diff --git a/sys/amiga/Build.ami b/sys/amiga/Build.ami deleted file mode 100644 index a17f5f77f..000000000 --- a/sys/amiga/Build.ami +++ /dev/null @@ -1,146 +0,0 @@ - - Compiling Amiga NetHack 3.4 - Last Revision: 21 February 2002 for NetHack 3.4.1 - - - We would like to thank each and every one of the people who took - the time and effort to report bugs to us. THANK YOU! (And keep - up the good work!) - -I. Introduction - - The Amiga-specific documentation has been split since the 3.1.3 release - - please read the file Install.ami for information specific to the - Amiga port before continuing. - - If you have problems with compilation, installation, or think you have - found a bug in the game, please report it by electronic mail to the - development group at nethack-bugs@nethack.org, where it will be routed - to the appropriate person. Include your configuration, the version of - NetHack you are playing (use the 'v' command or see - include/patchlevel.h), and as much specific information as possible. - As NetHack runs on many different machines, be sure to mention that you - are playing the Amiga version and also mention if you are using the - version for mc68k or ppc. - - If you want to find out about distributing NetHack, read the license - (in NetHack:license or type ?i during the game). - -II. Compiling Amiga NetHack 3.4 - -II.A. Compilation Overview - Compiling NetHack is not very hard - basically you do a little - configuration and start make. It does, however, require a good amount - of disk space and time. It also needs a good bit of memory, especially - for linking. - -II.B. Basic Compilation - - NetHack can be built with SAS/C version 6.5x. The commercial version - of DICE might work, but NetHack version 3.2.2 or later haven't been - compiled with it. The "official" compiler for NetHack 3.6 is SAS/C 6.58 - - we have dropped support for SAS/C 5.x. - - The Manx/Aztec port has not been tested recently and is certainly - broken. Anyone managing to compile NetHack with this compiler is - encouraged to submit context diffs of the required changes. When last - tested, NetHack required version 5.0B of that compiler. - - Compiling with gcc should also work. - -II.B.1. Introduction to Compiling NetHack - Before doing any compilation, read the README files distributed with - the source. These should familiarize you with the source tree layout - and what files are shared with what computers; everything in the - sys/amiga directory is used exclusively by the Amiga. - - The makefile (sys/amiga/Makefile.ami) depends on certain assignments, - providing the developer with a fairly flexible environment. See - sys/amiga/Makefile.ami for assignment assumptions. DICE users should - see section II.B.3 for information on creating a DMakefile usable with - DMake. - - Edit config.h to your liking and system configuration. The defaults - should be satisfactory for most systems. - - Read VERY CAREFULLY through the Makefile to familiarize yourself - with which assignments are assumed. Otherwise, you're going to get - something like "Insert NH: in any drive." You will need uudecode, - and, if you need to modify dgn_comp or lev_comp, flex, and bison. - The first thing Makefile.ami does is build makedefs, which handles - a variety of data file generation, and then lev_comp and dgn_comp - which compile the special levels. Makedefs will then be run to create - a few files, followed by a roughly alphabetically sorted compilation - of the entire source tree. This process will compile selected files - from the sys/amiga, sys/share, win/tty, and src directories, eventually - creating sbin/nethack. After building the main binary, a make install - will build the auxiliary files including help files, special levels, - icons, and the font files and will put these files into their final - positions - most will be in dlb archives (if DLB was defined in config.h). - The first make run should be done in NH:obj and the make install should be - done in NetHack:; for both runs, the makefile is NH:sys/amiga/Makefile.ami - (or NH:sys/amiga/DMakefile for DMake and NH:sys/amiga/Makefile.agc for - gcc). - - Note that not all the source is simple C code. If you are modifying - lev_comp or dgn_comp you may need bison and/or flex (depending on what - modifications you are making). You do not need any of these tools to - simply build NetHack - all the C output files are provided in the source - distribution. Also, the ifchange script requires a version of diff that - produces standard Unix format context diffs for proper operation - the - version shipped with SAS/C is not sufficient. - - If you do not have bison and flex, copy the files from sys/share. The - include files go in include/ and the C files go in util/. If the compile - fails due to prototype errors for malloc and realloc, try deleting - the first line of lev_comp.c and dgn_comp.c. - -II.B.2. Compiling NetHack with SAS/C version 6.58 - - NOTE WELL - Amiga NetHack has dropped support for SAS/C version 5. - This version of NetHack was developed with SAS/C 6.58. Earlier versions - than version of the compiler are known to cause problems - don't use them. - - A couple of notes and warnings from the SAS/C users on the team: - - * Included in the SAS/C port is code for generating a SnapShot.tb - file upon catching various internal disasters. That is why the - debug=l flag is in the makefile. This adds about 270K to the disk - image, but it does not increase the run time memory requirements. - - * The 5.10b optimizer did not produce correct code for NetHack. The - current optimizer has not been tested. - -II.B.3. Compiling NetHack with the commercial version of DICE - - IMPORTANT NOTE: If you are using DMake, you need to create DMakefile - from Makefile.ami. Do the following: - - cd NH:sys/amiga - edit from Makefile.ami to DMakefile with mkdmake opt w255 - - Some versions of DMake have been known to crash horribly on the - makefile - if this happens, you'll need to download another make - utility, such as AMake (ftp://ftp.dragonfire.net/amiga/utils/amake), - which will run in DMake-compatibility mode if invoked with the -C switch - (e.g. "amake -C -f NH:sys/amiga/DMakefile", or just - "alias dmake amake -C"). - - SECOND IMPORTANT NOTE: The score list is currently disabled when - compiling under DICE, due to an as-yet-unknown problem which causes - system crashes when displaying the score list. - - NetHack can be compiled using the commercial version of DICE only. The - registered shareware version had a bug in it which resulted in odd- - aligned procedures. (It is possible to patch DC1 to fix this problem; - however, this is not recommended, and you should upgrade to the - commercial version.) - - DICE 3.0 (the first commercial release) has a couple of bugs in it which - turn up in several of the NetHack sources; the DCC30_BUG define fixes - them. If you have a more recent version of the compiler, you may be - able to compile without this (and get slightly more efficient code) by - commenting out the define in amiconf.h. - - During compilation, DICE will output a lot of warnings; they can be - safely ignored. diff --git a/sys/amiga/Install.ami b/sys/amiga/Install.ami deleted file mode 100644 index 58ad2409b..000000000 --- a/sys/amiga/Install.ami +++ /dev/null @@ -1,200 +0,0 @@ - - Using and Installing Amiga NetHack 3.4 - (or Everything You Never Wanted to Know Before NetHacking) - (or Not Everything That Happens Always Comes Knocking) - - Last Revision: 28 March 2000 for NetHack 3.4.1 - - -0. Pre-intro for NetHack 3.4.1: - Amiga-specific changes for 3.4.1: - Most (around 99%) known bugs fixed (volunteers welcome). - HackWB and HackCli are no longer supported. Use the main binary. - - We would like to thank each and every one of the people who took - the time and effort to report bugs to us. THANK YOU! - -I. Introduction - -I.A. Overview - Welcome to Amiga NetHack! If this is your first visit to our fair - city, you are in for an amazing but dangerous journey; if you have - visited us before, beware! the city has changed in many strange and - subtle ways; it has also grown quite a bit. This missive brings to - light those mundane tasks which must be dealt with before beginning - your journey; for those of you who are faced with the task of - installing the pre-fabricated version of our town, section III - (Installing Amiga NetHack 3.6) will guide you through the task at - hand. If you are ready to visit, the local visitors guide is in - section II (Using Amiga NetHack 3.6); please also see the general - guide packaged separately (the file "GuideBook"). - - To all our visitors, a hearty Welcome! - and please be careful. - - [Those responsible for the previous paragraphs have been sacked. The - documentation has been completed at great expense in a more traditional - style. -- The Management] - -I.B. Getting Help - If you have questions about strategy, weapons, or monsters, the best - place to go for help is the Usenet newsgroup rec.games.roguelike.nethack. - - If you have problems with installation or think you have found a bug - in the game, please report it by electronic mail to the development - team at nethack-bugs@nethack.org, where it will be routed to the - appropriate person. Include your configuration, the version of - NetHack you are playing (use the 'v' command), whether or not you are - using an official binary release (and if so which one) and as much - specific information as possible. As NetHack runs on many different - machines, be sure to mention that you are playing the Amiga version. - -I.C. Credits - Olaf Seibert first ported NetHack 2.3 and 3.0 to the Amiga. Richard - Addison, Andrew Church, Jochen Erwied, Mark Gooderum, Ken Lorber, - Greg Olson, Mike Passaretti, and Gregg Wonderly polished and extended - the 3.0 and 3.1 ports. Andrew Church, Ken Lorber, and Gregg Wonderly - are responsible for the 3.2 port. Janne Salmijärvi resurrected the - amigaport for 3.3 and Teemu Suikki joined before 3.4.0. - -II. Using Amiga NetHack 3.4 - Run NetHack from the shell or from some tool that allows that, - ie. ToolManager. See the NetHack.txt file for command line options - and other usage. - -II.A. Sources of Information - Where to go depends on what you want to find out. If you want to find - out about distributing NetHack, read the license (in NetHack:license - or type ?i during the game). For an introduction to NetHack, read - the GuideBook file. To find out what options are compiled into your - copy of NetHack, type #v during the game. Finally, for information - during the game on all kinds of things, type ? and select from the - menu or by pressing Help key. - -II.B. The Amiga NetHack WorkBench Front End - Starting from 3.3.0 HackWB is not supported. - -II.C. The Amiga NetHack CLI Front End - Starting from 3.3.0 CLI Front end is not supported either. - - Instead, use the main binary. See NetHack.txt file for the standard Unix - flags for NetHack. In addition to those flags, Amiga NetHack accepts - the flags -l to force non-interlaced mode and -L to force interlaced mode. - -II.D. Amiga-Specific Information for NetHack - - There are several options that are unique to the Amiga version of - NetHack that may be specified in the NetHack.cnf file or on an - OPTIONS line: - - altmeta allows the ALT keys to function as META keys. The default - is altmeta. - flush flush discards all characters in the queue except the first, - which limits typeahead accidents. The default is !flush. - silent turn off the audio output. The default is silent. - - The current version of Amiga NetHack also supports menu accelerators. - See Guidebook.txt for a detailed description. Also supported is - selecting the number of stacked objects to drop, used with the (D)rop - command. Type the number and then select an item (or items with - accelerators). Items with a count associated with them are denoted - with # in place of -. I.e. 'd - 3 blessed daggers' becomes - 'd # 3 blessed daggers'. You can clear the count by hitting esc - while counting or deselect and reselect the item. The default - is to drop all selected items (as before). - - For other options how to configure the screen setting and colors refer - to Nethack.cnf. - -III. Installing Amiga NetHack 3.4 - -III.A. General Installation - Installation should be easy - basically it consists of putting files - where they belong and adding an assign to your startup. If you are - installing from the official binary distribution, simply unpacking - the archive in the appropriate directory will put the files in the - places they belong. - - IF YOU ALREADY HAVE A PREVIOUS VERSION INSTALLED YOU MUST DELETE THE - OLD SAVE AND BONES FILES - THEY WILL NOT WORK! This includes save - and bones files from all previous versions of NetHack (yes, even 3.3.1). - If you have a game in progress and want to finish it, use your - current version and then update. - -Will NetHack fit on your machine? - NetHack 3.6 is large. NetHack 3.4 is very large. You will need: - > Any standard series Amiga: 500, 600, 1000, 1200, 2000, 2500, 3000, 4000. - > WorkBench 2.04 or later. - > At least 3 meg of RAM. NetHack will NOT run in 1 meg (probably even 2). - > Mass storage: A hard drive with over 3 meg of free space is highly - recommended. - -Hard Disk Installation: - Unpack the archive to your place of choice. Since you are reading this - you've probably done that already. Now just assign NetHack: to - NetHack directory containing the executable and datafiles and other needed - directories. - - Use the table in the next section to see where things should end up. - Be sure that the file 8 ends up in NetHack:hack/8. - -Configuration - Using your favorite text editor, edit NetHack:NetHack.cnf to match - your system. - - Create the save file directory (makedir NetHack:save) and the levels file - directory (makedir NetHack:levels), if they don't already exist. - - Create the score file (echo to NetHack:record) and, if desired, the log - file (echo to NetHack:logfile), if they don't already exist. You may - leave out logfile, but record is needed. - -III.B. File Location Table -NetHack: - amii.hlp Guidebook.txt hack.font - license NetHack NetHack.cnf - NetHack.txt nhdat nhsdat - record Recover Recover.txt - logfile (optional, but useful) -NetHack:hack - 8 -NetHack:tiles - monsters.iff objects.iff other.iff - -IV. BBS Interface - - [Since HackCli and split binary is no longer supported the following - probably doesn't apply anymore. Due to lack of a suitable environment - it is also untested.] - - The BBS mode is based on the standard NetHack tty port and is designed - for use in a BBS setting - it is specifically not recommended for use - on the console. The current TTY mode has changed significantly since - the preliminary version released with 3.1.2. In particular, BBS mode - now works with split binaries (only), and now supports multiple games - in progress at the same time for multi-line boards (note however that - any individual user should not be allowed to run two instances of - NetHack at the same time). - - To set up NetHack for use with a BBS, set OPTIONS=windowtype:tty - and unset DUNGEONS, TRAPS, and EFFECTS in NetHack.cnf. Configure - the BBS to expect I/O through stdin and stdout, and have NetHack - invoked as: - HackCLI :uid -u uname options... - where uid is any string (without embedded spaces, colons, or slashes) - that is unique for each BBS user and uname is some corresponding human- - readable name for that user. Uid is used in constructing file names - to prevent collisions between simultaneous games and to prevent - people from using other people's save files. Uname is the name the - character will have in the game and the name that will appear in the - record file. - - The terminal is assumed to be a 24x80 ANSI-compatible terminal. - The present version does not deal with situations such as low - memory gracefully - as NetHack uses a considerable amount of - memory this is particularly painful with multiple games in - progress. Sysops are reminded to be familiar with the recover - utility, which may be needed from time to time and which should - probably not be available directly to users. Bug reports and - suggestions for improvements are requested from the user community - - this is still considered alpha software. - diff --git a/sys/amiga/Makefile.agc b/sys/amiga/Makefile.agc deleted file mode 100644 index 47040b520..000000000 --- a/sys/amiga/Makefile.agc +++ /dev/null @@ -1,1326 +0,0 @@ -# NetHack Makefile. -# Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991,1992,1993,1996. -# NetHack may be freely redistributed. See license for details. - -### -### modified for gcc by Teemu Suikki (zu@iki.fi) -### -### note: you need to use smake.. sorry -### - -### -### DIRECTORY STRUCTURE -### - -NH = nh: - -SBIN = $(NH)sbin/ -SLIB = $(NH)slib/ -NETHACK = $(NH)NetHack/ -HACKEXE = $(NH)HackExe/ -AMI = $(NH)sys/amiga/ -DAT = $(NH)dat/ -DOC = $(NH)doc/ -I = $(NH)include/ -SHARE = $(NH)sys/share/ -NHS = $(NH)src/ -TTY = $(NH)win/tty/ -WSHARE = $(NH)win/share/ -UTIL = $(NH)util/ -O = $(NH)obj/ -OO = $(NH)objo/ -# NB: O and OO MUST be different directories - -### -### INVOCATION -### - -MAKE = smake - -# Startup makefile with: -# -# $(MAKE) -f $(AMI)Makefile.amigcc -# $(MAKE) -f $(AMI)Makefile.amigcc install -# -# You may use following targets on $(MAKE) command lines: -# all do it all (default) -# link just create binary from object files -# obj just create common object files -# obja just create amiga object files -# objs just create shared object files -# clean deletes the object files -# spotless deletes the object files, main binary, and more -# -# Note: We do not build the Guidebook here since it needs tbl -# (See the file sys/unix/Makefile.doc for more information) - -#[SAS5] [and gcc?] -# If we were to use the precompiled header file feature in a newer version -# of SAS/C, we would comment out these following two lines. -# If we don't use precompiled header files, we uncomment it as well. - -HDEP = $(I)hack.h -CSYM = - -#Pathname for uudecode program: -UUDEC = uudecode - -# Flex/Bison command assignments -- Useful only if you have flex/bison -FLEX = flex -BISON = bison -# FBFIL and FBLIB may be used, if required by your version of flex or bison, -# to specify additional files or libraries to be linked with -FBFIL = -FBLIB = #lib lib:compat.lib - -# If you're compiling this on a 1.3 system, you'll have to uncomment the -# following (for use with the ifchange script below). Also useful instead of -# "protect ifchange +s" -EXECUTE = execute - -# Headers we depend on -AMDEP = $(AMI)winproto.h $(AMI)winext.h $(AMI)windefs.h $(I)winami.h - -# Pathname for the C compiler being used. - -CC = gcc -c -ASM = as - -# Compilation flags for selected C Compiler: -# $(CFLAGS) should appear before filename arguments of $(CC) command line. - -CFLAGS = -O3 -I $(I) - -# Components of various link command lines: -# $(LINK) should be the pathname of the linker being used (with any options -# that should appear at the beginning of the command line). The name of the -# output file should appear immediately after $(LNSPEC). $(LIN) should -# appear before the list of object files in each link command. $(LLINK) -# should appear as the list of object files in the link command line that -# creates the NetHack executable. $(LLIB) should appear at the end of each -# link command line. - -LINK = gcc -noixemul -O3 -LIN = -LLINK = -LLIB = -FLLIB = -OBJSPEC = -o -PNSPEC = -o -LNSPEC = -o -CCLINK = gcc -noixemul -CLFLAGS = -O3 -INCLSPEC = -I -DEFSPEC = -D -IGNSPEC = -j - -### -### FILE LISTS -### - -# A more reasonable random number generator (recommended for the Amiga): - -RANDOBJ = $(O)random.o - -.PRECIOUS: $(I)config.h $(I)decl.h $(I)hack.h $(I)permonst.h $(I)you.h - -# Almost nothing below this line should have to be changed. -# (Exceptions are marked by [SAS6], [MANX], etc.) -# -# Other things that have to be reconfigured are in config.h, -# (amiconf.h, pcconf.h), and possibly system.h, tradstdc.h. - -# Object files for makedefs: - -MAKEOBJS = \ - $(OO)makedefs.o $(O)monst.o $(O)objects.o - -# Object files for special levels compiler: - -SPLEVOBJS = \ - $(OO)lev_yacc.o $(OO)lev_lex.o $(OO)lev_main.o \ - $(O)decl.o $(O)drawing.o $(O)monst.o \ - $(O)objects.o $(OO)panic.o - -# Object files for dungeon compiler - -DGNCOMPOBJS = \ - $(OO)dgn_yacc.o $(OO)dgn_lex.o $(OO)dgn_main.o $(O)alloc.o $(OO)panic.o - -# Object files for NetHack: - -COMMOBJ = \ - $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o \ - $(O)attrib.o $(O)ball.o $(O)bones.o $(O)botl.o \ - $(O)cmd.o $(O)dbridge.o $(O)decl.o $(O)detect.o \ - $(O)dig.o $(O)display.o $(O)dlb.o $(O)do.o \ - $(O)do_name.o $(O)do_wear.o $(O)dog.o $(O)dogmove.o \ - $(O)dokick.o $(O)dothrow.o $(O)drawing.o $(O)dungeon.o \ - $(O)eat.o $(O)end.o $(O)engrave.o $(O)exper.o \ - $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o \ - $(O)hack.o $(O)hacklib.o $(O)invent.o $(O)light.o \ - $(O)lock.o $(O)mail.o $(O)makemon.o $(O)mapglyph.o \ - $(O)mcastu.o $(O)mhitm.o $(O)mhitu.o $(O)minion.o \ - $(O)mklev.o $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o \ - $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o \ - $(O)monst.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o \ - $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o \ - $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o \ - $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o \ - $(O)quest.o $(O)questpgr.o $(O)read.o $(O)rect.o \ - $(O)region.o $(O)restore.o $(O)rnd.o $(O)role.o \ - $(O)rumors.o $(O)save.o $(O)shk.o $(O)shknam.o \ - $(O)sit.o $(O)sounds.o $(O)sp_lev.o $(O)spell.o \ - $(O)steal.o $(O)steed.o $(O)sys.o $(O)teleport.o \ - $(O)timeout.o $(O)topten.o $(O)track.o $(O)trap.o \ - $(O)u_init.o $(O)uhitm.o $(O)vault.o $(O)version.o \ - $(O)vision.o $(O)weapon.o $(O)were.o $(O)wield.o \ - $(O)windows.o $(O)wizard.o $(O)worm.o $(O)worn.o \ - $(O)write.o $(O)zap.o - -MAKEDEFOBJ = \ - $(O)monstr.o - -AMIGAOBJ = \ - $(O)amidos.o $(O)amirip.o $(O)amisnd.o $(O)amistack.o \ - $(O)amiwind.o $(O)winami.o $(O)winchar.o $(O)winfuncs.o \ - $(O)winkey.o $(O)winmenu.o $(O)winreq.o $(O)winstr.o - -# Objects from assembly sources (because DMake can't handle default rules) -AMIGAOBJ2 = \ -# $(O)dispmap.o - -SHAREOBJ = \ - $(O)pcmain.o $(RANDOBJ) - -TTYOBJ = \ - $(O)getline.o $(O)termcap.o $(O)topl.o $(O)wintty.o $(O)amitty.o \ - $(O)rip.o - -# Yuck yuck yuck. Have to tell DMake where these are, since they're not -# all in the same place. -TTYSRC = \ - $(TTY)getline.c $(TTY)termcap.c $(TTY)topl.c $(TTY)wintty.c \ - $(AMI)amitty.c $(NHS)rip.c - -# All the object files for NetHack: - -HOBJ = $(COMMOBJ) $(AMIGAOBJ) $(AMIGAOBJ2) $(SHAREOBJ) $(MAKEDEFOBJ) $(TTYOBJ) - -### -### DATA FILES -### - -# quest files -ADFILES1= $(SLIB)Arc-fila.lev $(SLIB)Arc-filb.lev $(SLIB)Arc-loca.lev \ - $(SLIB)Arc-strt.lev -ADFILES= $(SLIB)Arc-goal.lev $(ADFILES1) - -BDFILES1= $(SLIB)Bar-fila.lev $(SLIB)Bar-filb.lev $(SLIB)Bar-loca.lev \ - $(SLIB)Bar-strt.lev -BDFILES= $(SLIB)Bar-goal.lev $(BDFILES1) - -CDFILES1= $(SLIB)Cav-fila.lev $(SLIB)Cav-filb.lev $(SLIB)Cav-loca.lev \ - $(SLIB)Cav-strt.lev -CDFILES= $(SLIB)Cav-goal.lev $(CDFILES1) - -HDFILES1= $(SLIB)Hea-fila.lev $(SLIB)Hea-filb.lev $(SLIB)Hea-loca.lev \ - $(SLIB)Hea-strt.lev -HDFILES= $(SLIB)Hea-goal.lev $(HDFILES1) - -KDFILES1= $(SLIB)Kni-fila.lev $(SLIB)Kni-filb.lev $(SLIB)Kni-loca.lev \ - $(SLIB)Kni-strt.lev -KDFILES= $(SLIB)Kni-goal.lev $(KDFILES1) - -MDFILES1= $(SLIB)Mon-fila.lev $(SLIB)Mon-filb.lev $(SLIB)Mon-loca.lev \ - $(SLIB)Mon-strt.lev -MDFILES= $(SLIB)Mon-goal.lev $(MDFILES1) - -PDFILES1= $(SLIB)Pri-fila.lev $(SLIB)Pri-filb.lev $(SLIB)Pri-loca.lev \ - $(SLIB)Pri-strt.lev -PDFILES= $(SLIB)Pri-goal.lev $(PDFILES1) - -RDFILES1= $(SLIB)Rog-fila.lev $(SLIB)Rog-filb.lev $(SLIB)Rog-loca.lev \ - $(SLIB)Rog-strt.lev -RDFILES= $(SLIB)Rog-goal.lev $(RDFILES1) - -RANFILES1= $(SLIB)Ran-fila.lev $(SLIB)Ran-filb.lev $(SLIB)Ran-loca.lev \ - $(SLIB)Ran-strt.lev -RANFILES= $(SLIB)Ran-goal.lev $(RANFILES1) - -SDFILES1= $(SLIB)Sam-fila.lev $(SLIB)Sam-filb.lev $(SLIB)Sam-loca.lev \ - $(SLIB)Sam-strt.lev -SDFILES= $(SLIB)Sam-goal.lev $(SDFILES1) - -TDFILES1= $(SLIB)Tou-fila.lev $(SLIB)Tou-filb.lev $(SLIB)Tou-loca.lev \ - $(SLIB)Tou-strt.lev -TDFILES= $(SLIB)Tou-goal.lev $(TDFILES1) - -VDFILES1= $(SLIB)Val-fila.lev $(SLIB)Val-filb.lev $(SLIB)Val-loca.lev \ - $(SLIB)Val-strt.lev -VDFILES= $(SLIB)Val-goal.lev $(VDFILES1) - -WDFILES1= $(SLIB)Wiz-fila.lev $(SLIB)Wiz-filb.lev $(SLIB)Wiz-loca.lev \ - $(SLIB)Wiz-strt.lev -WDFILES= $(SLIB)Wiz-goal.lev $(WDFILES1) - -XDFILES= $(ADFILES) $(BDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \ - $(MDFILES) $(PDFILES) $(RDFILES) $(RANFILES) $(SDFILES) $(TDFILES) \ - $(VDFILES) $(WDFILES) - -SOUNDFILES= \ - $(SBIN)cvtsnd \ - $(SLIB)sounds \ - $(SLIB)sounds/Bell $(SLIB)sounds/Bugle \ - $(SLIB)sounds/Drum_Of_Earthquake \ - $(SLIB)sounds/Fire_Horn $(SLIB)sounds/Frost_Horn \ - $(SLIB)sounds/Leather_Drum $(SLIB)sounds/Magic_Flute \ - $(SLIB)sounds/Magic_Harp $(SLIB)sounds/Tooled_Horn \ - $(SLIB)sounds/Wooden_Flute $(SLIB)sounds/Wooden_Harp - -TILEFILES= \ - $(SBIN)txt2iff \ - $(NETHACK)tiles \ - $(NETHACK)tiles/objects.iff \ - $(NETHACK)tiles/monsters.iff \ - $(NETHACK)tiles/other.iff - -INSTDUNGEONFILES1= \ - $(SLIB)air.lev $(SLIB)asmodeus.lev $(SLIB)astral.lev \ - $(SLIB)baalz.lev $(SLIB)bigrm-1.lev $(SLIB)bigrm-2.lev \ - $(SLIB)bigrm-3.lev $(SLIB)bigrm-4.lev $(SLIB)bigrm-5.lev \ - $(SLIB)castle.lev $(SLIB)dungeon $(SLIB)earth.lev \ - $(SLIB)fakewiz1.lev $(SLIB)fakewiz2.lev $(SLIB)fire.lev \ - $(SLIB)juiblex.lev $(SLIB)knox.lev $(SLIB)medusa-1.lev \ - $(SLIB)medusa-2.lev $(SLIB)minend-1.lev $(SLIB)minend-2.lev \ - $(SLIB)minetn-1.lev $(SLIB)minetn-2.lev $(SLIB)minefill.lev \ - $(SLIB)options $(SLIB)oracle.lev $(SLIB)orcus.lev \ - $(SLIB)sanctum.lev $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev \ - $(SLIB)soko2-1.lev $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev \ - $(SLIB)soko3-2.lev $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev \ - $(SLIB)tower1.lev $(SLIB)tower2.lev $(SLIB)tower3.lev \ - $(SLIB)valley.lev $(SLIB)water.lev $(SLIB)wizard1.lev \ - $(SLIB)wizard2.lev $(SLIB)wizard3.lev \ - $(XDFILES) - -INSTDUNGEONFILES= $(NETHACK)NetHack.cnf $(INSTDUNGEONFILES1) - - -INSTDATAFILES= \ - $(NETHACK)license $(NETHACK)logfile $(NETHACK)record \ - $(NETHACK)tomb.iff $(NETHACK)amii.hlp $(NETHACK)Recover.txt \ - $(NETHACK)GuideBook.txt $(NETHACK)NetHack.txt $(NETHACK)Install.ami \ -# $(NETHACK)HackWB.hlp $(NETHACK)WBDefaults.def - -LIBFILES= \ - $(INSTDUNGEONFILES1) \ - $(SLIB)cmdhelp $(SLIB)data $(SLIB)dungeon \ - $(SLIB)help $(SLIB)hh $(SLIB)history \ - $(SLIB)opthelp $(SLIB)oracles $(SLIB)rumors \ - $(SLIB)quest.dat $(SLIB)wizhelp - -### -### Getting down to business: -### - -all: $(COMPACT_HEADERS) $(SBIN)lev_comp $(SBIN)dgn_comp $(SBIN)NetHack \ - $(SBIN)dlb $(NETHACK)recover #$(NETHACK)HackCli $(SBIN)splitter \ -# $(NETHACK)HackWB - -install: inst-data inst-dungeon inst-fonts inst-sounds inst-tiles \ - $(NETHACK)recover $(NETHACK)NetHack $(NETHACK)nhdat - #$(NETHACK)NetHack.dir inst-icons - -$(SBIN)NetHack: link - -$(NETHACK)NetHack: $(SBIN)NetHack - copy $(SBIN)NetHack $(NETHACK)NetHack - -## uuh this is messy.. smake has weird command line length limit -link: $(HOBJ) - list to t:link lformat="$(O)%s" $(O)\#?.o QUICK NOHEAD - echo "\#sh" to t:cc - echo "$(LINK) $(LNSPEC) $(SBIN)NetHack $(LIN) $(LLIB) $(LLINK) " >>t:cc noline - fmt -u -w 2500 t:link >>t:cc - sh t:cc - delete t:cc t:link - - -## dlb support -$(OO)dlb_main.o: $(UTIL)dlb_main.c $(HDEP) $(I)dlb.h $(I)date.h - $(CC) $(CFLAGS) $(OBJSPEC)$(OO)dlb_main.o $(UTIL)dlb_main.c - -$(SBIN)dlb: $(OO)dlb_main.o $(O)dlb.o $(O)alloc.o $(OO)panic.o - $(LINK) $(PNSPEC) $(SBIN)dlb $(LIN) $(OO)dlb_main.o $(O)dlb.o \ - $(O)alloc.o $(OO)panic.o $(LLIB) - -obj: $(HOBJ) - -obja: $(AMIGAOBJ) - -objs: $(SHAREOBJ) - - -SUFFIXES = .lev .des -.des.lev: - $(SBIN)lev_comp $< - -# The default method for creating object files: - -#$(O)%.o: $(NHS)%.c -.c.o: - $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)$@ $< - -clean: - -delete $(O)\#?.o $(OO)\#?.o - -spotless: clean - -delete $(SBIN)NetHack $(SBIN)lev_comp $(SBIN)makedefs $(SBIN)dgn_comp - -delete $(SBIN)cvtsnd $(SBIN)dlb $(SBIN)txt2iff $(SBIN)splitter - -delete $(SBIN)tilemap - -delete $(SLIB)data $(SLIB)rumors - -delete $(SLIB)\#?.lev - -delete $(SLIB)dungeon - -delete $(SLIB)cmdhelp $(SLIB)help $(SLIB)hh $(SLIB)history - -delete $(SLIB)opthelp $(SLIB)options $(SLIB)oracles - -delete $(SLIB)quest.dat $(SLIB)wizhelp -# -delete $(SLIB)earth.lev $(SLIB)air.lev $(SLIB)fire.lev -# -delete $(SLIB)water.lev $(SLIB)astral.lev -# -delete $(SLIB)tower1.lev $(SLIB)tower2.lev $(SLIB)tower3.lev -# -delete $(SLIB)fakewiz1.lev $(SLIB)fakewiz2.lev -# -delete $(SLIB)medusa-1.lev $(SLIB)medusa-2.lev -# -delete $(SLIB)oracle.lev $(SLIB)wizard1.lev $(SLIB)wizard2.lev -# -delete $(SLIB)wizard3.lev $(DAT)dungeon.pdf $(SLIB)valley.lev -# -delete $(SLIB)minefill.lev -# -delete $(SLIB)minetn-1 $(SLIB)minetn-2 $(SLIB)minend-1 $(SLIB)minend-2 -# -delete $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev $(SLIB)soko2-1.lev -# -delete $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev $(SLIB)soko3-2.lev -# -delete $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev -# -delete $(ADFILES) -# -delete $(BDFILES) -# -delete $(CDFILES) -# -delete $(HDFILES) -# -delete $(KDFILES) -# -delete $(MDFILES) -# -delete $(PDFILES) -# -delete $(RDFILES) -# -delete $(RANFILES) -# -delete $(SDFILES) -# -delete $(TDFILES) -# -delete $(VDFILES) -# -delete $(WDFILES) - -delete $(I)onames.h $(I)pm.h $(I)date.h - -delete $(NHS)tile.c $(NHS)monstr.c - -delete $(I)tile.h -# -echo to $(I)onames.h "" noline -# -c:wait 2 -# -echo to $(I)pm.h "" noline -# -c:wait 2 -# -setdate $(UTIL)makedefs.c -# -c:wait 2 - -# Creating precompiled version of $(I)hack.h to save disk I/O. - -# -# Please note: The dependency lines for the modules here are -# deliberately incorrect. Including "hack.h" in -# the dependency list would cause a dependency -# loop. -# - -$(SBIN)makedefs: $(MAKEOBJS) - $(LINK) $(LNSPEC) $(SBIN)makedefs $(LIN) $(MAKEOBJS) $(LLIB) - -$(OO)makedefs.o: $(UTIL)makedefs.c $(I)config.h $(I)permonst.h $(I)monsym.h \ - $(I)objclass.h $(I)patchlevel.h $(I)qtext.h $(I)artilist.h - $(CC) $(DEFSPEC)MAKEDEFS_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)makedefs.c - -$(SBIN)lev_comp: $(SPLEVOBJS) - $(LINK) $(LNSPEC) $(SBIN)lev_comp $(LIN) $(SPLEVOBJS) $(FBFIL) $(FLLIB) - -$(SBIN)dgn_comp: $(DGNCOMPOBJS) - $(LINK) $(LNSPEC) $(SBIN)dgn_comp $(LIN) $(DGNCOMPOBJS) $(FBFIL) $(FLLIB) - -$(OO)lev_yacc.o: $(UTIL)lev_yacc.c $(HDEP) $(I)sp_lev.h $(I)pm.h $(I)onames.h -# setdate $(UTIL)lev_yacc.c - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)PREFIX="NH:slib/" $(CFLAGS) \ - $(DEFSPEC)alloca=malloc $(OBJSPEC)$@ $(UTIL)lev_yacc.c - -$(OO)lev_lex.o: $(UTIL)lev_lex.c $(HDEP) $(I)lev_comp.h $(I)sp_lev.h - $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)lev_lex.c - -$(OO)lev_main.o: $(UTIL)lev_main.c $(HDEP) $(I)pm.h $(I)onames.h $(I)date.h - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ - $(UTIL)lev_main.c - -$(OO)dgn_yacc.o: $(UTIL)dgn_yacc.c $(HDEP) $(I)dgn_file.h $(I)patchlevel.h - $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(DEFSPEC)alloca=malloc \ - $(OBJSPEC)$@ $(UTIL)dgn_yacc.c - -$(OO)dgn_lex.o: $(UTIL)dgn_lex.c $(I)config.h $(I)dgn_comp.h $(I)dgn_file.h - $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)dgn_lex.c - -$(OO)dgn_main.o: $(UTIL)dgn_main.c $(I)config.h $(I)date.h - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ - $(UTIL)dgn_main.c - -$(OO)panic.o: $(UTIL)panic.c $(HDEP) - -$(OO)recover.o: $(UTIL)recover.c $(I)config.h $(I)date.h - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ - $(UTIL)recover.c - -$(NETHACK)recover: $(OO)recover.o - $(LINK) $(LNSPEC) $(NETHACK)recover $(LIN) $(OO)recover.o $(LLIB) - -# [OPTION] -- If you have flex/bison, leave these uncommented. Otherwise, -# comment them out and be careful! (You're not guaranteed to have the most -# up to date *_comp.c, *_comp.h and *_lex.c) - -$(I)lev_comp.h: $(UTIL)lev_yacc.c $(I)patchlevel.h - -$(UTIL)lev_yacc.c: $(UTIL)lev_comp.y $(I)patchlevel.h - $(BISON) -d $(UTIL)lev_comp.y -# copy y.tab.c $(UTIL)lev_yacc.c -# copy y.tab.h $(I)lev_comp.h - copy $(UTIL)lev_comp.tab.c $(UTIL)lev_yacc.c - copy $(UTIL)lev_comp.tab.h $(I)lev_comp.h -# delete y.tab.c -# delete y.tab.h - delete $(UTIL)lev_comp.tab.c - delete $(UTIL)lev_comp.tab.h - -$(UTIL)lev_lex.c: $(UTIL)lev_comp.l $(I)patchlevel.h - $(FLEX) $(UTIL)lev_comp.l - copy lex.yy.c $(UTIL)lev_lex.c - delete lex.yy.c - -$(I)dgn_comp.h: $(UTIL)dgn_yacc.c $(I)patchlevel.h - -$(UTIL)dgn_yacc.c: $(UTIL)dgn_comp.y $(I)patchlevel.h - $(BISON) -d $(UTIL)dgn_comp.y -# copy y.tab.c $(UTIL)dgn_yacc.c -# copy y.tab.h $(I)dgn_comp.h - copy $(UTIL)dgn_comp.tab.c $(UTIL)dgn_yacc.c - copy $(UTIL)dgn_comp.tab.h $(I)dgn_comp.h -# delete y.tab.c -# delete y.tab.h - delete $(UTIL)dgn_comp.tab.c - delete $(UTIL)dgn_comp.tab.h - -$(UTIL)dgn_lex.c: $(UTIL)dgn_comp.l $(I)patchlevel.h - $(FLEX) $(UTIL)dgn_comp.l - copy lex.yy.c $(UTIL)dgn_lex.c - delete lex.yy.c - -# -# The following include files depend on makedefs to be created. -# As a result, they are not defined in HACKINCL, instead, their -# dependencies are explicitly outlined here. -# - -# -# date.h should be remade any time any of the source or include code -# is modified. Unfortunately, this would make the contents of this -# file far more complex. Since "hack.h" depends on most of the include -# files, we kludge around this by making date.h dependent on hack.h, -# even though it doesn't include this file. -# - -$(I)date.h $(DAT)options: $(HDEP) $(SBIN)makedefs $(AMIGAOBJ) $(I)patchlevel.h - $(SBIN)makedefs -v - $(EXECUTE) ifchange MOVE $(I)t.date.h $(I)date.h - -c:wait 2 - -$(I)onames.h: $(SBIN)makedefs - $(SBIN)makedefs -o - $(EXECUTE) ifchange TOUCH $(I)t.onames.h $(I)onames.h $(I)decl.h - $(EXECUTE) ifchange MOVE $(I)t.onames.h $(I)onames.h - -c:wait 2 - -$(I)pm.h: $(SBIN)makedefs - $(SBIN)makedefs -p - $(EXECUTE) ifchange TOUCH $(I)t.pm.h $(I)pm.h $(I)decl.h $(I)youprop.h - $(EXECUTE) ifchange MOVE $(I)t.pm.h $(I)pm.h - -c:wait 2 - -$(SLIB)quest.dat: $(DAT)quest.txt $(SBIN)makedefs - $(SBIN)makedefs -q - -$(NHS)monstr.c: $(HDEP) $(SBIN)makedefs - $(SBIN)makedefs -m - -c:wait 2 - -$(SLIB)oracles: $(DAT)oracles.txt $(SBIN)makedefs - $(SBIN)makedefs -h - -c:wait 2 - -# -# The following programs vary depending on what OS you are using. -# As a result, they are not defined in HACKSRC and their dependencies -# are explicitly outlined here. -# - -$(O)amidos.o: $(AMI)amidos.c $(HDEP) - -$(O)amirip.o: $(AMI)amirip.c $(HDEP) - -$(O)aglue.o: $(AMI)aglue.a - $(ASM) $(AFLAGS) $(AOBJSPEC)$(O)aglue.o $(AMI)aglue.a - -$(O)amisnd.o: $(AMI)amisnd.c $(HDEP) - -$(O)winchar.o: $(AMI)winchar.c $(NHS)tile.c $(HDEP) - -$(NHS)tile.c: $(WSHARE)tilemap.c - $(CCLINK) $(CFLAGS) $(PNSPEC) $(SBIN)tilemap $(WSHARE)tilemap.c - $(SBIN)tilemap - -$(O)winstr.o: $(AMI)winstr.c $(HDEP) $(AMDEP) - -$(O)winreq.o: $(AMI)winreq.c $(HDEP) $(AMDEP) $(AMI)colorwin.c $(AMI)clipwin.c - -$(O)winfuncs.o: $(AMI)winfuncs.c $(HDEP) $(AMDEP) $(I)patchlevel.h - -$(O)winkey.o: $(AMI)winkey.c $(HDEP) $(AMDEP) - -$(O)winmenu.o: $(AMI)winmenu.c $(HDEP) $(AMDEP) - -$(O)winami.o: $(AMI)winami.c $(HDEP) $(AMDEP) #$(AMI)char.c $(AMI)randwin.c - -#$(O)amilib.o: $(AMI)amilib.c $(HDEP) $(AMDEP) - -$(O)amiwind.o: $(AMI)amiwind.c $(AMI)amimenu.c $(HDEP) $(AMDEP) - -$(O)amiwbench.o: $(AMI)amiwbench.c $(HDEP) - -$(O)random.o: $(SHARE)random.c - -$(O)pcmain.o: $(SHARE)pcmain.c $(HDEP) $(I)dlb.h - -$(O)dispmap.o: $(AMI)dispmap.s - $(ASM) $(AFLAGS) $(AOBJSPEC)$@ $< - -# Stuff to build the front ends -$(NETHACK)HackWB: $(OO)wb.o $(OO)wbx.o $(OO)loader.o $(OO)multi.o - $(LINK) $(LNSPEC) $(NETHACK)HackWB $(LIN) $(OO)wb.o $(OO)wbx.o \ - $(OO)loader.o $(OO)multi.o $(LLIB) - -$(NETHACK)HackCli: $(OO)cli.o $(OO)loader.o $(OO)multi.o - $(LINK) $(LNSPEC) $(NETHACK)HackCli $(LIN) $(OO)cli.o $(OO)loader.o \ - $(OO)multi.o $(LLIB) - -# This needs to exist to eliminate the HackWB startup message -$(NETHACK)WBDefaults.def: - echo to $(NETHACK)WBDefaults.def - -WBH = $(AMI)wbdefs.h $(AMI)wbstruct.h $(AMI)wbprotos.h -ASP = $(AMI)splitter -$(OO)wb.o: $(WBH) $(AMI)wb.c $(AMI)wbwin.c $(AMI)wbdata.c $(AMI)wbgads.c \ - $(I)patchlevel.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)wb.o $(AMI)wb.c - -$(OO)wbx.o: $(WBH) $(AMI)wbcli.c $(AMI)wbwin.c $(AMI)wbdata.c \ - $(I)patchlevel.h $(I)date.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)wbx.o $(AMI)wbcli.c - -$(OO)loader.o: $(ASP)/loader.c $(ASP)/split.h $(ASP)/amiout.h $(ASP)/multi.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)loader.o $(ASP)/loader.c - -$(OO)multi.o: $(ASP)/multi.c $(ASP)/multi.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)multi.o $(ASP)/multi.c - -$(OO)cli.o: $(WBH) $(AMI)wbcli.c $(I)patchlevel.h $(I)date.h - $(CC) $(WBCFLAGS) $(WBC2FLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)cli.o \ - $(AMI)wbcli.c - -#### -# splitter support -$(SBIN)splitter: $(OO)splitter.o $(OO)arg.o - $(LINK) $(LNSPEC) $(SBIN)splitter $(LIN) $(OO)splitter.o $(OO)arg.o \ - $(LLIB) - -$(NETHACK)NetHack.dir: $(SBIN)splitter $(SBIN)NetHack - $(SBIN)splitter $(SBIN)NetHack - -$(OO)splitter.o: $(ASP)/splitter.c $(ASP)/split.h $(ASP)/amiout.h $(ASP)/arg.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)splitter.o \ - $(ASP)/splitter.c - -$(OO)arg.o: $(ASP)/arg.c $(ASP)/arg.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)arg.o $(ASP)/arg.c - -# Create/copy other stuff into NetHack: directory: - -$(NETHACK)tomb.iff: $(SBIN)xpm2iff $(AMI)grave16.xpm - $(SBIN)xpm2iff $(AMI)grave16.xpm $(NETHACK)tomb.iff - -$(OO)xpm2iff.o: $(AMI)xpm2iff.c - $(CC) $(CFLAGS) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(AMI)xpm2iff.c - -$(SBIN)xpm2iff: $(OO)xpm2iff.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)xpm2iff.o $(FLLIB) - -# Tile installation for the tile version of the game -inst-tiles: $(TILEFILES) - -$(NETHACK)tiles: - -makedir $(NETHACK)tiles - -$(OO)txt2iff.o: $(AMI)txt2iff.c - $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ \ - $(AMI)txt2iff.c - -$(OO)ppmwrite.o: $(WSHARE)ppmwrite.c - $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)ppmwrite.c - -$(OO)tiletext.o: $(WSHARE)tiletext.c $(I)config.h $(WSHARE)tile.h - $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)tiletext.c - -$(OO)tiletxt.o: $(WSHARE)tilemap.c $(I)hack.h - $(CC) $(CFLAGS) $(CSYM) $(DEFSPEC)TILETEXT $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)tilemap.c - -NAMEOBJS = $(O)drawing.o $(O)decl.o $(O)monst.o $(O)objects.o - -$(SBIN)txt2ppm: $(OO)ppmwrite.o $(NAMEOBJS) $(O)alloc.o $(OO)panic.o $(OO)tiletext.o $(OO)tiletxt.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)ppmwrite.o $(NAMEOBJS) $(OO)tiletext.o $(OO)tiletxt.o $(O)alloc.o $(OO)panic.o $(FLLIB) - -$(SBIN)txt2iff: $(OO)txt2iff.o $(NAMEOBJS) $(OO)tiletext.o $(OO)tiletxt.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)txt2iff.o $(NAMEOBJS) $(OO)tiletext.o \ - $(OO)tiletxt.o $(FLLIB) - -$(NETHACK)tiles/objects.iff: $(WSHARE)objects.txt $(SBIN)txt2iff - $(SBIN)txt2iff $(WSHARE)objects.txt $(NETHACK)tiles/objects.iff - -$(NETHACK)tiles/monsters.iff: $(WSHARE)monsters.txt $(SBIN)txt2iff - $(SBIN)txt2iff $(WSHARE)monsters.txt $(NETHACK)tiles/monsters.iff - -$(NETHACK)tiles/other.iff: $(WSHARE)other.txt $(SBIN)txt2iff - $(SBIN)txt2iff $(WSHARE)other.txt $(NETHACK)tiles/other.iff - -# Sound installation rules. -inst-sounds: $(SOUNDFILES) - list to T:nhsdat.lst $(SLIB)sounds QUICK NOHEAD - echo >T:make-nhsdat $(SBIN)dlb cCfI $(SLIB)sounds $(NETHACK)nhsdat T:nhsdat.lst - echo >>T:make-nhsdat if not exists $(NETHACK)nhsdat - echo >>T:make-nhsdat copy $(SLIB)sounds/\#? $(NETHACK)sounds - echo >>T:make-nhsdat endif - execute T:make-nhsdat - -delete T:make-nhsdat - -$(SLIB)sounds: - -makedir $(SLIB)sounds - -$(SBIN)cvtsnd: $(OO)cvtsnd.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)cvtsnd.o $(FLLIB) - -$(OO)cvtsnd.o: $(AMI)cvtsnd.c - -$(SLIB)sounds/Bell: $(SHARE)sounds/bell.uu - $(UUDEC) $(SHARE)sounds/bell.uu - $(SBIN)cvtsnd Bell $(SLIB)sounds/Bell - -delete Bell - -$(SLIB)sounds/Bugle: $(SHARE)sounds/bugle.uu - $(UUDEC) $(SHARE)sounds/bugle.uu - $(SBIN)cvtsnd Bugle $(SLIB)sounds/Bugle - -delete Bugle - -$(SLIB)sounds/Drum_Of_Earthquake: $(SHARE)sounds/erthdrum.uu - $(UUDEC) $(SHARE)sounds/erthdrum.uu - $(SBIN)cvtsnd Drum_Of_Earthquake $(SLIB)sounds/Drum_Of_Earthquake - -delete Drum_Of_Earthquake - -$(SLIB)sounds/Fire_Horn: $(SHARE)sounds/firehorn.uu - $(UUDEC) $(SHARE)sounds/firehorn.uu - $(SBIN)cvtsnd Fire_Horn $(SLIB)sounds/Fire_Horn - -delete Fire_Horn - -$(SLIB)sounds/Frost_Horn: $(SHARE)sounds/frsthorn.uu - $(UUDEC) $(SHARE)sounds/frsthorn.uu - $(SBIN)cvtsnd Frost_Horn $(SLIB)sounds/Frost_Horn - -delete Frost_Horn - -$(SLIB)sounds/Leather_Drum: $(SHARE)sounds/lethdrum.uu - $(UUDEC) $(SHARE)sounds/lethdrum.uu - $(SBIN)cvtsnd Leather_Drum $(SLIB)sounds/Leather_Drum - -delete Leather_Drum - -$(SLIB)sounds/Magic_Flute: $(SHARE)sounds/mgcflute.uu - $(UUDEC) $(SHARE)sounds/mgcflute.uu - $(SBIN)cvtsnd Magic_Flute $(SLIB)sounds/Magic_Flute - -delete Magic_Flute - -$(SLIB)sounds/Magic_Harp: $(SHARE)sounds/mgcharp.uu - $(UUDEC) $(SHARE)sounds/mgcharp.uu - $(SBIN)cvtsnd Magic_Harp $(SLIB)sounds/Magic_Harp - -delete Magic_Harp - -$(SLIB)sounds/Tooled_Horn: $(SHARE)sounds/toolhorn.uu - $(UUDEC) $(SHARE)sounds/toolhorn.uu - $(SBIN)cvtsnd Tooled_Horn $(SLIB)sounds/Tooled_Horn - -delete Tooled_Horn - -$(SLIB)sounds/Wooden_Flute: $(SHARE)sounds/wdnflute.uu - $(UUDEC) $(SHARE)sounds/wdnflute.uu - $(SBIN)cvtsnd Wooden_Flute $(SLIB)sounds/Wooden_Flute - -delete Wooden_Flute - -$(SLIB)sounds/Wooden_Harp: $(SHARE)sounds/wdnharp.uu - $(UUDEC) $(SHARE)sounds/wdnharp.uu - $(SBIN)cvtsnd Wooden_Harp $(SLIB)sounds/Wooden_Harp - -delete Wooden_Harp - -inst-dungeon: $(INSTDUNGEONFILES) - -$(NETHACK)options : $(DAT)options - copy $(DAT)options $@ - -# Create compiled dungeon files -BGM= $(SLIB)bigrm-2.lev $(SLIB)bigrm-3.lev $(SLIB)bigrm-4.lev $(SLIB)bigrm-5.lev -$(BGM): $(SLIB)bigrm-1.lev - -$(SLIB)bigrm-1.lev: $(DAT)bigroom.des $(SBIN)lev_comp - -$(SLIB)castle.lev: $(DAT)castle.des $(SBIN)lev_comp - -ENDGAME1= $(SLIB)air.lev $(SLIB)earth.lev $(SLIB)fire.lev $(SLIB)water.lev -$(ENDGAME1): $(SLIB)astral.lev - -$(SLIB)astral.lev: $(DAT)endgame.des $(SBIN)lev_comp - -GEHENNOM1= $(SLIB)asmodeus.lev $(SLIB)baalz.lev $(SLIB)juiblex.lev \ - $(SLIB)orcus.lev $(SLIB)sanctum.lev -$(GEHENNOM1): $(SLIB)valley.lev - -$(SLIB)valley.lev: $(DAT)gehennom.des $(SBIN)lev_comp - -$(SLIB)knox.lev: $(DAT)knox.des $(SBIN)lev_comp - -MINES1= $(SLIB)minend-1.lev $(SLIB)minend-2.lev $(SLIB)minetn-1.lev $(SLIB)minetn-2.lev -$(MINES1): $(SLIB)minefill.lev - -$(SLIB)minefill.lev: $(DAT)mines.des $(SBIN)lev_comp - -$(SLIB)oracle.lev: $(DAT)oracle.des $(SBIN)lev_comp - -TOWER1= $(SLIB)tower1.lev $(SLIB)tower2.lev -$(TOWER1): $(SLIB)tower3.lev - -$(SLIB)tower3.lev: $(DAT)tower.des $(SBIN)lev_comp - -WIZARD1= $(SLIB)wizard1.lev $(SLIB)wizard2.lev $(SLIB)wizard3.lev \ - $(SLIB)fakewiz1.lev -$(WIZARD1): $(SLIB)fakewiz2.lev - -$(SLIB)fakewiz2.lev: $(DAT)yendor.des $(SBIN)lev_comp - -MEDUSA1= $(SLIB)medusa-1.lev -$(MEDUSA1): $(SLIB)medusa-2.lev - -$(SLIB)medusa-2.lev: $(DAT)medusa.des $(SBIN)lev_comp - -SOKOBAN1= $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev $(SLIB)soko2-1.lev \ - $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev $(SLIB)soko3-2.lev \ - $(SLIB)soko4-1.lev -$(SOKOBAN1): $(SLIB)soko4-2.lev - -$(SLIB)soko4-2.lev: $(DAT)sokoban.des $(SBIN)lev_comp - -$(ADFILES1): $(SLIB)Arc-goal.lev - -$(SLIB)Arc-goal.lev: $(DAT)Arch.des $(SBIN)lev_comp - -$(BDFILES1): $(SLIB)Bar-goal.lev - -$(SLIB)Bar-goal.lev: $(DAT)Barb.des $(SBIN)lev_comp - -$(CDFILES1): $(SLIB)Cav-goal.lev - -$(SLIB)Cav-goal.lev: $(DAT)Caveman.des $(SBIN)lev_comp - -$(HDFILES1): $(SLIB)Hea-goal.lev - -$(SLIB)Hea-goal.lev: $(DAT)Healer.des $(SBIN)lev_comp - -$(KDFILES1): $(SLIB)Kni-goal.lev - -$(SLIB)Kni-goal.lev: $(DAT)Knight.des $(SBIN)lev_comp - -$(MDFILES1): $(SLIB)Mon-goal.lev - -$(SLIB)Mon-goal.lev: $(DAT)Monk.des $(SBIN)lev_comp - -$(PDFILES1): $(SLIB)Pri-goal.lev - -$(SLIB)Pri-goal.lev: $(DAT)Priest.des $(SBIN)lev_comp - -$(RDFILES1): $(SLIB)Rog-goal.lev - -$(SLIB)Rog-goal.lev: $(DAT)Rogue.des $(SBIN)lev_comp - -$(RANFILES1): $(SLIB)Ran-goal.lev - -$(SLIB)Ran-goal.lev: $(DAT)Ranger.des $(SBIN)lev_comp - -$(SDFILES1): $(SLIB)Sam-goal.lev - -$(SLIB)Sam-goal.lev: $(DAT)Samurai.des $(SBIN)lev_comp - -$(TDFILES1): $(SLIB)Tou-goal.lev - -$(SLIB)Tou-goal.lev: $(DAT)Tourist.des $(SBIN)lev_comp - -$(VDFILES1): $(SLIB)Val-goal.lev - -$(SLIB)Val-goal.lev: $(DAT)Valkyrie.des $(SBIN)lev_comp - -$(WDFILES1): $(SLIB)Wiz-goal.lev - -$(SLIB)Wiz-goal.lev: $(DAT)Wizard.des $(SBIN)lev_comp - -$(SLIB)dungeon: $(DAT)dungeon.def $(SBIN)makedefs $(SBIN)dgn_comp - $(SBIN)makedefs -e - $(SBIN)dgn_comp $(DAT)dungeon.pdf - copy $(DAT)dungeon $(SLIB)dungeon - delete $(DAT)dungeon - -inst-data: $(INSTDATAFILES) - -$(NETHACK)amii.hlp: $(AMI)amii.hlp - copy $(AMI)amii.hlp $@ - -#$(NETHACK)data: $(DAT)data -# copy $(DAT)data $@ - -$(SLIB)data: $(DAT)data.base $(I)config.h $(SBIN)makedefs - $(SBIN)makedefs -d - -#$(NETHACK)rumors: $(DAT)rumors -# copy $(DAT)rumors $@ - -$(SLIB)rumors: $(DAT)rumors.tru $(DAT)rumors.fal $(SBIN)makedefs - $(SBIN)makedefs -r - -$(SLIB)cmdhelp: $(DAT)cmdhelp - copy $(DAT)cmdhelp $@ - -$(SLIB)help: $(DAT)help - copy $(DAT)help $@ - -$(SLIB)hh: $(DAT)hh - copy $(DAT)hh $@ - -$(NETHACK)HackWB.hlp: $(AMI)HackWB.hlp - copy $(AMI)HackWB.hlp $@ - -$(SLIB)history: $(DAT)history - copy $(DAT)history $@ - -$(NETHACK)license: $(DAT)license - copy $(DAT)license $@ - -$(SLIB)opthelp: $(DAT)opthelp - copy $(DAT)opthelp $@ - -$(NETHACK)Recover.txt: $(DOC)Recover.txt - copy $(DOC)Recover.txt $@ - -$(NETHACK)GuideBook.txt: $(DOC)GuideBook.txt - copy $(DOC)GuideBook.txt $@ - -$(NETHACK)NetHack.txt: $(DOC)NetHack.txt - copy $(DOC)NetHack.txt $@ - -$(NETHACK)Install.ami: $(AMI)Install.ami - copy $(AMI)Install.ami $@ - -$(NETHACK)logfile: - echo to $@ - -$(NETHACK)record: - echo to $@ - -$(SLIB)wizhelp: $(DAT)wizhelp - copy $(DAT)wizhelp $@ - -# Create the directories here because NetHack.cnf puts them there by default -$(NETHACK)NetHack.cnf: $(AMI)NetHack.cnf - copy $(AMI)NetHack.cnf $@ - -makedir $(NETHACK)save - -makedir $(NETHACK)levels - -# Unpack and install fonts - -INSTFONTFILES= $(NETHACK)hack.font $(NETHACK)hack $(NETHACK)hack/8 - -inst-fonts: $(INSTFONTFILES) - -$(NETHACK)hack/8: $(AMI)amifont8.uu $(NETHACK)hack - $(UUDEC) $(AMI)amifont8.uu - copy 8 $(NETHACK)hack/8 - delete 8 - -$(NETHACK)hack.font: $(AMI)amifont.uu - $(UUDEC) $(AMI)amifont.uu - copy hack.font $(NETHACK)hack.font - delete hack.font - -$(NETHACK)hack: - -makedir $@ - -INSTICONFILES= \ - $(NETHACK)default.icon $(NETHACK)NetHack.info $(NETHACK)NewGame.info \ - $(NETHACK)HackWB.info - -inst-icons: $(INSTICONFILES) - -# Unpack the icons into place - -$(NETHACK)default.icon: $(AMI)dflticon.uu - $(UUDEC) $(AMI)dflticon.uu -# copy default.icon $(NETHACK)default.icon -# delete default.icon - -$(NETHACK)NetHack.info: $(AMI)NHinfo.uu - $(UUDEC) $(AMI)NHinfo.uu -# copy NetHack.info $(NETHACK)NetHack.info -# delete NetHack.info - -$(NETHACK)NewGame.info: $(AMI)NewGame.uu - $(UUDEC) $(AMI)NewGame.uu -# copy NewGame.info $(NETHACK)NewGame.info -# delete NewGame.info - -$(NETHACK)HackWB.info: $(AMI)HackWB.uu - $(UUDEC) $(AMI)HackWB.uu -# copy HackWB.info $(NETHACK)HackWB.info -# delete HackWB.info - -# If DLB is defined, create the nhdat library file in the playground -# directory. If not, move all the data files there. -$(NETHACK)nhdat: $(LIBFILES) - list to T:nhdat.lst $(SLIB) QUICK NOHEAD FILES - echo >T:make-nhdat $(SBIN)dlb cCfI $(SLIB) $(NETHACK)nhdat T:nhdat.lst - echo >>T:make-nhdat if not exists $(NETHACK)nhdat - echo >>T:make-nhdat copy $(SLIB)\#? $(NETHACK) - echo >>T:make-nhdat endif - execute T:make-nhdat - -delete T:make-nhdat - -# DO NOT DELETE THIS LINE - -$(O)allmain.o: $(NHS)allmain.c $(HDEP) - -$(O)alloc.o: $(NHS)alloc.c $(I)config.h - -$(O)apply.o: $(NHS)apply.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)apply.c - -$(O)artifact.o: $(NHS)artifact.c $(HDEP) $(I)artifact.h $(I)artilist.h - -$(O)attrib.o: $(NHS)attrib.c $(HDEP) $(I)artifact.h - -$(O)ball.o: $(NHS)ball.c $(HDEP) - -$(O)bones.o: $(NHS)bones.c $(HDEP) $(I)lev.h - -$(O)botl.o: $(NHS)botl.c $(HDEP) - -$(O)cmd.o: $(NHS)cmd.c $(HDEP) $(I)func_tab.h - -$(O)dbridge.o: $(NHS)dbridge.c $(HDEP) - -$(O)decl.o: $(NHS)decl.c $(HDEP) $(I)quest.h - -$(O)detect.o: $(NHS)detect.c $(HDEP) $(I)artifact.h - -$(O)dig.o: $(NHS)dig.c $(HDEP) - -$(O)display.o: $(NHS)display.c $(HDEP) - -$(O)dlb.o: $(NHS)dlb.c $(HDEP) $(I)dlb.h - -$(O)do.o: $(NHS)do.c $(HDEP) $(I)lev.h - -$(O)do_name.o: $(NHS)do_name.c $(HDEP) - -$(O)do_wear.o: $(NHS)do_wear.c $(HDEP) - -$(O)dog.o: $(NHS)dog.c $(HDEP) - -$(O)dogmove.o: $(NHS)dogmove.c $(HDEP) $(I)mfndpos.h - -$(O)dokick.o: $(NHS)dokick.c $(HDEP) - -$(O)dothrow.o: $(NHS)dothrow.c $(HDEP) - -$(O)drawing.o: $(NHS)drawing.c $(HDEP) $(I)tcap.h - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)drawing.c - -$(O)dungeon.o: $(NHS)dungeon.c $(HDEP) $(I)dgn_file.h $(I)dlb.h - -$(O)eat.o: $(NHS)eat.c $(HDEP) - -$(O)end.o: $(NHS)end.c $(HDEP) $(I)lev.h $(I)dlb.h - -$(O)engrave.o: $(NHS)engrave.c $(HDEP) $(I)lev.h - -$(O)exper.o: $(NHS)exper.c $(HDEP) - -$(O)explode.o: $(NHS)explode.c $(HDEP) - -$(O)extralev.o: $(NHS)extralev.c $(HDEP) - -$(O)files.o: $(NHS)files.c $(HDEP) $(I)dlb.h $(I)date.h - -$(O)fountain.o: $(NHS)fountain.c $(HDEP) - -$(O)hack.o: $(NHS)hack.c $(HDEP) - -$(O)hacklib.o: $(NHS)hacklib.c $(HDEP) - -$(O)invent.o: $(NHS)invent.c $(HDEP) $(I)artifact.h - -$(O)light.o: $(NHS)light.c $(HDEP) $(I)lev.h - -$(O)lock.o: $(NHS)lock.c $(HDEP) - -$(O)mail.o: $(NHS)mail.c $(HDEP) $(I)mail.h - -$(O)makemon.o: $(NHS)makemon.c $(HDEP) - -$(O)mapglyph.o: $(NHS)mapglyph.c $(HDEP) - -$(O)mcastu.o: $(NHS)mcastu.c $(HDEP) - -$(O)mhitm.o: $(NHS)mhitm.c $(HDEP) $(I)artifact.h - -$(O)mhitu.o: $(NHS)mhitu.c $(HDEP) $(I)artifact.h - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)mhitu.c - -$(O)minion.o: $(NHS)minion.c $(HDEP) - -$(O)mklev.o: $(NHS)mklev.c $(HDEP) - -$(O)mkmap.o: $(NHS)mkmap.c $(HDEP) $(I)sp_lev.h - -$(O)mkmaze.o: $(NHS)mkmaze.c $(HDEP) $(I)sp_lev.h $(I)lev.h - -$(O)mkobj.o: $(NHS)mkobj.c $(HDEP) $(I)artifact.h $(I)prop.h - -$(O)mkroom.o: $(NHS)mkroom.c $(HDEP) - -$(O)mon.o: $(NHS)mon.c $(HDEP) $(I)mfndpos.h - -$(O)mondata.o: $(NHS)mondata.c $(HDEP) - -$(O)monmove.o: $(NHS)monmove.c $(HDEP) $(I)mfndpos.h $(I)artifact.h - -$(O)monst.o: $(NHS)monst.c $(I)config.h $(I)permonst.h $(I)monsym.h \ - $(I)color.h - -$(O)monstr.o: $(NHS)monstr.c $(HDEP) - -$(O)mplayer.o: $(NHS)mplayer.c $(HDEP) - -$(O)mthrowu.o: $(NHS)mthrowu.c $(HDEP) - -$(O)muse.o: $(NHS)muse.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)muse.c - -$(O)music.o: $(NHS)music.c $(HDEP) #interp.c - -$(O)o_init.o: $(NHS)o_init.c $(HDEP) $(I)lev.h - -$(O)objects.o: $(NHS)objects.c $(I)config.h $(I)obj.h $(I)objclass.h \ - $(I)prop.h $(I)skills.h $(I)color.h - $(CC) $(CFLAGS) $(INCLSPEC)$(NHS) $(OBJSPEC)$@ $(NHS)objects.c - -$(O)objnam.o: $(NHS)objnam.c $(HDEP) - -$(O)options.o: $(NHS)options.c $(HDEP) $(I)tcap.h $(I)config.h \ - $(I)objclass.h $(I)flag.h - -$(O)pager.o: $(NHS)pager.c $(HDEP) $(I)dlb.h - -$(O)pickup.o: $(NHS)pickup.c $(HDEP) - -$(O)pline.o: $(NHS)pline.c $(HDEP) - -$(O)polyself.o: $(NHS)polyself.c $(HDEP) - -$(O)potion.o: $(NHS)potion.c $(HDEP) - -$(O)pray.o: $(NHS)pray.c $(HDEP) - -$(O)priest.o: $(NHS)priest.c $(HDEP) $(I)mfndpos.h - -$(O)quest.o: $(NHS)quest.c $(HDEP) $(I)quest.h $(I)qtext.h - -$(O)questpgr.o: $(NHS)questpgr.c $(HDEP) $(I)qtext.h $(I)dlb.h - -$(O)read.o: $(NHS)read.c $(HDEP) - -$(O)rect.o: $(NHS)rect.c $(HDEP) - -$(O)region.o: $(NHS)region.c $(HDEP) - -$(O)restore.o: $(NHS)restore.c $(HDEP) $(I)lev.h $(I)tcap.h $(I)quest.h - -$(O)rnd.o: $(NHS)rnd.c $(HDEP) - -$(O)role.o: $(NHS)role.c $(HDEP) - -$(O)rumors.o: $(NHS)rumors.c $(HDEP) $(I)dlb.h - -$(O)save.o: $(NHS)save.c $(HDEP) $(I)lev.h $(I)quest.h - -$(O)shk.o: $(NHS)shk.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)shk.c - -$(O)shknam.o: $(NHS)shknam.c $(HDEP) - -$(O)sit.o: $(NHS)sit.c $(HDEP) $(I)artifact.h - -$(O)sounds.o: $(NHS)sounds.c $(HDEP) - -$(O)sp_lev.o: $(NHS)sp_lev.c $(HDEP) $(I)sp_lev.h $(I)rect.h $(I)dlb.h - -$(O)spell.o: $(NHS)spell.c $(HDEP) - -$(O)steal.o: $(NHS)steal.c $(HDEP) - -$(O)steed.o: $(NHS)steed.c $(HDEP) - -$(O)sys.o: $(NHS)sys.c $(HDEP) - -$(O)teleport.o: $(NHS)teleport.c $(HDEP) - -$(O)timeout.o: $(NHS)timeout.c $(HDEP) $(I)lev.h - -$(O)topten.o: $(NHS)topten.c $(HDEP) $(I)dlb.h - -$(O)track.o: $(NHS)track.c $(HDEP) - -$(O)trap.o: $(NHS)trap.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)trap.c - -$(O)u_init.o: $(NHS)u_init.c $(HDEP) - -$(O)uhitm.o: $(NHS)uhitm.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)uhitm.c - -$(O)vault.o: $(NHS)vault.c $(HDEP) - -$(O)version.o: $(NHS)version.c $(HDEP) $(I)date.h $(I)patchlevel.h - -$(O)vision.o: $(NHS)vision.c $(HDEP) #$(I)vis_tab.h - -$(O)weapon.o: $(NHS)weapon.c $(HDEP) - -$(O)were.o: $(NHS)were.c $(HDEP) - -$(O)wield.o: $(NHS)wield.c $(HDEP) - -$(O)windows.o: $(NHS)windows.c $(HDEP) $(I)wintty.h - -$(O)wizard.o: $(NHS)wizard.c $(HDEP) $(I)qtext.h - -$(O)worm.o: $(NHS)worm.c $(HDEP) $(I)lev.h - -$(O)worn.o: $(NHS)worn.c $(HDEP) - -$(O)write.o: $(NHS)write.c $(HDEP) - -$(O)zap.o: $(NHS)zap.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)zap.c - -$(O)getline.o: $(TTY)getline.c $(HDEP) $(I)wintty.h - -$(O)termcap.o: $(TTY)termcap.c $(HDEP) $(I)wintty.h $(I)tcap.h - -$(O)topl.o: $(TTY)topl.c $(HDEP) $(I)wintty.h $(I)tcap.h - -$(O)wintty.o: $(TTY)wintty.c $(HDEP) $(I)wintty.h $(I)tcap.h \ - $(I)date.h $(I)patchlevel.h - -$(O)amitty.o: $(AMI)amitty.c $(HDEP) - -$(O)amistack.o: $(AMI)amistack.c - $(CC) $(CFLAGS3) $(CSYM) $(OBJSPEC)$@ $(AMI)amistack.c - -$(O)rip.o: $(NHS)rip.c $(HDEP) - - -$(I)config.h: $(I)config1.h $(I)tradstdc.h $(I)global.h - -setdate $(I)config.h - -c:wait 2 - -# onames.h handled at onames.h target, pm.h - -$(I)decl.h: $(I)quest.h $(I)spell.h $(I)color.h $(I)obj.h $(I)you.h - -setdate $(I)decl.h - -c:wait 2 - -$(I)global.h: $(I)coord.h $(I)pcconf.h $(I)amiconf.h - -setdate $(I)global.h - -c:wait 2 - -$(I)hack.h: $(I)config.h $(I)context.h $(I)trap.h $(I)decl.h $(I)dungeon.h - $(I)monsym.h $(I)mkroom.h $(I)objclass.h $(I)flag.h $(I)rm.h - $(I)vision.h $(I)display.h $(I)wintype.h $(I)engrave.h - $(I)rect.h $(I)region.h $(I)trampoli.h $(I)sys.h - -setdate $(I)hack.h - -c:wait 2 - -$(I)permonst.h: $(I)monattk.h $(I)monflag.h $(I)align.h - -setdate $(I)permonst.h - -c:wait 2 - -$(I)you.h: $(I)align.h $(I)attrib.h $(I)monst.h $(I)mextra.h $(I)youprop.h $(I)skills.h - -setdate $(I)you.h - -c:wait 2 - -# pm.h handled at target - -$(I)youprop.h: $(I)prop.h $(I)permonst.h $(I)mondata.h - -setdate $(I)youprop.h - -c:wait 2 - -$(I)display.h: $(I)vision.h $(I)mondata.h - -setdate $(I)display.h - -c:wait 2 - -$(I)dungeon.h: $(I)align.h - -setdate $(I)dungeon.h - -c:wait 2 - -$(I)engrave.h: $(I)trampoli.h $(I)rect.h - -setdate $(I)engrave.h - -c:wait 2 - -$(I)mextra.h: $(I)align.h - -setdate $(I)mextra.h - -c:wait 2 - -$(I)mondata.h: $(I)align.h - -setdate $(I)mondata.h - -c:wait 2 - -$(I)monst.h: $(I)align.h $(I)mextra.h - -setdate $(I)monst.h - -c:wait 2 - -$(I)pcconf.h: $(I)micro.h $(I)system.h - -setdate $(I)pcconf.h - -c:wait 2 - -$(I)rm.h: $(I)align.h - -setdate $(I)rm.h - -c:wait 2 - - -#notes -# install keeps doing re-install because it keeps rebuilding lev_comp??? -# fixed(?) - deleted setdate diff --git a/sys/amiga/Makefile.ami b/sys/amiga/Makefile.ami deleted file mode 100644 index 14b12986a..000000000 --- a/sys/amiga/Makefile.ami +++ /dev/null @@ -1,1666 +0,0 @@ -# NetHack Makefile. -# Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991,1992,1993,1996. -# NetHack may be freely redistributed. See license for details. - -### -### INTRODUCTION -### - -# This makefile is arranged for compiling for the Amiga with SAS/C 6.51 but -# can be configured for compiling with Manx C 5 or commercial DICE with -# simple changes. The appropriate changes are identified by #[compiler] -# where compiler is one of: SAS6, MANX, or DICE; the options in this -# makefile as should be set according to the compiler being used. (But see -# note 3 below.) - -# Note: When using the Manx compiler, an alternate make utility is -# required. The bundled Aztec make is just too damaged. - -# Note 2: The #SFD_xxx lines are used with mkdmake to generate a DMake- -# compatible makefile (DMakefile) from this file. Any line beginning with -# #SFD_INSTEAD replaces, in DMakefile, the following line from Makefile.ami. -# #SFD_BEGIN, #SFD_ELSE, and #SFD_END bracket multi-line sections for the two -# makefile formats. -# When changing this file, #SFD_INSTEAD lines will need to be inserted for -# the following cases: -# - Dependencies with different numbers of filenames (both > 1) on -# either side. The #SFD_INSTEAD line should immediately precede -# the line with the colon, and should contain a double colon "::" -# instead of a single colon. -# - Special command lists that override the default. A line containing -# "#SFD_INSTEAD #none" should precede such a rule. If the rule is -# more than one line long, precede it with "#SFD_BEGIN" and -# "#SFD_ELSE", and follow it with "#SFD_END". -# - Files not in the src, sys/amiga, sys/share, or win/tty directories -# that rely on the default ".c.o" rule. Following the dependency -# should be "#SFD_INSTEAD " with the filename inserted -# into the default rule where appropriate, then a line contianing -# "#none". -# In any SFD_BEGIN/ELSE/END block added, put a '##' before every line -# between the BEGIN and ELSE. Any line that's really a comment needs three -# '#'s, e.g. "### DICE comment". - -# Note 2A: Whenever an SFD line/block is added, the appropriate repeat count -# in mkdmake must be changed. (The repeat count "0" meaning "repeat -# until end of file" doesn't work as advertised.) - -# Note 3: mkdmake will automatically substitute DICE flags, etc. for SAS -# where appropriate. Since the makefile is already set up for SAS, -# the only people who end up having to make changes here are Manx -# users (or people who want to change the defaults). - -### -### DIRECTORY STRUCTURE -### - -NH = NH: -SBIN = $(NH)sbin/ -SLIB = $(NH)slib/ -NETHACK = $(NH)NetHack/ -HACKEXE = $(NH)HackExe/ -AMI = $(NH)sys/amiga/ -DAT = $(NH)dat/ -DOC = $(NH)doc/ -I = $(NH)include/ -SHARE = $(NH)sys/share/ -NHS = $(NH)src/ -TTY = $(NH)win/tty/ -WSHARE = $(NH)win/share/ -UTIL = $(NH)util/ -O = $(NH)obj/ -OO = $(NH)objo/ -# NB: O and OO MUST be different directories - -### -### INVOCATION -### - -#[SAS6] -#MAKE = smake -#[MANX] -#MAKE = make -#[DICE] -#MAKE = dmake - -# Startup makefile with: -# -#[SAS6] -#[MANX] -# $(MAKE) -f $(AMI)Makefile.ami -# $(MAKE) -f $(AMI)Makefile.ami install -# -#[DICE] -# $(MAKE) -f $(AMI)DMakefile -# $(MAKE) -f $(AMI)DMakefile install -# -# -# You may use following targets on $(MAKE) command lines: -# all do it all (default) -# link just create binary from object files -# obj just create common object files -# obja just create amiga object files -# objs just create shared object files -# clean deletes the object files -# spotless deletes the object files, main binary, and more -# -# Note: We do not build the Guidebook here since it needs tbl -# (See the file sys/unix/Makefile.doc for more information) - -#X# Precompiled header files: -#X# $(HDEP) should appear in any dependency list for an object file where -#X# we would want to make use of the precompiled version of $(I)hack.h, -#X# while $(CSYM) should appear in the C compiler command line that creates -#X# any such object file. (Changes made here should agree with the $(HDEP): -#X# target that appears later in this makefile.) -#X# - -#SFD_BEGIN -## -###[DICE] -### If we were compiling with DICE and wanted to use the symbol table -### pre-loading feature, we would uncomment these following two lines. -## -##HDEP = $(I)hack.sym -##CSYM = -H$(I)hack.sym=hack.h -## -#SFD_ELSE - -#[SAS5] -# If we were to use the precompiled header file feature in a newer version -# of SAS/C, we would comment out these following two lines. -# If we don't use precompiled header files, we uncomment it as well. - -HDEP = $(I)hack.h $(I)pm.h $(I)onames.h -CSYM = - -#[MANX] -# If we were compiling with Aztec, and wanted to use the symbol table -# pre-loading feature, we would uncomment these following two lines. - -#HDEP = Ram:hack.sym -#CSYM = +IRam:hack.sym - -#SFD_END - -#Pathname for uudecode program: -UUDEC = uudecode - -# Flex/Bison command assignments -- Useful only if you have flex/bison -FLEX = flex -BISON = bison -# FBFIL and FBLIB may be used, if required by your version of flex or bison, -# to specify additional files or libraries to be linked with -FBFIL = -FBLIB = #lib lib:compat.lib - -# If you're compiling this on a 1.3 system, you'll have to uncomment the -# following (for use with the ifchange script below). Also useful instead of -# "protect ifchange +s" -EXECUTE = execute - -# Headers we depend on -AMDEP = $(AMI)winproto.h $(AMI)winext.h $(AMI)windefs.h $(I)winami.h - -# Pathname for the C compiler being used. - -#SFD_BEGIN -## -###[DICE] -##CC = dcc -##ASM = das -## -#SFD_ELSE - -#[SAS6] -CC = sc -ASM = asm - -#[MANX] -#CC = cc - -#SFD_END - -# Compilation flags for selected C Compiler: -# $(CFLAGS) should appear before filename arguments of $(CC) command line. - -#SFD_BEGIN -## -###[DICE] -##CFLAGS = -c -I$(I) -mC -mD -ms -// -##CFLAGS2 = -##WBCFLAGS = -c -I$(I) -mC -mD -ms -// -##WBC2FLAGS = -DCLI -##SPLFLAGS = -DSPLIT -## -#SFD_ELSE - -#[SAS6] -# Note: make sure your CLI stack size is large (at least 50K) or lev_comp -# and makedefs may fail terribly - stack checking is disabled. -# -# **** WARNING **** GST support is not fool proof. You must make makedefs -# without a GST first so that the generated headers -# that are part of the GST can be made. -# -#GSTSRC=$(AMI)gst.c -# -#GSTHEAD=$(I)hack.h $(I)pm.h $(I)trap.h $(I)onames.h \ -# $(AMI)winami.p $(AMI)amidos.p $(AMI)amiwind.p -# -#GSTFILE=$(O)NetHack.gst -# undefine this to not compile with GSTs -#GST=gst=$(GSTFILE) -# -DEBUG=debug=symbol -CPU=cpu=68000 -#OPTFLAGS=opt opttime optpeep optgo optinl optsched optcomp=10 optdep=5 optrdep=5 #optalias +OPTTIME -OPTSIZE -CFLAGS = data=far nominc $(DEBUG) idir=$(I) $(CPU) nostkchk nover \ - codename=nhcode dataname=nhdata strmerge $(OPTFLAGS) $(TILES) $(SAVEDS) \ - afp $(ERRREXX) $(GST) -# for files that are too large for the standard flags: -CFLAGS2 = code=far strmerge $(SAVEDS) -WBCFLAGS = ignore=217,62 data=far ansi nminc code=far idir=$(I) $(CPU) afp \ - $(DEBUG) $(ERRREXX) define=AMIGA $(GST) -XXX = data=far ansi nminc idir=$(I) $(CPU) afp opt optinline optinlocal \ - optloop opttime -WBC2FLAGS = define=CLI -SPLFLAGS = define=SPLIT #dollarok -#for amistack.c -CFLAGS3 = data=near dataname=__MERGED nominc $(DEBUG) idir=$(I) $(CPU) nover nostkchk \ - codename=nhcode strmerge $(OPTFLAGS) $(TILES) $(SAVEDS) \ - afp $(ERRREXX) $(GST) - -#[MANX] -#CFLAGS = -i$(I) -mc -md -ms -pa -ps -bs -wo -qq -#WBCFLAGS = -mc -md -ms -pa -ps -bs -wo -qq -pp - -#SFD_END - -# Assembly flags: - -#SFD_BEGIN -## -###[DICE] -##AFLAGS = -##AOBJSPEC = -o -## -#SFD_ELSE - -#[SAS6] -AFLAGS = #what to put here? -AOBJSPEC = -o - -#SFD_END - -# Components of various link command lines: -# $(LINK) should be the pathname of the linker being used (with any options -# that should appear at the beginning of the command line). The name of the -# output file should appear immediately after $(LNSPEC). $(LIN) should -# appear before the list of object files in each link command. $(LLINK) -# should appear as the list of object files in the link command line that -# creates the NetHack executable. $(LLIB) should appear at the end of each -# link command line. - -# Note: amiga.lib added due to missing prototypes/pragmas. -# Should be deleted when this is resolved. - -#SFD_BEGIN -## -###[DICE] -### If you have flex/bison libraries, use the second definition of FLLIB -### instead of the first. -## -##LINK = dcc -mD -##LIN = -##LLINK = @$(AMI)ami.lnk -##LLIB = -##FLLIB = -###FLLIB = -l$(FBLIB) -##OBJSPEC = -o -##PNSPEC = -o -##LNSPEC = -o -##CCLINK = dcc -##CLFLAGS = -I$(I) -mC -mD -ms -// -##INCLSPEC = -I -##DEFSPEC = -D -##IGNSPEC = -j -## -#SFD_ELSE - -#[SAS6] - -LINK = slink noicons verbose maxhunk 262144 stripdebug -LIN = from lib:catch.o -LLINK = with $(AMI)ami.lnk -LLIB = lib lib:scnb.lib BATCH #lib lib:amiga.lib BATCH #scnb.lib or sc.lib -FLLIB = $(FBLIB) lib Lib:sc.lib BATCH -OBJSPEC = objname= -PNSPEC = noicons to #pname= -LNSPEC = to -CCLINK = sc link -INCLSPEC = idir= -DEFSPEC = define= -IGNSPEC = ignore= -COMPACT_HEADERS=$(GSTFILE) - -#[MANX] - -#LINK = ln -g +q +ss -o -#LIN = -#LLINK = -f $(AMI)ami.lnk -#LLIB = -lcl16 -#FLLIB = -lcl16 -#OBJSPEC = -o -#PNSPEC = -o -#LNSPEC = -o -#CCLINK = cc -#INCLSPEC = -i -#DEFSPEC = -d -#IGNSPEC = -j - -#SFD_END - -### -### FILE LISTS -### - -# A more reasonable random number generator (recommended for the Amiga): - -RANDOBJ = $(O)random.o - -#SFD_INSTEAD #none -.PRECIOUS: $(I)config.h $(I)decl.h $(I)hack.h $(I)permonst.h $(I)you.h - -# Almost nothing below this line should have to be changed. -# (Exceptions are marked by [SAS6], [MANX], etc.) -# -# Other things that have to be reconfigured are in config.h, -# (amiconf.h, pcconf.h), and possibly system.h, tradstdc.h. - -# Object files for makedefs: - -MAKEOBJS = \ - $(OO)makedefs.o $(O)monst.o $(O)objects.o - -# Object files for special levels compiler: - -SPLEVOBJS = \ - $(OO)lev_yacc.o $(OO)lev_lex.o $(OO)lev_main.o \ - $(O)decl.o $(O)drawing.o $(O)monst.o \ - $(O)objects.o $(OO)panic.o - -# Object files for dungeon compiler - -DGNCOMPOBJS = \ - $(OO)dgn_yacc.o $(OO)dgn_lex.o $(OO)dgn_main.o $(O)alloc.o $(OO)panic.o - -# Object files for NetHack: - -COMMOBJ = \ - $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o \ - $(O)attrib.o $(O)ball.o $(O)bones.o $(O)botl.o \ - $(O)cmd.o $(O)dbridge.o $(O)decl.o $(O)detect.o \ - $(O)dig.o $(O)display.o $(O)dlb.o $(O)do.o \ - $(O)do_name.o $(O)do_wear.o $(O)dog.o $(O)dogmove.o \ - $(O)dokick.o $(O)dothrow.o $(O)drawing.o $(O)dungeon.o \ - $(O)eat.o $(O)end.o $(O)engrave.o $(O)exper.o \ - $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o \ - $(O)hack.o $(O)hacklib.o $(O)invent.o $(O)light.o \ - $(O)lock.o $(O)mail.o $(O)makemon.o $(O)mapglyph.o \ - $(O)mcastu.o $(O)mhitm.o $(O)mhitu.o $(O)minion.o \ - $(O)mklev.o $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o \ - $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o \ - $(O)monst.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o \ - $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o \ - $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o \ - $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o \ - $(O)quest.o $(O)questpgr.o $(O)read.o $(O)rect.o \ - $(O)region.o $(O)restore.o $(O)rnd.o $(O)role.o \ - $(O)rumors.o $(O)save.o $(O)shk.o $(O)shknam.o \ - $(O)sit.o $(O)sounds.o $(O)sp_lev.o $(O)spell.o \ - $(O)steal.o $(O)steed.o $(O)sys.o $(O)teleport.o \ - $(O)timeout.o $(O)topten.o $(O)track.o $(O)trap.o \ - $(O)u_init.o $(O)uhitm.o $(O)vault.o $(O)version.o \ - (O)vision.o $(O)weapon.o $(O)were.o $(O)wield.o \ - $(O)windows.o $(O)wizard.o $(O)worm.o $(O)worn.o \ - $(O)write.o $(O)zap.o - -MAKEDEFOBJ = \ - $(O)monstr.o - -AMIGAOBJ = \ - $(O)amidos.o $(O)amirip.o $(O)amisnd.o $(O)amistack.o \ - $(O)amiwind.o $(O)winami.o $(O)winchar.o $(O)winfuncs.o \ - $(O)winkey.o $(O)winmenu.o $(O)winreq.o $(O)winstr.o - -# Objects from assembly sources (because DMake can't handle default rules) -AMIGAOBJ2 = \ -# $(O)dispmap.o - -SHAREOBJ = \ - $(O)pcmain.o $(RANDOBJ) - -TTYOBJ = \ - $(O)getline.o $(O)termcap.o $(O)topl.o $(O)wintty.o $(O)amitty.o \ - $(O)rip.o - -# Yuck yuck yuck. Have to tell DMake where these are, since they're not -# all in the same place. -TTYSRC = \ - $(TTY)getline.c $(TTY)termcap.c $(TTY)topl.c $(TTY)wintty.c \ - $(AMI)amitty.c $(NHS)rip.c - -# All the object files for NetHack: - -HOBJ = $(COMMOBJ) $(AMIGAOBJ) $(AMIGAOBJ2) $(SHAREOBJ) $(MAKEDEFOBJ) $(TTYOBJ) - -### -### DATA FILES -### - -# quest files -ADFILES1= $(SLIB)Arc-fila.lev $(SLIB)Arc-filb.lev $(SLIB)Arc-loca.lev \ - $(SLIB)Arc-strt.lev -ADFILES= $(SLIB)Arc-goal.lev $(ADFILES1) - -BDFILES1= $(SLIB)Bar-fila.lev $(SLIB)Bar-filb.lev $(SLIB)Bar-loca.lev \ - $(SLIB)Bar-strt.lev -BDFILES= $(SLIB)Bar-goal.lev $(BDFILES1) - -CDFILES1= $(SLIB)Cav-fila.lev $(SLIB)Cav-filb.lev $(SLIB)Cav-loca.lev \ - $(SLIB)Cav-strt.lev -CDFILES= $(SLIB)Cav-goal.lev $(CDFILES1) - -HDFILES1= $(SLIB)Hea-fila.lev $(SLIB)Hea-filb.lev $(SLIB)Hea-loca.lev \ - $(SLIB)Hea-strt.lev -HDFILES= $(SLIB)Hea-goal.lev $(HDFILES1) - -KDFILES1= $(SLIB)Kni-fila.lev $(SLIB)Kni-filb.lev $(SLIB)Kni-loca.lev \ - $(SLIB)Kni-strt.lev -KDFILES= $(SLIB)Kni-goal.lev $(KDFILES1) - -MDFILES1= $(SLIB)Mon-fila.lev $(SLIB)Mon-filb.lev $(SLIB)Mon-loca.lev \ - $(SLIB)Mon-strt.lev -MDFILES= $(SLIB)Mon-goal.lev $(MDFILES1) - -PDFILES1= $(SLIB)Pri-fila.lev $(SLIB)Pri-filb.lev $(SLIB)Pri-loca.lev \ - $(SLIB)Pri-strt.lev -PDFILES= $(SLIB)Pri-goal.lev $(PDFILES1) - -RDFILES1= $(SLIB)Rog-fila.lev $(SLIB)Rog-filb.lev $(SLIB)Rog-loca.lev \ - $(SLIB)Rog-strt.lev -RDFILES= $(SLIB)Rog-goal.lev $(RDFILES1) - -RANFILES1= $(SLIB)Ran-fila.lev $(SLIB)Ran-filb.lev $(SLIB)Ran-loca.lev \ - $(SLIB)Ran-strt.lev -RANFILES= $(SLIB)Ran-goal.lev $(RANFILES1) - -SDFILES1= $(SLIB)Sam-fila.lev $(SLIB)Sam-filb.lev $(SLIB)Sam-loca.lev \ - $(SLIB)Sam-strt.lev -SDFILES= $(SLIB)Sam-goal.lev $(SDFILES1) - -TDFILES1= $(SLIB)Tou-fila.lev $(SLIB)Tou-filb.lev $(SLIB)Tou-loca.lev \ - $(SLIB)Tou-strt.lev -TDFILES= $(SLIB)Tou-goal.lev $(TDFILES1) - -VDFILES1= $(SLIB)Val-fila.lev $(SLIB)Val-filb.lev $(SLIB)Val-loca.lev \ - $(SLIB)Val-strt.lev -VDFILES= $(SLIB)Val-goal.lev $(VDFILES1) - -WDFILES1= $(SLIB)Wiz-fila.lev $(SLIB)Wiz-filb.lev $(SLIB)Wiz-loca.lev \ - $(SLIB)Wiz-strt.lev -WDFILES= $(SLIB)Wiz-goal.lev $(WDFILES1) - -XDFILES= $(ADFILES) $(BDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \ - $(MDFILES) $(PDFILES) $(RDFILES) $(RANFILES) $(SDFILES) $(TDFILES) \ - $(VDFILES) $(WDFILES) - -SOUNDFILES= \ - $(SBIN)cvtsnd \ - $(SLIB)sounds \ - $(SLIB)sounds/Bell $(SLIB)sounds/Bugle \ - $(SLIB)sounds/Drum_Of_Earthquake \ - $(SLIB)sounds/Fire_Horn $(SLIB)sounds/Frost_Horn \ - $(SLIB)sounds/Leather_Drum $(SLIB)sounds/Magic_Flute \ - $(SLIB)sounds/Magic_Harp $(SLIB)sounds/Tooled_Horn \ - $(SLIB)sounds/Wooden_Flute $(SLIB)sounds/Wooden_Harp - -TILEFILES= \ - $(SBIN)txt2iff \ - $(NETHACK)tiles \ - $(NETHACK)tiles/objects.iff \ - $(NETHACK)tiles/monsters.iff \ - $(NETHACK)tiles/other.iff - -INSTDUNGEONFILES1= \ - $(SLIB)air.lev $(SLIB)asmodeus.lev $(SLIB)astral.lev \ - $(SLIB)baalz.lev $(SLIB)bigrm-1.lev $(SLIB)bigrm-2.lev \ - $(SLIB)bigrm-3.lev $(SLIB)bigrm-4.lev $(SLIB)bigrm-5.lev \ - $(SLIB)castle.lev $(SLIB)dungeon $(SLIB)earth.lev \ - $(SLIB)fakewiz1.lev $(SLIB)fakewiz2.lev $(SLIB)fire.lev \ - $(SLIB)juiblex.lev $(SLIB)knox.lev $(SLIB)medusa-1.lev \ - $(SLIB)medusa-2.lev $(SLIB)minend-1.lev $(SLIB)minend-2.lev \ - $(SLIB)minetn-1.lev $(SLIB)minetn-2.lev $(SLIB)minefill.lev \ - $(SLIB)options $(SLIB)oracle.lev $(SLIB)orcus.lev \ - $(SLIB)sanctum.lev $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev \ - $(SLIB)soko2-1.lev $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev \ - $(SLIB)soko3-2.lev $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev \ - $(SLIB)tower1.lev $(SLIB)tower2.lev $(SLIB)tower3.lev \ - $(SLIB)valley.lev $(SLIB)water.lev $(SLIB)wizard1.lev \ - $(SLIB)wizard2.lev $(SLIB)wizard3.lev \ - $(XDFILES) - -INSTDUNGEONFILES= $(NETHACK)NetHack.cnf $(INSTDUNGEONFILES1) - - -INSTDATAFILES= \ - $(NETHACK)license $(NETHACK)logfile $(NETHACK)record \ - $(NETHACK)tomb.iff $(NETHACK)amii.hlp $(NETHACK)Recover.txt \ - $(NETHACK)GuideBook.txt $(NETHACK)NetHack.txt $(NETHACK)Install.ami - -LIBFILES= \ - $(INSTDUNGEONFILES1) \ - $(SLIB)cmdhelp $(SLIB)data $(SLIB)dungeon \ - $(SLIB)help $(SLIB)hh $(SLIB)history \ - $(SLIB)opthelp $(SLIB)oracles $(SLIB)rumors \ - $(SLIB)quest.dat $(SLIB)wizhelp - -### -### Getting down to business: -### - -#SFD_INSTEAD all: $(SBIN)lev_comp $(SBIN)dgn_comp $(SBIN)NetHack \ -all: $(COMPACT_HEADERS) $(SBIN)lev_comp $(SBIN)dgn_comp $(SBIN)NetHack \ - $(SBIN)dlb $(NETHACK)recover - -install: all inst-data inst-dungeon inst-fonts inst-sounds inst-tiles \ - $(NETHACK)nhdat $(NETHACK)NetHack - -$(SBIN)NetHack: $(HOBJ) $(AMI)ami.lnk - $(LINK) $(LNSPEC) $(SBIN)NetHack $(LIN) $(LLINK) $(LLIB) - -$(NETHACK)NetHack: $(SBIN)NetHack - copy $(SBIN)NetHack $(NETHACK)NetHack - -link: - $(LINK) $(LNSPEC) $(SBIN)NetHack $(LIN) $(LLINK) $(LLIB) - -$(AMI)ami.lnk: $(AMI)Makefile.ami - list to $(AMI)ami.lnk lformat="$(O)%s" $(O)\#?.o QUICK NOHEAD - -## dlb support -$(OO)dlb_main.o: $(UTIL)dlb_main.c $(HDEP) $(I)dlb.h $(I)date.h - $(CC) $(CFLAGS) $(OBJSPEC)$(OO)dlb_main.o $(UTIL)dlb_main.c - -$(SBIN)dlb: $(OO)dlb_main.o $(O)dlb.o $(O)alloc.o $(OO)panic.o - $(LINK) $(PNSPEC) $(SBIN)dlb $(LIN) $(OO)dlb_main.o $(O)dlb.o \ - $(O)alloc.o $(OO)panic.o $(LLIB) - -obj: $(HOBJ) - -obja: $(AMIGAOBJ) - -objs: $(SHAREOBJ) - - -#SFD_BEGIN -#SFD_ELSE -SUFFIXES = .lev .des -.des.lev: - $(SBIN)lev_comp $< -#SFD_END - - -# The default method for creating object files: - -#SFD_BEGIN -## -###[DICE] -## -##$(COMMOBJ): $(COMMOBJ:"$(O)*.o":"$(NHS)%1.c") -## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) -## -##$(AMIGAOBJ): $(AMIGAOBJ:"$(O)*.o":"$(AMI)%1.c") -## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) -## -##$(SHAREOBJ): $(SHAREOBJ:"$(O)*.o":"$(SHARE)%1.c") -## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) -## -##$(TTYOBJ): $(TTYSRC) -## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) -## -#SFD_ELSE - -#[SAS6] - -.c.o: - $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)$@ $< - -#SFD_END - - -clean: - -delete $(O)\#?.o $(OO)\#?.o - -spotless: clean - -delete $(SBIN)NetHack $(SBIN)lev_comp $(SBIN)makedefs $(SBIN)dgn_comp - -delete $(SBIN)cvtsnd $(SBIN)dlb $(SBIN)txt2iff $(SBIN)splitter - -delete $(SBIN)tilemap - -delete $(SLIB)data $(SLIB)rumors - -delete $(SLIB)\#?.lev - -delete $(SLIB)dungeon - -delete $(SLIB)cmdhelp $(SLIB)help $(SLIB)hh $(SLIB)history - -delete $(SLIB)opthelp $(SLIB)options $(SLIB)oracles - -delete $(SLIB)quest.dat $(SLIB)wizhelp -# -delete $(SLIB)earth.lev $(SLIB)air.lev $(SLIB)fire.lev -# -delete $(SLIB)water.lev $(SLIB)astral.lev -# -delete $(SLIB)tower1.lev $(SLIB)tower2.lev $(SLIB)tower3.lev -# -delete $(SLIB)fakewiz1.lev $(SLIB)fakewiz2.lev -# -delete $(SLIB)medusa-1.lev $(SLIB)medusa-2.lev -# -delete $(SLIB)oracle.lev $(SLIB)wizard1.lev $(SLIB)wizard2.lev -# -delete $(SLIB)wizard3.lev $(DAT)dungeon.pdf $(SLIB)valley.lev -# -delete $(SLIB)minefill.lev -# -delete $(SLIB)minetn-1 $(SLIB)minetn-2 $(SLIB)minend-1 $(SLIB)minend-2 -# -delete $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev $(SLIB)soko2-1.lev -# -delete $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev $(SLIB)soko3-2.lev -# -delete $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev -# -delete $(ADFILES) -# -delete $(BDFILES) -# -delete $(CDFILES) -# -delete $(HDFILES) -# -delete $(KDFILES) -# -delete $(MDFILES) -# -delete $(PDFILES) -# -delete $(RDFILES) -# -delete $(RANFILES) -# -delete $(SDFILES) -# -delete $(TDFILES) -# -delete $(VDFILES) -# -delete $(WDFILES) - -delete $(I)onames.h $(I)pm.h $(I)date.h - -delete $(NHS)tile.c $(NHS)monstr.c - -delete $(I)tile.h -# -echo to $(I)onames.h "" noline -# -wait 2 -# -echo to $(I)pm.h "" noline -# -wait 2 -# -setdate $(UTIL)makedefs.c -# -wait 2 - -# Creating precompiled version of $(I)hack.h to save disk I/O. - -#SFD_BEGIN -## -###[DICE] -### If we were compiling with DICE and wanted to use the symbol table -### pre-loading feature, we would technically not need a rule to make the -### precompiled header file, because DCC handles this automatically; -### however, we must delete the precompiled header file if any of the -### includes change, and we need to create it manually because the -### sys/amiga sources, compiled first, define things differently than the -### main sources want them. -## -##$(HDEP): $(I)hack.h $(I)pm.h $(I)onames.h -## -delete $(I)hack.sym -## echo to Ram:hackincl.c "#include " -## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)Ram:hackincl.o Ram:hackincl.c -## -delete Ram:hackincl.c Ram:hackincl.o -## -#SFD_ELSE - -#X#[SAS5] -#X# If we were to use the precompiled header file feature of SAS/C, we -#X# would uncomment the following lines. (Also see defines for HDEP and -#X# CSYM near the beginning of this file, as these should be appropriately -#X# defined.) - -#X#$(HDEP): $(I)hack.h $(SBIN)makedefs -#X# echo to Ram:hackincl.c "#include <$(I)hack.h>" -#X# $(CC) $(CFLAGS) -ph $(OBJSPEC)$@ Ram:hackincl.c -#X# -delete Ram:hackincl.c - -#[MANX] -# If we were compiling with Aztec, and wanted to use the symbol table -# pre-loading feature, we would uncomment these following two lines. - -#$(HDEP): $(I)hack.h $(SBIN)makedefs -# $(CC) $(CFLAGS) -a $(OBJSPEC)Ram:hack.asm +h$@ $(I)hack.h -# -delete Ram:hack.asm - -#SFD_END - -# -# Please note: The dependency lines for the modules here are -# deliberately incorrect. Including "hack.h" in -# the dependency list would cause a dependency -# loop. -# - -$(SBIN)makedefs: $(MAKEOBJS) - $(LINK) $(LNSPEC) $(SBIN)makedefs $(LIN) $(MAKEOBJS) $(LLIB) - -$(OO)makedefs.o: $(UTIL)makedefs.c $(I)config.h $(I)permonst.h $(I)monsym.h \ - $(I)objclass.h $(I)patchlevel.h $(I)qtext.h $(I)artilist.h - $(CC) $(DEFSPEC)MAKEDEFS_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)makedefs.c - -$(SBIN)lev_comp: $(SPLEVOBJS) - $(LINK) $(LNSPEC) $(SBIN)lev_comp $(LIN) $(SPLEVOBJS) $(FBFIL) $(FLLIB) - -$(SBIN)dgn_comp: $(DGNCOMPOBJS) - $(LINK) $(LNSPEC) $(SBIN)dgn_comp $(LIN) $(DGNCOMPOBJS) $(FBFIL) $(FLLIB) - -$(OO)lev_yacc.o: $(UTIL)lev_yacc.c $(HDEP) $(I)sp_lev.h $(I)pm.h $(I)onames.h -# setdate $(UTIL)lev_yacc.c - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)PREFIX="NH:slib/" $(CFLAGS) \ - $(DEFSPEC)alloca=malloc $(OBJSPEC)$@ $(UTIL)lev_yacc.c - -$(OO)lev_lex.o: $(UTIL)lev_lex.c $(HDEP) $(I)lev_comp.h $(I)sp_lev.h - $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)lev_lex.c - -$(OO)lev_main.o: $(UTIL)lev_main.c $(HDEP) $(I)pm.h $(I)onames.h $(I)date.h - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ - $(UTIL)lev_main.c - -$(OO)dgn_yacc.o: $(UTIL)dgn_yacc.c $(HDEP) $(I)dgn_file.h $(I)patchlevel.h - $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(DEFSPEC)alloca=malloc \ - $(OBJSPEC)$@ $(UTIL)dgn_yacc.c - -$(OO)dgn_lex.o: $(UTIL)dgn_lex.c $(I)config.h $(I)dgn_comp.h $(I)dgn_file.h - $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)dgn_lex.c - -$(OO)dgn_main.o: $(UTIL)dgn_main.c $(I)config.h $(I)date.h - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ - $(UTIL)dgn_main.c - -$(OO)panic.o: $(UTIL)panic.c $(HDEP) -#SFD_INSTEAD $(CC) $(CFLAGS) $(OBJSPEC)%(left) $(UTIL)panic.c -#none - -$(OO)recover.o: $(UTIL)recover.c $(I)config.h $(I)date.h - $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ - $(UTIL)recover.c - -$(NETHACK)recover: $(OO)recover.o - $(LINK) $(LNSPEC) $(NETHACK)recover $(LIN) $(OO)recover.o $(LLIB) - -# [OPTION] -- If you have flex/bison, leave these uncommented. Otherwise, -# comment them out and be careful! (You're not guaranteed to have the most -# up to date *_comp.c, *_comp.h and *_lex.c) - -$(I)lev_comp.h: $(UTIL)lev_yacc.c $(I)patchlevel.h - -$(UTIL)lev_yacc.c: $(UTIL)lev_comp.y $(I)patchlevel.h - $(BISON) -d $(UTIL)lev_comp.y -# copy y.tab.c $(UTIL)lev_yacc.c -# copy y.tab.h $(I)lev_comp.h - copy $(UTIL)lev_comp.tab.c $(UTIL)lev_yacc.c - copy $(UTIL)lev_comp.tab.h $(I)lev_comp.h -# delete y.tab.c -# delete y.tab.h - delete $(UTIL)lev_comp.tab.c - delete $(UTIL)lev_comp.tab.h - -$(UTIL)lev_lex.c: $(UTIL)lev_comp.l $(I)patchlevel.h - $(FLEX) $(UTIL)lev_comp.l - copy lex.yy.c $(UTIL)lev_lex.c - delete lex.yy.c - -$(I)dgn_comp.h: $(UTIL)dgn_yacc.c $(I)patchlevel.h - -$(UTIL)dgn_yacc.c: $(UTIL)dgn_comp.y $(I)patchlevel.h - $(BISON) -d $(UTIL)dgn_comp.y -# copy y.tab.c $(UTIL)dgn_yacc.c -# copy y.tab.h $(I)dgn_comp.h - copy $(UTIL)dgn_comp.tab.c $(UTIL)dgn_yacc.c - copy $(UTIL)dgn_comp.tab.h $(I)dgn_comp.h -# delete y.tab.c -# delete y.tab.h - delete $(UTIL)dgn_comp.tab.c - delete $(UTIL)dgn_comp.tab.h - -$(UTIL)dgn_lex.c: $(UTIL)dgn_comp.l $(I)patchlevel.h - $(FLEX) $(UTIL)dgn_comp.l - copy lex.yy.c $(UTIL)dgn_lex.c - delete lex.yy.c - -# -# The following include files depend on makedefs to be created. -# As a result, they are not defined in HACKINCL, instead, their -# dependencies are explicitly outlined here. -# - -# -# date.h should be remade any time any of the source or include code -# is modified. Unfortunately, this would make the contents of this -# file far more complex. Since "hack.h" depends on most of the include -# files, we kludge around this by making date.h dependent on hack.h, -# even though it doesn't include this file. -# - -#SFD_INSTEAD $(I)date.h $(DAT)options:: $(HDEP) $(SBIN)makedefs $(AMIGAOBJ) -$(I)date.h $(DAT)options: $(HDEP) $(SBIN)makedefs $(AMIGAOBJ) $(I)patchlevel.h - $(SBIN)makedefs -v - $(EXECUTE) $(AMI)ifchange MOVE $(I)t.date.h $(I)date.h - -wait 2 - -$(I)onames.h: $(SBIN)makedefs - $(SBIN)makedefs -o - $(EXECUTE) $(AMI)ifchange TOUCH $(I)t.onames.h $(I)onames.h $(I)decl.h - $(EXECUTE) $(AMI)ifchange MOVE $(I)t.onames.h $(I)onames.h - -wait 2 - -$(I)pm.h: $(SBIN)makedefs - $(SBIN)makedefs -p - $(EXECUTE) $(AMI)ifchange TOUCH $(I)t.pm.h $(I)pm.h $(I)decl.h $(I)youprop.h - $(EXECUTE) $(AMI)ifchange MOVE $(I)t.pm.h $(I)pm.h - -wait 2 - -$(SLIB)quest.dat: $(DAT)quest.txt $(SBIN)makedefs - $(SBIN)makedefs -q - -$(NHS)monstr.c: $(HDEP) $(SBIN)makedefs - $(SBIN)makedefs -m - -wait 2 - -$(SLIB)oracles: $(DAT)oracles.txt $(SBIN)makedefs - $(SBIN)makedefs -h - -wait 2 - -# -# The following programs vary depending on what OS you are using. -# As a result, they are not defined in HACKSRC and their dependencies -# are explicitly outlined here. -# - -$(O)amidos.o: $(AMI)amidos.c $(HDEP) - -$(O)amirip.o: $(AMI)amirip.c $(HDEP) - -$(O)aglue.o: $(AMI)aglue.a - $(ASM) $(AFLAGS) $(AOBJSPEC)$(O)aglue.o $(AMI)aglue.a - -$(O)amisnd.o: $(AMI)amisnd.c $(HDEP) - -$(O)winchar.o: $(AMI)winchar.c $(NHS)tile.c $(HDEP) - -$(NHS)tile.c: $(WSHARE)tilemap.c -#SFD_INSTEAD $(CCLINK) $(CLFLAGS) $(PNSPEC) $(SBIN)tilemap $(WSHARE)tilemap.c - $(CCLINK) $(CFLAGS) $(PNSPEC) $(SBIN)tilemap $(WSHARE)tilemap.c - $(SBIN)tilemap - -$(O)winstr.o: $(AMI)winstr.c $(HDEP) $(AMDEP) - -$(O)winreq.o: $(AMI)winreq.c $(HDEP) $(AMDEP) $(AMI)colorwin.c $(AMI)clipwin.c - -$(O)winfuncs.o: $(AMI)winfuncs.c $(HDEP) $(AMDEP) $(I)patchlevel.h - -$(O)winkey.o: $(AMI)winkey.c $(HDEP) $(AMDEP) - -$(O)winmenu.o: $(AMI)winmenu.c $(HDEP) $(AMDEP) - -$(O)winami.o: $(AMI)winami.c $(HDEP) $(AMDEP) #$(AMI)char.c $(AMI)randwin.c - -#$(O)amilib.o: $(AMI)amilib.c $(HDEP) $(AMDEP) - -$(O)amiwind.o: $(AMI)amiwind.c $(AMI)amimenu.c $(HDEP) $(AMDEP) - -$(O)amiwbench.o: $(AMI)amiwbench.c $(HDEP) - -$(O)random.o: $(SHARE)random.c - -$(O)pcmain.o: $(SHARE)pcmain.c $(HDEP) $(I)dlb.h - -$(O)dispmap.o: $(AMI)dispmap.s - $(ASM) $(AFLAGS) $(AOBJSPEC)$@ $< - -# Stuff to build the front ends -$(NETHACK)HackWB: $(OO)wb.o $(OO)wbx.o $(OO)loader.o $(OO)multi.o - $(LINK) $(LNSPEC) $(NETHACK)HackWB $(LIN) $(OO)wb.o $(OO)wbx.o \ - $(OO)loader.o $(OO)multi.o $(LLIB) - -$(NETHACK)HackCli: $(OO)cli.o $(OO)loader.o $(OO)multi.o - $(LINK) $(LNSPEC) $(NETHACK)HackCli $(LIN) $(OO)cli.o $(OO)loader.o \ - $(OO)multi.o $(LLIB) - -# This needs to exist to eliminate the HackWB startup message -#SFD_INSTEAD $(NETHACK)WBDefaults.def: $(NETHACK)WBDefaults.def -$(NETHACK)WBDefaults.def: - echo to $(NETHACK)WBDefaults.def - -WBH = $(AMI)wbdefs.h $(AMI)wbstruct.h $(AMI)wbprotos.h -ASP = $(AMI)splitter -$(OO)wb.o: $(WBH) $(AMI)wb.c $(AMI)wbwin.c $(AMI)wbdata.c $(AMI)wbgads.c \ - $(I)patchlevel.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)wb.o $(AMI)wb.c - -$(OO)wbx.o: $(WBH) $(AMI)wbcli.c $(AMI)wbwin.c $(AMI)wbdata.c \ - $(I)patchlevel.h $(I)date.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)wbx.o $(AMI)wbcli.c - -$(OO)loader.o: $(ASP)/loader.c $(ASP)/split.h $(ASP)/amiout.h $(ASP)/multi.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)loader.o $(ASP)/loader.c - -$(OO)multi.o: $(ASP)/multi.c $(ASP)/multi.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)multi.o $(ASP)/multi.c - -$(OO)cli.o: $(WBH) $(AMI)wbcli.c $(I)patchlevel.h $(I)date.h - $(CC) $(WBCFLAGS) $(WBC2FLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)cli.o \ - $(AMI)wbcli.c - -#### -# splitter support -$(SBIN)splitter: $(OO)splitter.o $(OO)arg.o - $(LINK) $(LNSPEC) $(SBIN)splitter $(LIN) $(OO)splitter.o $(OO)arg.o \ - $(LLIB) - -$(NETHACK)NetHack.dir: $(SBIN)splitter $(SBIN)NetHack - $(SBIN)splitter $(SBIN)NetHack - -$(OO)splitter.o: $(ASP)/splitter.c $(ASP)/split.h $(ASP)/amiout.h $(ASP)/arg.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)splitter.o \ - $(ASP)/splitter.c - -$(OO)arg.o: $(ASP)/arg.c $(ASP)/arg.h - $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)arg.o $(ASP)/arg.c - -# Create/copy other stuff into NetHack: directory: - -$(NETHACK)tomb.iff: $(SBIN)xpm2iff $(AMI)grave16.xpm - $(SBIN)xpm2iff $(AMI)grave16.xpm $(NETHACK)tomb.iff - -$(OO)xpm2iff.o: $(AMI)xpm2iff.c - $(CC) $(CFLAGS) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(AMI)xpm2iff.c - -$(SBIN)xpm2iff: $(OO)xpm2iff.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)xpm2iff.o $(FLLIB) - -# Tile installation for the tile version of the game -inst-tiles: $(TILEFILES) - -#SFD_INSTEAD $(NETHACK)tiles: $(NETHACK)tiles -$(NETHACK)tiles: - -makedir $(NETHACK)tiles - -$(OO)txt2iff.o: $(AMI)txt2iff.c - $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ \ - $(AMI)txt2iff.c - -$(OO)ppmwrite.o: $(WSHARE)ppmwrite.c - $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)ppmwrite.c - -$(OO)tiletext.o: $(WSHARE)tiletext.c $(I)config.h $(WSHARE)tile.h - $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)tiletext.c - -$(OO)tiletxt.o: $(WSHARE)tilemap.c $(I)hack.h - $(CC) $(CFLAGS) $(CSYM) $(DEFSPEC)TILETEXT $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)tilemap.c - -NAMEOBJS = $(O)drawing.o $(O)decl.o $(O)monst.o $(O)objects.o - -$(SBIN)txt2ppm: $(OO)ppmwrite.o $(NAMEOBJS) $(O)alloc.o $(OO)panic.o $(OO)tiletext.o $(OO)tiletxt.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)ppmwrite.o $(NAMEOBJS) $(OO)tiletext.o $(OO)tiletxt.o $(O)alloc.o $(OO)panic.o $(FLLIB) - -$(SBIN)txt2iff: $(OO)txt2iff.o $(NAMEOBJS) $(OO)tiletext.o $(OO)tiletxt.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)txt2iff.o $(NAMEOBJS) $(OO)tiletext.o \ - $(OO)tiletxt.o $(FLLIB) - -$(NETHACK)tiles/objects.iff: $(WSHARE)objects.txt $(SBIN)txt2iff - $(SBIN)txt2iff $(WSHARE)objects.txt $(NETHACK)tiles/objects.iff - -$(NETHACK)tiles/monsters.iff: $(WSHARE)monsters.txt $(SBIN)txt2iff - $(SBIN)txt2iff $(WSHARE)monsters.txt $(NETHACK)tiles/monsters.iff - -$(NETHACK)tiles/other.iff: $(WSHARE)other.txt $(SBIN)txt2iff - $(SBIN)txt2iff $(WSHARE)other.txt $(NETHACK)tiles/other.iff - -# Sound installation rules. -inst-sounds: $(SOUNDFILES) - list to T:nhsdat.lst $(SLIB)sounds QUICK NOHEAD - echo >T:make-nhsdat $(SBIN)dlb cCfI $(SLIB)sounds $(NETHACK)nhsdat T:nhsdat.lst - echo >>T:make-nhsdat if not exists $(NETHACK)nhsdat - echo >>T:make-nhsdat copy $(SLIB)sounds/\#? $(NETHACK)sounds - echo >>T:make-nhsdat endif - execute T:make-nhsdat - -delete T:make-nhsdat - -#SFD_INSTEAD $(SLIB)sounds: $(SLIB)sounds -$(SLIB)sounds: - -makedir $(SLIB)sounds - -$(SBIN)cvtsnd: $(OO)cvtsnd.o - $(LINK) $(LNSPEC) $@ $(LIN) $(OO)cvtsnd.o $(FLLIB) - -$(OO)cvtsnd.o: $(AMI)cvtsnd.c -#SFD_INSTEAD $(CC) $(CFLAGS) $(OBJSPEC)%(left) %(right) -#none - -$(SLIB)sounds/Bell: $(SHARE)sounds/bell.uu - $(UUDEC) $(SHARE)sounds/bell.uu - $(SBIN)cvtsnd Bell $(SLIB)sounds/Bell - -delete Bell - -$(SLIB)sounds/Bugle: $(SHARE)sounds/bugle.uu - $(UUDEC) $(SHARE)sounds/bugle.uu - $(SBIN)cvtsnd Bugle $(SLIB)sounds/Bugle - -delete Bugle - -$(SLIB)sounds/Drum_Of_Earthquake: $(SHARE)sounds/erthdrum.uu - $(UUDEC) $(SHARE)sounds/erthdrum.uu - $(SBIN)cvtsnd Drum_Of_Earthquake $(SLIB)sounds/Drum_Of_Earthquake - -delete Drum_Of_Earthquake - -$(SLIB)sounds/Fire_Horn: $(SHARE)sounds/firehorn.uu - $(UUDEC) $(SHARE)sounds/firehorn.uu - $(SBIN)cvtsnd Fire_Horn $(SLIB)sounds/Fire_Horn - -delete Fire_Horn - -$(SLIB)sounds/Frost_Horn: $(SHARE)sounds/frsthorn.uu - $(UUDEC) $(SHARE)sounds/frsthorn.uu - $(SBIN)cvtsnd Frost_Horn $(SLIB)sounds/Frost_Horn - -delete Frost_Horn - -$(SLIB)sounds/Leather_Drum: $(SHARE)sounds/lethdrum.uu - $(UUDEC) $(SHARE)sounds/lethdrum.uu - $(SBIN)cvtsnd Leather_Drum $(SLIB)sounds/Leather_Drum - -delete Leather_Drum - -$(SLIB)sounds/Magic_Flute: $(SHARE)sounds/mgcflute.uu - $(UUDEC) $(SHARE)sounds/mgcflute.uu - $(SBIN)cvtsnd Magic_Flute $(SLIB)sounds/Magic_Flute - -delete Magic_Flute - -$(SLIB)sounds/Magic_Harp: $(SHARE)sounds/mgcharp.uu - $(UUDEC) $(SHARE)sounds/mgcharp.uu - $(SBIN)cvtsnd Magic_Harp $(SLIB)sounds/Magic_Harp - -delete Magic_Harp - -$(SLIB)sounds/Tooled_Horn: $(SHARE)sounds/toolhorn.uu - $(UUDEC) $(SHARE)sounds/toolhorn.uu - $(SBIN)cvtsnd Tooled_Horn $(SLIB)sounds/Tooled_Horn - -delete Tooled_Horn - -$(SLIB)sounds/Wooden_Flute: $(SHARE)sounds/wdnflute.uu - $(UUDEC) $(SHARE)sounds/wdnflute.uu - $(SBIN)cvtsnd Wooden_Flute $(SLIB)sounds/Wooden_Flute - -delete Wooden_Flute - -$(SLIB)sounds/Wooden_Harp: $(SHARE)sounds/wdnharp.uu - $(UUDEC) $(SHARE)sounds/wdnharp.uu - $(SBIN)cvtsnd Wooden_Harp $(SLIB)sounds/Wooden_Harp - -delete Wooden_Harp - -inst-dungeon: $(INSTDUNGEONFILES) - -$(NETHACK)options : $(DAT)options - copy $(DAT)options $@ - -# Create compiled dungeon files -BGM= $(SLIB)bigrm-2.lev $(SLIB)bigrm-3.lev $(SLIB)bigrm-4.lev $(SLIB)bigrm-5.lev -$(BGM): $(SLIB)bigrm-1.lev - -$(SLIB)bigrm-1.lev: $(DAT)bigroom.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)bigroom.des -#none - -$(SLIB)castle.lev: $(DAT)castle.des $(SBIN)lev_comp - -ENDGAME1= $(SLIB)air.lev $(SLIB)earth.lev $(SLIB)fire.lev $(SLIB)water.lev -$(ENDGAME1): $(SLIB)astral.lev - -$(SLIB)astral.lev: $(DAT)endgame.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)endgame.des -#none - -GEHENNOM1= $(SLIB)asmodeus.lev $(SLIB)baalz.lev $(SLIB)juiblex.lev \ - $(SLIB)orcus.lev $(SLIB)sanctum.lev -$(GEHENNOM1): $(SLIB)valley.lev - -$(SLIB)valley.lev: $(DAT)gehennom.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)gehennom.des -#none - -$(SLIB)knox.lev: $(DAT)knox.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)knox.des -#none - -MINES1= $(SLIB)minend-1.lev $(SLIB)minend-2.lev $(SLIB)minetn-1.lev $(SLIB)minetn-2.lev -$(MINES1): $(SLIB)minefill.lev - -$(SLIB)minefill.lev: $(DAT)mines.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)mines.des -#none - -$(SLIB)oracle.lev: $(DAT)oracle.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)oracle.des -#none - -TOWER1= $(SLIB)tower1.lev $(SLIB)tower2.lev -$(TOWER1): $(SLIB)tower3.lev - -$(SLIB)tower3.lev: $(DAT)tower.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)tower.des -#none - -WIZARD1= $(SLIB)wizard1.lev $(SLIB)wizard2.lev $(SLIB)wizard3.lev \ - $(SLIB)fakewiz1.lev -$(WIZARD1): $(SLIB)fakewiz2.lev - -$(SLIB)fakewiz2.lev: $(DAT)yendor.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)yendor.des -#none - -MEDUSA1= $(SLIB)medusa-1.lev -$(MEDUSA1): $(SLIB)medusa-2.lev - -$(SLIB)medusa-2.lev: $(DAT)medusa.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)medusa.des -#none - -SOKOBAN1= $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev $(SLIB)soko2-1.lev \ - $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev $(SLIB)soko3-2.lev \ - $(SLIB)soko4-1.lev -$(SOKOBAN1): $(SLIB)soko4-2.lev - -$(SLIB)soko4-2.lev: $(DAT)sokoban.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)sokoban.des -#none - -$(ADFILES1): $(SLIB)Arc-goal.lev - -$(SLIB)Arc-goal.lev: $(DAT)Arch.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Arch.des -#none - -$(BDFILES1): $(SLIB)Bar-goal.lev - -$(SLIB)Bar-goal.lev: $(DAT)Barb.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Barb.des -#none - -$(CDFILES1): $(SLIB)Cav-goal.lev - -$(SLIB)Cav-goal.lev: $(DAT)Caveman.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Caveman.des -#none - -$(HDFILES1): $(SLIB)Hea-goal.lev - -$(SLIB)Hea-goal.lev: $(DAT)Healer.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Healer.des -#none - -$(KDFILES1): $(SLIB)Kni-goal.lev - -$(SLIB)Kni-goal.lev: $(DAT)Knight.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Knight.des -#none - -$(MDFILES1): $(SLIB)Mon-goal.lev - -$(SLIB)Mon-goal.lev: $(DAT)Monk.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Monk.des -#none - -$(PDFILES1): $(SLIB)Pri-goal.lev - -$(SLIB)Pri-goal.lev: $(DAT)Priest.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Priest.des -#none - -$(RDFILES1): $(SLIB)Rog-goal.lev - -$(SLIB)Rog-goal.lev: $(DAT)Rogue.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Rogue.des -#none - -$(RANFILES1): $(SLIB)Ran-goal.lev - -$(SLIB)Ran-goal.lev: $(DAT)Ranger.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Ranger.des -#none - -$(SDFILES1): $(SLIB)Sam-goal.lev - -$(SLIB)Sam-goal.lev: $(DAT)Samurai.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Samurai.des -#none - -$(TDFILES1): $(SLIB)Tou-goal.lev - -$(SLIB)Tou-goal.lev: $(DAT)Tourist.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Tourist.des -#none - -$(VDFILES1): $(SLIB)Val-goal.lev - -$(SLIB)Val-goal.lev: $(DAT)Valkyrie.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Valkyrie.des -#none - -$(WDFILES1): $(SLIB)Wiz-goal.lev - -$(SLIB)Wiz-goal.lev: $(DAT)Wizard.des $(SBIN)lev_comp -#SFD_INSTEAD $(SBIN)lev_comp $(DAT)Wizard.des -#none - -$(SLIB)dungeon: $(DAT)dungeon.def $(SBIN)makedefs $(SBIN)dgn_comp - $(SBIN)makedefs -e - $(SBIN)dgn_comp $(DAT)dungeon.pdf - copy $(DAT)dungeon $(SLIB)dungeon - delete $(DAT)dungeon - -inst-data: $(INSTDATAFILES) - -$(NETHACK)amii.hlp: $(AMI)amii.hlp - copy $(AMI)amii.hlp $@ - -#$(NETHACK)data: $(DAT)data -# copy $(DAT)data $@ - -$(SLIB)data: $(DAT)data.base $(I)config.h $(SBIN)makedefs - $(SBIN)makedefs -d - -#$(NETHACK)rumors: $(DAT)rumors -# copy $(DAT)rumors $@ - -$(SLIB)rumors: $(DAT)rumors.tru $(DAT)rumors.fal $(SBIN)makedefs - $(SBIN)makedefs -r - -$(SLIB)cmdhelp: $(DAT)cmdhelp - copy $(DAT)cmdhelp $@ - -$(SLIB)help: $(DAT)help - copy $(DAT)help $@ - -$(SLIB)hh: $(DAT)hh - copy $(DAT)hh $@ - -$(NETHACK)HackWB.hlp: $(AMI)HackWB.hlp - copy $(AMI)HackWB.hlp $@ - -$(SLIB)history: $(DAT)history - copy $(DAT)history $@ - -$(NETHACK)license: $(DAT)license - copy $(DAT)license $@ - -$(SLIB)opthelp: $(DAT)opthelp - copy $(DAT)opthelp $@ - -$(NETHACK)Recover.txt: $(DOC)Recover.txt - copy $(DOC)Recover.txt $@ - -$(NETHACK)GuideBook.txt: $(DOC)GuideBook.txt - copy $(DOC)GuideBook.txt $@ - -$(NETHACK)NetHack.txt: $(DOC)NetHack.txt - copy $(DOC)NetHack.txt $@ - -$(NETHACK)Install.ami: $(AMI)Install.ami - copy $(AMI)Install.ami $@ - -#SFD_INSTEAD $(NETHACK)logfile: $(NETHACK)logfile -$(NETHACK)logfile: - echo to $@ - -#SFD_INSTEAD $(NETHACK)record: $(NETHACK)record -$(NETHACK)record: - echo to $@ - -$(SLIB)wizhelp: $(DAT)wizhelp - copy $(DAT)wizhelp $@ - -# Create the directories here because NetHack.cnf puts them there by default -$(NETHACK)NetHack.cnf: $(AMI)NetHack.cnf - copy $(AMI)NetHack.cnf $@ - -makedir $(NETHACK)save - -makedir $(NETHACK)levels - -#SFD_BEGIN -#SFD_ELSE -$(O)NetHack.gst: $(GSTSRC) $(I)hack.h - sc makegst=$(GSTFILE) $(CFLAGS) $(GSTSRC) -#SFD_END - -# Unpack and install fonts - -INSTFONTFILES= $(NETHACK)hack.font $(NETHACK)hack $(NETHACK)hack/8 - -inst-fonts: $(INSTFONTFILES) - -$(NETHACK)hack/8: $(AMI)amifont8.uu $(NETHACK)hack - $(UUDEC) $(AMI)amifont8.uu - copy 8 $(NETHACK)hack/8 - delete 8 - -$(NETHACK)hack.font: $(AMI)amifont.uu - $(UUDEC) $(AMI)amifont.uu - copy hack.font $(NETHACK)hack.font - delete hack.font - -#SFD_INSTEAD $(NETHACK)hack: $(NETHACK)hack -$(NETHACK)hack: - -makedir $@ - -INSTICONFILES= \ - $(NETHACK)default.icon $(NETHACK)NetHack.info $(NETHACK)NewGame.info \ - $(NETHACK)HackWB.info - -inst-icons: $(INSTICONFILES) - -# Unpack the icons into place - -$(NETHACK)default.icon: $(AMI)dflticon.uu - $(UUDEC) $(AMI)dflticon.uu -# copy default.icon $(NETHACK)default.icon -# delete default.icon - -$(NETHACK)NetHack.info: $(AMI)NHinfo.uu - $(UUDEC) $(AMI)NHinfo.uu -# copy NetHack.info $(NETHACK)NetHack.info -# delete NetHack.info - -$(NETHACK)NewGame.info: $(AMI)NewGame.uu - $(UUDEC) $(AMI)NewGame.uu -# copy NewGame.info $(NETHACK)NewGame.info -# delete NewGame.info - -$(NETHACK)HackWB.info: $(AMI)HackWB.uu - $(UUDEC) $(AMI)HackWB.uu -# copy HackWB.info $(NETHACK)HackWB.info -# delete HackWB.info - -# If DLB is defined, create the nhdat library file in the playground -# directory. If not, move all the data files there. -$(NETHACK)nhdat: $(LIBFILES) $(SBIN)dlb - list to T:nhdat.lst $(SLIB) QUICK NOHEAD FILES - echo >T:make-nhdat $(SBIN)dlb cCfI $(SLIB) $(NETHACK)nhdat T:nhdat.lst - echo >>T:make-nhdat if not exists $(NETHACK)nhdat - echo >>T:make-nhdat copy $(SLIB)\#? $(NETHACK) - echo >>T:make-nhdat endif - execute T:make-nhdat - -delete T:make-nhdat - -# DO NOT DELETE THIS LINE - -$(O)allmain.o: $(NHS)allmain.c $(HDEP) - -$(O)alloc.o: $(NHS)alloc.c $(I)config.h - -$(O)apply.o: $(NHS)apply.c $(HDEP) -#SFD_INSTEAD #none - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)apply.c - -$(O)artifact.o: $(NHS)artifact.c $(HDEP) $(I)artifact.h $(I)artilist.h - -$(O)attrib.o: $(NHS)attrib.c $(HDEP) $(I)artifact.h - -$(O)ball.o: $(NHS)ball.c $(HDEP) - -$(O)bones.o: $(NHS)bones.c $(HDEP) $(I)lev.h - -$(O)botl.o: $(NHS)botl.c $(HDEP) - -$(O)cmd.o: $(NHS)cmd.c $(HDEP) $(I)func_tab.h - -$(O)dbridge.o: $(NHS)dbridge.c $(HDEP) - -$(O)decl.o: $(NHS)decl.c $(HDEP) $(I)quest.h - -$(O)detect.o: $(NHS)detect.c $(HDEP) $(I)artifact.h - -$(O)dig.o: $(NHS)dig.c $(HDEP) - -$(O)display.o: $(NHS)display.c $(HDEP) - -$(O)dlb.o: $(NHS)dlb.c $(HDEP) $(I)dlb.h - -$(O)do.o: $(NHS)do.c $(HDEP) $(I)lev.h - -$(O)do_name.o: $(NHS)do_name.c $(HDEP) - -$(O)do_wear.o: $(NHS)do_wear.c $(HDEP) - -$(O)dog.o: $(NHS)dog.c $(HDEP) - -$(O)dogmove.o: $(NHS)dogmove.c $(HDEP) $(I)mfndpos.h - -$(O)dokick.o: $(NHS)dokick.c $(HDEP) - -$(O)dothrow.o: $(NHS)dothrow.c $(HDEP) - -$(O)drawing.o: $(NHS)drawing.c $(HDEP) $(I)tcap.h - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)drawing.c - -$(O)dungeon.o: $(NHS)dungeon.c $(HDEP) $(I)dgn_file.h $(I)dlb.h - -$(O)eat.o: $(NHS)eat.c $(HDEP) - -$(O)end.o: $(NHS)end.c $(HDEP) $(I)lev.h $(I)dlb.h - -$(O)engrave.o: $(NHS)engrave.c $(HDEP) $(I)lev.h - -$(O)exper.o: $(NHS)exper.c $(HDEP) - -$(O)explode.o: $(NHS)explode.c $(HDEP) - -$(O)extralev.o: $(NHS)extralev.c $(HDEP) - -$(O)files.o: $(NHS)files.c $(HDEP) $(I)dlb.h $(I)date.h - -$(O)fountain.o: $(NHS)fountain.c $(HDEP) - -$(O)hack.o: $(NHS)hack.c $(HDEP) - -$(O)hacklib.o: $(NHS)hacklib.c $(HDEP) - -$(O)invent.o: $(NHS)invent.c $(HDEP) $(I)artifact.h - -$(O)light.o: $(NHS)light.c $(HDEP) $(I)lev.h - -$(O)lock.o: $(NHS)lock.c $(HDEP) - -$(O)mail.o: $(NHS)mail.c $(HDEP) $(I)mail.h - -$(O)makemon.o: $(NHS)makemon.c $(HDEP) - -$(O)mapglyph.o: $(NHS)mapglyph.c $(HDEP) - -$(O)mcastu.o: $(NHS)mcastu.c $(HDEP) - -$(O)mhitm.o: $(NHS)mhitm.c $(HDEP) $(I)artifact.h - -$(O)mhitu.o: $(NHS)mhitu.c $(HDEP) $(I)artifact.h - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)mhitu.c - -$(O)minion.o: $(NHS)minion.c $(HDEP) - -$(O)mklev.o: $(NHS)mklev.c $(HDEP) - -$(O)mkmap.o: $(NHS)mkmap.c $(HDEP) $(I)sp_lev.h - -$(O)mkmaze.o: $(NHS)mkmaze.c $(HDEP) $(I)sp_lev.h $(I)lev.h - -$(O)mkobj.o: $(NHS)mkobj.c $(HDEP) $(I)artifact.h $(I)prop.h - -$(O)mkroom.o: $(NHS)mkroom.c $(HDEP) - -$(O)mon.o: $(NHS)mon.c $(HDEP) $(I)mfndpos.h - -$(O)mondata.o: $(NHS)mondata.c $(HDEP) - -$(O)monmove.o: $(NHS)monmove.c $(HDEP) $(I)mfndpos.h $(I)artifact.h - -$(O)monst.o: $(NHS)monst.c $(I)config.h $(I)permonst.h $(I)monsym.h $(I)color.h - -$(O)monstr.o: $(NHS)monstr.c $(HDEP) -#SFD_INSTEAD $(CC) $(CFLAGS) $(OBJSPEC)%(left) $(NHS)monstr.c -#none - -$(O)mplayer.o: $(NHS)mplayer.c $(HDEP) - -$(O)mthrowu.o: $(NHS)mthrowu.c $(HDEP) - -$(O)muse.o: $(NHS)muse.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)muse.c - -$(O)music.o: $(NHS)music.c $(HDEP) #interp.c - -$(O)o_init.o: $(NHS)o_init.c $(HDEP) $(I)lev.h - -$(O)objects.o: $(NHS)objects.c $(I)config.h $(I)obj.h $(I)objclass.h \ - $(I)prop.h $(I)skills.h $(I)color.h -#SFD_INSTEAD #none - $(CC) $(CFLAGS) $(INCLSPEC)$(NHS) $(OBJSPEC)$@ $(NHS)objects.c - -$(O)objnam.o: $(NHS)objnam.c $(HDEP) - -$(O)options.o: $(NHS)options.c $(HDEP) $(I)tcap.h $(I)config.h \ - $(I)objclass.h $(I)flag.h - -$(O)pager.o: $(NHS)pager.c $(HDEP) $(I)dlb.h - -$(O)pickup.o: $(NHS)pickup.c $(HDEP) - -$(O)pline.o: $(NHS)pline.c $(HDEP) - -$(O)polyself.o: $(NHS)polyself.c $(HDEP) - -$(O)potion.o: $(NHS)potion.c $(HDEP) - -$(O)pray.o: $(NHS)pray.c $(HDEP) - -$(O)priest.o: $(NHS)priest.c $(HDEP) $(I)mfndpos.h - -$(O)quest.o: $(NHS)quest.c $(HDEP) $(I)quest.h $(I)qtext.h - -$(O)questpgr.o: $(NHS)questpgr.c $(HDEP) $(I)qtext.h $(I)dlb.h - -$(O)read.o: $(NHS)read.c $(HDEP) - -$(O)rect.o: $(NHS)rect.c $(HDEP) - -$(O)region.o: $(NHS)region.c $(HDEP) - -$(O)restore.o: $(NHS)restore.c $(HDEP) $(I)lev.h $(I)tcap.h $(I)quest.h - -$(O)rnd.o: $(NHS)rnd.c $(HDEP) - -$(O)role.o: $(NHS)role.c $(HDEP) - -$(O)rumors.o: $(NHS)rumors.c $(HDEP) $(I)dlb.h - -$(O)save.o: $(NHS)save.c $(HDEP) $(I)lev.h $(I)quest.h - -$(O)shk.o: $(NHS)shk.c $(HDEP) -#SFD_INSTEAD #none - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)shk.c - -$(O)shknam.o: $(NHS)shknam.c $(HDEP) - -$(O)sit.o: $(NHS)sit.c $(HDEP) $(I)artifact.h - -$(O)sounds.o: $(NHS)sounds.c $(HDEP) - -$(O)sp_lev.o: $(NHS)sp_lev.c $(HDEP) $(I)sp_lev.h $(I)rect.h $(I)dlb.h - -$(O)spell.o: $(NHS)spell.c $(HDEP) - -$(O)steal.o: $(NHS)steal.c $(HDEP) - -$(O)steed.o: $(NHS)steed.c $(HDEP) - -$(O)sys.o: $(NHS)sys.c $(HDEP) - -$(O)teleport.o: $(NHS)teleport.c $(HDEP) - -$(O)timeout.o: $(NHS)timeout.c $(HDEP) $(I)lev.h - -$(O)topten.o: $(NHS)topten.c $(HDEP) $(I)dlb.h - -$(O)track.o: $(NHS)track.c $(HDEP) - -$(O)trap.o: $(NHS)trap.c $(HDEP) -#SFD_INSTEAD #none - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)trap.c - -$(O)u_init.o: $(NHS)u_init.c $(HDEP) - -$(O)uhitm.o: $(NHS)uhitm.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)uhitm.c - -$(O)vault.o: $(NHS)vault.c $(HDEP) - -$(O)version.o: $(NHS)version.c $(HDEP) $(I)date.h $(I)patchlevel.h - -# DMake doesn't grok mid-line comments -#SFD_INSTEAD $(O)vision.o: $(NHS)vision.c $(HDEP) -$(O)vision.o: $(NHS)vision.c $(HDEP) #$(I)vis_tab.h - -$(O)weapon.o: $(NHS)weapon.c $(HDEP) - -$(O)were.o: $(NHS)were.c $(HDEP) - -$(O)wield.o: $(NHS)wield.c $(HDEP) - -$(O)windows.o: $(NHS)windows.c $(HDEP) $(I)wintty.h - -$(O)wizard.o: $(NHS)wizard.c $(HDEP) $(I)qtext.h - -$(O)worm.o: $(NHS)worm.c $(HDEP) $(I)lev.h - -$(O)worn.o: $(NHS)worn.c $(HDEP) - -$(O)write.o: $(NHS)write.c $(HDEP) - -$(O)zap.o: $(NHS)zap.c $(HDEP) - $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)zap.c - -$(O)getline.o: $(TTY)getline.c $(HDEP) $(I)wintty.h - -$(O)termcap.o: $(TTY)termcap.c $(HDEP) $(I)wintty.h $(I)tcap.h - -$(O)topl.o: $(TTY)topl.c $(HDEP) $(I)wintty.h $(I)tcap.h - -$(O)wintty.o: $(TTY)wintty.c $(HDEP) $(I)wintty.h $(I)tcap.h \ - $(I)date.h $(I)patchlevel.h - -$(O)amitty.o: $(AMI)amitty.c $(HDEP) - -$(O)amistack.o: $(AMI)amistack.c - $(CC) $(CFLAGS3) $(CSYM) $(OBJSPEC)$@ $(AMI)amistack.c - -$(O)rip.o: $(NHS)rip.c $(HDEP) - - -$(I)config.h: $(I)config1.h $(I)tradstdc.h $(I)global.h - -setdate $(I)config.h - -wait 2 - -# onames.h handled at onames.h target, pm.h - -$(I)decl.h: $(I)quest.h $(I)spell.h $(I)color.h $(I)obj.h $(I)you.h - -setdate $(I)decl.h - -wait 2 - -$(I)global.h: $(I)coord.h $(I)pcconf.h $(I)amiconf.h - -setdate $(I)global.h - -wait 2 - -$(I)hack.h: $(I)config.h $(I)context.h $(I)trap.h $(I)decl.h $(I)dungeon.h \ - $(I)monsym.h $(I)mkroom.h $(I)objclass.h $(I)flag.h $(I)rm.h \ - $(I)vision.h $(I)display.h $(I)wintype.h $(I)engrave.h \ - $(I)rect.h $(I)region.h $(I)trampoli.h $(I)sys.h - -setdate $(I)hack.h - -wait 2 - -$(I)permonst.h: $(I)monattk.h $(I)monflag.h $(I)align.h - -setdate $(I)permonst.h - -wait 2 - -$(I)you.h: $(I)align.h $(I)attrib.h $(I)monst.h $(I)mextra.h $(I)youprop.h $(I)skills.h - -setdate $(I)you.h - -wait 2 - -# pm.h handled at target - -$(I)youprop.h: $(I)prop.h $(I)permonst.h $(I)mondata.h - -setdate $(I)youprop.h - -wait 2 - -$(I)display.h: $(I)vision.h $(I)mondata.h - -setdate $(I)display.h - -wait 2 - -$(I)dungeon.h: $(I)align.h - -setdate $(I)dungeon.h - -wait 2 - -$(I)engrave.h: $(I)trampoli.h $(I)rect.h - -setdate $(I)engrave.h - -wait 2 - -$(I)mextra.h: $(I)align.h - -setdate $(I)mextra.h - -wait 2 - -$(I)mondata.h: $(I)align.h - -setdate $(I)mondata.h - -wait 2 - -$(I)monst.h: $(I)align.h $(I)mextra.h - -setdate $(I)monst.h - -wait 2 - -$(I)pcconf.h: $(I)micro.h $(I)system.h - -setdate $(I)pcconf.h - -wait 2 - -$(I)rm.h: $(I)align.h - -setdate $(I)rm.h - -wait 2 - - -#notes -# install keeps doing re-install because it keeps rebuilding lev_comp??? -# fixed(?) - deleted setdate -# make nhdat rebuils sys/amiga objects diff --git a/sys/amiga/NHinfo.uu b/sys/amiga/NHinfo.uu new file mode 100644 index 000000000..4659aa02f --- /dev/null +++ b/sys/amiga/NHinfo.uu @@ -0,0 +1,11 @@ +begin 664 nethack.info +MXQ```0```````````"``(``$``,``0````$````````````````````````` +M`````P```````````````````````````````````(`````````@`"```@`` +M``$#````````````````````````````#___\`]P'O`/(`3P"0``D`D!D-`/ +M?_[P"!K\D`AJ_-`/'?[P#S?^\`\\_O`/;GSP#RN\\`^>_?`/AOGP#YOY\`Y) +M]O`,9>9P")?9,`F8N9`/G'G0"3[\4`A__A`/___P```````````````````` +M`````````````````````````@```0=0``R?`2`-_T`@!8&00`?]W@`.FMP@ +M#.K80`&=_@``M\H``+S:``'N<0``JYP``-[_```&^```.]P``.G=@`&UX,`# +GG_%@"=384 KB free chip +# RAM and a display mode that can open at 4 bitplanes (16 colours); on +# machines that can't, NetHack will automatically fall back to text +# mode at startup. +OPTIONS=windowtype:amiv +# +# Text mode (uses hack.font line-drawing characters): +#OPTIONS=windowtype:amii +#OPTIONS=symset:AmigaFont + +# *** GENERAL OPTIONS *** +OPTIONS=time,showexp,lit_corridor +OPTIONS=boulder:0 +OPTIONS=autopickup,pickup_types:$"=/!?+ +OPTIONS=catname:Kaori +# Numpad for movement; '5' is the run prefix, ALT+5 the rush prefix. +OPTIONS=number_pad:1 + +# *** MENU COLORS *** +# Colour-code inventory items by BUC status and value. +OPTIONS=menucolors +MENUCOLOR=" blessed "=green +MENUCOLOR=" holy "=green +MENUCOLOR=" uncursed "=cyan +MENUCOLOR=" cursed "=red +MENUCOLOR=" unholy "=red +MENUCOLOR=" cursed .* (being worn)"=red&underline +MENUCOLOR=" cursed .* (wielded)"=red&underline +MENUCOLOR="loadstone"=red&underline +MENUCOLOR="gold piece"=brown +MENUCOLOR="worthless"=brown +MENUCOLOR="wand of wishing"=magenta +MENUCOLOR="magic lamp"=magenta +MENUCOLOR="magic marker"=magenta +MENUCOLOR="bag of holding"=magenta +MENUCOLOR="amulet of life saving"=magenta +MENUCOLOR="cloak of magic resistance"=magenta +MENUCOLOR="silver dragon scale"=cyan +MENUCOLOR="gray dragon scale"=cyan +MENUCOLOR="speed boots"=magenta +MENUCOLOR="luckstone"=green +MENUCOLOR="unicorn horn"=green diff --git a/sys/amiga/README.amiga b/sys/amiga/README.amiga new file mode 100644 index 000000000..436a4aea4 --- /dev/null +++ b/sys/amiga/README.amiga @@ -0,0 +1,114 @@ + NetHack 5.0 for Amiga + ==================== + +Requirements +------------ + - AmigaOS 3.0 or later (Kickstart 39+) + - 6 MB free RAM minimum (8 MB recommended) + - Hard drive with ~5 MB free space + +Recommended: RTG graphics card (Picasso96/CyberGraphX) for best +tile rendering. Native AGA/OCS/ECS chipsets are supported. + + +Installation +------------ +Extract NH500AMI.ZIP somewhere on your hard drive (e.g. into Work:). +You'll get a NetHack drawer with everything inside. + +To play from Workbench, open the NetHack drawer and double-click the +nethack icon. + +To play from a Shell: + + Work:NetHack/nethack + +To redirect to a different install -- for example to test two versions +side by side -- set the NETHACKDIR (or HACKDIR) environment variable +before launching: + + setenv NETHACKDIR Work:games/nethack-dev/ + Work:games/nethack-dev/nethack + + +Display Modes +------------- +The shipped nethack.cnf selects tile mode (AMIV). AMIV needs a screen +with at least 4 bitplanes (16 colours) and ~384 KB free chip RAM; on +machines that don't qualify, the binary automatically falls back to +text mode (AMII) at startup with a short note explaining why. + +Tile mode auto-selects tiles32.iff (32 colors, 5 bitplanes) when the +screen supports 32+ colors, otherwise tiles16.iff (16 colors, 4 planes). + +To force text mode unconditionally, edit nethack.cnf: + + #OPTIONS=windowtype:amiv + OPTIONS=windowtype:amii + OPTIONS=symset:AmigaFont + + +Configuration +------------- +Edit nethack.cnf for game options. Defaults shipped: + + OPTIONS=windowtype:amiv - tile graphics + OPTIONS=number_pad:1 - numpad movement; '5' is run prefix + OPTIONS=time,showexp - turn count, experience visible + OPTIONS=lit_corridor - show lit corridors + OPTIONS=menucolors - colored inventory items + +ALT+letter shortcuts to extended commands (ALT+L for #loot, ALT+F for +#force, etc.) are enabled by default. On keymaps that need ALT for +typing characters (Scandinavian, German, French, ...) disable with: + + OPTIONS=!altmeta + +Menu color examples (after OPTIONS=menucolors): + + MENUCOLOR=" blessed "=green + MENUCOLOR=" cursed "=red + MENUCOLOR=" uncursed "=cyan + + +Building from Source +-------------------- +Cross-compilation from Linux using bebbo's m68k-amigaos-gcc toolchain +(https://franke.ms/git/bebbo/amiga-gcc): + + # Install toolchain to /opt/amiga + # Clone NetHack 5.0 source + cd NetHack + sys/unix/setup.sh sys/unix/hints/linux.500 + make fetch-lua + make CROSS_TO_AMIGA=1 fetch-regex + make CROSS_TO_AMIGA=1 all + make CROSS_TO_AMIGA=1 package + +The distribution ZIP is created at targets/amiga/NH500AMI.ZIP. + +Toolchain requirements: + + - m68k-amigaos-gcc (bebbo's amigaos-cross-toolchain in /opt/amiga) + - -noixemul (libnix) for linking + - -m68000 for maximum compatibility (or -m68020/040/060) + + +Known Issues +------------ + - Native Amiga compilation (SAS/C, DICE) is not supported; + cross-compilation with GCC is required + + +Credits +------- +Olaf Seibert first ported NetHack 2.3 and 3.0 to the Amiga. +Richard Addison, Andrew Church, Jochen Erwied, Mark Gooderum, +Ken Lorber, Greg Olson, Mike Passaretti, and Gregg Wonderly +polished and extended the 3.0 and 3.1 ports. Andrew Church, +Ken Lorber, and Gregg Wonderly are responsible for the 3.2 port. +Janne Salmijärvi resurrected the Amiga port for 3.3 and +Teemu Suikki joined before 3.4.0. + +Updated for NetHack 5.0, cross compile fixes and 32 color tile support by Ingo +Paschke in 2026. diff --git a/sys/amiga/amidos.c b/sys/amiga/amidos.c index 3fe520bb3..c06fc1b1c 100644 --- a/sys/amiga/amidos.c +++ b/sys/amiga/amidos.c @@ -9,6 +9,7 @@ #include "hack.h" #include "winami.h" +#include "windefs.h" /* Defined in config.h, let's undefine it here (static function below) */ #undef strcmpi @@ -18,23 +19,104 @@ #include #undef COUNT + #if defined(__SASC_60) || defined(__GNUC__) #include #include #endif +/* POSIX stubs needed by libnix (-noixemul) */ +#ifdef __noixemul__ +int getpid(void) { return (int)FindTask(NULL); } +#endif + +/* Point NetHack: at the directory we were launched from. Works for both + CLI ("nethack") and Workbench (icon double-click) launches, since + GetProgramDir() (V37+) resolves both. Any existing assign is replaced; + it would just be stale state from a previous install or session. */ +void +amiga_self_assign(void) +{ + BPTR dup; + + if (GetProgramDir() == 0) + return; + if ((dup = DupLock(GetProgramDir())) == 0) + return; + if (!AssignLock("NetHack", dup)) + UnLock(dup); +} + +/* Generate an RFC 4122 v4 UUID for this game. Entropy comes from + DateStamp + the running task's address mixed through a small LCG. */ +void +get_nhuuid(void) +{ + uchar bytes[16]; + struct DateStamp ds; + unsigned long x; + int i; + + if (svn.nhuuid[0]) + return; + + DateStamp(&ds); + x = (unsigned long) ds.ds_Days + ^ ((unsigned long) ds.ds_Minute << 16) + ^ ((unsigned long) ds.ds_Tick << 8) + ^ (unsigned long) FindTask(NULL); + /* Classic glibc/POSIX rand() LCG (Knuth, C99 7.22.2.1). Full period + 2^32; we read bits 16-23 to skip the LCG's bad low bits. */ + for (i = 0; i < 16; i++) { + x = x * 1103515245u + 12345u; + bytes[i] = (uchar) (x >> 16); + } + /* RFC 4122: version=4 (random), variant=10. */ + bytes[6] = (bytes[6] & 0x0F) | 0x40; + bytes[8] = (bytes[8] & 0x3F) | 0x80; + + Snprintf(svn.nhuuid, sizeof svn.nhuuid, + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" + "%02x%02x%02x%02x%02x%02x", + bytes[0], bytes[1], bytes[2], bytes[3], + bytes[4], bytes[5], + bytes[6], bytes[7], + bytes[8], bytes[9], + bytes[10], bytes[11], bytes[12], bytes[13], + bytes[14], bytes[15]); +} + +void +free_nhuuid(void) +{ + int i; + + for (i = 0; i < SIZE(svn.nhuuid); i++) { + svn.nhuuid[i] = 0; + } +} + #ifdef AZTEC_50 #include #undef strcmpi #endif /* Prototypes */ -#include "NH:sys/amiga/winami.p" +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/amiwind.p" +#include "NH:sys/amiga/winami.p" #include "NH:sys/amiga/amidos.p" +#else +#include "amiwind.p" +#include "winami.p" +#include "amidos.p" +#endif + extern char Initialized; extern struct window_procs amii_procs; +struct ami_sysflags sysflags = {0}; +FILE *fopenp(const char *, const char *); #ifndef __SASC_60 int Enable_Abort = 0; /* for stdio package */ @@ -46,13 +128,14 @@ char PATH[PATHLEN] = "NetHack:"; static boolean record_exists(void); void -flushout() +flushout(void) { (void) fflush(stdout); } #ifndef getuid -getuid() +int +getuid(void) { return 1; } @@ -60,26 +143,19 @@ getuid() #ifndef getlogin char * -getlogin() +getlogin(void) { return ((char *) NULL); } #endif -#ifndef AZTEC_50 -int -abs(x) -int x; -{ - return x < 0 ? -x : x; -} -#endif +/* abs() provided by libnix/stdlib */ #ifdef SHELL int -dosh() +dosh(void) { - int i; + int i = 0; char buf[BUFSZ]; extern struct ExecBase *SysBase; @@ -113,8 +189,7 @@ dosh() */ /* TODO: update this for FFS */ long -freediskspace(path) -char *path; +freediskspace(char *path) { #ifdef UNTESTED /* these changes from Patric Mueller for AROS to @@ -123,9 +198,9 @@ char *path; */ unsigned long long freeBytes = 0; #else - register long freeBytes = 0; + long freeBytes = 0; #endif - register struct InfoData *infoData; /* Remember... longword aligned */ + struct InfoData *infoData; /* Remember... longword aligned */ char fileName[32]; /* @@ -137,11 +212,11 @@ char *path; * so must be on the current device, so "" is enough... */ { - register char *colon; + char *colon; strncpy(fileName, path, sizeof(fileName) - 1); fileName[31] = 0; - if (colon = index(fileName, ':')) + if (colon = strchr(fileName, ':')) colon[1] = '\0'; else fileName[0] = '\0'; @@ -183,12 +258,11 @@ char *path; } long -filesize(file) -char *file; +filesize(char *file) { - register BPTR fileLock; - register struct FileInfoBlock *fileInfoBlock; - register long size = 0; + BPTR fileLock; + struct FileInfoBlock *fileInfoBlock; + long size = 0; fileInfoBlock = (struct FileInfoBlock *) alloc(sizeof(struct FileInfoBlock)); @@ -204,14 +278,14 @@ char *file; #if 0 void -eraseall(path, files) -const char *path, *files; +void +eraseall(const char *path, const char *files) { BPTR dirLock, dirLock2; struct FileInfoBlock *fibp; int chklen; #if (NH_DEVEL_STATUS != NH_STATUS_RELEASED) - if(files != alllevels)panic("eraseall"); + if(files != g.alllevels)panic("eraseall"); #endif chklen=(int)index(files,'*')-(int)files; @@ -240,12 +314,11 @@ const char *path, *files; #if 0 /* Unused */ #define COPYSIZE 4096 -char *CopyFile(from, to) -const char *from, *to; +char *CopyFile(const char *from, const char *to) { - register BPTR fromFile, toFile; - register char *buffer; - register long size; + BPTR fromFile, toFile; + char *buffer; + long size; char *error = NULL; buffer = (char *) alloc(COPYSIZE); @@ -272,14 +345,16 @@ const char *from, *to; } #endif +#ifdef MFLOPPY /* this should be replaced */ -saveDiskPrompt(start) +int +saveDiskPrompt(int start) { char buf[BUFSIZ], *bp; BPTR fileLock; if (sysflags.asksavedisk) { /* Don't prompt if you can find the save file */ - if (fileLock = Lock(SAVEF, SHARED_LOCK)) { + if (fileLock = Lock(gs.SAVEF, SHARED_LOCK)) { UnLock(fileLock); #if defined(TTY_GRAPHICS) if (windowprocs.win_init_nhwindows @@ -294,7 +369,7 @@ saveDiskPrompt(start) return 1; } pline("If save file is on a SAVE disk, put that disk in now."); - if (strlen(SAVEF) > QBUFSZ - 25 - 22) + if (strlen(gs.SAVEF) > QBUFSZ - 25 - 22) panic("not enough buffer space for prompt"); /* THIS IS A HACK */ #if defined(TTY_GRAPHICS) @@ -305,7 +380,7 @@ saveDiskPrompt(start) #endif #if defined(AMII_GRAPHICS) if (windowprocs.win_init_nhwindows == amii_procs.win_init_nhwindows) { - getlind("File name ?", buf, SAVEF); + getlind("File name ?", buf, gs.SAVEF); clear_nhwindow(WIN_BASE); } #endif @@ -314,21 +389,22 @@ saveDiskPrompt(start) return 0; /* Strip any whitespace. Also, if nothing was entered except - * whitespace, do not change the value of SAVEF. + * whitespace, do not change the value of gs.SAVEF. */ for (bp = buf; *bp; bp++) { if (!isspace(*bp)) { - strncpy(SAVEF, bp, PATHLEN); + strncpy(gs.SAVEF, bp, PATHLEN); break; } } } return 1; } +#endif /* MFLOPPY */ /* Return 1 if the record file was found */ static boolean -record_exists() +record_exists(void) { FILE *file; @@ -345,7 +421,7 @@ record_exists() * For Amiga: do nothing, but called from restore.c */ void -gameDiskPrompt() +gameDiskPrompt(void) { } #endif @@ -355,8 +431,7 @@ gameDiskPrompt() * be room for the /. */ void -append_slash(name) -char *name; +append_slash(char *name) { char *ptr; @@ -371,8 +446,7 @@ char *name; } void -getreturn(str) -const char *str; +getreturn(const char *str) { int ch; @@ -386,12 +460,11 @@ const char *str; #define PATHSEP ';' FILE * -fopenp(name, mode) -register const char *name, *mode; +fopenp(const char *name, const char *mode) { - register char *bp, *pp, lastch; - register FILE *fp; - register BPTR theLock; + char *bp, *pp, lastch = 0; + FILE *fp; + BPTR theLock; char buf[BUFSIZ]; /* Try the default directory first. Then look along PATH. @@ -442,7 +515,12 @@ register const char *name, *mode; static BPTR OrgDirLock = NO_LOCK; -chdir(dir) char *dir; +int +chdir( +#ifdef CROSS_TO_AMIGA + const +#endif + char *dir) { extern char orgdir[]; @@ -479,7 +557,7 @@ chdir(dir) char *dir; */ #undef exit void -nethack_exit(code) +nethack_exit(int code) { #ifdef CHDIR extern char orgdir[]; @@ -496,11 +574,11 @@ nethack_exit(code) exit(code); } -void regularize(s) /* normalize file name - we don't like :'s or /'s */ -register char *s; +void +regularize(char *s) /* normalize file name - we don't like :'s or /'s */ { - register char *lp; + char *lp; - while ((lp = index(s, ':')) || (lp = index(s, '/'))) + while ((lp = strchr(s, ':')) || (lp = strchr(s, '/'))) *lp = '_'; } diff --git a/sys/amiga/amidos.p b/sys/amiga/amidos.p index c9fb4d508..83decbc17 100644 --- a/sys/amiga/amidos.p +++ b/sys/amiga/amidos.p @@ -3,40 +3,41 @@ /* NetHack may be freely redistributed. See license for details. */ /* amidos.c */ -void NDECL(flushout ); +void flushout (void); #ifndef getuid -int NDECL(getuid ); +int getuid (void); #endif #ifndef getpid -int NDECL(getpid ); +int getpid (void); #endif #ifndef getlogin -char *NDECL(getlogin ); +char *getlogin (void); #endif #ifndef abs -int FDECL(abs, (int )); -#endif -int NDECL(tgetch ); -int NDECL(dosh ); -long FDECL(freediskspace, (char *)); -long FDECL(filesize, (char *)); -void FDECL(eraseall, (const char * , const char *)); -char *FDECL(CopyFile, (const char * , const char *)); -void FDECL(copybones, (int )); -void NDECL(playwoRAMdisk ); -int FDECL(saveDiskPrompt, (int )); -void NDECL(gameDiskPrompt ); -void FDECL(append_slash, (char *)); -void FDECL(getreturn, (const char *)); +int abs(int ); +#endif +int tgetch (void); +int dosh (void); +void amiga_self_assign (void); +long freediskspace(char *); +long filesize(char *); +void eraseall(const char * , const char *); +char *CopyFile(const char * , const char *); +void copybones(int ); +void playwoRAMdisk (void); +int saveDiskPrompt(int ); +void gameDiskPrompt (void); +void append_slash(char *); +void getreturn(const char *); #ifndef msmsg -void FDECL(msmsg, ( const char *, ... )); +void msmsg( const char *, ... ); #endif -#if !defined(__SASC_60) && !defined(_DCC) -int FDECL(chdir, (char *)); +#if !defined(__SASC_60) && !defined(_DCC) && !defined(CROSS_TO_AMIGA) +int chdir(char *); #endif -#ifndef strcmpi -int FDECL(strcmpi, (char * , char *)); +#ifndef strcmpi +int strcmpi(char * , char *); #endif #if !defined(memcmp) && !defined(AZTEC_C) && !defined(_DCC) && !defined(__GNUC__) -int FDECL(memcmp, (unsigned char * , unsigned char * , int )); +int memcmp(unsigned char * , unsigned char * , int ); #endif diff --git a/sys/amiga/amigst.c b/sys/amiga/amigst.c index 91f0d3430..8f6a74f64 100644 --- a/sys/amiga/amigst.c +++ b/sys/amiga/amigst.c @@ -36,8 +36,14 @@ #include #endif +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/winami.p" #include "NH:sys/amiga/amiwind.p" #include "NH:sys/amiga/amidos.p" +#else +#include "winami.p" +#include "amiwind.p" +#include "amidos.p" +#endif /* end amigst.c */ diff --git a/sys/amiga/amirip.c b/sys/amiga/amirip.c index e5a93ff94..5f4aa52af 100644 --- a/sys/amiga/amirip.c +++ b/sys/amiga/amirip.c @@ -43,22 +43,21 @@ static struct RastPort *rp; #include #endif -static char *load_list[] = { "tomb.iff", 0 }; static BitMapHeader tomb_bmhd; -static struct BitMap *tbmp[1] = { 0 }; +static struct BitMap *tombimg = NULL; -static int cols[2] = { 154, 319 }; /* X location of center of columns */ +static const int cols_base[2] = { 154, 319 }; /* X location of center of columns */ +static int cols[2]; /* cols_base[] + xoff, computed per call */ static int cno = 0; /* current column */ #define TEXT_TOP (65 + yoff) -static xoff, yoff; /* image centering */ +static int xoff, yoff; /* image centering */ /* terrible kludge */ /* this is why prototypes should have ONLY types in them! */ #undef red #undef green #undef blue -#undef index #ifdef _DCC #include #include @@ -101,19 +100,16 @@ int wh; /* was local in outrip, but needed for SCALE macro */ int cmap_white, cmap_black; void -amii_outrip(tmpwin, how, when) -winid tmpwin; -int how; -time_t when; +amii_outrip(winid tmpwin, int how, time_t when) { int just_return = 0; int done, rtxth; + struct IntuiMessage *imsg; int i; - register char *dpx; + char *dpx; char buf[200]; int line, tw, ww; - char *errstr = NULL; long year; if (!WINVERS_AMIV || HackScreen->RastPort.BitMap->Depth < 4) @@ -142,9 +138,7 @@ time_t when; SetFont(rp, HackFont); #endif - tomb_bmhd = ReadImageFiles(load_list, tbmp, &errstr); - if (errstr) - goto cleanup; + tomb_bmhd = ReadImageFile("tomb.iff", &tombimg); if (tomb_bmhd.w > ww || tomb_bmhd.h > wh) goto cleanup; @@ -152,12 +146,12 @@ time_t when; xoff = GENOFF(ww, tomb_bmhd.w); yoff = GENOFF(wh, tomb_bmhd.h); for (i = 0; i < SIZE(cols); i++) - cols[i] += xoff; + cols[i] = cols_base[i] + xoff; cmap_white = search_cmap(0, 0, 0); cmap_black = search_cmap(15, 15, 15); - BltBitMap(*tbmp, 0, 0, rp->BitMap, xoff, yoff, tomb_bmhd.w, tomb_bmhd.h, + BltBitMap(tombimg, 0, 0, rp->BitMap, xoff, yoff, tomb_bmhd.w, tomb_bmhd.h, 0xc0, 0xff, NULL); /* Put together death description */ @@ -186,12 +180,12 @@ time_t when; SetDrMd(rp, JAM1); /* Put name on stone */ - Sprintf(buf, "%s", plname); + Sprintf(buf, "%s", svp.plname); buf[STONE_LINE_LEN] = 0; tomb_text(buf); /* Put $ on stone */ - Sprintf(buf, "%ld Au", done_money); + Sprintf(buf, "%ld Au", gd.done_money); buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */ tomb_text(buf); @@ -200,7 +194,7 @@ time_t when; /* Put death type on stone */ for (line = DEATH_LINE, dpx = buf; line < YEAR_LINE; line++) { - register int i, i0; + int i, i0; char tmpchar; if ((i0 = strlen(dpx)) > STONE_LINE_LEN) { @@ -281,8 +275,7 @@ time_t when; } LoadRGB4(&HackScreen->ViewPort, sysflags.amii_curmap, amii_numcolors); - if (tbmp[0]) - FreeImageFiles(load_list, tbmp); + FreeImageFile(&tombimg); if (just_return) return; /* fall back to the straight-ASCII version */ @@ -290,8 +283,7 @@ time_t when; } static void -tomb_text(p) -char *p; +tomb_text(char *p) { char buf[STONE_LINE_LEN * 2]; int l; diff --git a/sys/amiga/amisnd.c b/sys/amiga/amisnd.c deleted file mode 100644 index 6421520ed..000000000 --- a/sys/amiga/amisnd.c +++ /dev/null @@ -1,319 +0,0 @@ -/* NetHack 3.6 amisnd.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ -/* Copyright (c) 1992, 1993, 1995 by Gregg Wonderly */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * This file contains music playing code. - * - * If we were REALLY determined, we would make the sound play - * asynchronously, but I'll save that one for a rainy day... - */ - -#include "hack.h" -#include "dlb.h" - -#undef red -#undef blue -#undef green -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#define AMII_AVERAGE_VOLUME 60 - -int amii_volume = AMII_AVERAGE_VOLUME; - -typedef struct VHDR { - char name[4]; - long len; - unsigned long oneshot, repeat, samples; - UWORD freq; - UBYTE n_octaves, compress; - LONG volume; -} VHDR; - -typedef struct IFFHEAD { - char FORM[4]; - long flen; - char _8SVX[4]; - VHDR vhdr; - char NAME[4]; - long namelen; -} IFFHEAD; - -extern struct GfxBase *GfxBase; - -UBYTE whichannel[] = { 1, 2, 4, 8 }; -void makesound(char *, char *, int vol); -void amii_speaker(struct obj *instr, char *melody, int vol); - -/* A major scale in indexs to freqtab... */ -int notetab[] = { 0, 2, 4, 5, 7, 9, 11, 12 }; - -/* Frequencies for a scale starting at one octave below 'middle C' */ -long freqtab[] = { - 220, /*A */ - 233, /*Bb*/ - 246, /*B */ - 261, /*C */ - 277, /*Db*/ - 293, /*D */ - 311, /*Eb*/ - 329, /*E */ - 349, /*F */ - 370, /*Gb*/ - 392, /*G */ - 415, /*Ab*/ - 440, /*A */ -}; - -#ifdef TESTING -main(argc, argv) int argc; -char **argv; -{ - makesound("wooden_flute", "AwBwCwDwEwFwGwawbwcwdwewfwgw", 60); - makesound("wooden_flute", "AhBhChDhEhFhGhahbhchdhehfhgh", 60); - makesound("wooden_flute", "AqBqCqDqEqFqGqaqbqcqdqeqfqgq", 60); - makesound("wooden_flute", "AeBeCeDeEeFeGeaebecedeeefege", 60); - makesound("wooden_flute", "AxBxCxDxExFxGxaxbxcxdxexfxgx", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); - makesound("wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60); -} -#else -void -amii_speaker(struct obj *instr, char *melody, int vol) -{ - int typ = instr->otyp; - char *actualn = (char *) OBJ_NAME(objects[typ]); - - /* Make volume be relative to users volume level, with 60 being the - * average level that will be passed to us. - */ - vol = vol * amii_volume / AMII_AVERAGE_VOLUME; - - makesound(actualn, melody, vol); -} -#endif - -void -makesound(char *actualn, char *melody, int vol) -{ - char *t; - int c, cycles, dot, dlay; - dlb *stream = 0; - IFFHEAD iffhead; - struct IOAudio *AudioIO = 0; - struct MsgPort *AudioMP = 0; - struct Message *AudioMSG = 0; - ULONG device = -1; - BYTE *waveptr = 0; - LONG frequency = 440, duration = 1, clock, samp, samples, samcyc = 1; - unsigned char name[100]; - - if (flags.silent) - return; - - if (GfxBase->DisplayFlags & PAL) - clock = 3546895; - else - clock = 3579545; - - /* - * Convert type to file name - if there's nothing to play we - * shouldn't be here in the first place. - */ - strncpy(name, actualn, sizeof(name)); - for (t = strchr(name, ' '); t; t = strchr(name, ' ')) - *t = '_'; - if ((stream = dlb_fopen(name, "r")) == NULL) { - perror(name); - return; - } - - AudioIO = (struct IOAudio *) AllocMem(sizeof(struct IOAudio), - MEMF_PUBLIC | MEMF_CLEAR); - if (AudioIO == 0) - goto killaudio; - - AudioMP = CreateMsgPort(); - if (AudioMP == 0) - goto killaudio; - - AudioIO->ioa_Request.io_Message.mn_ReplyPort = AudioMP; - AudioIO->ioa_Request.io_Message.mn_Node.ln_Pri = 0; - AudioIO->ioa_Request.io_Command = ADCMD_ALLOCATE; - AudioIO->ioa_Request.io_Flags = ADIOF_NOWAIT; - AudioIO->ioa_AllocKey = 0; - AudioIO->ioa_Data = whichannel; - AudioIO->ioa_Length = sizeof(whichannel); - - device = OpenDevice(AUDIONAME, 0L, (struct IORequest *) AudioIO, 0L); - if (device != 0) - goto killaudio; - - if (dlb_fread((genericptr_t) &iffhead, sizeof(iffhead), 1, stream) != 1) - goto killaudio; - - /* This is an even number of bytes long */ - if (dlb_fread(name, (iffhead.namelen + 1) & ~1, 1, stream) != 1) - goto killaudio; - - if (dlb_fread((genericptr_t) &samples, 4, 1, stream) != 1) - goto killaudio; - - if (dlb_fread((genericptr_t) &samples, 4, 1, stream) != 1) - goto killaudio; - - waveptr = AllocMem(samples, MEMF_CHIP | MEMF_PUBLIC); - if (!waveptr) - goto killaudio; - - if (dlb_fread(waveptr, samples, 1, stream) != 1) - goto killaudio; - - while (melody[0] && melody[1]) { - c = *melody++; - duration = *melody++; - dot = 0; - if (*melody == '.') { - dot = 1; - ++melody; - } - switch (duration) { - case 'w': - dlay = 3; - duration = 1; - cycles = 1; - break; - case 'h': - dlay = 3; - duration = 2; - cycles = 1; - break; - case 'q': - dlay = 2; - duration = 4; - cycles = 1; - break; - case 'e': - dlay = 1; - duration = 8; - cycles = 1; - break; - case 'x': - dlay = 0; - duration = 16; - cycles = 1; - break; - case 't': - dlay = 0; - duration = 32; - cycles = 1; - break; - default: - goto killaudio; /* unrecognized duration */ - } - - /* Lower case characters are one octave above upper case */ - switch (c) { - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - c -= 'a' - 7; - break; - - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - c -= 'A'; - break; - - default: - continue; - } - - samcyc = samples; - - /* lowercase start at middle 'C', upper case are one octave below */ - frequency = c > 7 ? freqtab[notetab[c % 7]] * 2 : freqtab[notetab[c]]; - - /* We can't actually do a dotted whole note unless we add code for a - * real - * 8SVX sample which includes sustain sample information to tell us - * how - * to hold the note steady... So when duration == 1, ignore 'dot'... - */ - if (dot && duration > 1) - samp = ((samples / duration) * 3) / 2; - else - samp = samples / duration; - - /* Only use some of the samples based on frequency */ - samp = frequency * samp / 880; - - /* The 22khz samples are middle C samples, so adjust the play - * back frequency accordingly - */ - frequency = (frequency * (iffhead.vhdr.freq * 2) / 3) / 440L; - - AudioIO->ioa_Request.io_Message.mn_ReplyPort = AudioMP; - AudioIO->ioa_Request.io_Command = CMD_WRITE; - AudioIO->ioa_Request.io_Flags = ADIOF_PERVOL; - AudioIO->ioa_Data = (BYTE *) waveptr; - AudioIO->ioa_Length = samp; - - /* The clock rate represents the unity rate, so dividing by - * the frequency gives us a period ratio... - */ - /*printf( "clock: %ld, freq: %ld, div: %ld\n", clock, frequency, - * clock/frequency );*/ - AudioIO->ioa_Period = clock / frequency; - AudioIO->ioa_Volume = vol; - AudioIO->ioa_Cycles = cycles; - - BeginIO((struct IORequest *) AudioIO); - WaitPort(AudioMP); - AudioMSG = GetMsg(AudioMP); - if (dlay) - Delay(dlay); - } - -killaudio: - if (stream) - dlb_fclose(stream); - if (waveptr) - FreeMem(waveptr, samples); - if (device == 0) - CloseDevice((struct IORequest *) AudioIO); - if (AudioMP) - DeleteMsgPort(AudioMP); - if (AudioIO) - FreeMem(AudioIO, sizeof(*AudioIO)); -} diff --git a/sys/amiga/amistack.c b/sys/amiga/amistack.c index 33769697f..84ae496e1 100644 --- a/sys/amiga/amistack.c +++ b/sys/amiga/amistack.c @@ -1,5 +1,5 @@ /* NetHack 3.6 amistack.c $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (c) Janne Salmijärvi, Tampere, Finland, 2000 */ +/* Copyright (c) Janne Salmij�rvi, Tampere, Finland, 2000 */ /* NetHack may be freely redistributed. See license for details. */ /* @@ -12,10 +12,20 @@ #ifdef __SASC_60 #include +#endif /* - * At the moment 90*1024 would suffice, but just to be on the safe side ... + * Increase stack size to allow deep recursions. + * NetHack 5.0 with Lua needs significantly more stack than 3.6. */ -long __stack = 128 * 1024; +#ifdef __SASC_60 +long __stack = 256 * 1024; +#else +/* libnix needs __stkinit referenced to pull swapstack.o from libnix.a */ +unsigned long __stack = 256 * 1024; +#ifdef CROSS_TO_AMIGA +extern void __stkinit(void); +void *__nh_force_stkinit = __stkinit; +#endif #endif diff --git a/sys/amiga/amitty.c b/sys/amiga/amitty.c index 047a122c1..22036c8f5 100644 --- a/sys/amiga/amitty.c +++ b/sys/amiga/amitty.c @@ -20,15 +20,15 @@ #include #endif -void NDECL(tty_change_color); -char *NDECL(tty_get_color_string); - -#ifdef TTY_GRAPHICS +void tty_change_color(void); +char *tty_get_color_string(void); int amibbs = 0; /* BBS mode */ char bbs_id[80] = ""; /* BBS uid equivalent */ long afh_in, afh_out; /* BBS mode Amiga filehandles */ +#ifdef TTY_GRAPHICS + void settty(const char *s) { @@ -58,9 +58,10 @@ setftty() } char kill_char = 'X' - '@'; char erase_char = '\b'; -tgetch() +int +tgetch(void) { - char x; + unsigned char x; Read(afh_in, &x, 1); return (x == '\r') ? '\n' : x; } diff --git a/sys/amiga/amiwind.c b/sys/amiga/amiwind.c index a5c4f7d67..d931697b7 100644 --- a/sys/amiga/amiwind.c +++ b/sys/amiga/amiwind.c @@ -3,9 +3,15 @@ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1993,1996 */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif /* Have to undef CLOSE as display.h and intuition.h both use it */ #undef CLOSE @@ -13,21 +19,33 @@ #ifdef AMII_GRAPHICS /* too early in the file? too late? */ #ifdef AMIFLUSH -static struct Message *FDECL(GetFMsg, (struct MsgPort *)); +static struct Message *GetFMsg(struct MsgPort *); #endif static int BufferGetchar(void); -static void ProcessMessage(register struct IntuiMessage *message); +static void ProcessMessage(struct IntuiMessage *message); #define BufferQueueChar(ch) (KbdBuffer[KbdBuffered++] = (ch)) -struct Library *ConsoleDevice; +struct Device *ConsoleDevice = NULL; + +/* Library bases - opened by amii_init_nhwindows, closed by amii_cleanup. + DOSBase is provided by newlib's startup code. + The rest must be defined here. */ +struct IntuitionBase *IntuitionBase = NULL; +struct GfxBase *GfxBase = NULL; +struct Library *GadToolsBase = NULL; +struct Library *LayersBase = NULL; +struct Library *AslBase = NULL; +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/amimenu.c" +#else +#include "amimenu.c" +#endif /* Now our own variables */ -struct IntuitionBase *IntuitionBase; struct Screen *HackScreen; struct Window *pr_WindowPtr; struct MsgPort *HackPort; @@ -38,7 +56,6 @@ char Initialized = 0; WEVENT lastevent; #ifdef HACKFONT -struct GfxBase *GfxBase; struct Library *DiskfontBase; #endif @@ -83,11 +100,10 @@ static enum { NoAction, CloseOver } delayed_key_action = NoAction; */ struct Window * -OpenShWindow(nw) -struct NewWindow *nw; +OpenShWindow(struct NewWindow *nw) { - register struct Window *win; - register ULONG idcmpflags; + struct Window *win; + ULONG idcmpflags; if (!HackPort) /* Sanity check */ return (struct Window *) 0; @@ -109,12 +125,10 @@ struct NewWindow *nw; * Close a window that shared the HackPort IDCMP port. */ -void FDECL(CloseShWindow, (struct Window *)); void -CloseShWindow(win) -struct Window *win; +CloseShWindow(struct Window *win) { - register struct IntuiMessage *msg; + struct IntuiMessage *msg; if (!HackPort) panic("HackPort NULL in CloseShWindow"); @@ -135,9 +149,9 @@ struct Window *win; } static int -BufferGetchar() +BufferGetchar(void) { - register int c; + int c; if (KbdBuffered > 0) { c = KbdBuffer[0]; @@ -163,8 +177,7 @@ BufferGetchar() */ int -ConvertKey(message) -register struct IntuiMessage *message; +ConvertKey(struct IntuiMessage *message) { static struct InputEvent theEvent; static char numpad[] = "bjnh.lyku"; @@ -173,8 +186,8 @@ register struct IntuiMessage *message; unsigned char buffer[10]; struct Window *w = message->IDCMPWindow; - register int length; - register ULONG qualifier; + int length; + ULONG qualifier; char numeric_pad, shift, control, alt; if (amii_wins[WIN_MAP]) @@ -338,10 +351,7 @@ register struct IntuiMessage *message; return (-1); } } - printf("Unrecognized key: %d ", (int) buffer[0]); - for (i = 1; i < length; ++i) - printf("%d ", (int) buffer[i]); - printf("\n"); + /* unrecognized key — silently ignore */ } return (-1); } @@ -356,8 +366,7 @@ register struct IntuiMessage *message; */ static void -ProcessMessage(message) -register struct IntuiMessage *message; +ProcessMessage(struct IntuiMessage *message) { int c; int cnt; @@ -368,15 +377,7 @@ register struct IntuiMessage *message; switch (message->Class) { case ACTIVEWINDOW: - if (alwaysinvent && WIN_INVEN != WIN_ERR - && w == amii_wins[WIN_INVEN]->win) { - cnt = DoMenuScroll(WIN_INVEN, 0, PICK_NONE, &mip); - } else if (scrollmsg && WIN_MESSAGE != WIN_ERR - && w == amii_wins[WIN_MESSAGE]->win) { - cnt = DoMenuScroll(WIN_MESSAGE, 0, PICK_NONE, &mip); - } else { - skip_mouse = 1; - } + skip_mouse = 1; break; case MOUSEBUTTONS: { @@ -412,12 +413,8 @@ register struct IntuiMessage *message; } } break; - case REFRESHWINDOW: { - if (scrollmsg && amii_wins[WIN_MESSAGE] - && w == amii_wins[WIN_MESSAGE]->win) { - cnt = DoMenuScroll(WIN_MESSAGE, 0, PICK_NONE, &mip); - } - } break; + case REFRESHWINDOW: + break; case CLOSEWINDOW: if (WIN_INVEN != WIN_ERR && w == amii_wins[WIN_INVEN]->win) { @@ -441,11 +438,6 @@ register struct IntuiMessage *message; break; case GADGETDOWN: - if (WIN_MESSAGE != WIN_ERR && w == amii_wins[WIN_MESSAGE]->win) { - cnt = DoMenuScroll(WIN_MESSAGE, 0, PICK_NONE, &mip); - } else if (WIN_INVEN != WIN_ERR && w == amii_wins[WIN_INVEN]->win) { - cnt = DoMenuScroll(WIN_INVEN, 0, PICK_NONE, &mip); - } break; case NEWSIZE: @@ -464,7 +456,17 @@ register struct IntuiMessage *message; ReDisplayData(WIN_INVEN); } else if (WINVERS_AMIV && (WIN_OVER != WIN_ERR && w == amii_wins[WIN_OVER]->win)) { - BufferQueueChar('R' - 64); + { + int i, have_redraw = 0; + for (i = 0; i < KbdBuffered; i++) { + if (KbdBuffer[i] == 'R' - 64) { + have_redraw = 1; + break; + } + } + if (!have_redraw) + BufferQueueChar('R' - 64); + } } else if (WIN_MAP != WIN_ERR && w == amii_wins[WIN_MAP]->win) { #ifdef CLIPPING CO = (w->Width - w->BorderLeft - w->BorderRight) / mxsize; @@ -477,7 +479,17 @@ register struct IntuiMessage *message; clipping = FALSE; clipx = clipy = 0; } - BufferQueueChar('R' - 64); + { + int i, have_redraw = 0; + for (i = 0; i < KbdBuffered; i++) { + if (KbdBuffer[i] == 'R' - 64) { + have_redraw = 1; + break; + } + } + if (!have_redraw) + BufferQueueChar('R' - 64); + } #endif } break; @@ -489,8 +501,9 @@ register struct IntuiMessage *message; amii_destroy_nhwindow(WIN_OVER); WIN_OVER = WIN_ERR; delayed_key_action = NoAction; + break; case NoAction: - ; /* null */ + break; } } @@ -505,13 +518,13 @@ register struct IntuiMessage *message; #if defined(TTY_GRAPHICS) && !defined(AMII_GRAPHICS) int -kbhit() +kbhit(void) { return 0; } #else int -kbhit() +kbhit(void) { int c; #ifdef TTY_GRAPHICS @@ -530,9 +543,9 @@ kbhit() #ifdef AMII_GRAPHICS int -amikbhit() +amikbhit(void) { - register struct IntuiMessage *message; + struct IntuiMessage *message; while (KbdBuffered < KBDBUFFER / 2) { #ifdef AMIFLUSH message = (struct IntuiMessage *) GetFMsg(HackPort); @@ -555,7 +568,7 @@ amikbhit() */ int -WindowGetchar() +WindowGetchar(void) { while ((lastevent.type = WEUNK), amikbhit() <= 0) { WaitPort(HackPort); @@ -564,7 +577,7 @@ WindowGetchar() } WETYPE -WindowGetevent() +WindowGetevent(void) { lastevent.type = WEUNK; while (amikbhit() == 0) { @@ -584,9 +597,9 @@ WindowGetevent() */ void -amii_cleanup() +amii_cleanup(void) { - register struct IntuiMessage *msg; + struct IntuiMessage *msg; /* Close things up */ if (HackPort) { @@ -696,8 +709,7 @@ amii_cleanup() #ifndef SHAREDLIB void -Abort(rc) -long rc; +Abort(long rc) { int fault = 1; #ifdef CHDIR @@ -748,7 +760,7 @@ long rc; } void -CleanUp() +CleanUp(void) { amii_cleanup(); } @@ -759,8 +771,7 @@ CleanUp() #ifdef AMIFLUSH /* This routine adapted from AmigaMail IV-37 by Michael Sinz */ static struct Message * -GetFMsg(port) -struct MsgPort *port; +GetFMsg(struct MsgPort *port) { struct IntuiMessage *msg, *succ, *succ1; @@ -786,8 +797,7 @@ struct MsgPort *port; #endif struct NewWindow * -DupNewWindow(win) -struct NewWindow *win; +DupNewWindow(struct NewWindow *win) { struct NewWindow *nwin; struct Gadget *ngd, *gd, *pgd = NULL; @@ -828,11 +838,10 @@ struct NewWindow *win; } void -FreeNewWindow(win) -struct NewWindow *win; +FreeNewWindow(struct NewWindow *win) { - register struct Gadget *gd, *pgd; - register struct StringInfo *sip; + struct Gadget *gd, *pgd; + struct StringInfo *sip; for (gd = win->FirstGadget; gd; gd = pgd) { pgd = gd->NextGadget; @@ -851,7 +860,7 @@ struct NewWindow *win; } void -bell() +bell(void) { if (flags.silent) return; @@ -859,15 +868,14 @@ bell() } void -amii_delay_output() +amii_delay_output(void) { /* delay 50 ms */ Delay(2L); } void -amii_number_pad(state) -int state; +amii_number_pad(int state) { } #endif /* AMII_GRAPHICS */ @@ -883,6 +891,10 @@ amii_loadlib(void) { } +#ifdef CROSS_TO_AMIGA +extern void Abort(long) NORETURN; +#endif + /* fatal error */ /*VARARGS1*/ void error diff --git a/sys/amiga/amiwind.p b/sys/amiga/amiwind.p index 3c9460b17..762646dc2 100644 --- a/sys/amiga/amiwind.p +++ b/sys/amiga/amiwind.p @@ -4,37 +4,37 @@ /* amiwind.c */ #ifdef INTUI_NEW_LOOK -struct Window *FDECL( OpenShWindow, (struct ExtNewWindow *) ); +struct Window * OpenShWindow(struct ExtNewWindow *) ; #else -struct Window *FDECL( OpenShWindow, (struct NewWindow *) ); +struct Window * OpenShWindow(struct NewWindow *) ; #endif -void FDECL( CloseShWindow, (struct Window *)); -int NDECL( kbhit ); -int NDECL( amikbhit ); -int NDECL( WindowGetchar ); -WETYPE NDECL( WindowGetevent ); -void NDECL( WindowFlush ); -void FDECL( WindowPutchar, (char )); -void FDECL( WindowFPuts, (const char *)); -void FDECL( WindowPuts, (const char *)); -void FDECL( WindowPrintf, ( char *,... )); -void NDECL( CleanUp ); -int FDECL( ConvertKey, ( struct IntuiMessage * )); +void CloseShWindow(struct Window *); +int kbhit (void); +int amikbhit (void); +int WindowGetchar (void); +WETYPE WindowGetevent (void); +void WindowFlush (void); +void WindowPutchar(char ); +void WindowFPuts(const char *); +void WindowPuts(const char *); +void WindowPrintf( char *,... ); +void CleanUp (void); +int ConvertKey( struct IntuiMessage * ); #ifndef SHAREDLIB -void FDECL( Abort, (long )); +void Abort(long ); #endif -void FDECL( flush_glyph_buffer, (struct Window *)); -void FDECL( amiga_print_glyph, (winid , int , int )); -void FDECL( start_glyphout, (winid )); -void FDECL( amii_end_glyphout, (winid )); +void flush_glyph_buffer(struct Window *); +void amiga_print_glyph(winid , int , int ); +void start_glyphout(winid ); +void amii_end_glyphout(winid ); #ifdef INTUI_NEW_LOOK -struct ExtNewWindow *FDECL( DupNewWindow, (struct ExtNewWindow *)); -void FDECL( FreeNewWindow, (struct ExtNewWindow *)); +struct ExtNewWindow * DupNewWindow(struct ExtNewWindow *); +void FreeNewWindow(struct ExtNewWindow *); #else -struct NewWindow *FDECL( DupNewWindow, (struct NewWindow *)); -void FDECL( FreeNewWindow, (struct NewWindow *)); +struct NewWindow * DupNewWindow(struct NewWindow *); +void FreeNewWindow(struct NewWindow *); #endif -void NDECL( bell ); -void NDECL( amii_delay_output ); -void FDECL( amii_number_pad, (int )); +void bell (void); +void amii_delay_output (void); +void amii_number_pad(int ); void amii_cleanup( void ); diff --git a/sys/amiga/bmp2iff_host.c b/sys/amiga/bmp2iff_host.c new file mode 100644 index 000000000..154335297 --- /dev/null +++ b/sys/amiga/bmp2iff_host.c @@ -0,0 +1,480 @@ +/* + * bmp2iff_host.c - Convert a BMP to Amiga BMAP IFF. + * Copyright (c) 2026 by Ingo Paschke. + * NetHack may be freely redistributed. See license for details. + * + * IFF BMAP format matches sys/amiga/xpm2iff.c by Gregg Wonderly. + * + * Usage: bmp2iff_host -planes N input.bmp output.iff + * + * This is a HOST tool -- runs on the build machine. + */ + +#include +#include +#include +#include + +#define TILE_X 16 +#define TILE_Y 16 + +#pragma pack(push,1) +typedef struct { + uint16_t bfType; + uint32_t bfSize; + uint16_t bfReserved1, bfReserved2; + uint32_t bfOffBits; +} BMPFILEHEADER; + +typedef struct { + uint32_t biSize; + int32_t biWidth, biHeight; + uint16_t biPlanes, biBitCount; + uint32_t biCompression; + uint32_t biSizeImage; + int32_t biXPelsPerMeter, biYPelsPerMeter; + uint32_t biClrUsed, biClrImportant; +} BMPINFOHEADER; +#pragma pack(pop) + +typedef struct { + uint8_t r, g, b; +} RGB; + +/* --------------------------------------------------------- */ +/* Fixed 16-color AMIV UI palette */ +/* Must match amiv_init_map[] in winami.c */ +/* --------------------------------------------------------- */ + +static const RGB amiv_pal[16] = { + {0x00,0x00,0x00}, /* 0 black */ + {0xFF,0xFF,0xFF}, /* 1 white */ + {0x00,0xBB,0xFF}, /* 2 cyan */ + {0xFF,0x66,0x00}, /* 3 orange */ + {0x00,0x00,0xFF}, /* 4 blue */ + {0x00,0x99,0x00}, /* 5 green */ + {0x66,0x99,0xBB}, /* 6 grey */ + {0xFF,0x00,0x00}, /* 7 red */ + {0x66,0xFF,0x00}, /* 8 ltgreen */ + {0xFF,0xFF,0x00}, /* 9 yellow */ + {0xFF,0x00,0xFF}, /* 10 magenta */ + {0x99,0x44,0x00}, /* 11 brown */ + {0x44,0x66,0x66}, /* 12 greyblue */ + {0xCC,0x44,0x00}, /* 13 ltbrown */ + {0xDD,0xDD,0xBB}, /* 14 ltgrey */ + {0xFF,0xBB,0x99}, /* 15 peach */ +}; + +/* --------------------------------------------------------- */ +/* Colour helpers */ +/* --------------------------------------------------------- */ + +static int +coldist(const RGB *a, const RGB *b) +{ + int dr = a->r - b->r; + int dg = a->g - b->g; + int db = a->b - b->b; + return dr*dr + dg*dg + db*db; +} + +static int +nearest(const RGB *c, const RGB *pal, int n) +{ + int best = 0, bestd = 0x7fffffff, i; + for (i = 0; i < n; i++) { + int d = coldist(c, &pal[i]); + if (d < bestd) { bestd = d; best = i; } + } + return best; +} + +/* --------------------------------------------------------- */ +/* IFF output */ +/* --------------------------------------------------------- */ + +static FILE *iff_fp; + +static void +wr32(uint32_t v) +{ + uint8_t b[4] = { v>>24, v>>16, v>>8, v }; + fwrite(b, 1, 4, iff_fp); +} + +static void +wr_chunk(const char *id, const void *d, uint32_t len) +{ + fwrite(id, 1, 4, iff_fp); + wr32(len); + fwrite(d, 1, len, iff_fp); + if (len & 1) fputc(0, iff_fp); +} + +static void +iff_write(int nplanes, int ncolors, uint8_t *cmap, + int w, int h, uint8_t **planes, + int ntiles, int across, int down) +{ + long spos; + uint32_t plsz = (uint32_t)(w / 8) * h; + int i; + + fwrite("FORM", 1, 4, iff_fp); + spos = ftell(iff_fp); + wr32(0); + fwrite("BMAP", 1, 4, iff_fp); + + /* BMHD */ + { + uint8_t bm[20]; + memset(bm, 0, 20); + bm[0] = w >> 8; bm[1] = w; + bm[2] = h >> 8; bm[3] = h; + bm[8] = (uint8_t)nplanes; + bm[14] = 100; bm[15] = 100; + wr_chunk("BMHD", bm, 20); + } + + /* CAMG */ + { + uint8_t c[4] = {0,0,0x80,0x04}; + wr_chunk("CAMG", c, 4); + } + + /* CMAP */ + wr_chunk("CMAP", cmap, (uint32_t)ncolors * 3); + + /* PDAT */ + { + uint8_t pd[28], *p = pd; + uint32_t v[7]; + v[0] = nplanes; + v[1] = plsz; + v[2] = across; + v[3] = down; + v[4] = ntiles; + v[5] = TILE_X; + v[6] = TILE_Y; + for (i = 0; i < 7; i++) { + p[0] = (v[i]>>24); p[1] = (v[i]>>16); + p[2] = (v[i]>> 8); p[3] = v[i]; + p += 4; + } + wr_chunk("PDAT", pd, 28); + } + + /* PLNE */ + fwrite("PLNE", 1, 4, iff_fp); + wr32(plsz * nplanes); + for (i = 0; i < nplanes; i++) + fwrite(planes[i], 1, plsz, iff_fp); + + /* fix FORM size */ + { + long end = ftell(iff_fp); + uint32_t sz = (uint32_t)(end - spos - 4); + fseek(iff_fp, spos, SEEK_SET); + wr32(sz); + fseek(iff_fp, 0, SEEK_END); + } +} + +/* --------------------------------------------------------- */ +/* Pixel-to-bitplane conversion */ +/* --------------------------------------------------------- */ + +static void +to_planes(uint8_t *pix, int w, int h, + int np, uint8_t **pl) +{ + int rb = w / 8; + int x, y, p; + + for (p = 0; p < np; p++) + memset(pl[p], 0, rb * h); + + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) { + uint8_t v = pix[y * w + x]; + int off = y * rb + x / 8; + int bit = 7 - (x & 7); + for (p = 0; p < np; p++) + if (v & (1 << p)) + pl[p][off] |= (1 << bit); + } +} + +/* --------------------------------------------------------- */ +/* Palette building */ +/* --------------------------------------------------------- */ + +/* + * Build an output palette of 'maxcol' entries: + * - slots 0-15: fixed AMIV UI colors + * - slots 16+: tile colors from the BMP + * + * Returns remap[0..nsrc-1] mapping BMP palette index + * to output palette index. + */ +static void +build_palette(const RGB *src, int nsrc, + const uint8_t *pix, int npix, + int maxcol, + RGB *out, int *remap) +{ + int freq[256] = {0}; + int order[256]; + int i, j, nfree, nuniq; + + /* count pixel frequency per BMP palette entry */ + for (i = 0; i < npix; i++) + freq[pix[i]]++; + + /* sort BMP colors by frequency (descending) */ + for (i = 0; i < nsrc; i++) order[i] = i; + for (i = 1; i < nsrc; i++) { + int k = order[i], kf = freq[k]; + j = i - 1; + while (j >= 0 && freq[order[j]] < kf) { + order[j+1] = order[j]; + j--; + } + order[j+1] = k; + } + + /* count unique colors actually used */ + nuniq = 0; + for (i = 0; i < nsrc; i++) + if (freq[i] > 0) nuniq++; + + /* first 16 slots are AMIV UI */ + for (i = 0; i < 16 && i < maxcol; i++) + out[i] = amiv_pal[i]; + for (i = 16; i < maxcol; i++) + memset(&out[i], 0, sizeof(RGB)); + + nfree = maxcol - 16; + if (nfree < 0) nfree = 0; + + /* + * Case 1: enough free slots for all unique colors. + * Assign each unique BMP color its own pen, exact + * AMIV matches share the UI pen. + */ + if (nuniq <= nfree) { + int next = 16; + for (i = 0; i < nsrc; i++) { + if (freq[i] == 0) { + remap[i] = 0; + continue; + } + /* exact match to an AMIV pen? */ + int best = nearest(&src[i], amiv_pal, 16); + if (coldist(&src[i], &amiv_pal[best]) == 0) { + remap[i] = best; + } else { + remap[i] = next; + out[next] = src[i]; + next++; + } + } + return; + } + + /* + * Case 2: more unique colors than free slots. + * - Direct/near AMIV matches use UI pens. + * - Remaining slots filled by most-frequent colors. + * - Leftovers mapped to nearest in final palette. + */ + { + int next = 16; + int assigned[256]; + memset(assigned, 0, sizeof(assigned)); + + /* pass 1: exact/near AMIV matches */ + for (i = 0; i < nsrc; i++) { + if (freq[i] == 0) { + remap[i] = 0; + assigned[i] = 1; + continue; + } + int best = nearest(&src[i], amiv_pal, 16); + int d = coldist(&src[i], &amiv_pal[best]); + if (d < 200) { /* near match threshold */ + remap[i] = best; + assigned[i] = 1; + } + } + + /* pass 2: fill free slots with most-frequent + * unassigned colors (order[] is freq-sorted) */ + for (i = 0; i < nsrc && next < maxcol; i++) { + int idx = order[i]; + if (assigned[idx] || freq[idx] == 0) + continue; + remap[idx] = next; + out[next] = src[idx]; + assigned[idx] = 1; + next++; + } + + /* pass 3: map remaining to nearest in palette */ + for (i = 0; i < nsrc; i++) { + if (!assigned[i]) + remap[i] = nearest(&src[i], out, next); + } + } +} + +/* --------------------------------------------------------- */ +/* Main */ +/* --------------------------------------------------------- */ + +int +main(int argc, char **argv) +{ + FILE *bmpfp; + BMPFILEHEADER fhdr; + BMPINFOHEADER ihdr; + RGB palette[256]; + int ncolors, img_w, img_h, rowstride; + uint8_t *bmpdata, *pixels; + int ntiles, across, down; + int nplanes, maxcol; + int i, y; + RGB outpal[256]; + int remap[256]; + uint8_t *remapped; + uint8_t *plane_data[8]; + uint8_t cmap_rgb[256 * 3]; + int planesize; + + /* parse args */ + if (argc != 5 + || strcmp(argv[1], "-planes") != 0) { + fprintf(stderr, + "Usage: %s -planes N input.bmp output.iff\n", + argv[0]); + return 1; + } + nplanes = atoi(argv[2]); + if (nplanes < 1 || nplanes > 8) { + fprintf(stderr, "planes must be 1-8\n"); + return 1; + } + maxcol = 1 << nplanes; + + /* read BMP */ + bmpfp = fopen(argv[3], "rb"); + if (!bmpfp) { perror(argv[3]); return 1; } + + if (fread(&fhdr, sizeof(fhdr), 1, bmpfp) != 1 + || fread(&ihdr, sizeof(ihdr), 1, bmpfp) != 1) { + fprintf(stderr, "Failed to read BMP header\n"); + return 1; + } + if (fhdr.bfType != 0x4D42) { + fprintf(stderr, "Not a BMP file\n"); + return 1; + } + if (ihdr.biBitCount != 8) { + fprintf(stderr, + "Expected 8-bit BMP, got %d-bit\n", + ihdr.biBitCount); + return 1; + } + + img_w = ihdr.biWidth; + img_h = abs(ihdr.biHeight); + ncolors = ihdr.biClrUsed ? ihdr.biClrUsed : 256; + if (ncolors > 256) ncolors = 256; + + /* read palette (BMP stores BGRx) */ + { + uint8_t raw[256][4]; + if (fread(raw, 4, ncolors, bmpfp) + != (size_t)ncolors) { + fprintf(stderr, "Failed to read palette\n"); + return 1; + } + for (i = 0; i < ncolors; i++) { + palette[i].r = raw[i][2]; + palette[i].g = raw[i][1]; + palette[i].b = raw[i][0]; + } + } + + /* read pixel data */ + rowstride = (img_w + 3) & ~3; + bmpdata = malloc(rowstride * img_h); + fseek(bmpfp, fhdr.bfOffBits, SEEK_SET); + if (fread(bmpdata, 1, rowstride * img_h, bmpfp) + != (size_t)(rowstride * img_h)) { + fprintf(stderr, "Failed to read pixel data\n"); + return 1; + } + fclose(bmpfp); + + /* flip bottom-up to top-down */ + pixels = malloc(img_w * img_h); + if (ihdr.biHeight > 0) { + for (y = 0; y < img_h; y++) + memcpy(pixels + y * img_w, + bmpdata + (img_h-1-y) * rowstride, + img_w); + } else { + for (y = 0; y < img_h; y++) + memcpy(pixels + y * img_w, + bmpdata + y * rowstride, img_w); + } + free(bmpdata); + + across = img_w / TILE_X; + down = img_h / TILE_Y; + ntiles = across * down; + + /* build palette and remap pixels */ + build_palette(palette, ncolors, + pixels, img_w * img_h, + maxcol, outpal, remap); + + remapped = malloc(img_w * img_h); + for (i = 0; i < img_w * img_h; i++) + remapped[i] = (uint8_t)remap[pixels[i]]; + + /* convert to bitplanes */ + planesize = (img_w / 8) * img_h; + for (i = 0; i < nplanes; i++) + plane_data[i] = calloc(1, planesize); + + to_planes(remapped, img_w, img_h, + nplanes, plane_data); + + /* build CMAP */ + for (i = 0; i < maxcol; i++) { + cmap_rgb[i*3+0] = outpal[i].r; + cmap_rgb[i*3+1] = outpal[i].g; + cmap_rgb[i*3+2] = outpal[i].b; + } + + /* write IFF */ + iff_fp = fopen(argv[4], "wb"); + if (!iff_fp) { perror(argv[4]); return 1; } + + iff_write(nplanes, maxcol, cmap_rgb, + img_w, img_h, plane_data, + ntiles, across, down); + fclose(iff_fp); + + printf("%s: %dx%d, %d colors (%d planes), " + "%d tiles\n", + argv[4], img_w, img_h, + maxcol, nplanes, ntiles); + + for (i = 0; i < nplanes; i++) free(plane_data[i]); + free(remapped); + free(pixels); + return 0; +} diff --git a/sys/amiga/cnf-info.uu b/sys/amiga/cnf-info.uu new file mode 100644 index 000000000..f9b9f0887 --- /dev/null +++ b/sys/amiga/cnf-info.uu @@ -0,0 +1,23 @@ +begin 644 nethack.cnf.info +MXQ```0``````(``4`!X`'@`&``$``0?Z<1@'^I$H```````````````````` +M```!!``'^J`!X``T`) +M2*@'``````````````````````@'^``(````"`?`>`@````(!^``"`````@' +MP``(````"`>`?@@````(`^``"`````@!_^`(````"`'_``@````(`?Y_"``` +M``@`__`(````"`#\``@````8`WP7___T'^UO_!?___0?Z__\%___]!_ +MO_?P7___T'____!?___0?___\%___^!__]>`7___P'___P@@```0`````/__ +M__"````(H```((%```"@```@@@`2`*```""`@```H```((!*@`"@```@@)(` +M`*```""`4A(`H```((!*0`"@```@@%```*```""`0`@`H```((````"@```@ +M@````*```!"``"APH```((```(`````(`````````!)$2#`Z5&]O;',O161I +.=%!A9``````(`````0`` +` +end diff --git a/sys/amiga/cvtsnd.c b/sys/amiga/cvtsnd.c deleted file mode 100644 index 2e16b7645..000000000 --- a/sys/amiga/cvtsnd.c +++ /dev/null @@ -1,97 +0,0 @@ -/* NetHack 3.6 cvtsnd.c $NHDT-Date: 1432512794 2015/05/25 00:13:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ -/* Copyright (c) 1995, Andrew Church, Olney, Maryland */ -/* NetHack may be freely redistributed. See license for details. */ - -#include -#include -#include - -typedef struct { - short namelen; - char name[62]; - char misc[64]; /* rest of MacBinary header */ - long FORM; - long flen; - long AIFF; - long SSND; - long sndlen; -} AIFF; - -typedef struct { - char FORM[4]; - long flen; - char _8SVX[4]; - char VHDR[4]; - long vhlen; - long oneshot, repeat; - long samples; /* 'samplesPerHiCycle' in the docs - usually 32, so - * we'll use that */ - short freq; - char octaves, compress; - long volume; - char NAME[4]; - long nlen; /* should be 64; see name[] comment */ - char name[64]; /* for simplicity, i.e. just fwrite() entiree header */ - char BODY[4]; - long blen; -} IFF; - -main(int ac, char **av) -{ - FILE *in, *out; - AIFF aiff; - IFF iff; - static char buf[16384]; - long n, len; - - if (ac != 3) { - fprintf(stderr, "Usage: %s input-file output-file\n", av[0]); - exit(20); - } - if (!(in = fopen(av[1], "r"))) { - fprintf(stderr, "Can't open input file\n"); - exit(20); - } - if (!(out = fopen(av[2], "w"))) { - fprintf(stderr, "Can't open output file\n"); - exit(20); - } - - fread(&aiff, sizeof(aiff), 1, in); - memcpy(iff.FORM, "FORM", 4); - iff.flen = sizeof(iff) + aiff.sndlen - 8; - memcpy(iff._8SVX, "8SVX", 4); - memcpy(iff.VHDR, "VHDR", 4); - iff.vhlen = 20; - iff.oneshot = aiff.sndlen; - iff.repeat = 0; - iff.samples = 32; - iff.freq = 22000; - iff.octaves = 1; - iff.compress = 0; - iff.volume = 0x10000; - memcpy(iff.NAME, "NAME", 4); - iff.nlen = 64; - strncpy(iff.name, aiff.name, 62); - iff.name[aiff.namelen] = 0; - memcpy(iff.BODY, "BODY", 4); - iff.blen = aiff.sndlen; - fwrite(&iff, sizeof(iff), 1, out); - len = aiff.sndlen; - do { - if (len >= sizeof(buf)) - n = fread(buf, 1, sizeof(buf), in); - else - n = fread(buf, 1, len, in); - if (n) { - fwrite(buf, 1, n, out); - len -= n; - } - } while (len && n); - - if (len) - fprintf(stderr, "Warning: %ld bytes of sample missing\n", len); - fclose(in); - fclose(out); - exit(0); -} diff --git a/sys/amiga/drawer-info.uu b/sys/amiga/drawer-info.uu new file mode 100644 index 000000000..cddf5a258 --- /dev/null +++ b/sys/amiga/drawer-info.uu @@ -0,0 +1,17 @@ +begin 644 NetHack.info +MXQ```0`````!HP`/`#D`#@`&``$``0`SE&``-K,H```````````````````` +M```!`@```````````(````"``````#!?4````````!```+@`30%R`$K__P`` +M```"`!!_`#:X9@``````+N.D````````````7@!!_____P`!```````````` +M`````#D`#@`"``%O4`,`````````````````#_______Y``,```````$``@` +M`````"0`"``)_R``)``(``G5(``D``@`"``@`"0`"``'_\``)``(```````D +M``G______^0`````````!``/_______\```````````````````````_____ +M___X`#```````!@`,_______^``W_______8`#?_]@#?_]@`-__V*M__V``W +M__?_W__8`#?_^``__]@`-_______V``V```````8`#________@````````` +M```````````````````````````````Y``X``@`!<#`#```````````````` +M``_______^0`&JJJJJJJM``U5555555<`'________P`0```````!`!````` +M```&`$``"?\@``8`0``)U2``!H!```@`(``&@$``!__```:`0```````!H!_ +M_______^@`*JJJJJJJJ`/_______^``P```````8`"*JJJJJJJ@`!5555555 +M4````````````#________@`/_______^``___8`W__X`#__]BK?__@`/__W +K_]__^``___@`/__X`#________@```````````````````````````$````` +` +end diff --git a/sys/amiga/ifchange b/sys/amiga/ifchange deleted file mode 100644 index d06450c08..000000000 --- a/sys/amiga/ifchange +++ /dev/null @@ -1,55 +0,0 @@ -.KEY oper/a,tmp/a,real/a,f1,f2,f3,f4,f5 - -. ; miscellaneous script functions for the Amiga -. ; Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993, 1996. -. ; NetHack may be freely redistributed. See license for details. - -FAILAT 6 -IF EQ "MOVE" - IF EXISTS - diff >T:mic -c - search from T:mic SEARCH "---" QUIET - IF WARN - echo "MOVE: no change" - delete - ELSE - echo "MOVE: copy" - copy clone - delete - ENDIF - ELSE - echo "MOVE: copy2" - copy clone - delete - ENDIF - QUIT -ENDIF - -IF EQ "TOUCH" - IF EXISTS - diff >T:mic -c - search from T:mic SEARCH "---" QUIET - IF NOT WARN - echo "TOUCH: touch" - IF NOT EQ "@" - setdate - ENDIF - IF NOT EQ "@" - setdate - ENDIF - IF NOT EQ "@" - setdate - ENDIF - IF NOT EQ "@" - setdate - ENDIF - IF NOT EQ "@" - setdate - ENDIF - ENDIF - ENDIF - QUIT -ENDIF - -echo "ifchange: '' not recognized" -quit 10 diff --git a/sys/amiga/license-info.uu b/sys/amiga/license-info.uu new file mode 100644 index 000000000..398d9aed5 --- /dev/null +++ b/sys/amiga/license-info.uu @@ -0,0 +1,23 @@ +begin 644 license.info +MXQ```0``````(``4`!X`'@`&``$``0?ZD2@'^J`!X``T`) +M1X`'``````````````````````@'^``(````"`?`>`@````(!^``"`````@' +MP``(````"`>`?@@````(`^``"`````@!_^`(````"`'_``@````(`?Y_"``` +M``@`__`(````"`#\``@````8`WP7___T'^UO_!?___0?Z__\%___]!_ +MO_?P7___T'____!?___0?___\%___^!__]>`7___P'___P@@```0`````/__ +M__"````(H```((%```"@```@@@`2`*```""`@```H```((!*@`"@```@@)(` +M`*```""`4A(`H```((!*0`"@```@@%```*```""`0`@`H```((````"@```@ +M@````*```!"``"APH```((```(`````(`````````!)$2#`Z5&]O;',O161I +.=%!A9``````(`````0`` +` +end diff --git a/sys/amiga/mkdmake b/sys/amiga/mkdmake deleted file mode 100644 index fc002ef10..000000000 --- a/sys/amiga/mkdmake +++ /dev/null @@ -1,13 +0,0 @@ -GE/$@/%(left)/ -GE/$@#O____^@#_(DBE^@#_____^@#_2G__^@#_ +M____^@#_____^@#_B2J*>@#_____^@#_(E$3^@#O____^@#_F15$^@#_____ +M^@#_(DBO^@#_____^@#_-(15^@#_____^@#_____^@#^D___^@#_____^@#_ +M____^@#_____^@```````@#______@`````&```````$@```&``$0```,``$ +M(``!X``$$```P``$"``````$```````!\```````"```6U5````````````` +M=/==@```````````W;=:````````````M8``````````````````````=M5U +M@```````````W:[L````````````9NJ[````````````W;=0```````````` +MRWNJ```````````````````!;`````````````````````````````"````` +M`````````````````"<`(P`#0`Z[``(```````(!NVZT``(`` +M`````(!:P````(```````(```````(`[:KK``(```````(!NUW8``(`````` +M`(`S=5V``(```````(!NVZ@``(```````(!EO=4``(```````(```````("V +M`````(```````(```````(```````,```````````!)365,Z5&]O;',O161I +.=%!A9``````(`````0`` +` +end diff --git a/sys/amiga/txt-info.uu b/sys/amiga/txt-info.uu new file mode 100644 index 000000000..d898dec9d --- /dev/null +++ b/sys/amiga/txt-info.uu @@ -0,0 +1,23 @@ +begin 644 nethack.txt.info +MXQ```0``````(``4`!X`'@`&``$``4`)%KA`"1E8```````````````````` +M```!!`!`"3\8!X9\*````+(````&`````````````"`````````>`!X``T`) +M1$`'``````````````````````@'^``(````"`?`>`@````(!^``"`````@' +MP``(````"`>`?@@````(`^``"`````@!_^`(````"`'_``@````(`?Y_"``` +M``@`__`(````"`#\``@````8`WP7___T'^UO_!?___0?Z__\%___]!_ +MO_?P7___T'____!?___0?___\%___^!__]>`7___P'___P@@```0`````/__ +M__"````(H```((%```"@```@@@`2`*```""`@```H```((!*@`"@```@@)(` +M`*```""`4A(`H```((!*0`"@```@@%```*```""`0`@`H```((````"@```@ +M@````*```!"``"APH```((```(`````(`````````!)$2#`Z5&]O;',O161I +.=%!A9``````(`````0`` +` +end diff --git a/sys/amiga/txt2iff.c b/sys/amiga/txt2iff.c deleted file mode 100644 index 8e1916b9e..000000000 --- a/sys/amiga/txt2iff.c +++ /dev/null @@ -1,446 +0,0 @@ -/* NetHack 3.6 txt2iff.c $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ -/* Copyright (c) 1995 by Gregg Wonderly, Naperville, Illinois */ -/* NetHack may be freely redistributed. See license for details. */ - -#include - -#include "config.h" -#include "tile.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef _DCC -#include -#include -#include -#endif - -void panic(const char *); -void map_colors(void); -int BestMatch(int, int, int); - -extern pixval ColorMap[3][MAXCOLORMAPSIZE]; -extern int colorsinmap; - -/* - * WARNING: - * This program carries forth the assumption that the colormaps in all - * of the .txt files are the same. This is a bug. - */ - -struct { - int Height; - int Width; -} IFFScreen; - -/* - * We are using a hybrid form of our own design which we call a BMAP (for - * bitmap) form. It is an ILBM with the bitmaps already deinterleaved, - * completely uncompressed. - * This speeds the loading of the images from the games point of view because - * it - * does not have to deinterleave and uncompress them. - */ -#define ID_BMAP MAKE_ID('B', 'M', 'A', 'P') /* instead of ILBM */ -#define ID_BMHD MAKE_ID('B', 'M', 'H', 'D') /* Same as ILBM */ -#define ID_CAMG MAKE_ID('C', 'A', 'M', 'G') /* Same as ILBM */ -#define ID_CMAP MAKE_ID('C', 'M', 'A', 'P') /* Same as ILBM */ -#define ID_PDAT \ - MAKE_ID('P', 'D', 'A', 'T') /* Extra data describing plane \ - * size due to graphics.library \ - * rounding requirements. \ - */ -#define ID_PLNE MAKE_ID('P', 'L', 'N', 'E') /* The planes of the image */ - -#ifndef _DCC -extern -#endif - struct Library *IFFParseBase; - -int nplanes; - -/* BMHD from IFF documentation */ -typedef struct { - UWORD w, h; - WORD x, y; - UBYTE nPlanes; - UBYTE masking; - UBYTE compression; - UBYTE reserved1; - UWORD transparentColor; - UBYTE xAspect, yAspect; - WORD pageWidth, pageHeight; -} BitMapHeader; - -typedef struct { - UBYTE r, g, b; -} AmiColorMap; - -pixel pixels[TILE_Y][TILE_X]; -AmiColorMap *cmap; - -int findcolor(register pixel *pix); -void packwritebody(pixel (*tile)[TILE_X], char **planes, int tileno); - -void -error(char *str) -{ - fprintf(stderr, "ERROR: %s\n", str); -} - -/* - * This array maps the image colors to the amiga's first 16 colors. The - * colors - * are reordered to help with maintaining dripen settings. - */ -int colrmap[] = { 0, 6, 9, 15, 4, 10, 2, 3, 5, 11, 7, 13, 8, 1, 14, 12 }; - -/* How many tiles fit across and down. */ - -#define COLS 20 -#define ROWS ((tiles + COLS - 1) / COLS) - -main(int argc, char **argv) -{ - int colors; - struct { - long nplanes; - long pbytes; - long across; - long down; - long npics; - long xsize; - long ysize; - } pdat; - long pbytes; /* Bytes of data in a plane */ - int i, cnt; - BitMapHeader bmhd; - struct IFFHandle *iff; - long camg = HIRES | LACE; - int tiles = 0; - char **planes; - - if (argc != 3) { - fprintf(stderr, "Usage: %s source destination\n", argv[0]); - exit(1); - } - -#if defined(_DCC) || defined(__GNUC__) - IFFParseBase = OpenLibrary("iffparse.library", 0); - if (!IFFParseBase) { - error("unable to open iffparse.library"); - exit(1); - } -#endif - - /* First, count the files in the file */ - if (fopen_text_file(argv[1], "r") != TRUE) { - perror(argv[1]); - return (1); - } - - nplanes = 0; - i = colorsinmap - 1; /*IFFScreen.Colors - 1; */ - while (i != 0) { - nplanes++; - i >>= 1; - } - - planes = malloc(nplanes * sizeof(char *)); - if (planes == 0) { - error("can not allocate planes pointer"); - exit(1); - } - - while (read_text_tile(pixels) == TRUE) - ++tiles; - fclose_text_file(); - - IFFScreen.Width = COLS * TILE_X; - IFFScreen.Height = ROWS * TILE_Y; - - pbytes = (COLS * ROWS * TILE_X + 15) / 16 * 2 * TILE_Y; - - for (i = 0; i < nplanes; ++i) { - planes[i] = calloc(1, pbytes); - if (planes[i] == 0) { - error("can not allocate planes pointer"); - exit(1); - } - } - - /* Now, process it */ - if (fopen_text_file(argv[1], "r") != TRUE) { - perror(argv[1]); - return (1); - } - - iff = AllocIFF(); - if (!iff) { - error("Can not allocate IFFHandle"); - return (1); - } - - iff->iff_Stream = Open(argv[2], MODE_NEWFILE); - if (!iff->iff_Stream) { - error("Can not open output file"); - return (1); - } - - InitIFFasDOS(iff); - OpenIFF(iff, IFFF_WRITE); - - PushChunk(iff, ID_BMAP, ID_FORM, IFFSIZE_UNKNOWN); - - bmhd.w = IFFScreen.Width; - bmhd.h = IFFScreen.Height; - bmhd.x = 0; - bmhd.y = 0; - bmhd.nPlanes = nplanes; - bmhd.masking = 0; - bmhd.compression = 0; - bmhd.reserved1 = 0; - bmhd.transparentColor = 0; - bmhd.xAspect = 100; - bmhd.yAspect = 100; - bmhd.pageWidth = TILE_X; - bmhd.pageHeight = TILE_Y; - - PushChunk(iff, ID_BMAP, ID_BMHD, sizeof(bmhd)); - WriteChunkBytes(iff, &bmhd, sizeof(bmhd)); - PopChunk(iff); - - PushChunk(iff, ID_BMAP, ID_CAMG, sizeof(camg)); - WriteChunkBytes(iff, &camg, sizeof(camg)); - PopChunk(iff); - - /* We need to reorder the colors to get reasonable default pens but - * we also need to know where some of the colors are - so go find out. - */ - map_colors(); - - cmap = malloc((colors = (1L << nplanes)) * sizeof(AmiColorMap)); - for (i = 0; i < colors; ++i) { - cmap[colrmap[i]].r = ColorMap[CM_RED][i]; - cmap[colrmap[i]].g = ColorMap[CM_GREEN][i]; - cmap[colrmap[i]].b = ColorMap[CM_BLUE][i]; - } - - PushChunk(iff, ID_BMAP, ID_CMAP, IFFSIZE_UNKNOWN); - for (i = 0; i < colors; ++i) - WriteChunkBytes(iff, &cmap[i], 3); - PopChunk(iff); - - cnt = 0; - while (read_text_tile(pixels) == TRUE) { - packwritebody(pixels, planes, cnt); - if (cnt % 20 == 0) - printf("%d..", cnt); - ++cnt; - fflush(stdout); - } - - pdat.nplanes = nplanes; - pdat.pbytes = pbytes; - pdat.xsize = TILE_X; - pdat.ysize = TILE_Y; - pdat.across = COLS; - pdat.down = ROWS; - pdat.npics = cnt; - - PushChunk(iff, ID_BMAP, ID_PDAT, IFFSIZE_UNKNOWN); - WriteChunkBytes(iff, &pdat, sizeof(pdat)); - PopChunk(iff); - - PushChunk(iff, ID_BMAP, ID_PLNE, IFFSIZE_UNKNOWN); - for (i = 0; i < nplanes; ++i) - WriteChunkBytes(iff, planes[i], pbytes); - PopChunk(iff); - - CloseIFF(iff); - Close(iff->iff_Stream); - FreeIFF(iff); - - printf("\n%d tiles converted\n", cnt); - -#if defined(_DCC) || defined(__GNUC__) - CloseLibrary(IFFParseBase); -#endif - exit(0); -} - -findcolor(register pixel *pix) -{ - register int i; - - for (i = 0; i < MAXCOLORMAPSIZE; ++i) { - if ((pix->r == ColorMap[CM_RED][i]) - && (pix->g == ColorMap[CM_GREEN][i]) - && (pix->b == ColorMap[CM_BLUE][i])) { - return (i); - } - } - return (-1); -} - -void -packwritebody(pixel (*tile)[TILE_X], char **planes, int tileno) -{ - register int i, j, k, col; - register char *buf; - register int across, rowbytes, xoff, yoff; - - /* how many tiles fit across? */ - across = COLS; - - /* How many bytes per pixel row */ - rowbytes = ((IFFScreen.Width + 15) / 16) * 2; - - /* How many bytes to account for y distance in planes */ - yoff = ((tileno / across) * TILE_Y) * rowbytes; - - /* How many bytes to account for x distance in planes */ - xoff = (tileno % across) * (TILE_X / 8); - - /* For each row... */ - for (i = 0; i < TILE_Y; ++i) { - /* For each bitplane... */ - for (k = 0; k < nplanes; ++k) { - const int mask = 1l << k; - - /* Go across the row */ - for (j = 0; j < TILE_X; j++) { - col = findcolor(&tile[i][j]); - if (col == -1) { - error("can not convert pixel color to colormap index"); - return; - } - /* Shift the colors around to have good complements and to - * know the dripen values. - */ - col = colrmap[col]; - - /* To top left corner of tile */ - buf = planes[k] + yoff + xoff; - - /*To i'th row of tile and the correct byte for the j'th - * pixel*/ - buf += (i * rowbytes) + (j / 8); - - /* Or in the bit for this color */ - *buf |= (((col & mask) != 0) << (7 - (j % 8))); - } - } - } -} - -/* #define DBG */ - -/* map_colors - * The incoming colormap is in arbitrary order and has arbitrary colors in - * it, but we need (some) specific colors in specific places. Find the - * colors we need and fix the mapping table to match. - */ -/* What we are aiming for: */ -/* XXX was 0-7 */ -#define CX_BLACK 0 -#define CX_WHITE 1 -#define CX_BROWN 11 -#define CX_CYAN 2 -#define CX_GREEN 5 -#define CX_MAGENTA 10 -#define CX_BLUE 4 -#define CX_RED 7 -/* we don't care about the rest, at least now */ -/* should get: black white blue red grey greyblue ltgrey */ -void -map_colors() -{ - int x; -#if 1 - int tmpmap[] = { 0, 2, 3, 7, 4, 5, 8, 9, 10, 11, 13, 15, 12, 1, 14, 6 }; -/* still not right: gray green yellow lost somewhere? */ -#else - int tmpmap[16]; - int x, y; - for (x = 0; x < 16; x++) - tmpmap[x] = -1; /* set not assigned yet */ - - tmpmap[BestMatch(0, 0, 0)] = CX_BLACK; - tmpmap[BestMatch(255, 255, 255)] = CX_WHITE; - tmpmap[BestMatch(255, 0, 0)] = CX_RED; - tmpmap[BestMatch(0, 255, 0)] = CX_GREEN; - tmpmap[BestMatch(0, 0, 255)] = CX_BLUE; - - /* clean up the rest */ - for (x = 0; x < 16; x++) { - for (y = 0; y < 16; y++) - if (tmpmap[y] == x) - goto outer_cont; - for (y = 0; y < 16; y++) - if (tmpmap[y] == -1) { - tmpmap[y] = x; - break; - } - if (y == 16) - panic("too many colors?"); - outer_cont: - ; - } - for (x = 0; x < 16; x++) - if (tmpmap[y] == -1) - panic("lost color?"); -#endif - for (x = 0; x < 16; x++) { -#ifdef DBG - printf("final: c[%d]=%d (target: %d)\n", x, tmpmap[x], colrmap[x]); -#endif - colrmap[x] = tmpmap[x]; - } -} -BestMatch(r, g, b) int r, g, b; -{ - int x; - int bestslot; - int bestrate = 99999999L; - for (x = 0; x < 16; x++) { - int rr = r - ColorMap[CM_RED][x]; - int gg = g - ColorMap[CM_GREEN][x]; - int bb = b - ColorMap[CM_BLUE][x]; - int rate = rr * rr + gg * gg + bb * bb; - if (bestrate > rate) { - bestrate = rate; - bestslot = x; - } - } -#ifdef DBG - printf("map (%d,%d,%d) -> %d (error=%d)\n", r, g, b, bestslot, bestrate); -#endif - return bestslot; -} - -long * -alloc(unsigned int n) -{ - long *ret = malloc(n); - if (!ret) { - error("Can't allocate memory"); - exit(1); - } - return (ret); -} - -void -panic(const char *msg) -{ - fprintf(stderr, "PANIC: %s\n", msg); - exit(1); -} diff --git a/sys/amiga/winmenu.c b/sys/amiga/winamenu.c similarity index 94% rename from sys/amiga/winmenu.c rename to sys/amiga/winamenu.c index 8558dbac5..d391bdec4 100644 --- a/sys/amiga/winmenu.c +++ b/sys/amiga/winamenu.c @@ -1,20 +1,26 @@ -/* NetHack 3.6 winmenu.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ +/* NetHack 3.6 winamenu.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993,1996. */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif /* Start building the text for a menu */ void -amii_start_menu(window) -register winid window; +amii_start_menu(winid window, unsigned long mbehavior UNUSED) { - register int i; - register struct amii_WinDesc *cw; - register amii_menu_item *mip; + int i; + struct amii_WinDesc *cw; + amii_menu_item *mip; + if (window == WIN_ERR || (cw = amii_wins[window]) == NULL || cw->type != NHW_MENU) @@ -56,17 +62,13 @@ register winid window; /* Add a string to a menu */ void -amii_add_menu(window, glyph, id, ch, gch, attr, str, preselected) -register winid window; -register int glyph; -register const anything *id; -register char ch; -register char gch; -register int attr; -register const char *str; -register BOOLEAN_P preselected; +amii_add_menu(winid window, const glyph_info *glyphinfo, const anything *id, + char ch, char gch, int attr, int clr, + const char *str, unsigned int itemflags) { - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; + + boolean preselected = ((itemflags & MENU_ITEMFLAGS_SELECTED) != 0); amii_menu_item *mip; char buf[4 + BUFSZ]; @@ -81,7 +83,8 @@ register BOOLEAN_P preselected; mip->identifier = *id; mip->selected = preselected; mip->attr = attr; - mip->glyph = Is_rogue_level(&u.uz) ? NO_GLYPH : glyph; + mip->color = clr; + mip->glyph = Is_rogue_level(&u.uz) ? NO_GLYPH : (glyphinfo ? glyphinfo->glyph : NO_GLYPH); mip->selector = 0; mip->gselector = gch; mip->count = -1; @@ -122,11 +125,10 @@ register BOOLEAN_P preselected; /* Done building a menu. */ void -amii_end_menu(window, morestr) -register winid window; -register const char *morestr; +amii_end_menu(winid window, const char *morestr) { - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; + if (window == WIN_ERR || (cw = amii_wins[window]) == NULL || cw->type != NHW_MENU) @@ -142,8 +144,8 @@ register const char *morestr; mip = cw->menu.last; #endif any.a_void = 0; - amii_add_menu(window, NO_GLYPH, &any, 0, 0, ATR_NONE, morestr, - MENU_UNSELECTED); + amii_add_menu(window, (const glyph_info *) 0, &any, 0, 0, ATR_NONE, + NO_COLOR, morestr, MENU_ITEMFLAGS_NONE); #ifdef PROMPTFIRST /* Do some shuffling. Last first, push others one forward \ */ mip->next = NULL; @@ -169,13 +171,11 @@ register const char *morestr; /* Select something from the menu. */ int -amii_select_menu(window, how, mip) -register winid window; -register int how; -register menu_item **mip; +amii_select_menu(winid window, int how, menu_item **mip) { int cnt; - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; + if (window == WIN_ERR || (cw = amii_wins[window]) == NULL || cw->type != NHW_MENU) @@ -190,7 +190,7 @@ register menu_item **mip; } amii_menu_item * -find_menu_item(register struct amii_WinDesc *cw, int idx) +find_menu_item(struct amii_WinDesc *cw, int idx) { amii_menu_item *mip; for (mip = cw->menu.items; idx > 0 && mip; mip = mip->next) @@ -200,11 +200,11 @@ find_menu_item(register struct amii_WinDesc *cw, int idx) } int -make_menu_items(register struct amii_WinDesc *cw, register menu_item **rmip) +make_menu_items(struct amii_WinDesc *cw, menu_item **rmip) { - register int idx = 0; - register amii_menu_item *mip; - register menu_item *mmip; + int idx = 0; + amii_menu_item *mip; + menu_item *mmip; for (mip = cw->menu.items; mip; mip = mip->next) { if (mip->selected) @@ -227,19 +227,17 @@ make_menu_items(register struct amii_WinDesc *cw, register menu_item **rmip) } int -DoMenuScroll(win, blocking, how, retmip) -int win, blocking, how; -menu_item **retmip; +DoMenuScroll(int win, int blocking, int how, menu_item **retmip) { amii_menu_item *amip; - register struct Window *w; - register struct NewWindow *nw; + struct Window *w; + struct NewWindow *nw; struct PropInfo *pip; - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; struct IntuiMessage *imsg; struct Gadget *gd; - register int wheight, xsize, ysize, aredone = 0; - register int txwd, txh; + int wheight, xsize, ysize, aredone = 0; + int txwd, txh; long mics, secs, class, code; long oldmics = 0, oldsecs = 0; int aidx, oidx, topidx, hidden; @@ -348,7 +346,7 @@ menu_item **retmip; nw->Screen = HackScreen; if (win == WIN_INVEN) { - sprintf(title, "%s the %s's Inventory", plname, pl_character); + sprintf(title, "%s the %s's Inventory", svp.plname, svp.pl_character); nw->Title = title; if (lastinvent.MaxX != 0) { nw->LeftEdge = lastinvent.MinX; @@ -810,7 +808,7 @@ menu_item **retmip; ++topidx; else break; - } else if (code = CTRL('U') + } else if (code == CTRL('U') || code == MENU_PREVIOUS_PAGE) { if (topidx > 0) --topidx; @@ -998,11 +996,13 @@ menu_item **retmip; oldmics = mics; } else { amip = find_menu_item(cw, oidx); - amip->selected = 0; - amip->count = -1; - reset_counting = TRUE; - if (amip->canselect && amip->selector) - amip->str[SOFF + 2] = '-'; + if (amip) { + amip->selected = 0; + amip->count = -1; + reset_counting = TRUE; + if (amip->canselect && amip->selector) + amip->str[SOFF + 2] = '-'; + } } if (counting && amip->selected && amip->canselect && amip->selector) { @@ -1083,13 +1083,12 @@ menu_item **retmip; } void -ReDisplayData(win) -winid win; +ReDisplayData(winid win) { int totalvis; - register struct amii_WinDesc *cw; - register struct Window *w; - register struct Gadget *gd; + struct amii_WinDesc *cw; + struct Window *w; + struct Gadget *gd; unsigned long hidden, aidx, wheight; struct PropInfo *pip; @@ -1114,15 +1113,13 @@ winid win; } long -FindLine(win, line) -winid win; -int line; +FindLine(winid win, int line) { int txwd; - register char *t; - register struct amii_WinDesc *cw; - register struct Window *w; - register int i, disprow, len; + char *t; + struct amii_WinDesc *cw; + struct Window *w; + int i, disprow, len; int col = -1; if (win == WIN_ERR || !(cw = amii_wins[win]) || !(w = cw->win)) { @@ -1177,15 +1174,14 @@ int line; } long -CountLines(win) -winid win; +CountLines(winid win) { int txwd; amii_menu_item *mip; - register char *t; - register struct amii_WinDesc *cw; - register struct Window *w; - register int i, disprow, len; + char *t; + struct amii_WinDesc *cw; + struct Window *w; + int i, disprow, len; int col = -1; if (win == WIN_ERR || !(cw = amii_wins[win]) || !(w = cw->win)) { @@ -1241,17 +1237,15 @@ winid win; } void -DisplayData(win, start) -winid win; -int start; +DisplayData(winid win, int start) { int txwd; amii_menu_item *mip; - register char *t; - register struct amii_WinDesc *cw; - register struct Window *w; - register struct RastPort *rp; - register int i, disprow, len, wheight; + char *t; + struct amii_WinDesc *cw; + struct Window *w; + struct RastPort *rp; + int i, disprow, len, wheight; int whichcolor = -1; int col; @@ -1354,6 +1348,13 @@ int start; whichcolor = 2; } + /* Apply menucolor if set for this item */ + if (mip && mip->color != NO_COLOR && !(mip->selected)) { + extern const int foreg[]; + SetAPen(rp, foreg[mip->color]); + whichcolor = 0; /* force re-evaluation next item */ + } + /* Next line out, wrap if too long */ t = cw->data[i] + SOFF; @@ -1418,14 +1419,11 @@ int start; } void -SetPropInfo(win, gad, vis, total, top) -register struct Window *win; -register struct Gadget *gad; -register long vis, total, top; +SetPropInfo(struct Window *win, struct Gadget *gad, long vis, long total, long top) { long mflags; - register long hidden; - register int body, pot; + long hidden; + int body, pot; hidden = max(total - vis, 0); diff --git a/sys/amiga/winami.c b/sys/amiga/winami.c index d445be286..7770a3547 100644 --- a/sys/amiga/winami.c +++ b/sys/amiga/winami.c @@ -3,14 +3,25 @@ */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif + #include "dlb.h" +#ifdef CROSS_TO_AMIGA +#define strnicmp strncmpi +#endif + #ifdef AMIGA_INTUITION -static int FDECL(put_ext_cmd, (char *, int, struct amii_WinDesc *, int)); +static int put_ext_cmd(char *, int, struct amii_WinDesc *, int); struct amii_DisplayDesc *amiIDisplay; /* the Amiga Intuition descriptor */ struct Rectangle lastinvent, lastmsg; @@ -28,15 +39,17 @@ long amii_scrnmode; * the intuition interface for the amiga... */ struct window_procs amii_procs = { - "amii", WC_COLOR | WC_HILITE_PET | WC_INVERSE, + WPID(amii), + WC_COLOR | WC_HILITE_PET | WC_INVERSE, + 0L, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* color availability */ - 0L, amii_init_nhwindows, + amii_init_nhwindows, amii_player_selection, amii_askname, amii_get_nh_event, amii_exit_nhwindows, amii_suspend_nhwindows, amii_resume_nhwindows, amii_create_nhwindow, amii_clear_nhwindow, amii_display_nhwindow, amii_destroy_nhwindow, amii_curs, amii_putstr, genl_putmixed, amii_display_file, amii_start_menu, amii_add_menu, amii_end_menu, - amii_select_menu, genl_message_menu, amii_update_inventory, + amii_select_menu, genl_message_menu, amii_mark_synch, amii_wait_synch, #ifdef CLIPPING amii_cliparound, @@ -50,27 +63,30 @@ struct window_procs amii_procs = { #ifdef CHANGE_COLOR /* only a Mac option currently */ amii_change_color, amii_get_color_string, #endif - /* other defs that really should go away (they're tty specific) */ - amii_delay_output, amii_delay_output, amii_outrip, genl_preference_update, + amii_outrip, genl_preference_update, genl_getmsghistory, genl_putmsghistory, genl_status_init, genl_status_finish, genl_status_enablefield, genl_status_update, genl_can_suspend_yes, + amii_update_inventory, + amii_ctrl_nhwindow, }; /* The view window layout uses the same function names so we can use * a shared library to allow the executable to be smaller. */ struct window_procs amiv_procs = { - "amitile", WC_COLOR | WC_HILITE_PET | WC_INVERSE, + WPID(amiv), + WC_COLOR | WC_HILITE_PET | WC_INVERSE, + 0L, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* color availability */ - 0L, amii_init_nhwindows, + amii_init_nhwindows, amii_player_selection, amii_askname, amii_get_nh_event, amii_exit_nhwindows, amii_suspend_nhwindows, amii_resume_nhwindows, amii_create_nhwindow, amii_clear_nhwindow, amii_display_nhwindow, amii_destroy_nhwindow, amii_curs, amii_putstr, genl_putmixed, amii_display_file, amii_start_menu, amii_add_menu, amii_end_menu, - amii_select_menu, genl_message_menu, amii_update_inventory, + amii_select_menu, genl_message_menu, amii_mark_synch, amii_wait_synch, #ifdef CLIPPING amii_cliparound, @@ -84,12 +100,13 @@ struct window_procs amiv_procs = { #ifdef CHANGE_COLOR /* only a Mac option currently */ amii_change_color, amii_get_color_string, #endif - /* other defs that really should go away (they're tty specific) */ - amii_delay_output, amii_delay_output, amii_outrip, genl_preference_update, + amii_outrip, genl_preference_update, genl_getmsghistory, genl_putmsghistory, genl_status_init, genl_status_finish, genl_status_enablefield, genl_status_update, genl_can_suspend_yes, + amii_update_inventory, + amii_ctrl_nhwindow, }; unsigned short amii_initmap[AMII_MAXCOLORS]; @@ -413,10 +430,11 @@ struct NewScreen NewHackScreen = { 0, 0, WIDTH, SCREENHEIGHT, 3, 0, * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting pl_character. - * Always called after init_nhwindows() and before display_gamewindows(). + * Always called after init_nhwindows() and before + * init_sound_disp_gamewindows(). */ void -amii_askname() +amii_askname(void) { char plnametmp[300]; /* From winreq.c: sizeof(StrStringSIBuff) */ *plnametmp = 0; @@ -424,10 +442,10 @@ amii_askname() amii_getlin("Who are you?", plnametmp); } while (strlen(plnametmp) == 0); - strncpy(plname, plnametmp, PL_NSIZ - 1); /* Avoid overflowing plname[] */ - plname[PL_NSIZ - 1] = 0; + strncpy(svp.plname, plnametmp, PL_NSIZ - 1); /* Avoid overflowing plname[] */ + svp.plname[PL_NSIZ - 1] = 0; - if (*plname == '\33') { + if (*svp.plname == '\33') { clearlocks(); exit_nhwindows(NULL); nh_terminate(0); @@ -442,12 +460,12 @@ amii_askname() #if 0 /* New function at the bottom */ void -amii_player_selection() +amii_player_selection(void) { - register struct Window *cwin; - register struct IntuiMessage *imsg; - register int aredone = 0; - register struct Gadget *gd; + struct Window *cwin; + struct IntuiMessage *imsg; + int aredone = 0; + struct Gadget *gd; static int once = 0; long class, code; @@ -461,9 +479,9 @@ amii_player_selection() #if 0 /* Don't query the user ... instead give random character -jhsa */ #if 0 /* OBSOLETE */ - if( *pl_character ){ - pl_character[ 0 ] = toupper( pl_character[ 0 ] ); - if( index( pl_classes, pl_character[ 0 ] ) ) + if( *svp.pl_character ){ + svp.pl_character[ 0 ] = toupper( svp.pl_character[ 0 ] ); + if( strchr( pl_classes, svp.pl_character[ 0 ] ) ) return; } #endif @@ -487,7 +505,7 @@ amii_player_selection() #ifdef INTUI_NEW_LOOK Type_NewWindowStructure1.Extension = wintags; Type_NewWindowStructure1.Flags |= WFLG_NW_EXTENDED; - fillhook.h_Entry = (ULONG(*)())LayerFillHook; + fillhook.h_Entry = (void *) &LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; #endif @@ -515,21 +533,21 @@ amii_player_selection() switch( class ) { case VANILLAKEY: - if( index( pl_classes, toupper( code ) ) ) + if( strchr( pl_classes, toupper( code ) ) ) { - pl_character[0] = toupper( code ); + svp.pl_character[0] = toupper( code ); aredone = 1; } else if( code == ' ' || code == '\n' || code == '\r' ) { flags.initrole = randrole(FALSE); #if 0 /* OBSOLETE */ - strcpy( pl_character, roles[ rnd( 11 ) ] ); + strcpy( svp.pl_character, roles[ rnd( 11 ) ] ); #endif aredone = 1; amii_clear_nhwindow( WIN_BASE ); CloseShWindow( cwin ); - RandomWindow( pl_character ); + RandomWindow( svp.pl_character ); return; } else if( code == 'q' || code == 'Q' ) @@ -549,15 +567,15 @@ amii_player_selection() case 1: /* Random Character */ flags.initrole = randrole(FALSE); #if 0 /* OBSOLETE */ - strcpy( pl_character, roles[ rnd( 11 ) ] ); + strcpy( svp.pl_character, roles[ rnd( 11 ) ] ); #endif amii_clear_nhwindow( WIN_BASE ); CloseShWindow( cwin ); - RandomWindow( pl_character ); + RandomWindow( svp.pl_character ); return; default: - pl_character[0] = gd->GadgetID; + svp.pl_character[0] = gd->GadgetID; break; } aredone = 1; @@ -583,8 +601,7 @@ amii_player_selection() #include "NH:sys/amiga/randwin.c" void -RandomWindow( name ) - char *name; +RandomWindow(char *name) { struct MsgPort *tport; struct timerequest *trq; @@ -660,7 +677,7 @@ RandomWindow( name ) #ifdef INTUI_NEW_LOOK Rnd_NewWindowStructure1.Extension = wintags; Rnd_NewWindowStructure1.Flags |= WFLG_NW_EXTENDED; - fillhook.h_Entry = (ULONG(*)())LayerFillHook; + fillhook.h_Entry = (void *) &LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; #endif @@ -750,10 +767,11 @@ amii_get_ext_cmd(void) #endif int colx; int bottom = 0; + struct Window *w; char obufp[100]; - register char *bufp = obufp; - register int c; + char *bufp = obufp; + int c; int com_index, oindex; int did_comp = 0; /* did successful completion? */ int sel = -1; @@ -767,7 +785,7 @@ amii_get_ext_cmd(void) #ifdef EXTMENU if (iflags.extmenu) { win = amii_create_nhwindow(NHW_MENU); - amii_start_menu(win); + amii_start_menu(win, MENU_BEHAVE_STANDARD); pline("#"); amii_putstr(WIN_MESSAGE, -1, " "); @@ -775,8 +793,9 @@ amii_get_ext_cmd(void) id.a_char = *extcmdlist[i].ef_txt; sprintf(buf, "%-10s - %s ", extcmdlist[i].ef_txt, extcmdlist[i].ef_desc); - amii_add_menu(win, NO_GLYPH, &id, extcmdlist[i].ef_txt[0], 0, 0, - buf, MENU_UNSELECTED); + amii_add_menu(win, (const glyph_info *) 0, &id, + extcmdlist[i].ef_txt[0], 0, 0, NO_COLOR, + buf, MENU_ITEMFLAGS_NONE); } amii_end_menu(win, (char *) 0); @@ -830,14 +849,15 @@ amii_get_ext_cmd(void) } win = amii_create_nhwindow(NHW_MENU); - amii_start_menu(win); + amii_start_menu(win, MENU_BEHAVE_STANDARD); for (i = 0; extcmdlist[i].ef_txt != NULL; ++i) { id.a_char = extcmdlist[i].ef_txt[0]; sprintf(buf, "%-10s - %s ", extcmdlist[i].ef_txt, extcmdlist[i].ef_desc); - amii_add_menu(win, NO_GLYPH, &id, extcmdlist[i].ef_txt[0], 0, - 0, buf, MENU_UNSELECTED); + amii_add_menu(win, (const glyph_info *) 0, &id, + extcmdlist[i].ef_txt[0], 0, 0, NO_COLOR, + buf, MENU_ITEMFLAGS_NONE); } amii_end_menu(win, (char *) 0); @@ -929,10 +949,7 @@ amii_get_ext_cmd(void) } static int -put_ext_cmd(obufp, colx, cw, bottom) -char * obufp; -int colx, bottom; -struct amii_WinDesc *cw; +put_ext_cmd(char *obufp, int colx, struct amii_WinDesc *cw, int bottom) { struct Window *w = cw->win; char *t; @@ -977,10 +994,9 @@ struct amii_WinDesc *cw; /* Ask a question and get a response */ char -amii_yn_function(query, resp, def) -const char * query, *resp; -char def; +amii_yn_function(const char *query, const char *resp, char def) { + /* * Generic yes/no function. 'def' is the default (returned by space or * return; 'esc' returns 'q', or 'n', or the default, depending on @@ -992,21 +1008,21 @@ char def; * are allowed); if it includes an , anything beyond that won't * be shown in the prompt to the user but will be acceptable as input. */ - register char q; + char q; char rtmp[40]; boolean digit_ok, allow_num; char prompt[BUFSZ]; - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; if (cw = amii_wins[WIN_MESSAGE]) cw->disprows = 0; if (resp) { char *rb, respbuf[QBUFSZ]; - allow_num = (index(resp, '#') != 0); + allow_num = (strchr(resp, '#') != 0); Strcpy(respbuf, resp); /* any acceptable responses that follow aren't displayed */ - if ((rb = index(respbuf, '\033')) != 0) + if ((rb = strchr(respbuf, '\033')) != 0) *rb = '\0'; (void) strncpy(prompt, query, QBUFSZ - 1); prompt[QBUFSZ - 1] = '\0'; @@ -1049,18 +1065,18 @@ char def; #endif /*0*/ digit_ok = allow_num && isdigit(q); if (q == '\033') { - if (index(resp, 'q')) + if (strchr(resp, 'q')) q = 'q'; - else if (index(resp, 'n')) + else if (strchr(resp, 'n')) q = 'n'; else q = def; break; - } else if (index(quitchars, q)) { + } else if (strchr(quitchars, q)) { q = def; break; } - if (!index(resp, q) && !digit_ok) { + if (!strchr(resp, q) && !digit_ok) { amii_bell(); q = (char) 0; } else if (q == '#' || digit_ok) { @@ -1086,7 +1102,7 @@ char def; break; /* overflow: try again */ digit_string[0] = z; amii_addtopl(digit_string), n_len++; - } else if (z == 'y' || index(quitchars, z)) { + } else if (z == 'y' || strchr(quitchars, z)) { if (z == '\033') value = -1; /* abort */ z = '\n'; /* break */ @@ -1126,15 +1142,14 @@ char def; } void -amii_display_file(fn, complain) -const char * fn; -boolean complain; +amii_display_file(const char *fn, boolean complain) { - register struct amii_WinDesc *cw; - register int win; - register dlb *fp; - register char *t; - register char buf[200]; + struct amii_WinDesc *cw; + int win; + dlb *fp; + char *t; + char buf[200]; + if (fn == NULL) panic("NULL file name in display_file()"); @@ -1163,7 +1178,7 @@ boolean complain; cw->morestr = (char *) fn; while (dlb_fgets(buf, sizeof(buf), fp) != NULL) { - if (t = index(buf, '\n')) + if (t = strchr(buf, '\n')) *t = 0; amii_putstr(win, 0, buf); } @@ -1182,12 +1197,11 @@ boolean complain; * are rendered in the up position by default. */ void -SetBorder(gd) -register struct Gadget * gd; +SetBorder(struct Gadget *gd) { - register struct Border *bp; - register short *sp; - register int i, inc = -1, dec = -1; + struct Border *bp; + short *sp; + int i, inc = -1, dec = -1; int borders = 6; int hipen = sysflags.amii_dripens[SHINEPEN], shadowpen = sysflags.amii_dripens[SHADOWPEN]; @@ -1325,7 +1339,7 @@ register struct Gadget * gd; /* Following function copied from wintty.c; Modified slightly to fit amiga needs */ void -amii_player_selection() +amii_player_selection(void) { int i, k, n; char pick4u = 'n', thisch, lastch = 0; @@ -1334,6 +1348,7 @@ amii_player_selection() anything any; menu_item *selected = 0; + rigid_role_checks(); /* Should we randomly pick for the player? */ @@ -1349,9 +1364,9 @@ amii_player_selection() cursor_on(WIN_MESSAGE); pick4u = lowc(WindowGetchar()); cursor_off(WIN_MESSAGE); - if (index(quitchars, pick4u)) + if (strchr(quitchars, pick4u)) pick4u = 'y'; - } while (!index(ynqchars, pick4u)); + } while (!strchr(ynqchars, pick4u)); pbuf[0] = pick4u; pbuf[1] = 0; amii_addtopl(pbuf); @@ -1389,7 +1404,7 @@ amii_player_selection() } else { /* Prompt for a role */ win = create_nhwindow(NHW_MENU); - start_menu(win); + start_menu(win, MENU_BEHAVE_STANDARD); any.a_void = 0; /* zero out all bits */ for (i = 0; roles[i].name.m; i++) { if (ok_role(i, flags.initrace, flags.initgend, @@ -1412,8 +1427,8 @@ amii_player_selection() } else Strcpy(rolenamebuf, roles[i].name.m); } - add_menu(win, NO_GLYPH, &any, thisch, 0, ATR_NONE, - an(rolenamebuf), MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, thisch, 0, ATR_NONE, + NO_COLOR, an(rolenamebuf), MENU_ITEMFLAGS_NONE); lastch = thisch; } } @@ -1421,11 +1436,11 @@ amii_player_selection() flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randrole(FALSE) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, '*', 0, ATR_NONE, + NO_COLOR, "Random", MENU_ITEMFLAGS_NONE); any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, 'q', 0, ATR_NONE, + NO_COLOR, "Quit", MENU_ITEMFLAGS_NONE); Sprintf(pbuf, "Pick a role for your %s", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); @@ -1480,25 +1495,25 @@ amii_player_selection() /* Permit the user to pick, if there is more than one */ if (n > 1) { win = create_nhwindow(NHW_MENU); - start_menu(win); + start_menu(win, MENU_BEHAVE_STANDARD); any.a_void = 0; /* zero out all bits */ for (i = 0; races[i].noun; i++) if (ok_race(flags.initrole, i, flags.initgend, flags.initalign)) { any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, races[i].noun[0], 0, - ATR_NONE, races[i].noun, - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, races[i].noun[0], 0, + ATR_NONE, NO_COLOR, races[i].noun, + MENU_ITEMFLAGS_NONE); } any.a_int = pick_race(flags.initrole, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randrace(flags.initrole) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, '*', 0, ATR_NONE, + NO_COLOR, "Random", MENU_ITEMFLAGS_NONE); any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, 'q', 0, ATR_NONE, + NO_COLOR, "Quit", MENU_ITEMFLAGS_NONE); Sprintf(pbuf, "Pick the race of your %s", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); @@ -1553,24 +1568,25 @@ amii_player_selection() /* Permit the user to pick, if there is more than one */ if (n > 1) { win = create_nhwindow(NHW_MENU); - start_menu(win); + start_menu(win, MENU_BEHAVE_STANDARD); any.a_void = 0; /* zero out all bits */ for (i = 0; i < ROLE_GENDERS; i++) if (ok_gend(flags.initrole, flags.initrace, i, flags.initalign)) { any.a_int = i + 1; - add_menu(win, NO_GLYPH, &any, genders[i].adj[0], 0, - ATR_NONE, genders[i].adj, MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, genders[i].adj[0], 0, + ATR_NONE, NO_COLOR, genders[i].adj, + MENU_ITEMFLAGS_NONE); } any.a_int = pick_gend(flags.initrole, flags.initrace, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randgend(flags.initrole, flags.initrace) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, '*', 0, ATR_NONE, + NO_COLOR, "Random", MENU_ITEMFLAGS_NONE); any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, 'q', 0, ATR_NONE, + NO_COLOR, "Quit", MENU_ITEMFLAGS_NONE); Sprintf(pbuf, "Pick the gender of your %s", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); @@ -1624,24 +1640,25 @@ amii_player_selection() /* Permit the user to pick, if there is more than one */ if (n > 1) { win = create_nhwindow(NHW_MENU); - start_menu(win); + start_menu(win, MENU_BEHAVE_STANDARD); any.a_void = 0; /* zero out all bits */ for (i = 0; i < ROLE_ALIGNS; i++) if (ok_align(flags.initrole, flags.initrace, flags.initgend, i)) { any.a_int = i + 1; - add_menu(win, NO_GLYPH, &any, aligns[i].adj[0], 0, - ATR_NONE, aligns[i].adj, MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, aligns[i].adj[0], 0, + ATR_NONE, NO_COLOR, aligns[i].adj, + MENU_ITEMFLAGS_NONE); } any.a_int = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randalign(flags.initrole, flags.initrace) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, '*', 0, ATR_NONE, + NO_COLOR, "Random", MENU_ITEMFLAGS_NONE); any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); + add_menu(win, &nul_glyphinfo, &any, 'q', 0, ATR_NONE, + NO_COLOR, "Quit", MENU_ITEMFLAGS_NONE); Sprintf(pbuf, "Pick the alignment of your %s", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); diff --git a/sys/amiga/winami.p b/sys/amiga/winami.p index 7d24a2cee..dfb588177 100644 --- a/sys/amiga/winami.p +++ b/sys/amiga/winami.p @@ -2,56 +2,56 @@ /* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* winami.c */ -void FDECL(amii_raw_print, (const char *)); -void FDECL(amii_raw_print_bold, (const char *)); -void FDECL(amii_start_menu, (winid )); -void FDECL(amii_add_menu, (winid , char , int , const char *)); -void FDECL(amii_end_menu, (winid , char , const char * , const char *)); -char FDECL(amii_select_menu, (winid )); -void NDECL(amii_update_inventory ); -void NDECL(amii_mark_synch ); -void NDECL(amii_wait_synch ); -void NDECL(amii_setclipped ); -void FDECL(amii_cliparound, (int , int )); -void NDECL(amii_askname ); -void NDECL(amii_player_selection ); -void NDECL(flush_output ); -void FDECL(amii_destroy_nhwindow, (winid )); -int FDECL(amii_create_nhwindow, (int )); -void NDECL(amii_init_nhwindows ); -int NDECL(amii_get_ext_cmd); -char FDECL(amii_yn_function, (const char * , const char * , char )); -void FDECL(amii_addtopl, (const char *)); -void FDECL(TextSpaces, (struct RastPort * , int )); -void FDECL(amii_putstr, (winid , int , const char *)); -void FDECL(amii_putsym, (winid , int , int , CHAR_P )); -void FDECL(amii_clear_nhwindow, (winid )); -void FDECL(amii_exit_nhwindows, (const char *)); -int FDECL(amii_nh_poskey, (int * , int * , int *)); -int NDECL(amii_nhgetch ); -void NDECL(amii_get_nh_event ); -void NDECL(amii_remember_topl ); -int NDECL(amii_doprev_message ); -void FDECL(amii_display_nhwindow, (winid , boolean )); -void FDECL(amii_display_file, (const char * , boolean )); -void FDECL(amii_curs, (winid , int , int )); -void FDECL(amii_print_glyph, (winid , xchar , xchar , int, int )); -void FDECL(DoMenuScroll, (int , int )); -void FDECL(DisplayData, (int , int , int )); -void FDECL(SetPropInfo, (struct Window * , struct Gadget * , long , long , long )); -void FDECL(kill_nhwindows, (int )); -void FDECL(amii_cl_end, (struct amii_WinDesc * , int )); -void FDECL(cursor_off, (winid )); -void FDECL(cursor_on, (winid )); -void NDECL(amii_getret ); -void FDECL(amii_getlin, (const char * , char *)); -void FDECL(getlind, (const char * , char * , const char *)); -void FDECL(amii_suspend_nhwindows, (char * )); -void NDECL(amii_resume_nhwindows); -void NDECL(amii_bell); -void NDECL(EditColor); -void FDECL(DrawCol, ( struct Window *, int, UWORD * ) ); -void FDECL( DispCol, ( struct Window *w, int idx, UWORD * ) ); -void FDECL( SetBorder, (struct Gadget *) ); -void NDECL( port_help ); -void FDECL( dismiss_nhwindow, (winid) ); +void amii_raw_print(const char *); +void amii_raw_print_bold(const char *); +void amii_start_menu(winid , unsigned long ); +void amii_add_menu(winid, const glyph_info *, const anything *, char, char, int, int, const char *, unsigned int); +void amii_end_menu(winid , char , const char * , const char *); +char amii_select_menu(winid ); +void amii_update_inventory(int); +void amii_mark_synch (void); +void amii_wait_synch (void); +void amii_setclipped (void); +void amii_cliparound(int , int ); +void amii_askname (void); +void amii_player_selection (void); +void flush_output (void); +void amii_destroy_nhwindow(winid ); +int amii_create_nhwindow(int ); +void amii_init_nhwindows (void); +int amii_get_ext_cmd(void); +char amii_yn_function(const char * , const char * , char ); +void amii_addtopl(const char *); +void TextSpaces(struct RastPort * , int ); +void amii_putstr(winid , int , const char *); +void amii_putsym(winid , int , int , CHAR_P ); +void amii_clear_nhwindow(winid ); +void amii_exit_nhwindows(const char *); +int amii_nh_poskey(coordxy *, coordxy *, int *); +int amii_nhgetch (void); +void amii_get_nh_event (void); +void amii_remember_topl (void); +int amii_doprev_message (void); +void amii_display_nhwindow(winid , boolean ); +void amii_display_file(const char * , boolean ); +void amii_curs(winid , int , int ); +void amii_print_glyph(winid, coordxy, coordxy, const glyph_info *, const glyph_info *); +void DoMenuScroll(int , int ); +void DisplayData(int , int , int ); +void SetPropInfo(struct Window * , struct Gadget * , long , long , long ); +void kill_nhwindows(int ); +void amii_cl_end(struct amii_WinDesc * , int ); +void cursor_off(winid ); +void cursor_on(winid ); +void amii_getret (void); +void amii_getlin(const char * , char *); +void getlind(const char * , char * , const char *); +void amii_suspend_nhwindows(char * ); +void amii_resume_nhwindows(void); +void amii_bell(void); +void EditColor(void); +void DrawCol( struct Window *, int, UWORD * ) ; +void DispCol( struct Window *w, int idx, UWORD * ) ; +void SetBorder(struct Gadget *) ; +void port_help (void); +void dismiss_nhwindow(winid) ; diff --git a/sys/amiga/winchar.c b/sys/amiga/winchar.c index b7960c01a..0c9dbc6b2 100644 --- a/sys/amiga/winchar.c +++ b/sys/amiga/winchar.c @@ -14,14 +14,24 @@ #ifdef TESTING #include "hack.h" #else +#ifndef CROSS_TO_AMIGA #include "NH:src/tile.c" +#else +#include "../src/tile.c" +#endif #endif +#ifndef CROSS_TO_AMIGA #include "NH:win/share/tile.h" - #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "tile.h" +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif #ifdef OPT_DISPMAP #define DISPMAP /* use display_map() from dispmap.s */ @@ -31,7 +41,8 @@ int main(int, char **); struct BitMap *MyAllocBitMap(int, int, int, long); void MyFreeBitMap(struct BitMap *); -void FreeImageFiles(char **, struct BitMap **); +BitMapHeader ReadImageFile(const char *, struct BitMap **); +void FreeImageFile(struct BitMap **); void amiv_flush_glyph_buffer(struct Window *); void amiv_lprint_glyph(winid, int, int); void amii_lprint_glyph(winid, int, int); @@ -53,6 +64,13 @@ void MyFreeBitMap(struct BitMap *bmp); extern void display_map(struct Window *); #endif +#ifdef TILES_IN_GLYPHMAP +extern int maxmontile, maxobjtile, maxothtile; /* from tile.c */ +#define MAXMONTILE maxmontile +#define MAXOBJTILE maxobjtile +#define MAXOTHTILE maxothtile +#endif + /* * These values will be available from tile.c source * @@ -74,17 +92,9 @@ extern void display_map(struct Window *); struct PDAT pictdata; -#define NUMTILEIMAGES 3 -char *tileimages[] = { -#define TBLMONTILE 0 - "NetHack:tiles/monsters.iff", -#define TBLOBJTILE 1 - "NetHack:tiles/objects.iff", -#define TBLOTHTILE 2 - "NetHack:tiles/other.iff", 0, -}; - -struct BitMap *ifftimg[NUMTILEIMAGES], *tile; +/* Single tile image file, set at runtime by amii_init_nhwindows */ +char *tilefile; +struct BitMap *tileimg, *tile; #ifdef TESTING short pens[NUMDRIPENS] = { 8, 3, 15, 0, 15, 7, 7, 8, 0 }; @@ -129,7 +139,7 @@ main(int argc, char **argv) x = x % IMGCOLUMNS; dx = i % (IMGCOLUMNS * 2); dy = i / (IMGCOLUMNS * 2); - BltBitMapRastPort(ifftimg[tbl], x * pictdata.xsize, + BltBitMapRastPort(tileimg, x * pictdata.xsize, y * pictdata.ysize, w->RPort, w->BorderLeft + 1 + dx * pictdata.xsize, w->BorderTop + 1 + dy * pictdata.ysize, @@ -159,175 +169,112 @@ main(int argc, char **argv) CloseScreen(scr); } - FreeImageFiles(tileimages, ifftimg); + FreeTileImageFiles(); return (0); } #endif +/* + * Read a single BMAP IFF file into a BitMap. + * Returns the BitMapHeader; *bmp receives the bitmap. + * Caller frees via FreeImageFile(). + */ BitMapHeader -ReadTileImageFiles() -{ - char *errstr = NULL; - BitMapHeader ret = ReadImageFiles(tileimages, ifftimg, &errstr); - if (errstr) { - panic(errstr); - } - return ret; -} - -BitMapHeader -ReadImageFiles(char **filenames, struct BitMap **iffimg, char **errstrp) +ReadImageFile(const char *filename, struct BitMap **bmp) { - BitMapHeader *bmhd = NULL, bmhds; - unsigned char *cmap; - extern int errno; - register int i, j; + BitMapHeader *bmhd, bmhds; + int j, np; struct IFFHandle *iff; struct StoredProperty *prop; IFFParseBase = OpenLibrary("iffparse.library", 0L); - if (!IFFParseBase) { - *errstrp = "No iffparse.library"; - return bmhds; + if (!IFFParseBase) + panic("No iffparse.library"); + + iff = AllocIFF(); + if (!iff) + panic("can't start IFF processing"); + + iff->iff_Stream = Open(filename, MODE_OLDFILE); + if (iff->iff_Stream == 0) + panic("Can't open %s", filename); + + InitIFFasDOS(iff); + OpenIFF(iff, IFFF_READ); + PropChunk(iff, ID_BMAP, ID_BMHD); + PropChunk(iff, ID_BMAP, ID_CMAP); + PropChunk(iff, ID_BMAP, ID_PDAT); + StopChunk(iff, ID_BMAP, ID_PLNE); + if ((j = ParseIFF(iff, IFFPARSE_SCAN)) != 0) + panic("ParseIFF failed on %s, code %d", + filename, j); + + prop = FindProp(iff, ID_BMAP, ID_BMHD); + if (!prop) + panic("No BMHD chunk in %s", filename); + bmhd = (BitMapHeader *) prop->sp_Data; + np = bmhd->nPlanes; + + /* Load CMAP into palette arrays if present */ + prop = FindProp(iff, ID_BMAP, ID_CMAP); + if (prop) { + unsigned char *cmap = prop->sp_Data; + for (j = 0; j < (1L << np) * 3; j += 3) { + amii_initmap[j / 3] = + amiv_init_map[j / 3] = + ((cmap[j+0] >> 4) << 8) + | ((cmap[j+1] >> 4) << 4) + | (cmap[j+2] >> 4); + } } - /* - for( i = 0; filenames[i]; ++i ) - memset( iffimg[i], 0, sizeof( struct BitMap ) ); - */ - for (i = 0; filenames[i]; ++i) { - iff = AllocIFF(); - if (!iff) { - FreeImageFiles(filenames, iffimg); - *errstrp = "can't start IFF processing"; - return bmhds; - } - iff->iff_Stream = Open(filenames[i], MODE_OLDFILE); - if (iff->iff_Stream == 0) { - char *buf = malloc(100 + strlen(filenames[i])); - FreeImageFiles(filenames, iffimg); - sprintf(buf, "Can't open %s: %s", filenames[i], strerror(errno)); - *errstrp = buf; - return bmhds; - } - InitIFFasDOS(iff); - OpenIFF(iff, IFFF_READ); - PropChunk(iff, ID_BMAP, ID_BMHD); - PropChunk(iff, ID_BMAP, ID_CMAP); - PropChunk(iff, ID_BMAP, ID_CAMG); - PropChunk(iff, ID_BMAP, ID_PDAT); - StopChunk(iff, ID_BMAP, ID_PLNE); - if ((j = ParseIFF(iff, IFFPARSE_SCAN)) != 0) { - char *buf = malloc(100); - FreeImageFiles(filenames, iffimg); - sprintf(buf, "ParseIFF failed for image %d, failure code: %d", i, - j); - *errstrp = buf; - return bmhds; - } + /* Load PDAT if present */ + prop = FindProp(iff, ID_BMAP, ID_PDAT); + if (prop) + pictdata = *(struct PDAT *) prop->sp_Data; - if (prop = FindProp(iff, ID_BMAP, ID_BMHD)) { - bmhd = (BitMapHeader *) prop->sp_Data; - } else { - FreeImageFiles(filenames, iffimg); - CloseIFF(iff); - Close(iff->iff_Stream); - FreeIFF(iff); - *errstrp = "No BMHD CHUNK in file"; - return bmhds; - } + *bmp = MyAllocBitMap(bmhd->w, bmhd->h, + np, MEMF_CHIP | MEMF_CLEAR); + if (!*bmp) + panic("Can't allocate bitmap for %s", filename); - if (prop = FindProp(iff, ID_BMAP, ID_CMAP)) { - cmap = prop->sp_Data; - for (j = 0; j < (1L << bmhd->nPlanes) * 3; j += 3) { -#if 0 - /* Some day we will want to use the larger palette - * resolution available under v39 and later. i.e. - * 32 instead of 12 bits of color. Ususally this - * just means shifting the color left by 16-20 bits - * depending on what intensity looks best. Experience - * says that the higher values are better intensities. - * - * For now though we won't do this. The color table - * structure is incompatible with earlier versions of - * intuition. We would have to do some funny things - * to make 3*AMII_MAXCOLORS longs work like 3*AMII_MAXCOLORS - * UWORD's at run time... A union would help, but... - */ - if( IntuitionBase->LibNode.lib_Version >= 39 ) - { - /* 8 bits of color, so shift to left end. */ - amiv_init_map[ j+0 ] = cmap[j+0]<<24; - amiv_init_map[ j+1 ] = cmap[j+1]<<24; - amiv_init_map[ j+2 ] = cmap[j+2]<<24; - } - else -#endif - { -/* We can only use 4 bits of the 8 that are stored in the - * cmap, so mask them and then shift them into position - * for the UWORD value to store. - */ -#ifndef TESTING - amii_initmap[j / 3] = amiv_init_map[j / 3] = - ((cmap[j + 0] >> 4) << 8) | ((cmap[j + 1] >> 4) << 4) - | (cmap[j + 2] >> 4); -#endif - } - } - } else { - FreeImageFiles(filenames, iffimg); - CloseIFF(iff); - Close(iff->iff_Stream); - FreeIFF(iff); - *errstrp = "No CMAP CHUNK in file"; - return bmhds; - } + for (j = 0; j < np; j++) + ReadChunkBytes(iff, (*bmp)->Planes[j], + RASSIZE(bmhd->w, bmhd->h)); - if (prop = FindProp(iff, ID_BMAP, ID_PDAT)) { - struct PDAT *pp; + bmhds = *bmhd; + CloseIFF(iff); + Close(iff->iff_Stream); + FreeIFF(iff); + CloseLibrary(IFFParseBase); - pp = (struct PDAT *) prop->sp_Data; - pictdata = *pp; - } else { - FreeImageFiles(filenames, iffimg); - CloseIFF(iff); - Close(iff->iff_Stream); - FreeIFF(iff); - *errstrp = "No PDAT CHUNK in file"; - return bmhds; - } + return bmhds; +} - iffimg[i] = MyAllocBitMap(bmhd->w, bmhd->h, - pictdata.nplanes + amii_extraplanes, - MEMF_CHIP | MEMF_CLEAR); - if (iffimg[i] == NULL) { - char *buf = malloc(80); - FreeImageFiles(filenames, iffimg); - sprintf(buf, "Can't allocate bitmap for image %d\n", i); - *errstrp = buf; - return bmhds; - } - for (j = 0; j < pictdata.nplanes + amii_extraplanes; ++j) { - ReadChunkBytes(iff, iffimg[i]->Planes[j], - RASSIZE(bmhd->w, bmhd->h)); - } - bmhds = *bmhd; - CloseIFF(iff); - Close(iff->iff_Stream); - FreeIFF(iff); +void +FreeImageFile(struct BitMap **bmp) +{ + if (*bmp) { + MyFreeBitMap(*bmp); + *bmp = NULL; } - CloseLibrary(IFFParseBase); +} + +BitMapHeader +ReadTileImageFiles(void) +{ + BitMapHeader bmhds; + + bmhds = ReadImageFile(tilefile, &tileimg); tile = MyAllocBitMap(pictdata.xsize, pictdata.ysize, - pictdata.nplanes + amii_extraplanes, - MEMF_CHIP | MEMF_CLEAR); - if (tile == NULL) { - FreeImageFiles(filenames, iffimg); - *errstrp = "Can't allocate tile bitmap for scaling"; - } - return (bmhds); + pictdata.nplanes + amii_extraplanes, + MEMF_CHIP | MEMF_CLEAR); + if (!tile) + panic("Can't allocate tile temp bitmap"); + + return bmhds; } struct MyBitMap { @@ -384,8 +331,7 @@ MyFreeBitMap(struct BitMap *bmp) #ifdef TESTING void -panic(s, a1, a2, a3, a4) -char *s; +panic(char *s, long a1, long a2, long a3, long a4) { printf(s, a1, a2, a3, a4); putchar('\n'); @@ -403,24 +349,10 @@ alloc(unsigned int x) #endif void -FreeTileImageFiles() -{ - FreeImageFiles(tileimages, ifftimg); -} - -void -FreeImageFiles(char **filenames, struct BitMap **img) +FreeTileImageFiles(void) { - register int i; - - for (i = 0; filenames[i]; ++i) { - if (img[i]) - MyFreeBitMap(img[i]); - } - - /* REALLY ugly hack alert! */ - if (tile && img == ifftimg) - MyFreeBitMap(tile); + FreeImageFile(&tileimg); + FreeImageFile(&tile); } #ifndef TESTING @@ -439,8 +371,7 @@ struct amiv_glyph_node amiv_g_nodes[NUMBER_GLYPH_NODES]; static char amiv_glyph_buffer[GLYPH_BUFFER_SIZE]; void -flush_glyph_buffer(vw) -struct Window *vw; +flush_glyph_buffer(struct Window *vw) { if (WINVERS_AMIV) amiv_flush_glyph_buffer(vw); @@ -452,8 +383,7 @@ struct Window *vw; * Routine to flush whatever is buffered */ void -amiv_flush_glyph_buffer(vw) -struct Window *vw; +amiv_flush_glyph_buffer(struct Window *vw) { #if !defined(DISPMAP) || defined(OPT_DISPMAP) int xsize, ysize, x, y; @@ -464,7 +394,7 @@ struct Window *vw; struct BitMap *imgbm = 0, *bm = 0; int i, k; int scaling_needed; - register struct RastPort *rp = vw->RPort; + struct RastPort *rp = vw->RPort; #endif /* If nothing is buffered, return before we do anything */ @@ -560,7 +490,7 @@ struct Window *vw; /* Go ahead and start dumping the stuff */ for (i = 0; i < glyph_node_index; ++i) { /* Do it */ - register int offx, offy, j; + int offx, offy, j; struct BitMap *nodebm = amiv_g_nodes[i].bitmap; /* Get the unclipped coordinates */ @@ -579,10 +509,10 @@ struct Window *vw; * this code is generalized to handle any size tile * image... */ - memcpy(tile->Planes[j] + ((k * pictdata.ysize) / 8), + memcpy(tile->Planes[j] + k * tile->BytesPerRow, nodebm->Planes[j] + offx + offy + (nodebm->BytesPerRow * k), - pictdata.ysize / 8); + pictdata.xsize / 8); } } @@ -631,41 +561,30 @@ struct Window *vw; * Glyph buffering routine. Called instead of WindowPuts(). */ void -amiv_lprint_glyph(window, color_index, glyph) -winid window; -int color_index, glyph; +amiv_lprint_glyph(winid window, int color_index, int glyph) { int base; struct amii_WinDesc *cw; struct Window *w; int curx; int cury; - int tbl, icon; - register int xoff, yoff; + int icon; + int xoff, yoff; - /* Get the real icon index */ - if (glyph != NO_GLYPH) - icon = GlyphToIcon(glyph); + /* Skip NO_GLYPH — nothing to draw */ + if (glyph == NO_GLYPH) + return; + + icon = GlyphToIcon(glyph); if ((cw = amii_wins[window]) == (struct amii_WinDesc *) NULL) panic("bad winid in amiv_lprint_glyph: %d", window); w = cw->win; - if (glyph != NO_GLYPH && glyph < 10000) { - /* decide on which image has the needed picture */ - if (icon <= MAXMONTILE) { - tbl = TBLMONTILE; - base = 0; - } else if (icon <= MAXOBJTILE) { - tbl = TBLOBJTILE; - base = MAXMONTILE + 1; - } else if (icon <= MAXOTHTILE) { - tbl = TBLOTHTILE; - base = MAXOBJTILE + 1; - } else - panic("Bad icon #%d, glyph #%d, only %d icons known\n", icon, - glyph, MAXOTHTILE); + if (glyph < 10000) { + if (icon >= pictdata.npics) + icon = 0; /* fallback for out-of-range */ /* Get the relative offset in the page */ @@ -731,11 +650,11 @@ int color_index, glyph; amiv_g_nodes[glyph_node_index].odstx = cw->curx; amiv_g_nodes[glyph_node_index].srcx = xoff; amiv_g_nodes[glyph_node_index].srcy = yoff; - amiv_g_nodes[glyph_node_index].bitmap = ifftimg[tbl]; + amiv_g_nodes[glyph_node_index].bitmap = tileimg; ++glyph_node_index; } else { /* Do it */ - register int j, k, x, y, apen; + int j, k, x, y, apen; struct RastPort *rp = w->RPort; x = rp->cp_x - pictdata.xsize - 3; #ifdef OPT_DISPMAP @@ -753,17 +672,17 @@ int color_index, glyph; y = rp->cp_y - pictdata.ysize + 1; if (glyph != NO_GLYPH) { - struct BitMap *bm = ifftimg[tbl]; + struct BitMap *bm = tileimg; /* 8 bits per byte */ xoff /= 8; yoff *= bm->BytesPerRow; for (j = 0; j < pictdata.nplanes; ++j) { for (k = 0; k < pictdata.ysize; ++k) { - memcpy(tile->Planes[j] + ((k * pictdata.ysize) / 8), + memcpy(tile->Planes[j] + k * tile->BytesPerRow, bm->Planes[j] + xoff + yoff + (bm->BytesPerRow * k), - pictdata.ysize / 8); + pictdata.xsize / 8); } } @@ -807,8 +726,7 @@ static int usecolor; */ void -amiv_start_glyphout(window) -winid window; +amiv_start_glyphout(winid window) { struct amii_WinDesc *cw; struct Window *w; @@ -843,8 +761,7 @@ winid window; * General cleanup routine -- flushes and restores cursor */ void -amii_end_glyphout(window) -winid window; +amii_end_glyphout(winid window) { struct amii_WinDesc *cw; struct Window *w; @@ -874,7 +791,7 @@ winid window; Move(w->RPort, xsave, ysave); } -static maze_type = COL_MAZE_BRICK; +static int maze_type = COL_MAZE_BRICK; void SetMazeType(MazeType t) @@ -885,9 +802,12 @@ SetMazeType(MazeType t) int GlyphToIcon(int glyph) { + glyph_info gi; + + map_glyphinfo(0, 0, glyph, 0, &gi); if (glyph > 10000) return glyph; - return (glyph2tile[glyph]); + return (gi.gm.tileidx); } #endif @@ -912,17 +832,19 @@ struct amii_glyph_node { static struct amii_glyph_node amii_g_nodes[NUMBER_GLYPH_NODES]; static char amii_glyph_buffer[GLYPH_BUFFER_SIZE]; -#ifdef TEXTCOLOR /* * Map our amiga-specific colormap into the colormap specified in color.h. * See winami.c for the amiga specific colormap. */ +/* CLR_BLACK (slot 0) renders as the dim blue pen on black background, + CLR_WHITE (slot 15) uses white on black. Slots 9-14 use the inverse- + video trick (fg=black, bg=color) to fit 16 logical colors into 8 pens. */ int foreg[AMII_MAXCOLORS] = { - 0, 7, 4, 2, 6, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0 + 6, 7, 4, 2, 6, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 1 }; int backg[AMII_MAXCOLORS] = { - 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 1, 6, 5, 3, 1 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 1, 6, 5, 3, 0 }; #if 0 #define CLR_BLACK 0 @@ -943,7 +865,6 @@ int backg[AMII_MAXCOLORS] = { #define CLR_WHITE 15 #define CLR_MAX 16 #endif -#endif #ifndef TESTING /* @@ -969,11 +890,10 @@ int backg[AMII_MAXCOLORS] = { * Routine to simply flush whatever is buffered */ void -amii_flush_glyph_buffer(w) -struct Window *w; +amii_flush_glyph_buffer(struct Window *w) { short i, x, y; - register struct RastPort *rp = w->RPort; + struct RastPort *rp = w->RPort; /* If nothing is buffered, return before we do anything */ if (glyph_node_index == 0) @@ -995,6 +915,10 @@ struct Window *w; + rp->TxBaseline + 1; x = amii_g_nodes[i].x * rp->TxWidth + w->BorderLeft; + /* Skip if pixel coordinates are outside window */ + if (x < 0 || y < 0 || y >= w->Height || x >= w->Width) + continue; + /* Move pens to correct location */ Move(rp, (long) x, (long) y); @@ -1011,9 +935,7 @@ struct Window *w; glyph_node_index = glyph_buffer_index = 0; } void -amiga_print_glyph(window, color_index, glyph) -winid window; -int color_index, glyph; +amiga_print_glyph(winid window, int color_index, int glyph) { if (WINVERS_AMIV) amiv_lprint_glyph(window, color_index, glyph); @@ -1025,9 +947,7 @@ int color_index, glyph; * Glyph buffering routine. Called instead of WindowPuts(). */ void -amii_lprint_glyph(window, color_index, glyph) -winid window; -int color_index, glyph; +amii_lprint_glyph(winid window, int color_index, int glyph) { int fg_color, bg_color; struct amii_WinDesc *cw; @@ -1042,13 +962,8 @@ int color_index, glyph; curx = cw->curx; cury = cw->cury; -#ifdef TEXTCOLOR fg_color = foreg[color_index]; bg_color = backg[color_index]; -#else - fg_color = 1; - bg_color = 0; -#endif /* TEXTCOLOR */ /* See if we have enough character buffer space... */ if (glyph_buffer_index >= GLYPH_BUFFER_SIZE) @@ -1107,8 +1022,7 @@ static int usecolor; */ void -amii_start_glyphout(window) -winid window; +amii_start_glyphout(winid window) { struct amii_WinDesc *cw; struct Window *w; @@ -1182,7 +1096,7 @@ amii_end_glyphout(window) #ifdef OPT_DISPMAP /* don't use dispmap unless x & y are 8,16,24,32,48 and equal */ void -dispmap_sanity() +dispmap_sanity(void) { if (mxsize != mysize || dispmap_sanity1(mxsize) || dispmap_sanity1(mysize)) { @@ -1190,11 +1104,10 @@ dispmap_sanity() } } int -dispmap_sanity1(x) -int x; +dispmap_sanity1(int x) { static unsigned char valid[] = { 8, 16, 24, 32, 48, 0 }; - return !!strchr(valid, x); + return !strchr((char *)valid, x); } #endif /* OPT_DISPMAP */ #endif /* TESTING */ diff --git a/sys/amiga/windefs.h b/sys/amiga/windefs.h index f8b2aeda3..cb6cbd3db 100644 --- a/sys/amiga/windefs.h +++ b/sys/amiga/windefs.h @@ -96,11 +96,6 @@ CLIPPING must be defined for the AMIGA version #define __asm /* DICE doesn't like __asm */ #endif -#ifndef __SASC_60 -#undef index -#define index strchr -#endif - #ifdef _DCC #include #else @@ -117,7 +112,7 @@ CLIPPING must be defined for the AMIGA version #endif #define WINVERS_AMII (strcmp("amii", windowprocs.name) == 0) -#define WINVERS_AMIV (strcmp("amitile", windowprocs.name) == 0) +#define WINVERS_AMIV (strcmp("amiv", windowprocs.name) == 0) #define WINVERS_AMIT (strcmp("amitty", windowprocs.name) == 0) /* cw->data[x] contains 2 characters worth of special information. These @@ -201,3 +196,4 @@ struct PDAT #undef MAXCOLORS #define MAXCOLORS 256 + diff --git a/sys/amiga/winfuncs.c b/sys/amiga/winfuncs.c index 380954681..ba7835775 100644 --- a/sys/amiga/winfuncs.c +++ b/sys/amiga/winfuncs.c @@ -3,14 +3,28 @@ */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif + #include "patchlevel.h" -#include "date.h" extern struct TagItem scrntags[]; - +#ifndef CROSS_TO_AMIGA +extern struct Library *ConsoleDevice; +#else +extern struct Device * +# ifdef __CONSTLIBBASEDECL__ + __CONSTLIBBASEDECL__ +# endif /* __CONSTLIBBASEDECL__ */ + ConsoleDevice; +#endif static BitMapHeader amii_bmhd; static void cursor_common(struct RastPort *, int, int); @@ -25,6 +39,11 @@ int xclipbord = 4, yclipbord = 2; #endif int mxsize, mysize; + +/* Track the last level we centered the clipping viewport on, so that + both amii_clear_nhwindow (pre-docrt centering) and amii_cliparound + (scroll/pan during play) can detect level changes. */ +static d_level clip_saved_level = { 127, 127 }; /* XXX */ struct Rectangle amii_oldover; struct Rectangle amii_oldmsg; @@ -43,8 +62,7 @@ int amii_otherBPen; long amii_libvers = LIBRARY_FONT_VERSION; void -ami_wininit_data(dir) -int dir; +ami_wininit_data(int dir) { extern unsigned short amii_init_map[AMII_MAXCOLORS]; extern unsigned short amiv_init_map[AMII_MAXCOLORS]; @@ -53,11 +71,7 @@ int dir; return; if (!WINVERS_AMIV) { -#ifdef TEXTCOLOR amii_numcolors = 8; -#else - amii_numcolors = 4; -#endif amii_defpens[0] = C_BLACK; /* DETAILPEN */ amii_defpens[1] = C_BLUE; /* BLOCKPEN */ amii_defpens[2] = C_BROWN; /* TEXTPEN */ @@ -139,12 +153,13 @@ struct TagItem wintags[] = { }; #endif -void amii_destroy_nhwindow(win) /* just hide */ -register winid win; +void +amii_destroy_nhwindow(winid win) /* just hide */ { int i; int type; - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; + if (win == WIN_ERR || (cw = amii_wins[win]) == NULL) { panic(winpanicstr, win, "destroy_nhwindow"); @@ -249,26 +264,37 @@ PPC_LayerFillHook(void) struct RastPort *rp = (struct RastPort *) REG_A2; struct FillParams *fp = (struct FillParams *) REG_A1; #else +/* Assembly trampoline: Intuition calls LayerFillHook with arguments + in registers a0 (hook), a1 (fillparams), a2 (rastport). + Push them onto the stack and call the C implementation. */ +__asm( +" .globl _LayerFillHook\n" +"_LayerFillHook:\n" +" move.l a1,-(sp)\n" +" move.l a2,-(sp)\n" +" move.l a0,-(sp)\n" +" jsr _LayerFillHook_impl\n" +" lea 12(sp),sp\n" +" rts\n" +); void -LayerFillHook(void) +LayerFillHook_impl(struct Hook *hk, struct RastPort *rp, + struct FillParams *fp) { - register struct Hook *hk asm("a0"); - register struct RastPort *rp asm("a2"); - register struct FillParams *fp asm("a1"); #endif #else void #ifndef _DCC __interrupt #endif - __saveds __asm LayerFillHook(register __a0 struct Hook *hk, - register __a2 struct RastPort *rp, - register __a1 struct FillParams *fp) + __saveds __asm LayerFillHook(__a0 struct Hook *hk, + __a2 struct RastPort *rp, + __a1 struct FillParams *fp) { #endif - register long x, y, xmax, ymax; - register int apen; + long x, y, xmax, ymax; + int apen; struct RastPort rptmp; memcpy(&rptmp, rp, sizeof(struct RastPort)); @@ -310,15 +336,17 @@ void } #endif -amii_create_nhwindow(type) register int type; +winid +amii_create_nhwindow(int type) { - register struct Window *w = NULL; - register struct NewWindow *nw = NULL; - register struct amii_WinDesc *wd = NULL; + struct Window *w = NULL; + struct NewWindow *nw = NULL; + struct amii_WinDesc *wd = NULL; struct Window *mapwin = NULL, *stwin = NULL, *msgwin = NULL; - register int newid; + int newid; int maph, stath, scrfontysize; + scrfontysize = HackScreen->Font->ta_YSize; /* @@ -552,11 +580,7 @@ amii_create_nhwindow(type) register int type; case NHW_OVER: case NHW_MAP: if (wd) { -#ifdef __GNUC__ fillhook.h_Entry = (void *) &LayerFillHook; -#else - fillhook.h_Entry = (ULONG (*) ()) LayerFillHook; -#endif fillhook.h_Data = (void *) type; fillhook.h_SubEntry = 0; wd->hook = alloc(sizeof(fillhook)); @@ -654,6 +678,10 @@ amii_create_nhwindow(type) register int type; / w->RPort->TxHeight; wd->cols = (w->Width - w->BorderLeft - w->BorderRight - 2) / w->RPort->TxWidth; + /* Map window uses y+2 offset in amii_print_glyph, so cury + values go up to ROWNO+2. Ensure rows accommodates this. */ + if (type == NHW_MAP && wd->rows < ROWNO + 3) + wd->rows = ROWNO + 3; } /* Okay, now do the individual type initialization */ @@ -725,7 +753,9 @@ amii_create_nhwindow(type) register int type; */ wd->data = (char **) alloc(3 * sizeof(char *)); wd->data[0] = (char *) alloc(wd->cols + 10); + wd->data[0][0] = '\0'; wd->data[1] = (char *) alloc(wd->cols + 10); + wd->data[1][0] = '\0'; wd->data[2] = NULL; break; @@ -760,7 +790,7 @@ amii_create_nhwindow(type) register int type; SetMenuStrip(w, MenuStrip); /* Make our requesters come to our screen */ { - register struct Process *myProcess = + struct Process *myProcess = (struct Process *) FindTask(NULL); pr_WindowPtr = (struct Window *) (myProcess->pr_WindowPtr); myProcess->pr_WindowPtr = (APTR) w; @@ -776,8 +806,7 @@ amii_create_nhwindow(type) register int type; Abort(AG_OpenDev | AO_ConsoleDev); } - ConsoleDevice = (struct Library *) ConsoleIO.io_Device; - + ConsoleDevice = (struct Device *) ConsoleIO.io_Device; KbdBuffered = 0; #ifdef HACKFONT @@ -811,12 +840,23 @@ PPC_SM_Filter(void) ULONG modeID = (ULONG) REG_A1; struct ScreenModeRequester *smr = (struct ScreenModeRequester *) REG_A2; #else +/* Assembly trampoline for SM_Filter hook callback. + SM_Filter is the asm entry point; SM_Filter_impl is the C body. */ +extern void SM_Filter(void); +__asm( +" .globl _SM_Filter\n" +"_SM_Filter:\n" +" move.l a2,-(sp)\n" +" move.l a1,-(sp)\n" +" move.l a0,-(sp)\n" +" jsr _SM_Filter_impl\n" +" lea 12(sp),sp\n" +" rts\n" +); int -SM_Filter(void) +SM_Filter_impl(struct Hook *hk, ULONG modeID, + struct ScreenModeRequester *smr) { - register struct Hook *hk asm("a0"); - register ULONG modeID asm("a1"); - register struct ScreenModeRequester *smr asm("a2"); #endif #else int @@ -824,8 +864,8 @@ int __interrupt #endif __saveds __asm SM_Filter( - register __a0 struct Hook *hk, register __a1 ULONG modeID, - register __a2 struct ScreenModeRequester *smr) + __a0 struct Hook *hk, __a1 ULONG modeID, + __a2 struct ScreenModeRequester *smr) { #endif struct DimensionInfo dims; @@ -846,17 +886,58 @@ int return 0; } +/* Switch from AMIV (tile) to AMII (text) and tell the player why. */ +static void +amii_fall_back(const char *why1, const char *why2) +{ + extern struct window_procs amii_procs; + + raw_print(why1); + raw_print(why2); + raw_print("Falling back to text mode. Set windowtype:amii in"); + raw_print("nethack.cnf to suppress this warning."); + windowprocs = amii_procs; + ami_wininit_data(WININIT); +} + +static void +amii_maybe_fall_back_to_text(void) +{ + if (!WINVERS_AMIV) + return; + + if (IntuitionBase->LibNode.lib_Version >= 37) { + struct Screen *wbscr; + int wb_depth = -1; + + if ((wbscr = LockPubScreen("Workbench")) != NULL) { + wb_depth = wbscr->BitMap.Depth; + UnlockPubScreen(NULL, wbscr); + } + if (wb_depth >= 0 && wb_depth < 4) { + amii_fall_back("Workbench screen is shallower than 16 colours", + "(tile mode requires depth >= 4)."); + return; + } + } + + if (AvailMem(MEMF_CHIP) < 384L * 1024L) { + amii_fall_back("Not enough chip RAM available for tile mode", + "(< 384 KB free)."); + return; + } +} + /* Initialize the windowing environment */ void -amii_init_nhwindows(argcp, argv) -int *argcp; -char **argv; +amii_init_nhwindows(int *argcp, char **argv) { int i; struct Screen *wbscr; int forcenobig = 0; + if (HackScreen) panic("init_nhwindows() called twice", 0); @@ -912,6 +993,8 @@ char **argv; Abort(AG_OpenLib); } + amii_maybe_fall_back_to_text(); + amiIDisplay = (struct amii_DisplayDesc *) alloc(sizeof(struct amii_DisplayDesc)); memset(amiIDisplay, 0, sizeof(struct amii_DisplayDesc)); @@ -1172,9 +1255,16 @@ char **argv; } #endif - if (WINVERS_AMIV) + if (WINVERS_AMIV) { + extern char *tilefile; + if (amii_numcolors >= 32) { + tilefile = "NetHack:tiles/tiles32.iff"; + amii_numcolors = 32; + } else { + tilefile = "NetHack:tiles/tiles16.iff"; + } amii_bmhd = ReadTileImageFiles(); - else + } else memcpy(amii_initmap, amii_init_map, sizeof(amii_initmap)); memcpy(sysflags.amii_curmap, amii_initmap, sizeof(sysflags.amii_curmap)); @@ -1201,11 +1291,7 @@ char **argv; /* While openscreen fails try fewer colors to see if that is the problem. */ while ((HackScreen = OpenScreen((void *) &NewHackScreen)) == NULL) { -#ifdef TEXTCOLOR if (--NewHackScreen.Depth < 3) -#else - if (--NewHackScreen.Depth < 2) -#endif Abort(AN_OpenScreen & ~AT_DeadEnd); } amii_numcolors = 1L << NewHackScreen.Depth; @@ -1345,11 +1431,11 @@ amii_setdrawpens(struct Window *w, int type) /* Clear the indicated window */ void -amii_clear_nhwindow(win) -register winid win; +amii_clear_nhwindow(winid win) { - register struct amii_WinDesc *cw; - register struct Window *w; + struct amii_WinDesc *cw; + struct Window *w; + if (reclip == 2) return; @@ -1378,6 +1464,40 @@ register winid win; amii_setfillpens(w, cw->type); SetDrMd(w->RPort, JAM2); +#ifdef CLIPPING + /* When clearing the map for a full redraw (docrt/cls), center the + clipping viewport on the player BEFORE the map is redrawn. + Without this, the first docrt() after a level change or new game + draws with stale clip coordinates (typically 0,0), leaving the + player off-screen until their first move triggers amii_cliparound. */ + if (cw->type == NHW_MAP && clipping && u.ux + && !on_level(&u.uz, &clip_saved_level)) { + int COx, LIx; + struct RastPort *rp = w->RPort; + + if (Is_rogue_level(&u.uz)) { + COx = (w->Width - w->BorderLeft - w->BorderRight) / rp->TxWidth; + LIx = (w->Height - w->BorderTop - w->BorderBottom) / rp->TxHeight; + } else { + COx = CO; + LIx = LI; + } + clipx = max(0, (int) u.ux - COx / 2); + clipxmax = clipx + COx; + if (clipxmax > COLNO) { + clipxmax = COLNO; + clipx = clipxmax - COx; + } + clipy = max(0, (int) u.uy - LIx / 2); + clipymax = clipy + LIx; + if (clipymax > ROWNO) { + clipymax = ROWNO; + clipy = clipymax - LIx; + } + clip_saved_level = u.uz; + } +#endif + if (cw->type == NHW_MENU || cw->type == NHW_TEXT) { RectFill(w->RPort, w->BorderLeft, w->BorderTop, w->Width - w->BorderRight - 1, @@ -1402,11 +1522,10 @@ register winid win; /* Dismiss the window from the screen */ void -dismiss_nhwindow(win) -register winid win; +dismiss_nhwindow(winid win) { - register struct Window *w; - register struct amii_WinDesc *cw; + struct Window *w; + struct amii_WinDesc *cw; if (win == WIN_ERR || (cw = amii_wins[win]) == NULL) { panic(winpanicstr, win, "dismiss_nhwindow"); @@ -1442,9 +1561,9 @@ register winid win; } void -amii_exit_nhwindows(str) -const char *str; +amii_exit_nhwindows(const char *str) { + /* Seems strange to have to do this... but we need the BASE window * left behind... */ @@ -1459,15 +1578,14 @@ const char *str; } void -amii_display_nhwindow(win, blocking) -winid win; -boolean blocking; +amii_display_nhwindow(winid win, boolean blocking) { menu_item *mip; int cnt; static int lastwin = -1; struct amii_WinDesc *cw; + if (!Initialized) return; lastwin = win; @@ -1497,14 +1615,12 @@ boolean blocking; } void -amii_curs(window, x, y) -winid window; -register int x, y; /* not xchar: perhaps xchar is unsigned and - curx-x would be unsigned as well */ +amii_curs(winid window, int x, int y) { - register struct amii_WinDesc *cw; - register struct Window *w; - register struct RastPort *rp; + struct amii_WinDesc *cw; + struct Window *w; + struct RastPort *rp; + if (window == WIN_ERR || (cw = amii_wins[window]) == NULL) panic(winpanicstr, window, "curs"); @@ -1525,8 +1641,14 @@ register int x, y; /* not xchar: perhaps xchar is unsigned and cw->curx = x; cw->cury = y; + /* Silently skip rendering for out-of-bounds coordinates */ + if (cw->rows > 0 && y >= cw->rows) + return; + if (cw->cols > 0 && x >= cw->cols) + return; + #ifdef DEBUG - if (x < 0 || y < 0 || y >= cw->rows || x >= cw->cols) { + if (0 && (x < 0 || y < 0 || y >= cw->rows || x >= cw->cols)) { char *s = "[unknown type]"; switch (cw->type) { case NHW_MESSAGE: @@ -1648,12 +1770,10 @@ printf("pos: (%d,%d)->(%d,%d)\n",x,y,qqx,qqy); } void -amii_set_text_font(name, size) -char *name; -int size; +amii_set_text_font(char *name, int size) { - register int i; - register struct amii_WinDesc *cw; + int i; + struct amii_WinDesc *cw; int osize = TextsFont13.ta_YSize; static char nname[100]; @@ -1694,11 +1814,10 @@ int size; } void -kill_nhwindows(all) -register int all; +kill_nhwindows(int all) { - register int i; - register struct amii_WinDesc *cw; + int i; + struct amii_WinDesc *cw; /* Foreach open window in all of amii_wins[], CloseShWindow, free memory */ @@ -1711,12 +1830,10 @@ register int all; } void -amii_cl_end(cw, curs_pos) -register struct amii_WinDesc *cw; -register int curs_pos; +amii_cl_end(struct amii_WinDesc *cw, int curs_pos) { - register struct Window *w = cw->win; - register int oy, ox; + struct Window *w = cw->win; + int oy, ox; if (!w) panic("NULL window pointer in amii_cl_end()"); @@ -1730,12 +1847,11 @@ register int curs_pos; } void -cursor_off(window) -winid window; +cursor_off(winid window) { - register struct amii_WinDesc *cw; - register struct Window *w; - register struct RastPort *rp; + struct amii_WinDesc *cw; + struct Window *w; + struct RastPort *rp; int curx, cury; int x, y; long dmode; @@ -1790,13 +1906,12 @@ winid window; } void -cursor_on(window) -winid window; +cursor_on(winid window) { int x, y; - register struct amii_WinDesc *cw; - register struct Window *w; - register struct RastPort *rp; + struct amii_WinDesc *cw; + struct Window *w; + struct RastPort *rp; unsigned char ch; long dmode; short apen, bpen; @@ -1843,10 +1958,13 @@ winid window; if (WINVERS_AMIV && cw->type == NHW_MAP) { cursor_common(rp, x, y); } else { - Move(rp, x, y); - ch = CURSOR_CHAR; - Text(rp, &ch, 1); - Move(rp, x, y); + if (w && x >= 0 && y >= 0 + && x < w->Width && y < w->Height) { + Move(rp, x, y); + ch = CURSOR_CHAR; + Text(rp, &ch, 1); + Move(rp, x, y); + } } SetDrMd(rp, dmode); @@ -1855,9 +1973,7 @@ winid window; } static void -cursor_common(rp, x, y) -struct RastPort *rp; -int x, y; +cursor_common(struct RastPort *rp, int x, int y) { int x1, x2, y1, y2; @@ -1880,29 +1996,27 @@ int x, y; } void -amii_suspend_nhwindows(str) -const char *str; +amii_suspend_nhwindows(const char *str) { if (HackScreen) ScreenToBack(HackScreen); } void -amii_resume_nhwindows() +amii_resume_nhwindows(void) { if (HackScreen) ScreenToFront(HackScreen); } void -amii_bell() +amii_bell(void) { DisplayBeep(NULL); } void -removetopl(cnt) -int cnt; +removetopl(int cnt) { struct amii_WinDesc *cw = amii_wins[WIN_MESSAGE]; /* NB - this is sufficient for @@ -1920,7 +2034,7 @@ int cnt; #ifdef PORT_HELP void -port_help() +port_help(void) { display_file(PORT_HELP, 1); } @@ -1936,17 +2050,20 @@ port_help() */ void -amii_print_glyph(win, x, y, glyph, bkglyph) -winid win; -xchar x, y; -int glyph, bkglyph; +amii_print_glyph(winid win, coordxy x, coordxy y, + const glyph_info *glyphinfo, + const glyph_info *bkglyphinfo UNUSED) { struct amii_WinDesc *cw; uchar ch; + int glyph; int color, och; extern const int zapcolors[]; unsigned special; + + glyph = glyphinfo->glyph; + /* In order for the overview window to work, we can not clip here */ if (!WINVERS_AMIV) { #ifdef CLIPPING @@ -1978,8 +2095,8 @@ if(u.uz.dlevel != x){ } else /* AMII, or Rogue level in either version */ { /* map glyph to character and color */ - (void) mapglyph(glyph, &och, &color, &special, x, y, 0); - ch = (uchar) och; + ch = glyphinfo->ttychar; + color = glyphinfo->gm.sym.color; if (WINVERS_AMIV) { /* implies Rogue level here */ amii_curs(win, x, y); amiga_print_glyph(win, NO_COLOR, ch + 10000); @@ -1987,15 +2104,11 @@ if(u.uz.dlevel != x){ /* Move the cursor. */ amii_curs(win, x, y + 2); -#ifdef TEXTCOLOR /* Turn off color if rogue level. */ if (Is_rogue_level(&u.uz)) color = NO_COLOR; amiga_print_glyph(win, color, ch); -#else - g_putch(ch); /* print the character */ -#endif cw->curx++; /* one character over */ } } @@ -2004,11 +2117,11 @@ if(u.uz.dlevel != x){ /* Make sure the user sees a text string when no windowing is available */ void -amii_raw_print(s) -register const char *s; +amii_raw_print(const char *s) { int argc = 0; + if (!s) return; if (amiIDisplay) @@ -2040,11 +2153,11 @@ register const char *s; */ void -amii_raw_print_bold(s) -register const char *s; +amii_raw_print_bold(const char *s) { int argc = 0; + if (!s) return; @@ -2075,20 +2188,28 @@ register const char *s; /* Rebuild/update the inventory if the window is up. */ void -amii_update_inventory() +amii_update_inventory(int arg UNUSED) { - register struct amii_WinDesc *cw; + struct amii_WinDesc *cw; + if (WIN_INVEN != WIN_ERR && (cw = amii_wins[WIN_INVEN]) && cw->type == NHW_MENU && cw->win) { - display_inventory(NULL, FALSE); + repopulate_perminvent(); } } +/* Stub for ctrl_nhwindow - no special handling needed for Amiga */ +win_request_info * +amii_ctrl_nhwindow(winid window UNUSED, int request UNUSED, win_request_info *wri UNUSED) +{ + return (win_request_info *) 0; +} + /* Humm, doesn't really do anything useful */ void -amii_mark_synch() +amii_mark_synch(void) { if (!amiIDisplay) fflush(stderr); @@ -2099,7 +2220,7 @@ amii_mark_synch() * ask for a key to be pressed. */ void -amii_wait_synch() +amii_wait_synch(void) { if (!amiIDisplay || amiIDisplay->rawprint) { if (amiIDisplay) @@ -2113,7 +2234,7 @@ amii_wait_synch() } void -amii_setclipped() +amii_setclipped(void) { #ifdef CLIPPING clipping = TRUE; @@ -2124,12 +2245,35 @@ amii_setclipped() #endif } +/* Redraw a rectangular region of the map via newsym(). Used after + ScrollRaster() shifts existing pixels — only the exposed strip needs + redrawing. Does NOT flush; the caller flushes after all regions. */ +static void +redraw_map_region(int x1, int y1, int x2, int y2) +{ + int x, y; + + if (!u.ux) + return; + if (x1 < 1) x1 = 1; + if (y1 < 0) y1 = 0; + if (x2 >= COLNO) x2 = COLNO - 1; + if (y2 >= ROWNO) y2 = ROWNO - 1; + for (y = y1; y <= y2; y++) + for (x = x1; x <= x2; x++) { + /* Invalidate the glyph buffer so newsym() redraws even if + * the glyph hasn't changed — the pixels were shifted by + * ScrollRaster and no longer match the buffer. */ + gg.gbuf[y][x].glyphinfo.glyph = NO_GLYPH; + newsym(x, y); + } +} + /* XXX still to do: suppress scrolling if we violate the boundary but the * edge of the map is already displayed */ void -amii_cliparound(x, y) -register int x, y; +amii_cliparound(int x, int y) { #ifdef CLIPPING int oldx = clipx, oldy = clipy; @@ -2138,8 +2282,9 @@ register int x, y; #define SCROLLCNT 1 /* Get there in 3 moves... */ int scrollcnt = SCROLLCNT; /* ...or 1 if we changed level */ - if (!clipping) /* And 1 in anycase, cleaner, simpler, quicker */ + if (!clipping) { /* And 1 in anycase, cleaner, simpler, quicker */ return; + } if (Is_rogue_level(&u.uz)) { struct Window *w = amii_wins[WIN_MAP]->win; @@ -2156,16 +2301,22 @@ register int x, y; * reasonablely large window extra motion is avoided; for * the rogue level hopefully this means no motion at all. */ - { - static d_level saved_level = { 127, 127 }; /* XXX */ - - if (!on_level(&u.uz, &saved_level)) { - scrollcnt = 1; /* jump with blanking */ - clipx = clipy = 0; - clipxmax = COx; - clipymax = LIx; - saved_level = u.uz; /* save as new current level */ + if (!on_level(&u.uz, &clip_saved_level)) { + scrollcnt = 1; /* jump with blanking */ + /* Center viewport on the player for the new level. */ + clipx = max(0, x - COx / 2); + clipxmax = clipx + COx; + if (clipxmax > COLNO) { + clipxmax = COLNO; + clipx = clipxmax - COx; } + clipy = max(0, y - LIx / 2); + clipymax = clipy + LIx; + if (clipymax > ROWNO) { + clipymax = ROWNO; + clipy = clipymax - LIx; + } + clip_saved_level = u.uz; /* save as new current level */ } if (x <= clipx + xclipbord) { @@ -2187,13 +2338,12 @@ register int x, y; reclip = 1; if (clipx != oldx || clipy != oldy || clipxmax != oldxmax || clipymax != oldymax) { -#ifndef NOSCROLLRASTER struct Window *w = amii_wins[WIN_MAP]->win; struct RastPort *rp = w->RPort; - int xdelta, ydelta, xmod, ymod, i; - int incx, incy, mincx, mincy; - int savex, savey, savexmax, saveymax; - int scrx, scry; + int dx = clipx - oldx; + int dy = clipy - oldy; + int scrx, scry; /* tile pixel dimensions */ + int halfW, halfH; /* half viewport in tiles */ if (Is_rogue_level(&u.uz)) { scrx = rp->TxWidth; @@ -2203,129 +2353,63 @@ register int x, y; scry = mysize; } - /* Ask that the glyph routines not draw the overview window */ - reclip = 2; - cursor_off(WIN_MAP); - - /* Compute how far we are moving in terms of tiles */ - mincx = clipx - oldx; - mincy = clipy - oldy; - - /* How many tiles to get there in SCROLLCNT moves */ - incx = (clipx - oldx) / scrollcnt; - incy = (clipy - oldy) / scrollcnt; - - /* If less than SCROLLCNT tiles, then move by 1 tile if moving at all - */ - if (incx == 0) - incx = (mincx != 0); - if (incy == 0) - incy = (mincy != 0); - - /* Get count of pixels to move each iteration and final pixel count */ - xdelta = ((clipx - oldx) * scrx) / scrollcnt; - xmod = ((clipx - oldx) * scrx) % scrollcnt; - ydelta = ((clipy - oldy) * scry) / scrollcnt; - ymod = ((clipy - oldy) * scry) % scrollcnt; - - /* Preserve the final move location */ - savex = clipx; - savey = clipy; - saveymax = clipymax; - savexmax = clipxmax; - -/* - * Set clipping rectangle to be just the region that will be exposed so - * that drawing will be faster - */ -#if 0 /* Doesn't seem to work quite the way it should */ - /* In some cases hero is 'centered' offscreen */ - if( xdelta < 0 ) - { - clipx = oldx; - clipxmax = clipx + incx; - } - else if( xdelta > 0 ) - { - clipxmax = oldxmax; - clipx = clipxmax - incx; - } - else - { - clipx = oldx; - clipxmax = oldxmax; - } - - if( ydelta < 0 ) - { - clipy = oldy; - clipymax = clipy + incy; - } - else if( ydelta > 0 ) - { - clipymax = oldymax; - clipy = clipymax - incy; - } - else - { - clipy = oldy; - clipymax = oldymax; - } -#endif - /* Now, in scrollcnt moves, move the picture toward the final view */ - for (i = 0; i < scrollcnt; ++i) { -#ifdef DISPMAP - if (i == scrollcnt - 1 && (xmod != 0 || ymod != 0) - && (xdelta != 0 || ydelta != 0)) { - incx += (clipx - oldx) % scrollcnt; - incy += (clipy - oldy) % scrollcnt; - xdelta += xmod; - ydelta += ymod; - } -#endif - /* Scroll the raster if we are scrolling */ - if (xdelta != 0 || ydelta != 0) { - ScrollRaster(rp, xdelta, ydelta, w->BorderLeft, w->BorderTop, - w->Width - w->BorderRight - 1, - w->Height - w->BorderBottom - 1); - - if (mincx == 0) - incx = 0; - else - mincx -= incx; - - clipx += incx; - clipxmax += incx; - - if (mincy == 0) - incy = 0; - else - mincy -= incy; - - clipy += incy; - clipymax += incy; - - /* Draw the exposed portion */ - redraw_map(); - flush_glyph_buffer(amii_wins[WIN_MAP]->win); + halfW = COx / 2; + halfH = LIx / 2; + + /* Erase the map cursor before shifting pixels, otherwise the + old cursor position leaves a COMPLEMENT artifact on screen. */ + if (WIN_MAP != WIN_ERR) + cursor_off(WIN_MAP); + + /* Large jumps (teleport, level change): just redraw everything. */ + if (abs(dx) > halfW || abs(dy) > halfH + || scrollcnt != SCROLLCNT) { + { + int savedAPen = rp->FgPen; + int savedDrMd = rp->DrawMode; + SetAPen(rp, amii_otherBPen); + SetDrMd(rp, JAM1); + RectFill(rp, w->BorderLeft, w->BorderTop, + w->Width - w->BorderRight - 1, + w->Height - w->BorderBottom - 1); + SetAPen(rp, savedAPen); + SetDrMd(rp, savedDrMd); } + redraw_map(FALSE); + } else { + /* Flush pending glyphs — they reference old clip coords */ + flush_glyph_buffer(w); + + /* Hardware-blit the viewport by the scroll delta */ + ScrollRaster(rp, dx * scrx, dy * scry, + w->BorderLeft, w->BorderTop, + w->Width - w->BorderRight - 1, + w->Height - w->BorderBottom - 1); + + /* Redraw only the exposed strip(s) */ + if (dx > 0) + redraw_map_region(clipxmax - dx, clipy, + clipxmax, clipymax - 1); + else if (dx < 0) + redraw_map_region(clipx, clipy, + clipx - dx, clipymax - 1); + + if (dy > 0) + redraw_map_region(clipx, clipymax - dy, + clipxmax, clipymax - 1); + else if (dy < 0) + redraw_map_region(clipx, clipy, + clipxmax, clipy - dy - 1); + + flush_glyph_buffer(w); } - - clipx = savex; - clipy = savey; - clipymax = saveymax; - clipxmax = savexmax; -#endif - redraw_map(); - flush_glyph_buffer(amii_wins[WIN_MAP]->win); } reclip = 0; #endif } void -flushIDCMP(port) -struct MsgPort *port; +flushIDCMP(struct MsgPort *port) { struct Message *msg; while (msg = GetMsg(port)) diff --git a/sys/amiga/winkey.c b/sys/amiga/winkey.c index c90e06fc8..f2686bfde 100644 --- a/sys/amiga/winkey.c +++ b/sys/amiga/winkey.c @@ -2,16 +2,24 @@ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif -amii_nh_poskey(x, y, mod) int *x, *y, *mod; +int +amii_nh_poskey(coordxy *x, coordxy *y, int *mod) { struct amii_WinDesc *cw; WETYPE type; struct RastPort *rp; struct Window *w; + /* No entry log for nh_poskey -- too noisy (called constantly) */ if (cw = amii_wins[WIN_MESSAGE]) { cw->wflags &= ~FLMAP_SKIP; @@ -53,10 +61,11 @@ amii_nh_poskey(x, y, mod) int *x, *y, *mod; } int -amii_nhgetch() +amii_nhgetch(void) { int ch; struct amii_WinDesc *cw = amii_wins[WIN_MESSAGE]; + /* No entry log for nhgetch -- too noisy (called constantly) */ if (WIN_MAP != WIN_ERR && amii_wins[WIN_MAP]) { cursor_on(WIN_MAP); @@ -69,15 +78,15 @@ amii_nhgetch() } void -amii_get_nh_event() +amii_get_nh_event(void) { /* nothing now - later I have no idea. Is this just a Mac hook? */ } void -amii_getret() +amii_getret(void) { - register int c; + int c; raw_print(""); raw_print("Press Return..."); diff --git a/sys/amiga/winproto.h b/sys/amiga/winproto.h index 9c249b0a0..d855e50fe 100644 --- a/sys/amiga/winproto.h +++ b/sys/amiga/winproto.h @@ -8,10 +8,9 @@ void EditClipping(void); void DrawCol(struct Window *w, int idx, UWORD *colors); void DispCol(struct Window *w, int idx, UWORD *colors); void amii_change_color(int, long, int); -char *amii_get_color_string(); +char *amii_get_color_string(void); void amii_getlin(const char *prompt, char *bufp); void getlind(const char *prompt, char *bufp, const char *dflt); -char *amii_get_color_string(void); int filecopy(char *from, char *to); char *basename(char *str); char *dirname(char *str); @@ -33,17 +32,17 @@ void amii_scrollmsg(register struct Window *w, register struct amii_WinDesc *cw); /* winkey.c */ -int amii_nh_poskey(int *x, int *y, int *mod); +int amii_nh_poskey(coordxy *x, coordxy *y, int *mod); int amii_nhgetch(void); void amii_get_nh_event(void); void amii_getret(void); /* winmenu.c */ -void amii_start_menu(winid window); -void FDECL(amii_add_menu, (winid, int, const anything *, CHAR_P, CHAR_P, int, - const char *, BOOLEAN_P)); -void FDECL(amii_end_menu, (winid, const char *)); -int FDECL(amii_select_menu, (winid, int, menu_item **)); +void amii_start_menu(winid window, unsigned long); +void amii_add_menu(winid, const glyph_info *, const anything *, CHAR_P, CHAR_P, + int, int, const char *, unsigned int); +void amii_end_menu(winid, const char *); +int amii_select_menu(winid, int, menu_item **); int DoMenuScroll(int win, int blocking, int how, menu_item **); void ReDisplayData(winid win); void DisplayData(winid win, int start); @@ -55,7 +54,6 @@ struct Window *OpenShWindow(struct NewWindow *nw); void CloseShWindow(struct Window *win); int ConvertKey(struct IntuiMessage *message); int kbhit(void); -int kbhit(void); int amikbhit(void); int WindowGetchar(void); WETYPE WindowGetevent(void); @@ -65,7 +63,7 @@ void Abort(long rc); #endif void CleanUp(void); void flush_glyph_buffer(struct Window *w); -void amiga_print_glyph(winid window, int color_index, int glyph, int bkglyph); +void amiga_print_glyph(winid window, int color_index, int glyph); void start_glyphout(winid window); void amii_end_glyphout(winid window); struct NewWindow *DupNewWindow(struct NewWindow *win); @@ -101,19 +99,19 @@ void amii_resume_nhwindows(void); void amii_bell(void); void removetopl(int cnt); void port_help(void); -void amii_print_glyph(winid win, xchar x, xchar y, int glyph, int bkglyph); +void amii_print_glyph(winid win, coordxy x, coordxy y, const glyph_info *glyphinfo, const glyph_info *bkglyphinfo); void amii_raw_print(const char *s); void amii_raw_print_bold(const char *s); -void amii_update_inventory(void); +void amii_update_inventory(int); void amii_mark_synch(void); void amii_wait_synch(void); void amii_setclipped(void); void amii_cliparound(int x, int y); void amii_set_text_font(char *font, int size); -BitMapHeader ReadImageFiles(char **, struct BitMap **, char **); +BitMapHeader ReadImageFile(const char *, struct BitMap **); +void FreeImageFile(struct BitMap **); BitMapHeader ReadTileImageFiles(void); -void FreeImageFiles(char **, struct BitMap **); -void FreeTileImageFiles(); +void FreeTileImageFiles(void); /* winami.c */ #ifdef SHAREDLIB @@ -124,12 +122,10 @@ void amii_askname(void); void amii_player_selection(void); void RandomWindow(char *name); int amii_get_ext_cmd(void); -char amii_yn_function(const char *prompt, const char *resp, char def); char amii_yn_function(const char *query, const char *resp, char def); void amii_display_file(const char *fn, boolean complain); void SetBorder(struct Gadget *gd); -void *malloc(register unsigned size); -void free(void *q); +/* malloc/free provided by stdlib.h */ #ifdef SHAREDLIB /* amilib.c */ @@ -141,8 +137,10 @@ void setup_librefs(WinamiBASE *base); void Abort(long rc); #endif +win_request_info *amii_ctrl_nhwindow(winid, int, win_request_info *); + /* amirip.c */ -void FDECL(amii_outrip, (winid tmpwin, int how, time_t when)); +void amii_outrip(winid tmpwin, int how, time_t when); /* winchar.c */ void SetMazeType(MazeType); @@ -151,4 +149,3 @@ int GlyphToIcon(int glyph); void dispmap_sanity(void); int dispmap_sanity1(int); #endif -void FreeTileImageFiles(void); diff --git a/sys/amiga/winreq.c b/sys/amiga/winreq.c index 3d59f5960..910adeb86 100644 --- a/sys/amiga/winreq.c +++ b/sys/amiga/winreq.c @@ -2,9 +2,15 @@ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif #define GADBLUEPEN 2 #define GADREDPEN 3 @@ -39,7 +45,11 @@ struct NewWindow StrWindow = { &String, NULL, NULL, NULL, NULL, 5, 5, 0xffff, 0xffff, CUSTOMSCREEN }; +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/colorwin.c" +#else +#include "colorwin.c" +#endif #define XSIZE 2 #define YSIZE 3 @@ -48,21 +58,25 @@ struct NewWindow StrWindow = { #define GADOKAY 6 #define GADCANCEL 7 +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/clipwin.c" +#else +#include "clipwin.c" +#endif void ClearCol(struct Window *w); void -EditColor() +EditColor(void) { - extern char configfile[]; + const char *configfile = get_configfile(); int i, done = 0, okay = 0; long code, qual, class; - register struct Gadget *gd, *dgad; - register struct Window *nw; - register struct IntuiMessage *imsg; - register struct PropInfo *pip; - register struct Screen *scrn; + struct Gadget *gd, *dgad; + struct Window *nw; + struct IntuiMessage *imsg; + struct PropInfo *pip; + struct Screen *scrn; long aidx; int msx, msy; int curcol = 0, drag = 0; @@ -114,11 +128,7 @@ EditColor() #ifdef INTUI_NEW_LOOK Col_NewWindowStructure1.Extension = wintags; Col_NewWindowStructure1.Flags |= WFLG_NW_EXTENDED; -#ifdef __GNUC__ fillhook.h_Entry = (void *) &LayerFillHook; -#else - fillhook.h_Entry = (ULONG (*) ()) LayerFillHook; -#endif fillhook.h_Data = (void *) -2; fillhook.h_SubEntry = 0; #endif @@ -234,7 +244,7 @@ EditColor() for (i = 0; i < amii_numcolors; ++i) { fprintf(nfp, "%03x", colors[i]); if ((i + 1) < amii_numcolors) - putc(',', nfp); + putc('/', nfp); } putc('\n', nfp); } @@ -342,11 +352,11 @@ EditClipping(void) char buf[40]; int done = 0, okay = 0; long code, qual, class; - register struct Gadget *gd, *dgad; - register struct Window *nw; - register struct IntuiMessage *imsg; - register struct PropInfo *pip; - register struct Screen *scrn; + struct Gadget *gd, *dgad; + struct Window *nw; + struct IntuiMessage *imsg; + struct PropInfo *pip; + struct Screen *scrn; long aidx; int lmxsize = mxsize, lmysize = mysize; int lxclipbord = xclipbord, lyclipbord = yclipbord; @@ -374,11 +384,7 @@ EditClipping(void) #ifdef INTUI_NEW_LOOK ClipNewWindowStructure1.Extension = wintags; ClipNewWindowStructure1.Flags |= WFLG_NW_EXTENDED; -#ifdef __GNUC__ fillhook.h_Entry = (void *) &LayerFillHook; -#else - fillhook.h_Entry = (ULONG (*) ()) LayerFillHook; -#endif fillhook.h_Data = (void *) -2; fillhook.h_SubEntry = 0; #endif @@ -532,8 +538,7 @@ EditClipping(void) } char * -dirname(str) -char *str; +dirname(char *str) { char *t, c; static char dir[300]; @@ -541,9 +546,9 @@ char *str; t = strrchr(str, '/'); if (!t) t = strrchr(str, ':'); - if (!t) - t = str; - else { + if (!t) { + dir[0] = '\0'; + } else { c = *t; *t = 0; strcpy(dir, str); @@ -553,8 +558,7 @@ char *str; } char * -basename(str) -char *str; +basename(char *str) { char *t; @@ -568,7 +572,8 @@ char *str; return (t); } -filecopy(from, to) char *from, *to; +int +filecopy(char *from, char *to) { char *buf; int i = 0; @@ -592,7 +597,7 @@ filecopy(from, to) char *from, *to; } /* The colornames, and the default values for the pens */ -static struct COLDEF { +struct COLDEF { char *name, *defval; }; struct COLDEF amii_colnames[AMII_MAXCOLORS] = { @@ -643,10 +648,7 @@ ClearCol(struct Window *w) } void -DrawCol(w, idx, colors) -struct Window *w; -int idx; -UWORD *colors; +DrawCol(struct Window *w, int idx, UWORD *colors) { int bxorx, bxory, bxxlen, bxylen; int i, incx, incy, r, g, b; @@ -728,10 +730,7 @@ UWORD *colors; } void -DispCol(w, idx, colors) -struct Window *w; -int idx; -UWORD *colors; +DispCol(struct Window *w, int idx, UWORD *colors) { char buf[50]; char *colname, *defval; @@ -810,26 +809,21 @@ amii_setpens(int count) /* Generate a requester for a string value. */ void -amii_getlin(prompt, bufp) -const char *prompt; -char *bufp; +amii_getlin(const char *prompt, char *bufp) { getlind(prompt, bufp, 0); } /* and with default */ void -getlind(prompt, bufp, dflt) -const char *prompt; -char *bufp; -const char *dflt; +getlind(const char *prompt, char *bufp, const char *dflt) { #ifndef TOPL_GETLINE - register struct Window *cwin; - register struct IntuiMessage *imsg; - register long class, code, qual; - register int aredone = 0; - register struct Gadget *gd; + struct Window *cwin; + struct IntuiMessage *imsg; + long class, code, qual; + int aredone = 0; + struct Gadget *gd; static int once; *StrString = 0; @@ -858,11 +852,7 @@ const char *dflt; #ifdef INTUI_NEW_LOOK StrWindow.Extension = wintags; StrWindow.Flags |= WFLG_NW_EXTENDED; -#ifdef __GNUC__ fillhook.h_Entry = (void *) &LayerFillHook; -#else - fillhook.h_Entry = (ULONG (*) ()) LayerFillHook; -#endif fillhook.h_Data = (void *) -2; fillhook.h_SubEntry = 0; #endif @@ -992,9 +982,7 @@ const char *dflt; } void -amii_change_color(pen, val, rev) -int pen, rev; -long val; +amii_change_color(int pen, long val, int rev) { if (rev) sysflags.amii_curmap[pen] = ~val; @@ -1006,12 +994,13 @@ long val; } char * -amii_get_color_string() +amii_get_color_string(void) { int i; char s[10]; static char buf[BUFSZ]; + *buf = 0; for (i = 0; i < min(32, amii_numcolors); ++i) { sprintf(s, "%s%03lx", i ? "/" : "", (long) sysflags.amii_curmap[i]); diff --git a/sys/amiga/winstr.c b/sys/amiga/winstr.c index fd745c182..a3801fff1 100644 --- a/sys/amiga/winstr.c +++ b/sys/amiga/winstr.c @@ -2,17 +2,19 @@ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ +#ifndef CROSS_TO_AMIGA #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" - +#else +#include "windefs.h" +#include "winext.h" +#include "winproto.h" +#endif /* Put a string into the indicated window using the indicated attribute */ void -amii_putstr(window, attr, str) -winid window; -int attr; -const char *str; +amii_putstr(winid window, int attr, const char *str) { int fudge; int len; @@ -22,6 +24,7 @@ const char *str; int i, j, n0, bottom, totalvis, wheight; static int wrapping = 0; + /* Always try to avoid a panic when there is no window */ if (window == WIN_ERR) { window = WIN_BASE; @@ -76,8 +79,8 @@ const char *str; while (isspace(*str)) str++; - strncpy(toplines, str, TBUFSZ); - toplines[TBUFSZ - 1] = 0; + strncpy(gt.toplines, str, TBUFSZ); + gt.toplines[TBUFSZ - 1] = 0; /* For initial message to be visible, we need to explicitly position * the @@ -96,15 +99,15 @@ const char *str; memcpy(cw->data, &cw->data[1], (iflags.msg_history - 1) * sizeof(char *)); cw->data[iflags.msg_history - 1] = - (char *) alloc(strlen(toplines) + 5); + (char *) alloc(strlen(gt.toplines) + SOFF + 4); strcpy(cw->data[i = iflags.msg_history - 1] + SOFF + (scrollmsg != 0), - toplines); + gt.toplines); } else { /* Otherwise, allocate a new one and copy the line in */ - cw->data[cw->maxrow] = (char *) alloc(strlen(toplines) + 5); + cw->data[cw->maxrow] = (char *) alloc(strlen(gt.toplines) + SOFF + 4); strcpy(cw->data[i = cw->maxrow++] + SOFF + (scrollmsg != 0), - toplines); + gt.toplines); } cw->data[i][SEL_ITEM] = 1; cw->data[i][VATTR] = attr + 1; @@ -177,7 +180,7 @@ const char *str; / w->RPort->TxHeight, totalvis, totalvis); } - i = strlen(toplines + SOFF); + i = strlen(gt.toplines + SOFF); cw->maxcol = max(cw->maxcol, i); cw->vwy = cw->maxrow; break; @@ -186,12 +189,15 @@ const char *str; if (cw->data[cw->cury] == NULL) panic("NULL pointer for status window"); ob = &cw->data[cw->cury][j = cw->curx]; - if (context.botlx) + if (disp.botlx) *ob = 0; /* Display when beam at top to avoid flicker... */ WaitTOF(); - Text(w->RPort, (char *) str, strlen((char *) str)); + { int slen = strlen((char *) str); + if (slen > cw->cols) slen = cw->cols; + Text(w->RPort, (char *) str, slen); + } if (cw->cols > strlen(str)) TextSpaces(w->RPort, cw->cols - strlen(str)); @@ -281,9 +287,7 @@ const char *str; } void -amii_scrollmsg(w, cw) -register struct Window *w; -register struct amii_WinDesc *cw; +amii_scrollmsg(struct Window *w, struct amii_WinDesc *cw) { int bottom, wheight; @@ -306,8 +310,7 @@ register struct amii_WinDesc *cw; } int -amii_msgborder(w) -struct Window *w; +amii_msgborder(struct Window *w) { register int bottom; @@ -320,8 +323,7 @@ struct Window *w; } void -outmore(cw) -register struct amii_WinDesc *cw; +outmore(struct amii_WinDesc *cw) { struct Window *w = cw->win; @@ -354,11 +356,7 @@ register struct amii_WinDesc *cw; } void -outsubstr(cw, str, len, fudge) -register struct amii_WinDesc *cw; -char *str; -int len; -int fudge; +outsubstr(struct amii_WinDesc *cw, char *str, int len, int fudge) { struct Window *w = cw->win; @@ -382,10 +380,7 @@ int fudge; /* Put a graphics character onto the screen */ void -amii_putsym(st, i, y, c) -winid st; -int i, y; -CHAR_P c; +amii_putsym(winid st, int i, int y, CHAR_P c) { amii_curs(st, i, y); Text(amii_wins[st]->win->RPort, &c, 1); @@ -394,8 +389,7 @@ CHAR_P c; /* Add to the last line in the message window */ void -amii_addtopl(s) -const char *s; +amii_addtopl(const char *s) { register struct amii_WinDesc *cw = amii_wins[WIN_MESSAGE]; @@ -408,9 +402,7 @@ const char *s; } void -TextSpaces(rp, nr) -struct RastPort *rp; -int nr; +TextSpaces(struct RastPort *rp, int nr) { if (nr < 1) return; @@ -424,7 +416,7 @@ int nr; } void -amii_remember_topl() +amii_remember_topl(void) { /* ignore for now. I think this will be done automatically by * the code writing to the message window, but I could be wrong. @@ -432,12 +424,13 @@ amii_remember_topl() } int -amii_doprev_message() +amii_doprev_message(void) { struct amii_WinDesc *cw; struct Window *w; char *str; + if (WIN_MESSAGE == WIN_ERR || (cw = amii_wins[WIN_MESSAGE]) == NULL || (w = cw->win) == NULL) { panic(winpanicstr, WIN_MESSAGE, "doprev_message"); diff --git a/sys/amiga/xpm2iff.c b/sys/amiga/xpm2iff.c deleted file mode 100644 index 0ffbc8c47..000000000 --- a/sys/amiga/xpm2iff.c +++ /dev/null @@ -1,363 +0,0 @@ -/* NetHack 3.6 xpm2iff.c $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ -/* Copyright (c) 1995 by Gregg Wonderly, Naperville, Illinois */ -/* NetHack may be freely redistributed. See license for details. */ - -#include - -#include "config.h" -#include "tile.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef _DCC -#include -#include -#include -#endif - -struct xpmscreen { - int Width; - int Height; - int Colors; - int ColorResolution; - int Background; - int AspectRatio; - int Interlace; - int BytesPerRow; -} XpmScreen; - -/* translation table from xpm characters to RGB and colormap slots */ -struct Ttable { - char flag; - char r, g, b; - int slot; /* output colortable index */ -} ttable[256]; - -pixval ColorMap[3][MAXCOLORMAPSIZE]; -int colorsinmap; - -/* - * We are using a hybrid form of our own design which we call a BMAP (for - * bitmap) form. It is an ILBM with the bitmaps already deinterleaved, - * completely uncompressed. - * This speeds the loading of the images from the games point of view because - * it - * does not have to deinterleave and uncompress them. - */ -#define ID_BMAP MAKE_ID('B', 'M', 'A', 'P') /* instead of ILBM */ -#define ID_BMHD MAKE_ID('B', 'M', 'H', 'D') /* Same as ILBM */ -#define ID_CAMG MAKE_ID('C', 'A', 'M', 'G') /* Same as ILBM */ -#define ID_CMAP MAKE_ID('C', 'M', 'A', 'P') /* Same as ILBM */ -#define ID_PDAT \ - MAKE_ID('P', 'D', 'A', 'T') /* Extra data describing plane \ - * size due to graphics.library \ - * rounding requirements. \ - */ -#define ID_PLNE MAKE_ID('P', 'L', 'N', 'E') /* The planes of the image */ - -int nplanes; - -/* BMHD from IFF documentation */ -typedef struct { - UWORD w, h; - WORD x, y; - UBYTE nPlanes; - UBYTE masking; - UBYTE compression; - UBYTE reserved1; - UWORD transparentColor; - UBYTE xAspect, yAspect; - WORD pageWidth, pageHeight; -} BitMapHeader; - -typedef struct { - UBYTE r, g, b; -} AmiColorMap; - -pixel pixels[TILE_Y][TILE_X]; -AmiColorMap *cmap; - -void -error(char *str) -{ - fprintf(stderr, "ERROR: %s\n", str); -} - -char **planes; - -main(int argc, char **argv) -{ - int colors; - struct { - long nplanes; - long pbytes; - long across; - long down; - long npics; - long xsize; - long ysize; - } pdat; - long pbytes; /* Bytes of data in a plane */ - int i, cnt; - BitMapHeader bmhd; - struct IFFHandle *iff; - long camg = HIRES | LACE; - int tiles = 0; - int index; - -#if defined(_DCC) || defined(__GNUC__) - IFFParseBase = OpenLibrary("iffparse.library", 0); - if (!IFFParseBase) { - error("unable to open iffparse.library"); - exit(1); - } -#endif - - if (fopen_xpm_file(argv[1], "r") != TRUE) { - perror(argv[1]); - return (1); - } - - nplanes = 0; - i = XpmScreen.Colors - 1; - while (i != 0) { - nplanes++; - i >>= 1; - } - - planes = malloc(nplanes * sizeof(char *)); - if (planes == 0) { - error("can not allocate planes pointer"); - exit(1); - } - - XpmScreen.BytesPerRow = ((XpmScreen.Width + 15) / 16) * 2; - pbytes = XpmScreen.BytesPerRow * XpmScreen.Height; - for (i = 0; i < nplanes; ++i) { - planes[i] = malloc(pbytes); - if (planes[i] == 0) { - error("can not allocate planes pointer"); - exit(1); - } - memset(planes[i], 0, pbytes); - } - - iff = AllocIFF(); - if (!iff) { - error("Can not allocate IFFHandle"); - return (1); - } - - iff->iff_Stream = Open(argv[2], MODE_NEWFILE); - if (!iff->iff_Stream) { - error("Can not open output file"); - return (1); - } - - InitIFFasDOS(iff); - OpenIFF(iff, IFFF_WRITE); - - PushChunk(iff, ID_BMAP, ID_FORM, IFFSIZE_UNKNOWN); - - bmhd.w = XpmScreen.Width; - bmhd.h = XpmScreen.Height; - bmhd.x = 0; - bmhd.y = 0; - bmhd.nPlanes = nplanes; - bmhd.masking = 0; - bmhd.compression = 0; - bmhd.reserved1 = 0; - bmhd.transparentColor = 0; - bmhd.xAspect = 100; - bmhd.yAspect = 100; - bmhd.pageWidth = 0; /* not needed for this program */ - bmhd.pageHeight = 0; /* not needed for this program */ - - PushChunk(iff, ID_BMAP, ID_BMHD, sizeof(bmhd)); - WriteChunkBytes(iff, &bmhd, sizeof(bmhd)); - PopChunk(iff); - - PushChunk(iff, ID_BMAP, ID_CAMG, sizeof(camg)); - WriteChunkBytes(iff, &camg, sizeof(camg)); - PopChunk(iff); - -#define SCALE(x) (x) - cmap = malloc((colors = (1L << nplanes)) * sizeof(AmiColorMap)); - if (cmap == 0) { - error("Can't allocate color map"); - exit(1); - } - for (index = 0; index < 256; index++) { - if (ttable[index].flag) { - cmap[ttable[index].slot].r = SCALE(ttable[index].r); - cmap[ttable[index].slot].g = SCALE(ttable[index].g); - cmap[ttable[index].slot].b = SCALE(ttable[index].b); - } - } -#undef SCALE - - PushChunk(iff, ID_BMAP, ID_CMAP, IFFSIZE_UNKNOWN); - WriteChunkBytes(iff, cmap, colors * sizeof(*cmap)); - PopChunk(iff); - - conv_image(); - - pdat.nplanes = nplanes; - pdat.pbytes = pbytes; - pdat.xsize = XpmScreen.Width; - pdat.ysize = XpmScreen.Height; - pdat.across = 0; - pdat.down = 0; - pdat.npics = 1; - - PushChunk(iff, ID_BMAP, ID_PDAT, IFFSIZE_UNKNOWN); - WriteChunkBytes(iff, &pdat, sizeof(pdat)); - PopChunk(iff); - - PushChunk(iff, ID_BMAP, ID_PLNE, IFFSIZE_UNKNOWN); - for (i = 0; i < nplanes; ++i) - WriteChunkBytes(iff, planes[i], pbytes); - PopChunk(iff); - - CloseIFF(iff); - Close(iff->iff_Stream); - FreeIFF(iff); - -#if defined(_DCC) || defined(__GNUC__) - CloseLibrary(IFFParseBase); -#endif - exit(0); -} - -#define SETBIT(Plane, Plane_offset, Col, Value) \ - if (Value) { \ - planes[Plane][Plane_offset + (Col / 8)] |= 1 << (7 - (Col & 7)); \ - } - -conv_image() -{ - int row, col, planeno; - - for (row = 0; row < XpmScreen.Height; row++) { - char *xb = xpmgetline(); - int plane_offset; - if (xb == 0) - return; - plane_offset = row * XpmScreen.BytesPerRow; - for (col = 0; col < XpmScreen.Width; col++) { - int slot; - int color = xb[col]; - if (!ttable[color].flag) { - fprintf(stderr, "Bad image data\n"); - } - slot = ttable[color].slot; - for (planeno = 0; planeno < nplanes; planeno++) { - SETBIT(planeno, plane_offset, col, slot & (1 << planeno)); - } - } - } -} - -long * -alloc(unsigned int n) -{ - long *ret = malloc(n); - if (!ret) { - error("Can't allocate memory"); - exit(1); - } - return (ret); -} - -FILE *xpmfh = 0; -char initbuf[200]; -char *xpmbuf = initbuf; - -/* version 1. Reads the raw xpm file, NOT the compiled version. This is - * not a particularly good idea but I don't have time to do the right thing - * at this point, even if I was absolutely sure what that was. */ -fopen_xpm_file(const char *fn, const char *mode) -{ - int temp; - char *xb; - if (strcmp(mode, "r")) - return FALSE; /* no choice now */ - if (xpmfh) - return FALSE; /* one file at a time */ - xpmfh = fopen(fn, mode); - if (!xpmfh) - return FALSE; /* I'm hard to please */ - - /* read the header */ - xb = xpmgetline(); - if (xb == 0) - return FALSE; - if (4 != sscanf(xb, "%d %d %d %d", &XpmScreen.Width, &XpmScreen.Height, - &XpmScreen.Colors, &temp)) - return FALSE; /* bad header */ - /* replace the original buffer with one big enough for - * the real data - */ - /* XXX */ - xpmbuf = malloc(XpmScreen.Width * 2); - if (!xpmbuf) { - error("Can't allocate line buffer"); - exit(1); - } - if (temp != 1) - return FALSE; /* limitation of this code */ - - { - /* read the colormap and translation table */ - int ccount = -1; - while (ccount++ < (XpmScreen.Colors - 1)) { - char index; - int r, g, b; - xb = xpmgetline(); - if (xb == 0) - return FALSE; - if (4 != sscanf(xb, "%c c #%2x%2x%2x", &index, &r, &g, &b)) { - fprintf(stderr, "Bad color entry: %s\n", xb); - return FALSE; - } - ttable[index].flag = 1; /* this color is valid */ - ttable[index].r = r; - ttable[index].g = g; - ttable[index].b = b; - ttable[index].slot = ccount; - } - } - return TRUE; -} - -/* This deserves better. Don't read it too closely - you'll get ill. */ -#define bufsz 2048 -char buf[bufsz]; -xpmgetline() -{ - char *bp; - do { - if (fgets(buf, bufsz, xpmfh) == 0) - return 0; - } while (buf[0] != '"'); - /* strip off the trailing <",> if any */ - for (bp = buf; *bp; bp++) - ; - bp--; - while (isspace(*bp)) - bp--; - if (*bp == ',') - bp--; - if (*bp == '"') - bp--; - bp++; - *bp = '\0'; - - return &buf[1]; -} diff --git a/sys/amiga/xpm2iff_host.c b/sys/amiga/xpm2iff_host.c new file mode 100644 index 000000000..589d4f56f --- /dev/null +++ b/sys/amiga/xpm2iff_host.c @@ -0,0 +1,346 @@ +/* xpm2iff_host.c - host-side .xpm -> Amiga BMAP IFF converter. + * Copyright (c) 2026 by Ingo Paschke. + * NetHack may be freely redistributed. See license for details. + * + * Adapted from sys/amiga/xpm2iff.c, Copyright (c) 1995 by Gregg Wonderly. + * Rewritten for host-side cross-compilation using POSIX file I/O with + * explicit big-endian output instead of AmigaOS IFFParse library calls. + * + * Input: an XPM2 file, 1 char per pixel. + * Output: a BMAP IFF file readable by sys/amiga/winchar.c (tomb.iff). + */ + +#include +#include +#include +#include +#include + +/* ------------------------------------------------------------------ + * XPM screen descriptor and color translation table + * ------------------------------------------------------------------ */ + +static struct { + int Width; + int Height; + int Colors; + int BytesPerRow; +} XpmScreen; + +/* Translation table: indexed by the single XPM character code. + * slot = output palette index (0-based) + * flag = 1 if this entry is valid + * r,g,b = RGB components (0-255) */ +static struct { + unsigned char flag; + unsigned char r, g, b; + int slot; +} ttable[256]; + +/* ------------------------------------------------------------------ + * XPM parsing + * Adapted directly from sys/amiga/xpm2iff.c (already POSIX). + * ------------------------------------------------------------------ */ + +static FILE *xpmfh; + +#define XBUFSZ 2048 +static char xbuf[XBUFSZ]; + +/* Read the next quoted line from the XPM file. + * Returns a pointer to the content between the first pair of double-quotes, + * or NULL on EOF. Trailing ", and whitespace are stripped. */ +static char * +xpmgetline(void) +{ + char *bp; + do { + if (fgets(xbuf, XBUFSZ, xpmfh) == NULL) + return NULL; + } while (xbuf[0] != '"'); + + /* strip trailing <",> and whitespace */ + for (bp = xbuf; *bp; bp++) + ; + bp--; + while (isspace((unsigned char)*bp)) + bp--; + if (*bp == ',') + bp--; + if (*bp == '"') + bp--; + bp++; + *bp = '\0'; + + return &xbuf[1]; +} + +/* Open an XPM file and parse its header + color table. + * Populates XpmScreen and ttable[]. + * Returns 1 on success, 0 on failure. */ +static int +fopen_xpm_file(const char *fn) +{ + int temp; + char *xb; + + xpmfh = fopen(fn, "r"); + if (!xpmfh) + return 0; + + /* read dimensions header: "W H Colors 1" */ + xb = xpmgetline(); + if (!xb) + return 0; + if (sscanf(xb, "%d %d %d %d", + &XpmScreen.Width, &XpmScreen.Height, + &XpmScreen.Colors, &temp) != 4) + return 0; + if (temp != 1) { + fprintf(stderr, "xpm2iff_host: only 1 char/pixel XPM files supported\n"); + return 0; + } + + /* read color map: "%c c #rrggbb" */ + { + int ccount = 0; + while (ccount < XpmScreen.Colors) { + char idx; + int r, g, b; + xb = xpmgetline(); + if (!xb) + return 0; + if (sscanf(xb, "%c c #%2x%2x%2x", &idx, &r, &g, &b) != 4) { + fprintf(stderr, "xpm2iff_host: bad color entry: %s\n", xb); + return 0; + } + ttable[(unsigned char)idx].flag = 1; + ttable[(unsigned char)idx].r = (unsigned char)r; + ttable[(unsigned char)idx].g = (unsigned char)g; + ttable[(unsigned char)idx].b = (unsigned char)b; + ttable[(unsigned char)idx].slot = ccount; + ccount++; + } + } + return 1; +} + +/* ------------------------------------------------------------------ + * Bitplane packing + * ------------------------------------------------------------------ */ + +static char **planes; + +#define SETBIT(plane, plane_offset, col, value) \ + do { \ + if (value) \ + planes[plane][plane_offset + ((col) / 8)] \ + |= (char)(1 << (7 - ((col) & 7))); \ + } while (0) + +static void +conv_image(int nplanes) +{ + int row, col, planeno; + + for (row = 0; row < XpmScreen.Height; row++) { + char *xb = xpmgetline(); + int plane_offset; + if (!xb) + return; + plane_offset = row * XpmScreen.BytesPerRow; + for (col = 0; col < XpmScreen.Width; col++) { + int color = (unsigned char)xb[col]; + int slot; + if (!ttable[color].flag) { + fprintf(stderr, "xpm2iff_host: bad image data at row %d col %d\n", + row, col); + continue; + } + slot = ttable[color].slot; + for (planeno = 0; planeno < nplanes; planeno++) + SETBIT(planeno, plane_offset, col, slot & (1 << planeno)); + } + } +} + +/* ------------------------------------------------------------------ + * Big-endian IFF output helpers + * ------------------------------------------------------------------ */ + +static FILE *iff_out; + +static void +wr32(uint32_t v) +{ + fputc((v >> 24) & 0xff, iff_out); + fputc((v >> 16) & 0xff, iff_out); + fputc((v >> 8) & 0xff, iff_out); + fputc( v & 0xff, iff_out); +} + +static void +write_chunk(const char *id, const void *data, uint32_t size) +{ + fwrite(id, 1, 4, iff_out); + wr32(size); + fwrite(data, 1, size, iff_out); + if (size & 1) + fputc(0, iff_out); +} + +/* ------------------------------------------------------------------ + * main + * ------------------------------------------------------------------ */ + +int +main(int argc, char **argv) +{ + int i, nplanes, colors; + uint32_t pbytes, plne_size, form_size; + + if (argc != 3) { + fprintf(stderr, "Usage: %s source.xpm destination.iff\n", argv[0]); + return 1; + } + + if (!fopen_xpm_file(argv[1])) { + fprintf(stderr, "%s: failed to open or parse XPM file\n", argv[1]); + return 1; + } + + /* nplanes = ceil(log2(Colors)) */ + nplanes = 0; + i = XpmScreen.Colors - 1; + while (i > 0) { nplanes++; i >>= 1; } + + colors = 1 << nplanes; + + XpmScreen.BytesPerRow = ((XpmScreen.Width + 15) / 16) * 2; + pbytes = (uint32_t)XpmScreen.BytesPerRow * (uint32_t)XpmScreen.Height; + + /* Allocate zero-initialised bitplane buffers */ + planes = malloc(nplanes * sizeof(char *)); + if (!planes) { perror("malloc"); return 1; } + for (i = 0; i < nplanes; ++i) { + planes[i] = calloc(1, pbytes); + if (!planes[i]) { perror("calloc"); return 1; } + } + + /* Pack pixel data into bitplanes */ + conv_image(nplanes); + fclose(xpmfh); + + /* Open output IFF file */ + iff_out = fopen(argv[2], "wb"); + if (!iff_out) { perror(argv[2]); return 1; } + + /* Pre-compute FORM size: + * 4 (BMAP type tag) + * 8 + 20 (BMHD) + * 8 + 4 (CAMG) + * 8 + colors*3 (CMAP; colors is a power of 2, so colors*3 is even) + * 8 + 28 (PDAT: 7 x uint32_t) + * 8 + nplanes*pbytes (PLNE; pbytes is always even) + */ + plne_size = (uint32_t)nplanes * pbytes; + form_size = 4 + + (8 + 20) + + (8 + 4) + + (8 + (uint32_t)colors * 3) + + (8 + 28) + + (8 + plne_size); + + /* FORM header */ + fwrite("FORM", 1, 4, iff_out); + wr32(form_size); + fwrite("BMAP", 1, 4, iff_out); + + /* BMHD chunk */ + { + uint8_t bmhd[20]; + uint8_t *p = bmhd; + uint16_t w = (uint16_t)XpmScreen.Width; + uint16_t h = (uint16_t)XpmScreen.Height; + + p[0] = w >> 8; p[1] = w & 0xff; p += 2; /* w */ + p[0] = h >> 8; p[1] = h & 0xff; p += 2; /* h */ + memset(p, 0, 4); p += 4; /* x=0, y=0 */ + *p++ = (uint8_t)nplanes; /* nPlanes */ + *p++ = 0; /* masking: none */ + *p++ = 0; /* compression: none */ + *p++ = 0; /* reserved1 */ + p[0] = 0; p[1] = 0; p += 2; /* transparentColor */ + *p++ = 100; /* xAspect */ + *p++ = 100; /* yAspect */ + p[0] = 0; p[1] = 0; p += 2; /* pageWidth (not used) */ + p[0] = 0; p[1] = 0; p += 2; /* pageHeight (not used) */ + + write_chunk("BMHD", bmhd, 20); + } + + /* CAMG chunk: HIRES | LACE = 0x00008004 */ + { + uint8_t camg[4] = { 0x00, 0x00, 0x80, 0x04 }; + write_chunk("CAMG", camg, 4); + } + + /* CMAP chunk: built from ttable (no color reordering for XPM images) */ + { + uint8_t *cmap = calloc(colors, 3); + if (!cmap) { perror("calloc"); return 1; } + for (i = 0; i < 256; i++) { + if (ttable[i].flag) { + int s = ttable[i].slot; + cmap[s * 3 + 0] = ttable[i].r; + cmap[s * 3 + 1] = ttable[i].g; + cmap[s * 3 + 2] = ttable[i].b; + } + } + write_chunk("CMAP", cmap, (uint32_t)colors * 3); + free(cmap); + } + + /* PDAT chunk: 7 x uint32_t big-endian + * nplanes, pbytes, across=0, down=0, npics=1, xsize=Width, ysize=Height */ + { + uint32_t vals[7]; + uint8_t pdat[28]; + uint8_t *p = pdat; + + vals[0] = (uint32_t)nplanes; + vals[1] = pbytes; + vals[2] = 0; /* across: not a tile sheet */ + vals[3] = 0; /* down */ + vals[4] = 1; /* npics */ + vals[5] = (uint32_t)XpmScreen.Width; + vals[6] = (uint32_t)XpmScreen.Height; + + for (i = 0; i < 7; i++) { + p[0] = (vals[i] >> 24) & 0xff; + p[1] = (vals[i] >> 16) & 0xff; + p[2] = (vals[i] >> 8) & 0xff; + p[3] = vals[i] & 0xff; + p += 4; + } + write_chunk("PDAT", pdat, 28); + } + + /* PLNE chunk: concatenated bitplane data */ + fwrite("PLNE", 1, 4, iff_out); + wr32(plne_size); + for (i = 0; i < nplanes; ++i) + fwrite(planes[i], 1, pbytes, iff_out); + if (plne_size & 1) + fputc(0, iff_out); + + fclose(iff_out); + + for (i = 0; i < nplanes; ++i) free(planes[i]); + free(planes); + + printf("tomb.iff: %dx%d, %d colors (%d planes), %u bytes/plane\n", + XpmScreen.Width, XpmScreen.Height, colors, nplanes, + (unsigned)pbytes); + return 0; +} diff --git a/sys/atari/.gitattributes b/sys/atari/.gitattributes deleted file mode 100644 index 51c777260..000000000 --- a/sys/atari/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* NH_filestag=(file%s_for_Atari_version_-_untested_for_3.6.6) diff --git a/sys/atari/Install.tos b/sys/atari/Install.tos deleted file mode 100644 index 5b2bfde01..000000000 --- a/sys/atari/Install.tos +++ /dev/null @@ -1,124 +0,0 @@ - Instructions for compiling and installing NetHack 3.6 - on a TOS system - ===================================================== - (or, How to make ST NetHack 3.6) - Last revision: 2 February 2000 - -1. Make sure all the NetHack files are in the appropriate directory structure. - You should have a main directory with subdirectories dat, doc, include, - src, util, sys\atari, sys\share, sys\unix, and at least one of win\tty - and win\gem. You may have other subdirectories under sys and win, but - they needn't concern you. If you do not follow this structure, the - Makefiles will not function properly. The .c files for the main program - belong in src, those for utility programs in util, and Atari-specific - ones in sys\atari. All the .h files belong in include, the documentation - in doc, and assorted data files in dat. You may also use random.c from - sys\share. The Makefiles belong in sys\unix. (A more detailed - explanation of the directory structure may be found in Files, which - should be in the top directory.) - - -2. If you don't already have a good command line interpreter, get one. - Doing all of the following from the desktop or a GEM shell will - probably be a *big* pain. If you can get a Bourne shell compatible - one, and put it in \bin\sh, then you'll save yourself some trouble - with the Makefiles. There are several good shells on various - FTP sites (including atari.archive.umich.edu). - - Run the "setup.g" shell script in sys\atari. This will setup all the - makefiles and other files in the appropriate directories. It assumes - that your compiler prefers \ to / as a directory separator. If not, - simply copy the makefiles instead of running sed on them. - -3. Now go to the include subdirectory to edit a couple of the header files - there. - - First edit config.h according to the comments to match your system and - desired set of features. In particular: - make sure that UNIX is *not* defined, and TOS is (if you're using - the MiNT library, and/or the -mint option to gcc, this will - be done automatically) - make sure that HACKDIR is defined properly (or not at all) - make sure that COMPRESS is not defined - - Also edit tosconf.h; this shouldn't need much changing. If you are not - going to include random.c you will need to comment out RANDOM. Gcc users - don't need RANDOM, since the gcc and MiNT libraries have a Berkeley - derived srandom() function already. If you have no termcap support and - don't want to use the supplied termcap.uu, comment out TERMLIB. Gcc has - a termcap library, so TERMLIB should always be "on" with gcc (and you - don't need to worry about termcap.uu at all). - -4. If you want to change the high score list behavior, examine the top of - topten.c, in the src directory. You may want to change the definitions of - PERSMAX, POINTSMIN, and ENTRYMAX. I set POINTSMIN to 51 and ENTRYMAX to - 50 to keep the size of the score list down. - -5. Go to the src directory and edit your Makefile. You'll want the Systos - target configuration; the comments explain most of what needs to be done, - at least for the gcc. - - Next, go to the top, util, dat, and doc directories, and edit the Makefiles - there, as necessary. You'll need nroff and/or TeX to do the files in doc; - if you don't have one/both of these, you can skip it (docs?? we don't need - no steenking docs :-)). - - If you elected to use Fred Fish's termcap library (bundled in as - termcap.arc), you will have to generate termcap.a from those sources. - - If you are recompiling after patching your sources, or if you got your - files from somewhere other than the official distribution, "touch - makedefs.c" to ensure that certain files (onames.h and pm.h) are remade, - lest potentially troublesome timestamps fool "make." - -8. Now, enter "make all", and take a long siesta; your computer will be - occupied for a long time. If all goes well, you will get an executable. - If you tried to compile in too many features, you will probably get a - dysfunctional executable, and will have to start over. - - Hint 1: If you're short on memory, you might enter "make -n all - >make.bat," and then run script.bat with some sort of batch - program or with the gulam command "script make.bat." - - Hint 2: You'll save yourself a lot of grief if you use the GNU - version of the "make" program. Some of the smaller makes aren't - completely compatible. GNU software for the Atari is widely - available; for example, by anonymous FTP from atari.archive.umich.edu. - -9. Make sure the support files -- data, rumors, cmdhelp, opthelp, help, hh, - history, license, and oracles, or simply nhdat if DLB was defined -- - were copied to the game directory. If not, move them there from the - dat directory yourself. rumors can be created manually by entering - "makedefs -r;" data by entering "makedefs -d." - - Also, make sure that the various level files (*.lev, from the dat - subdirectory) were copied over correctly. If you're not sure what files - should have been made, double check with Makefile.dat. - -10. Go to the src\atari directory. Copy atari.cnf to your game directory - as NetHack.cnf. Edit it to reflect your particular setup and personal - preferences, following the comments. - - If you compiled in the TERMLIB feature, also move the "termcap" file to - your game directory. (Note: gcc's termcap routines have built-in - defaults, so the termcap file is not necessary with that compiler.) - - If you're running NetHack from the MultiTOS desktop, and you want a - more useful set of drop down menus than the plain system "File/Edit" - ones, copy nethack.mnu to your games directory. This file contains a - menu definition that puts a lot of the common commands into the menu. - -11. Play NetHack. If it works, you're done! - - -Notes ------ - -1) Save files and bones files from previous versions will not work with - NetHack 3.4. Don't bother trying to keep them. - -2) To install an update of NetHack after changing something, enter "make" - from the src directory. If you add, delete, or reorder monsters or - objects, or you change the format of saved level files, delete any save - and bones files. (Trying to use such files sometimes produces amusing - confusions on the game's part, but more often produces crashes.) diff --git a/sys/atari/atarifnt.uue b/sys/atari/atarifnt.uue deleted file mode 100644 index 7abba9d2b..000000000 --- a/sys/atari/atarifnt.uue +++ /dev/null @@ -1,119 +0,0 @@ -table - !"#$%&'()*+,-./0123456789:;<=>? -@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ -begin 644 hackfnt.arc -M&@A(04-+1DY4+E!21P E!, #\48JO>BQ\= ,8#0 #" S4 ,! ! &@!Bz -M8 "#D!2 > . !Q_P%!5= 'D!0(GN10.X('EB9,Z1L+0"<,&1!DY*5L<@-B,#H(!<(N' 8XIH'SYK3.CQSX057EA26DQ\r -MPP$/)REU#@XPB$ 1!G0 0$(: &!033IT8:&$"0KPY1<)0XR@#%5_4O90D1D<"*$)%H((p -M\1T&9O C)HDD(,.H$I#R \9 B%1Z::9HFB&+HHQ*\Q4@$&2 !" R (!$,"!Lo -MB<0;",#!#S"!4 -(-P(L0$8"*1J 3#1,GNM,T),m -M8$< (PQ#%1UHGB%!I5*81\>GD8;JCA"2@" %H 4R0 ')RW% P@\ZO " !H l -M>>.0 !1) ))U+(4#""D*H,^.3/PP0)!!@"PRQ76 @!Z5/%1,5,HZ_(//"#Dk -MD3,#: P3_2)LS)@#4:4< V708,0A\>,3@X(80P0Z%CR-^,G"0D)$00%@$8 ("#0CD i -MH9 +/!B@4 E@R- J) ;$PX.,"_&PD$(&M E) 0B(=+E"&Q0."08%@,(T'ZM_h -MKA !"\P)">$ , W)#6UN"HD&#F PX.P&% X&!U4"L"D&8.C$0&W"(P^ 3@ Xg -M()(!LTNN4 %@Z#Z Y &(!(,>>IC1N4A;C)[Y["3$-E D(N%#EPT#F>] UAY(f -M#PD"A1M^^.?^>,\ '_YP1_<,@P<( '/_CA@GXP #/ 8 PXK1 ?d -M/O"#3FIH!C]X@#UM@H/Q . XZ7F' <#87^\P (/XF8$!/# ##. 711C R8H?c -M!( )I<@#*RX$ QXP P8\@C&G(0L!G*"UB@ E,>"(?],"Z+YAO).@#b -M !5:PSX9@0,$/O!! $PH(S^X@7A?[%__%@*!IOC Q#P0=; 8(#>#80-68,!a -M#/#0/Q#B@ ,X\(<$J1YB$ ,,L*+Iz -M$N,'#+APA"'<7/0 X_K-"%?/##0GHH0QKV<"'\<.$.=>)#]ASN<)MR'&R.y -MF$2%',!TP6/B0'182PP03R?E7(@? ( /=(K1# ?! 9P\@('9P1&-:@%!_N"Xx -M3@ LDG 04(8QC%&%.VJ. .E306O6N4YPQ& ,-A@ (;7H!OAE;IW]4Q$$_- 2w -M"&RTDW!P0 8P@ $!$"%K>$!"_GA A;00!?^L,8 Q/@ .* 2%*I<2"M?N3DAv -M N T*C@/\# !AR8$P=97(@!S"#/B8$!#DL5HSG] 9PFCV!P'T ">@:/Q:P ,:@$4.^_P/;XA7L%\Z+,& 6T-'4+3J#JQ!@CK20!C#&2IR;/EF_$1Z;!BKY;6g -M,"\\P.@+'H2<>MP5KYIUPH<-V/I^8(!!G&,(J85$6XP'68@-L+%4-YAA&S>_f -M<$!%(0M>\^,#^ #V/XRF@EJ8 \8R(L !,#L(9\?8#@Y@:B80(6=4,*"&,!"$e -M'VKH[;ZX$)0D]4-K%@*-K]'U'(&HK37TH0M&=(*%'N! #CBQ95SH8"$(U(4.d -M*GD >,P( /\PM3>JM/$9H1B7;#! +\4W$#B0\,B/(H86+D'.$&"D&\ZYE\$,!_VT$Z<^P-2KNVY1'5(b -M5QC((+ULN* =W+"-"NM0)'H0A2X '41_RC8 $ !%7HQ#QGS "/?R&P.GVV a -MI>+@'8C ,0K.+L5&L8%AMU4M6E5?.!^()*B?0P+#X%*2( ^2P B!P /X $2z -MD >>H$K L$JJI$I^ $/X#Y?!'D&8 .31U))-0"ZA'FLQGF&8VG<$'HX%G+?y -M90Q&YV+8T#LZX0\?A%YF)1(HN'DC]V/;!08?%(/(9U2' WO*A#T6IF8N! ;_x -M4'P)<&IBM'F0)44N9'08@ TVH$-VX ??8'WPM! *H N[YFO>)V+# $JP $[w -MH 4]A!' L&S)Q'X>Q 9F4&U@@ (8@':-@@+X!VYHUCL+D348 770P),Q0&Zv -M8 _6@ W#0%4

@4X,@ TZ6'LP>'Y5-%< ( 0ZD3RUt -M-SLSAV/8@ UAA0 'AGSOM!!&!V#3X S0)UX#9HR;PX6,]5/@$(;!1F)4@ 'Ss -MX ;#\ _^ _P@%G!\&(QUGZ*=F-S" -H5T.J8 9 )F3($SRV*$L\($0!V$7,r -M90[&@ 4O9C04T(B/J%.1N%0"@!"6Z&*8"$KP5#B9QD0B9T5+)#T#(@[BI56Fq -MB(J_J :K""D\ %9G%3PB\8LXYDMO)E\U5'NL&)(AA%[B- PF&8R$$XM@4(PFp -MAU5=I$+*.#O21$D&H $8,'3;A9/5. *,%"BLSEX!4\J\ ]7%8Y\0(XV\ >#o -M "IM4Y?I%8 !@TS]#Z%IPP@#.P ,U9&$YY@&6R6"])$YL!@D+@%C45&M#l -MF$.]] ?IY4LAA%7M%6#2\GRQ9ICB2$TBH0"LLY2)A5CI0P4OY&S_P ?\P \Vk -M, 8Y-#KMQP:NQP:;X@\XT 5&PP-L,)<;Y7%%B FO8SH-T$3[,P!!( BKLYZUj -MLT)&XY> "0!V0$1M!9$\Z$)Q]$'_h -M@#QPT%X?"CT>2DD8\ /YTUZ\P M_H)/!>3V(Y:$+D5"7LPQLQIS\$$C)))T&g -M<)Y@X'C]DQZ>,P#P$$G@^47Z* $-X3D1X &8XP!-! E:JA KT$^V@SWZ=@#Kf -MU#L#TA:8d -M8P"A T\!8ACS83Y"J1!PYH$C-D@D18ZIPP<&P#H(ZCIXT'B"4T'%8U3B=CT"c -M\$$A!$P3143&U(2-,M#R+>60#<601Q%*@E G"z -MIEL\$*C D$H2Z$J1Z'%@<(&Q4T'1=TL.N4ON)UW4A4ZX! (%D48U%UB9 #6y -MZ0Z#5@!DI1/!XQV'DQYKU41MY1W>!$YJYAT.^Y"%\Y#/0U>%@PJU,@.U L1(D35$'^0%3--1+/17#!$V?C@D[JI$%&u -M)XM.IZ^t -M1&&6R%\1^TI+@?)$0D%7#KA $H1BZ9EZ#^![-MP0!Jq -MX'![%G%^!@=@<'HNMD*K]T&SXW$P '(Z@6 DE4'^8'*S6%KF18.>0 /)8I47/9@?FR@;4Q@=BD$&+"RDZQ U4<'K%6SIHn -M23AL /+ P#G, Q/-@SYD D/7('>\ ^_59"L=) NA!! 53R9!P,=6'D+$8*:m -MMU16%#R;0U)])HLJ*+NI*&"95TNN2(.[=$')WR%T]*(_(-SL,0 /4l -M9 ^T'XY%GR@Q@=_4'P(D'-5Q(H^=\.$O 8$QP8VL%1V8 =9>#E># %Z$ HAk -MX6M05\9(0 7=@+[R.XYKZ -TRW[090SO@ PX-LAY+%[,T,<<]+!3" "M4B78j -M@$D1)(B0FPGS, QP,(9IY@$9@ F2/(&L!@$$@%PBX0\,21?R)$X1:470]8EFi -MA4L'9CSB99VF:)T\1%3N%))BY!TD:9,X!@-37)LKR5TMR5Y7FUAB$$4YUD,Fh -MU%U&&&!&60 7=$60&F/G ,Jg -MX%I^, ;+R0_E> ?O*YU0M*!R"(=Y'$4DP XX8 V$.R.VR 0'H8\%0 (;BU3Gf -M< X@, PXL'(;X("RFF]ZO4(>@*5DALD88 3SV:LDC % <)OYV45- ;..XQT7e -MM$(M! ::): %"@8V "?)=YD^) .*DD?VD42"I(5Z@,7FJ'8IGG9JD4(T%Z_d -M][:40TU86**__*&^I$*2?3D[/1!2Q "&\ D8\*[MI4XW>GUG=4%:)*6#M:5M68T$4(%MU8BJZJC[b -MTP"ZHP-9P]:7"@D'X(0#L %T@ 9A, 9KD%5TX (Z+@"X$.(C7N(G7N6XH.)B$ 8Wx -M3A]B@072\ 4+P1(V409*O@%\H.)E@ =I$"4J(A)63N)OP 9Rw -M\ 5D$ 9^N35L/@!$4 1&$ 15$.> H.)H@.-P\.5^61 JSN(U'B4I7A1N\ : v -M+N@B,0!%7@9T4.=XKN.4_A-VD 8QX09Q3@B53@=K, =IH =QC@A?\!)RL.EBu -MON2,<.MV'B4+P>5?8.9H'NQZK@]?8!-WKN=Z#@^W'N@K 1;'$>IN0 :O$^>#t -M(1(0$,T,@ Z@ +2H@ *X (H &H 0( .KQ !"8*)6P ZP $0X #C3@$ s -# !H r - q -end diff --git a/sys/atari/nethack.mnu b/sys/atari/nethack.mnu deleted file mode 100644 index 6a7d7d204..000000000 --- a/sys/atari/nethack.mnu +++ /dev/null @@ -1,53 +0,0 @@ -# Sample .mnu file for NetHack -# This will work only with MINIWIN v1.1 -# or TOSWIN v2.0 (or better) - -#%title "NetHack" -#%about "About NetHack" "v" - -File - "Shell" "!" - "Options" "O" - --- - "Save Game" "S" - --- - "Quit" ?"[1][Really quit?][ Yes | No ]":%A"#quit y":! -Edit - "Copy" %C - "Paste" %P - "Paste Options..." %O - --- - "Set Font..." %F -Inventory - "Show Inventory" "i" - -- - "Put on jewelry" "P" - "Remove jewelry" "R" - "Wear armor" "W" - "Take off armor" "T" - "Wield weapon" "w" - "Exchange weapons" "x" - "Ready ammo in quiver" "Q" - --- - "Eat" "e" - "Quaff potion" "q" - --- - "Drop" "d" - "Throw" "t" - "Fire" "f" -Move - "North" "k" 4800 - "South" "j" 5000 - "East" "l" 4d00 - "West" "h" 4b00 - --- - "Rest" "." - --- - "Open door" "o" - "Close door" "c" -Misc - "Help" "?" 6200 - "List known spells" "+" - "Cast spell" "Z" - --- - "Abort" 001b 6100 diff --git a/sys/atari/setup.g b/sys/atari/setup.g deleted file mode 100644 index bcdff674e..000000000 --- a/sys/atari/setup.g +++ /dev/null @@ -1,17 +0,0 @@ -# gulam shell script -- should work with tcsh and many -# other Atari shells, too - -# UNIX shells use '/' in file names, but at least some Atari shells need '\' -# so we process the UNIX makefiles to make that switch - -# sed script not included as a here document in this script because at -# least some Atari shells don't do that - -sed -f unx2atar.sed < ..\unix\Makefile.top > ..\..\Makefile -sed -f unx2atar.sed < ..\unix\Makefile.dat > ..\..\dat\Makefile -sed -f unx2atar.sed < ..\unix\Makefile.doc > ..\..\doc\Makefile -sed -f unx2atar.sed < ..\unix\Makefile.src > ..\..\src\Makefile -sed -f unx2atar.sed < ..\unix\Makefile.utl > ..\..\util\Makefile - -# KLUDGE to fix a Makefile problem -echo > ..\..\include\win32api.h diff --git a/sys/atari/tos.c b/sys/atari/tos.c deleted file mode 100644 index 9bf36a81b..000000000 --- a/sys/atari/tos.c +++ /dev/null @@ -1,379 +0,0 @@ -/* NetHack 3.6 tos.c $NHDT-Date: 1501979358 2017/08/06 00:29:18 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.8 $ */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * TOS system functions. - */ - -#define NEED_VARARGS -#include "hack.h" - -#ifdef TTY_GRAPHICS -#include "tcap.h" -#else -/* To avoid error for tos.c; will be removed later */ -static char *nh_HE = "\033q"; -#endif - -#ifdef TOS - -#include -#ifndef WORD -#define WORD short /* 16 bits -- redefine if necessary */ -#endif - -#include - -static char NDECL(DOSgetch); -static char NDECL(BIOSgetch); -static void NDECL(init_aline); -char *_a_line; /* for Line A variables */ -#ifdef TEXTCOLOR -boolean colors_changed = FALSE; -#endif - -int -tgetch() -{ - char ch; - - /* BIOSgetch can use the numeric key pad on IBM compatibles. */ - if (iflags.BIOS) - ch = BIOSgetch(); - else - ch = DOSgetch(); - return ((ch == '\r') ? '\n' : ch); -} - -/* - * Keyboard translation tables. - */ -#define KEYPADLO 0x61 -#define KEYPADHI 0x71 - -#define PADKEYS (KEYPADHI - KEYPADLO + 1) -#define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) - -/* - * Keypad keys are translated to the normal values below. - * When iflags.BIOS is active, shifted keypad keys are translated to the - * shift values below. - */ -static const struct pad { - char normal, shift, cntrl; -} keypad[PADKEYS] = - { - { C('['), 'Q', C('[') }, /* UNDO */ - { '?', '/', '?' }, /* HELP */ - { '(', 'a', '(' }, /* ( */ - { ')', 'w', ')' }, /* ) */ - { '/', '/', '/' }, /* / */ - { C('p'), '$', C('p') }, /* * */ - { 'y', 'Y', C('y') }, /* 7 */ - { 'k', 'K', C('k') }, /* 8 */ - { 'u', 'U', C('u') }, /* 9 */ - { 'h', 'H', C('h') }, /* 4 */ - { '.', '.', '.' }, - { 'l', 'L', C('l') }, /* 6 */ - { 'b', 'B', C('b') }, /* 1 */ - { 'j', 'J', C('j') }, /* 2 */ - { 'n', 'N', C('n') }, /* 3 */ - { 'i', 'I', C('i') }, /* Ins */ - { '.', ':', ':' } /* Del */ - }, - numpad[PADKEYS] = { - { C('['), 'Q', C('[') }, /* UNDO */ - { '?', '/', '?' }, /* HELP */ - { '(', 'a', '(' }, /* ( */ - { ')', 'w', ')' }, /* ) */ - { '/', '/', '/' }, /* / */ - { C('p'), '$', C('p') }, /* * */ - { '7', M('7'), '7' }, /* 7 */ - { '8', M('8'), '8' }, /* 8 */ - { '9', M('9'), '9' }, /* 9 */ - { '4', M('4'), '4' }, /* 4 */ - { '.', '.', '.' }, /* 5 */ - { '6', M('6'), '6' }, /* 6 */ - { '1', M('1'), '1' }, /* 1 */ - { '2', M('2'), '2' }, /* 2 */ - { '3', M('3'), '3' }, /* 3 */ - { 'i', 'I', C('i') }, /* Ins */ - { '.', ':', ':' } /* Del */ - }; - -/* - * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII - * meaning unless assigned one by a keyboard conversion table, so the - * keyboard BIOS normally does not return a character code when Alt-letter - * is pressed. So, to interpret unassigned Alt-letters, we must use a - * scan code table to translate the scan code into a letter, then set the - * "meta" bit for it. -3. - */ -#define SCANLO 0x10 - -static const char scanmap[] = { - /* ... */ - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', 0, 'a', - 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0, '\\', 'z', 'x', - 'c', 'v', 'b', 'N', 'm', ',', '.', '?' /* ... */ -}; - -#define inmap(x) (SCANLO <= (x) && (x) < SCANLO + SIZE(scanmap)) - -/* - * BIOSgetch gets keys directly with a BIOS call. - */ -#define SHIFT (0x1 | 0x2) -#define CTRL 0x4 -#define ALT 0x8 - -static char -BIOSgetch() -{ - unsigned char scan, shift, ch; - const struct pad *kpad; - - long x; - - /* Get scan code. - */ - x = Crawcin(); - ch = x & 0x0ff; - scan = (x & 0x00ff0000L) >> 16; - /* Get shift status. - */ - shift = Kbshift(-1); - - /* Translate keypad keys */ - if (iskeypad(scan)) { - kpad = iflags.num_pad ? numpad : keypad; - if (shift & SHIFT) - ch = kpad[scan - KEYPADLO].shift; - else if (shift & CTRL) - ch = kpad[scan - KEYPADLO].cntrl; - else - ch = kpad[scan - KEYPADLO].normal; - } - /* Translate unassigned Alt-letters */ - if ((shift & ALT) && !ch) { - if (inmap(scan)) - ch = scanmap[scan - SCANLO]; - return (isprint(ch) ? M(ch) : ch); - } - return ch; -} - -static char -DOSgetch() -{ - return (Crawcin() & 0x007f); -} - -long -freediskspace(path) -char *path; -{ - int drive = 0; - struct { - long freal; /*free allocation units*/ - long total; /*total number of allocation units*/ - long bps; /*bytes per sector*/ - long pspal; /*physical sectors per allocation unit*/ - } freespace; - if (path[0] && path[1] == ':') - drive = (toupper(path[0]) - 'A') + 1; - if (Dfree(&freespace, drive) < 0) - return -1; - return freespace.freal * freespace.bps * freespace.pspal; -} - -/* - * Functions to get filenames using wildcards - */ -int -findfirst(path) -char *path; -{ - return (Fsfirst(path, 0) == 0); -} - -int -findnext() -{ - return (Fsnext() == 0); -} - -char * -foundfile_buffer() -{ - return (char *) Fgetdta() + 30; -} - -long -filesize(file) -char *file; -{ - if (findfirst(file)) - return (*(long *) ((char *) Fgetdta() + 26)); - else - return -1L; -} - -/* - * Chdrive() changes the default drive. - */ -void -chdrive(str) -char *str; -{ - char *ptr; - char drive; - - if ((ptr = index(str, ':')) != (char *) 0) { - drive = toupper(*(ptr - 1)); - (void) Dsetdrv(drive - 'A'); - } - return; -} - -void -get_scr_size() -{ -#ifdef MINT -#include - struct winsize win; - char *tmp; - - if ((tmp = nh_getenv("LINES"))) - LI = atoi(tmp); - else if ((tmp = nh_getenv("ROWS"))) - LI = atoi(tmp); - if (tmp && (tmp = nh_getenv("COLUMNS"))) - CO = atoi(tmp); - else { - ioctl(0, TIOCGWINSZ, &win); - LI = win.ws_row; - CO = win.ws_col; - } -#else - init_aline(); - LI = (*((WORD *) (_a_line + -42L))) + 1; - CO = (*((WORD *) (_a_line + -44L))) + 1; -#endif -} - -#define BIGBUF 8192 - -int -_copyfile(from, to) -char *from, *to; -{ - int fromfd, tofd, r; - char *buf; - - fromfd = open(from, O_RDONLY | O_BINARY, 0); - if (fromfd < 0) - return -1; - tofd = open(to, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, FCMASK); - if (tofd < 0) { - close(fromfd); - return -1; - } - buf = (char *) alloc((unsigned) BIGBUF); - while ((r = read(fromfd, buf, BIGBUF)) > 0) - write(tofd, buf, r); - close(fromfd); - close(tofd); - free((genericptr_t) buf); - return 0; /* successful */ -} - -int -kbhit() -{ - return Cconis(); -} - -static void -init_aline() -{ -#ifdef __GNUC__ - /* line A calls nuke registers d0-d2,a0-a2; not all compilers regard these - as scratch registers, though, so we save them - */ - asm(" moveml d0-d2/a0-a2, sp@-"); - asm(" .word 0xa000; movel d0, __a_line"); - asm(" moveml sp@+, d0-d2/a0-a2"); -#else - asm(" movem.l d0-d2/a0-a2, -(sp)"); - asm(" .dc.w 0xa000"); /* tweak as necessary for your compiler */ - asm(" move.l d0, __a_line"); - asm(" movem.l (sp)+, d0-d2/a0-a2"); -#endif -} - -#ifdef TEXTCOLOR -/* used in termcap.c to decide how to set up the hilites */ -unsigned long tos_numcolors = 2; - -void -set_colors() -{ - static char colorHE[] = "\033q\033b0"; - - if (!iflags.BIOS) - return; - init_aline(); - tos_numcolors = 1 << (((unsigned char *) _a_line)[1]); - if (tos_numcolors <= 2) { /* mono */ - iflags.use_color = FALSE; - return; - } else { - colors_changed = TRUE; - nh_HE = colorHE; - } -} - -void -restore_colors() -{ - static char plainHE[] = "\033q"; - - if (colors_changed) - nh_HE = plainHE; - colors_changed = FALSE; -} -#endif /* TEXTCOLOR */ - -#ifdef SUSPEND - -#include - -#ifdef MINT -extern int __mint; -#endif - -int -dosuspend() -{ -#ifdef MINT - extern int kill(); - if (__mint == 0) { -#endif - pline("Sorry, it seems we have no SIGTSTP here. Try ! or S."); -#ifdef MINT - } else if (signal(SIGTSTP, SIG_IGN) == SIG_DFL) { - suspend_nhwindows((char *) 0); - (void) signal(SIGTSTP, SIG_DFL); - (void) kill(0, SIGTSTP); - get_scr_size(); - resume_nhwindows(); - } else { - pline("I don't think your shell has job control."); - } -#endif /* MINT */ - return (0); -} -#endif /* SUSPEND */ - -#endif /* TOS */ diff --git a/sys/atari/unx2atar.sed b/sys/atari/unx2atar.sed deleted file mode 100644 index 8d4433075..000000000 --- a/sys/atari/unx2atar.sed +++ /dev/null @@ -1,23 +0,0 @@ -: loop -/\\$/N -/\\$/b loop -# for each line, append any continuation lines before trying to classify it -/^ / { -# if it starts with a tab, it's meant for the shell, and we should think -# about reversing the slashes -s;cd ../util;cd ..\\util; -s;cd ../src;cd ..\\src; -/librarian/ s;dat/options;dat\\options; -/$(MAKE)/b -/$(CC)/b -s;/;\\;g -} -# unfortunately, we do not want to reverse *all* the slashes, as even the -# Atari make and gcc like forward ones, and it's messy to avoid the ones in -# sed addresses -# so, flip the first one in e.g. -# @( cd ../util ; $(MAKE) ../include/onames.h ) -# flip the librarian-related ones in dat/options -# ignore other lines related to make and gcc -# and flip any slashes left over, which include a number of UNIX-only things -# that we didn't need to do but don't hurt diff --git a/sys/be/.gitattributes b/sys/be/.gitattributes deleted file mode 100644 index 6812375fd..000000000 --- a/sys/be/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* NH_filestag=(file%s_for_BeOS_version_-_untested_for_3.6.6) diff --git a/sys/be/README b/sys/be/README deleted file mode 100644 index 64105f136..000000000 --- a/sys/be/README +++ /dev/null @@ -1,63 +0,0 @@ -This file is sys/be/README. It is for those intending to compile -NetHack 3.6 on a BeOS 4.5 system. - -BeOS NetHack currently only supports the TTY windowing system. In -order to compile it, it would benefit you greatly to think of your Be -system as a UNIX variant. It is possible to compile using BeIDE. -However, there are four executables and several steps involved in making -NetHack. Unless you are extremely familiar with the build sequence and -are willing to modify the code somewhat, I suggest you avoid it for now. -Let the UNIX Makefiles take care of all that for you. - - -Known problems: -+ No special characters for walls. None of the fonts available for use - in a tty window has the graphics characters needed to improve the look. - If such a font existed, then all you need to do is set the dungeon, - object, and/or monter mappings in your defaults file. -+ The arrow keys don't work. - - - -Build instructions. From a freshly unpacked source tree: - -1. Copy the Makfiles in sys/unix to their proper spots. You may - use setup.sh or copy them by hand. Using setup.sh to create - links instead of copying the Makefiles will work, but BeOS will - not let you edit a link. It may be helpful to read - sys/unix/Install.unx. - -2. Edit src/Makefile: - o Change System to SysBe. - o Comment out the UNIX versions of SYSSRC and SYSOBJ variables. - o Uncomment the BeOS versions of SYSRC and SYSOBJ. - o Uncomment the BeOS versions of CC, CFLAGS, LD, and LFLAGS. The - flags are different for Intel vs BeBox/Mac. - o Uncomment one of the Intel or BeBox/Mac BeOS versions of CC, CFLAGS, - LD, and LFLAGS. - o Comment out the default CFLAGS and LFLAGS. - o Change WINTTYLIB to be -ltermcap. - -3. Edit util/Makefile: - o If on a BeBox/Mac: - - Uncomment the BeOS versions of CC and CFLAGS - - Comment out the default CFLAGS and LFLAGS. - o If on Intel: - - the default values of CFLAGS and LFLAGS work fine - o Change YACC and LEX to be bison -y and flex respectively. - -4. Edit include/config.h to change HACKDIR to be the location of your - install directory. - -5. Edit top level Makefile and change GAMEDIR to match HACKDIR in - include/config.h. Make sure the path to GAMEDIR exists. Change - SHELLDIR to a "throw away" directory, like /tmp. We don't use the - shell. Change CHOWN and CHGRP commands to "true", there really - aren't groups on the BeOS. - -6. Type "make install" at the top level. - - - -It is possible that some necessary steps needed to make the game have been -omitted. Feel free to ad-lib as necessary. diff --git a/sys/be/bemain.c b/sys/be/bemain.c deleted file mode 100644 index b5a26bded..000000000 --- a/sys/be/bemain.c +++ /dev/null @@ -1,278 +0,0 @@ -/* NetHack 3.6 bemain.c $NHDT-Date: 1447844549 2015/11/18 11:02:29 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */ -/* Copyright (c) Dean Luick, 1996. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "dlb.h" -#include - -static void whoami(void); -static void process_options(int argc, char **argv); -static void chdirx(const char *dir); -static void getlock(void); - -#ifdef __begui__ -#define MAIN nhmain -int nhmain(int argc, char **argv); -#else -#define MAIN main -#endif - -int -MAIN(int argc, char **argv) -{ - int fd; - char *dir; - boolean resuming = FALSE; /* assume new game */ - - sys_early_init(); - - dir = nh_getenv("NETHACKDIR"); - if (!dir) - dir = nh_getenv("HACKDIR"); - - choose_windows(DEFAULT_WINDOW_SYS); - chdirx(dir); - initoptions(); - - init_nhwindows(&argc, argv); - whoami(); - - /* - * It seems you really want to play. - */ - u.uhp = 1; /* prevent RIP on early quits */ - process_options(argc, argv); /* command line options */ - - set_playmode(); /* sets plname to "wizard" for wizard mode */ - /* strip role,race,&c suffix; calls askname() if plname[] is empty - or holds a generic user name like "player" or "games" */ - plnamesuffix(); - /* unlike Unix where the game might be invoked with a script - which forces a particular character name for each player - using a shared account, we always allow player to rename - the character during role/race/&c selection */ - iflags.renameallowed = TRUE; - - getlock(); - - dlb_init(); /* must be before newgame() */ - - /* - * Initialize the vision system. This must be before mklev() on a - * new game or before a level restore on a saved game. - */ - vision_init(); - - display_gamewindows(); - - /* - * First, try to find and restore a save file for specified character. - * We'll return here if new game player_selection() renames the hero. - */ -attempt_restore: - if ((fd = restore_saved_game()) >= 0) { -#ifdef NEWS - if (iflags.news) { - display_file(NEWS, FALSE); - iflags.news = FALSE; /* in case dorecover() fails */ - } -#endif - pline("Restoring save file..."); - mark_synch(); /* flush output */ - if (dorecover(fd)) { - resuming = TRUE; /* not starting new game */ - if (discover) - You("are in non-scoring discovery mode."); - if (discover || wizard) { - if (yn("Do you want to keep the save file?") == 'n') - (void) delete_savefile(); - else { - nh_compress(fqname(SAVEF, SAVEPREFIX, 0)); - } - } - } - } - - if (!resuming) { - /* new game: start by choosing role, race, etc; - player might change the hero's name while doing that, - in which case we try to restore under the new name - and skip selection this time if that didn't succeed */ - if (!iflags.renameinprogress) { - player_selection(); - if (iflags.renameinprogress) { - /* player has renamed the hero while selecting role; - discard current lock file and create another for - the new character name */ - delete_levelfile(0); /* remove empty lock file */ - getlock(); - goto attempt_restore; - } - } - newgame(); - if (discover) - You("are in non-scoring discovery mode."); - } - - moveloop(resuming); - return 0; -} - -static void -whoami(void) -{ - /* - * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS - * 2. Use $USER or $LOGNAME (if 1. fails) - * The resulting name is overridden by command line options. - * If everything fails, or if the resulting name is some generic - * account like "games", "play", "player", "hack" then eventually - * we'll ask him. - */ - char *s; - - if (*plname) - return; - if (s = nh_getenv("USER")) { - (void) strncpy(plname, s, sizeof(plname) - 1); - return; - } - if (s = nh_getenv("LOGNAME")) { - (void) strncpy(plname, s, sizeof(plname) - 1); - return; - } -} - -/* normalize file name - we don't like .'s, /'s, spaces */ -void -regularize(char *s) -{ - register char *lp; - - while ((lp = strchr(s, '.')) || (lp = strchr(s, '/')) - || (lp = strchr(s, ' '))) - *lp = '_'; -} - -static void -process_options(int argc, char **argv) -{ - int i; - - while (argc > 1 && argv[1][0] == '-') { - argv++; - argc--; - switch (argv[0][1]) { - case 'D': - wizard = TRUE, discover = FALSE; - break; - case 'X': - discover = TRUE, wizard = FALSE; - break; -#ifdef NEWS - case 'n': - iflags.news = FALSE; - break; -#endif - case 'u': - if (argv[0][2]) - (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); - else if (argc > 1) { - argc--; - argv++; - (void) strncpy(plname, argv[0], sizeof(plname) - 1); - } else - raw_print("Player name expected after -u"); - break; - case 'p': /* profession (role) */ - if (argv[0][2]) { - if ((i = str2role(&argv[0][2])) >= 0) - flags.initrole = i; - } else if (argc > 1) { - argc--; - argv++; - if ((i = str2role(argv[0])) >= 0) - flags.initrole = i; - } - break; - case 'r': /* race */ - if (argv[0][2]) { - if ((i = str2race(&argv[0][2])) >= 0) - flags.initrace = i; - } else if (argc > 1) { - argc--; - argv++; - if ((i = str2race(argv[0])) >= 0) - flags.initrace = i; - } - break; - case '@': - flags.randomall = 1; - break; - default: - raw_printf("Unknown option: %s", *argv); - break; - } - } -} - -static void -chdirx(const char *dir) -{ - if (!dir) - dir = HACKDIR; - - if (chdir(dir) < 0) - error("Cannot chdir to %s.", dir); - - /* Warn the player if we can't write the record file */ - /* perhaps we should also test whether . is writable */ - check_recordfile(dir); -} - -void -getlock(void) -{ - int fd; - - Sprintf(lock, "%d%s", getuid(), plname); - regularize(lock); - set_levelfile_name(lock, 0); - fd = creat(lock, FCMASK); - if (fd == -1) { - error("cannot creat lock file."); - } else { - if (write(fd, (genericptr_t) &hackpid, sizeof(hackpid)) - != sizeof(hackpid)) { - error("cannot write lock"); - } - if (close(fd) == -1) { - error("cannot close lock"); - } - } -} - -/* validate wizard mode if player has requested access to it */ -boolean -authorize_wizard_mode() -{ - /* other ports validate user name or character name here */ - return TRUE; -} - -#ifndef __begui__ -/* - * If we are not using the Be GUI, then just exit -- we don't need to - * do anything extra. - */ -void nethack_exit(int status); - -void -nethack_exit(int status) -{ - exit(status); -} -#endif /* !__begui__ */ - -/*bemain.c*/ diff --git a/sys/libnh/README.md b/sys/libnh/README.md new file mode 100644 index 000000000..3a9c14d1d --- /dev/null +++ b/sys/libnh/README.md @@ -0,0 +1,110 @@ +# About +This creates a library for NetHack that can be incorporated into other programs. There are two different libraries that are currently available: +* libnethack.a - a binary Unix library +* nethack.js / nethack.wasm - a [WebAssembly / WASM](https://webassembly.org/) library for use in JavaScript programs (both nodejs and browser) + +## Build +This library has only been built on MacOS, but should work on Linux and other unix-ish platforms. If you have problems, start by stealing hints files from the `sys/unix/hints` for your platform. Contributions for other platforms are happily accepted. + +Building the WASM module requires that you have the [emscripten toolchain / sdk installed](https://emscripten.org/docs/getting_started/downloads.html). + +Generally the build is the same as the unix build: + +[Edit Oct 4, 2020: Use the existing Makefile and hints, hints/include system for cross-compiles] +1. `cd sys/unix` +2. `./setup.sh hints/macOS.500` +3. `cd ../..` +4. For `libnethack.a`: `make WANT_LIBNH=1 all` +5. For `nethack.js`: `make CROSS_TO_WASM=1 all` + +[Original text was:] +1. `cd sys/lib` +2. For `libnethack.a`: `./setup.sh hints/macOS.500`; for `nethack.js`: `./setup.sh hints/wasm` +3. `cd ../..` +4. `make` + + +[Edit Oct 4, 2020:] +Resulting libraries will be in the `targets/wasm` directory for `CROSS_TO_WASM=1`. +Resulting libraries will be in the `src` directory for `WANT_LIBNH=1`. + +[Original text:] +Resulting libraries will be in the `src` directory. + +WASM also has a npm module that can be published out of `sys/lib/npm-library`. After building the `nethack.js` it can be published by: +1. `cd sys/lib/npm-library` +2. `npm publish` + +## API: libnethack.a +The API is two functions: +* `nhmain(int argc, char *argv[])` - The main function for NetHack that configures the program and runs the `moveloop()` until the game is over. The arguments to this function are the [command line arguments](https://nethackwiki.com/wiki/Options) to NetHack. +* `shim_graphics_set_callback(shim_callback_t cb)` - A single function that sets a callback to gather graphics events: write a string to screen, get user input, etc. Your job is to pass in a callback and handle all the requested rendering events to show NetHack on the screen. The callback is `void shim_callback_t(const char *name, void *ret_ptr, const char *fmt, ...)` + * `name` is the name of the [window function](https://github.com/NetHack/NetHack/blob/NetHack-3.7/doc/window.txt) that needs to be handled + * `ret_ptr` is a pointer to a memory space for the return value. The type expected to be returned in this pointer is described by the first character of the `fmt` string. + * `fmt` is a string that describes the signature of the callback. The first character in the string is the return type and any additional characters describe the variable arguments: `i` for integer, `s` for string, `p` for pointer, `c` for character, `v` for void. For example, if format is "vis" the callback will have no return (void), the first argument will be an integer, and the second argument will be a string. If format is "iii" the callback must return an integer, and both the arguments passed in will be integers. + * [Variadic arguments](https://www.gnu.org/software/libc/manual/html_node/Variadic-Example.html): a variable number and type of arguments depending on the `window function` that is being called. The arguments associated with each `name` are described in the [NetHack window.txt](https://github.com/NetHack/NetHack/blob/NetHack-3.7/doc/window.txt). + +Where is the header file for the API you ask? There isn't one. It's three functions, just drop the forward declarations at the top of your file (or create your own header). It's more work figuring out how to install and copy around header files than it's worth for such a small API. If you disagree, feel free to submit a PR to fix it. :) + +## API: nethack.js +The WebAssembly API has a similar signature to `libnethack.a` with minor syntactic differences: +* `main(int argc, char argv[])` - The main function for NetHack +* `shim_graphics_set_callback(char *cbName)` - A `String` representing a name of a callback function. The callback function be registered as `globalThis[cbName] = function yourCallback(name, ... args) { /* your stuff */ }`. Note that [globalThis](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis) points to `window` in browsers and `global` in node.js. + * `name` is the name of the [window function](https://github.com/NetHack/NetHack/blob/NetHack-3.7/doc/window.txt) that needs to be handled + * `... args` is a variable number and type of arguments depending on the `window function` that is being called. The arguments associated with each `name` are described in the [NetHack window.txt](https://github.com/NetHack/NetHack/blob/NetHack-3.7/doc/window.txt) + * The function must return the value expected for the specified `name` + + +## API Stability +The "shim graphics" API should generally be stable. I aspire to replace the command line arguments (argc / argv) with a structure of options, so the `nhmain()` and `main()` functions may change at some point. + +## libnethack.a example +``` c +#include + +int nhmain(int argc, char *argv[]); +typedef void(*shim_callback_t)(const char *name, void *ret_ptr, const char *fmt, ...); +void shim_graphics_set_callback(shim_callback_t cb); + +void window_cb(const char *name, void *ret_ptr, const char *fmt, ...) { + /* TODO */ +} + +int main(int argc, char *argv[]) { + shim_graphics_set_callback(window_cb); + nhmain(argc, argv); +} +``` + +## nethack.js example +``` js +const path = require("path"); + +// starts nethack +function nethackStart(cb, inputModule = {}) { + // set callback + let cbName = cb.name; + if (cbName === "") cbName = "__anonymousNetHackCallback"; + let userCallback = globalThis[cbName] = cb; + + // Emscripten Module config + let Module = inputModule; + savedOnRuntimeInitialized = Module.onRuntimeInitialized; + Module.onRuntimeInitialized = function (... args) { + // after the WASM is loaded, add the shim graphics callback function + Module.ccall( + "shim_graphics_set_callback", // C function name + null, // return type + ["string"], // arg types + [cbName], // arg values + {async: true} // options + ); + }; + + // load and run the module + var factory = require(path.join(__dirname, "../build/nethack.js")); + factory(Module); +} + +nethackStart(yourCallbackFunction); +``` diff --git a/sys/libnh/libnhmain.c b/sys/libnh/libnhmain.c new file mode 100644 index 000000000..67b38e4e0 --- /dev/null +++ b/sys/libnh/libnhmain.c @@ -0,0 +1,1325 @@ +/* NetHack 5.0 libnhmain.c $NHDT-Date: 1693359589 2023/08/30 01:39:49 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.106 $ */ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/*-Copyright (c) Robert Patrick Rankin, 2011. */ +/* NetHack may be freely redistributed. See license for details. */ + +/* main.c - Unix NetHack */ + +#include "hack.h" +#include "dlb.h" + +#include +#include +#include +#include +#ifndef O_RDONLY +#include +#endif + +/* for cross-compiling to WebAssembly (WASM) */ +#ifdef __EMSCRIPTEN__ +#include +void js_helpers_init(); +void js_constants_init(); +void js_globals_init(); +#endif + +#if !defined(_BULL_SOURCE) && !defined(__sgi) && !defined(_M_UNIX) +#if !defined(SUNOS4) && !(defined(ULTRIX) && defined(__GNUC__)) +#if defined(POSIX_TYPES) || defined(SVR4) || defined(HPUX) +extern struct passwd *getpwuid(uid_t); +#else +extern struct passwd *getpwuid, (int); +#endif +#endif +#endif +extern struct passwd *getpwnam(const char *); +#ifdef CHDIR +static void chdirx(const char *, boolean); +#endif /* CHDIR */ +boolean whoami(void); +static void process_options(int, char **); + +#ifdef _M_UNIX +extern void check_sco_console(void); +extern void init_sco_cons(void); +#endif +#ifdef __linux__ +extern void check_linux_console(void); +extern void init_linux_cons(void); +#endif + +static void wd_message(void); +static struct passwd *get_unix_pw(void); +/* ATTRNORETURN static void opt_terminate(void) NORETURN; */ + +#ifdef __EMSCRIPTEN__ +/* if WebAssembly, export this API and don't optimize it out */ +EMSCRIPTEN_KEEPALIVE +int +main(int argc, char *argv[]) + +#else /* !__EMSCRIPTEN__ */ +int nhmain(int argc, char *argv[]); + +int +nhmain(int argc, char *argv[]) + +#endif /* __EMSCRIPTEN__ */ +{ +#ifdef CHDIR + char *dir; +#endif + NHFILE *nhfp; + boolean exact_username; + boolean resuming = FALSE; /* assume new game */ + boolean plsel_once = FALSE; + // int i; + // for (i = 0; i < argc; i++) { + // printf ("argv[%d]: %s\n", i, argv[i]); + // } + + early_init(argc, argv); + + gh.hname = argv[0]; + svh.hackpid = getpid(); + (void) umask(0777 & ~FCMASK); + + choose_windows(DEFAULT_WINDOW_SYS); + +#ifdef CHDIR /* otherwise no chdir() */ + /* + * See if we must change directory to the playground. + * (Perhaps hack runs suid and playground is inaccessible + * for the player.) + * The environment variable HACKDIR is overridden by a + * -d command line option (must be the first option given). + */ + dir = nh_getenv("NETHACKDIR"); + if (!dir) + dir = nh_getenv("HACKDIR"); + + if (argc > 1) { + if (argcheck(argc, argv, ARG_VERSION) == 2) + exit(EXIT_SUCCESS); + +#ifdef CRASHREPORT + if (argcheck(argc, argv, ARG_BIDSHOW)) + exit(EXIT_SUCCESS); +#endif + + if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { + gd.deferred_showpaths = TRUE; + return; + } + if (argcheck(argc, argv, ARG_DEBUG) == 1) { + argc--; + argv++; + } + if (argc > 1 && !strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { + /* avoid matching "-dec" for DECgraphics; since the man page + * says -d directory, hope nobody's using -desomething_else + */ + argc--; + argv++; + dir = argv[0] + 2; + if (*dir == '=' || *dir == ':') + dir++; + if (!*dir && argc > 1) { + argc--; + argv++; + dir = argv[0]; + } + if (!*dir) + error("Flag -d must be followed by a directory name."); + } + } +#endif /* CHDIR */ + + if (argc > 1) { + /* + * Now we know the directory containing 'record' and + * may do a prscore(). Exclude `-style' - it's a Qt option. + */ + if (!strncmp(argv[1], "-s", 2) && strncmp(argv[1], "-style", 6)) { +#ifdef CHDIR + chdirx(dir, 0); +#endif +#ifdef SYSCF + initoptions(); +#endif +#ifdef PANICTRACE + ARGV0 = gh.hname; /* save for possible stack trace */ +#ifndef NO_SIGNAL + panictrace_setsignals(TRUE); +#endif +#endif + prscore(argc, argv); + /* FIXME: shouldn't this be using nh_terminate() to free + up any memory allocated by initoptions() */ + exit(EXIT_SUCCESS); + } + } /* argc > 1 */ + +/* + * Change directories before we initialize the window system so + * we can find the tile file. + */ +#ifdef CHDIR + chdirx(dir, 1); +#endif + +#ifdef __EMSCRIPTEN__ + js_helpers_init(); + js_constants_init(); + js_globals_init(); +#endif + +#ifdef _M_UNIX + check_sco_console(); +#endif +#ifdef __linux__ + check_linux_console(); +#endif + initoptions(); +#ifdef PANICTRACE + ARGV0 = gh.hname; /* save for possible stack trace */ +#ifndef NO_SIGNAL + panictrace_setsignals(TRUE); +#endif +#endif + exact_username = whoami(); + + /* + * It seems you really want to play. + */ + u.uhp = 1; /* prevent RIP on early quits */ + program_state.preserve_locks = 1; +#ifndef NO_SIGNAL + sethanguphandler((SIG_RET_TYPE) hangup); +#endif + + process_options(argc, argv); /* command line options */ +#ifdef WINCHAIN + commit_windowchain(); +#endif + init_nhwindows(&argc, argv); /* now we can set up window system */ +#ifdef _M_UNIX + init_sco_cons(); +#endif +#ifdef __linux__ + init_linux_cons(); +#endif + +#ifdef DEF_PAGER + if (!(gc.catmore = nh_getenv("HACKPAGER")) + && !(gc.catmore = nh_getenv("PAGER"))) + gc.catmore = DEF_PAGER; +#endif +#ifdef MAIL + getmailstatus(); +#endif + + /* wizard mode access is deferred until here */ + set_playmode(); /* sets plname to "wizard" for wizard mode */ + /* hide any hyphens from plnamesuffix() */ + gp.plnamelen = exact_username ? (int) strlen(svp.plname) : 0; + /* strip role,race,&c suffix; calls askname() if plname[] is empty + or holds a generic user name like "player" or "games" */ + plnamesuffix(); + + if (wizard) { + /* use character name rather than lock letter for file names */ + gl.locknum = 0; + } else { +#ifndef NO_SIGNAL + /* suppress interrupts while processing lock file */ + (void) signal(SIGQUIT, SIG_IGN); + (void) signal(SIGINT, SIG_IGN); +#endif + } + + dlb_init(); /* must be before newgame() */ + + /* + * Initialize the vision system. This must be before mklev() on a + * new game or before a level restore on a saved game. + */ + vision_init(); + + init_sound_disp_gamewindows(); + + /* + * First, try to find and restore a save file for specified character. + * We'll return here if new game player_selection() renames the hero. + */ + attempt_restore: + + /* + * getlock() complains and quits if there is already a game + * in progress for current character name (when gl.locknum == 0) + * or if there are too many active games (when gl.locknum > 0). + * When proceeding, it creates an empty .0 file to + * designate the current game. + * getlock() constructs based on the character + * name (for !gl.locknum) or on first available of alock, block, + * clock, &c not currently in use in the playground directory + * (for gl.locknum > 0). + */ + if (*svp.plname) { + getlock(); + program_state.preserve_locks = 0; /* after getlock() */ + } + + if (*svp.plname && (nhfp = restore_saved_game()) != 0) { + const char *fq_save = fqname(gs.SAVEF, SAVEPREFIX, 1); + + (void) chmod(fq_save, 0); /* disallow parallel restores */ +#ifndef NO_SIGNAL + (void) signal(SIGINT, (SIG_RET_TYPE) done1); +#endif +#ifdef NEWS + if (iflags.news) { + display_file(NEWS, FALSE); + iflags.news = FALSE; /* in case dorecover() fails */ + } +#endif + pline("Restoring save file..."); + mark_synch(); /* flush output */ + if (dorecover(nhfp)) { + resuming = TRUE; /* not starting new game */ + wd_message(); + if (discover || wizard) { + /* this seems like a candidate for paranoid_confirmation... */ + if (y_n("Do you want to keep the save file?") == 'n') { + (void) delete_savefile(); + } else { + (void) chmod(fq_save, FCMASK); /* back to readable */ + nh_compress(fq_save); + } + } + } + } + + if (!resuming) { + boolean neednewlock = (!*svp.plname); + /* new game: start by choosing role, race, etc; + player might change the hero's name while doing that, + in which case we try to restore under the new name + and skip selection this time if that didn't succeed */ + if (!iflags.renameinprogress || iflags.defer_plname || neednewlock) { + if (!plsel_once) + player_selection(); + plsel_once = TRUE; + if (neednewlock && *svp.plname) + goto attempt_restore; + if (iflags.renameinprogress) { + /* player has renamed the hero while selecting role; + if locking alphabetically, the existing lock file + can still be used; otherwise, discard current one + and create another for the new character name */ + if (!gl.locknum) { + delete_levelfile(0); /* remove empty lock file */ + getlock(); + } + goto attempt_restore; + } + } + newgame(); + wd_message(); + } + + /* moveloop() never returns but isn't flagged NORETURN */ + moveloop(resuming); + + exit(EXIT_SUCCESS); + /*NOTREACHED*/ + return 0; +} + +/* caveat: argv elements might be arbitrary long */ +static void +process_options(int argc, char *argv[]) +{ + int i, l; + + /* + * Process options. + */ + while (argc > 1 && argv[1][0] == '-') { + argv++; + argc--; + l = (int) strlen(*argv); + /* must supply at least 4 chars to match "-XXXgraphics" */ + if (l < 4) + l = 4; + + switch (argv[0][1]) { + case 'D': + case 'd': + if ((argv[0][1] == 'D' && !argv[0][2]) + || !strcmpi(*argv, "-debug")) { + wizard = TRUE, discover = FALSE; + } else if (!strncmpi(*argv, "-DECgraphics", l)) { + load_symset("DECGraphics", PRIMARYSET); + switch_symbols(TRUE); + } else { + raw_printf("Unknown option: %.60s", *argv); + } + break; + case 'X': + discover = TRUE, wizard = FALSE; + break; +#ifdef NEWS + case 'n': + iflags.news = FALSE; + break; +#endif + case 'u': + if (argv[0][2]) { + (void) strncpy(svp.plname, argv[0] + 2, sizeof svp.plname - 1); + gp.plnamelen = 0; /* plname[] might have -role-race attached */ + } else if (argc > 1) { + argc--; + argv++; + (void) strncpy(svp.plname, argv[0], sizeof svp.plname - 1); + gp.plnamelen = 0; + } else { + raw_print("Player name expected after -u"); + } + break; + case 'I': + case 'i': + if (!strncmpi(*argv, "-IBMgraphics", l)) { + load_symset("IBMGraphics", PRIMARYSET); + load_symset("RogueIBM", ROGUESET); + switch_symbols(TRUE); + } else { + raw_printf("Unknown option: %.60s", *argv); + } + break; + case 'p': /* profession (role) */ + if (argv[0][2]) { + if ((i = str2role(&argv[0][2])) >= 0) + flags.initrole = i; + } else if (argc > 1) { + argc--; + argv++; + if ((i = str2role(argv[0])) >= 0) + flags.initrole = i; + } + break; + case 'r': /* race */ + if (argv[0][2]) { + if ((i = str2race(&argv[0][2])) >= 0) + flags.initrace = i; + } else if (argc > 1) { + argc--; + argv++; + if ((i = str2race(argv[0])) >= 0) + flags.initrace = i; + } + break; + case 'w': /* windowtype */ + config_error_init(FALSE, "command line", FALSE); + choose_windows(&argv[0][2]); + config_error_done(); + break; + case '@': + flags.randomall = 1; + break; + default: + if ((i = str2role(&argv[0][1])) >= 0) { + flags.initrole = i; + break; + } + /* else raw_printf("Unknown option: %.60s", *argv); */ + } + } + +#ifdef SYSCF + if (argc > 1) + raw_printf("MAXPLAYERS are set in sysconf file.\n"); +#else + /* XXX This is deprecated in favor of SYSCF with MAXPLAYERS */ + if (argc > 1) + gl.locknum = atoi(argv[1]); +#endif +#ifdef MAX_NR_OF_PLAYERS + /* limit to compile-time limit */ + if (!gl.locknum || gl.locknum > MAX_NR_OF_PLAYERS) + gl.locknum = MAX_NR_OF_PLAYERS; +#endif +#ifdef SYSCF + /* let syscf override compile-time limit */ + if (!gl.locknum || (sysopt.maxplayers && gl.locknum > sysopt.maxplayers)) + gl.locknum = sysopt.maxplayers; +#endif +} + +#ifdef CHDIR +static void +chdirx(const char *dir, boolean wr) +{ + if (dir /* User specified directory? */ +#ifdef HACKDIR + && strcmp(dir, HACKDIR) /* and not the default? */ +#endif + ) { +#ifdef SECURE + (void) setgid(getgid()); + (void) setuid(getuid()); /* Ron Wessels */ +#endif + } else { + /* non-default data files is a sign that scores may not be + * compatible, or perhaps that a binary not fitting this + * system's layout is being used. + */ +#ifdef VAR_PLAYGROUND + int len = strlen(VAR_PLAYGROUND); + + gf.fqn_prefix[SCOREPREFIX] = (char *) alloc(len + 2); + Strcpy(gf.fqn_prefix[SCOREPREFIX], VAR_PLAYGROUND); + if (gf.fqn_prefix[SCOREPREFIX][len - 1] != '/') { + gf.fqn_prefix[SCOREPREFIX][len] = '/'; + gf.fqn_prefix[SCOREPREFIX][len + 1] = '\0'; + } + +#endif + } + +#ifdef HACKDIR + if (dir == (const char *) 0) + dir = HACKDIR; +#endif + + if (dir && chdir(dir) < 0) { + perror(dir); + error("Cannot chdir to %s.", dir); + } + + /* warn the player if we can't write the record file + * perhaps we should also test whether . is writable + * unfortunately the access system-call is worthless. + */ + if (wr) { +#ifdef VAR_PLAYGROUND + gf.fqn_prefix[LEVELPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[SAVEPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[BONESPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[LOCKPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[TROUBLEPREFIX] = gf.fqn_prefix[SCOREPREFIX]; +#endif + check_recordfile(dir); + } +} +#endif /* CHDIR */ + +/* returns True iff we set plname[] to username which contains a hyphen */ +boolean +whoami(void) +{ + /* + * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS + * 2. Use $USER or $LOGNAME (if 1. fails) + * 3. Use getlogin() (if 2. fails) + * The resulting name is overridden by command line options. + * If everything fails, or if the resulting name is some generic + * account like "games", "play", "player", "hack" then eventually + * we'll ask him. + * Note that we trust the user here; it is possible to play under + * somebody else's name. + */ + if (!*svp.plname) { + const char *s; + + s = nh_getenv("USER"); + if (!s || !*s) + s = nh_getenv("LOGNAME"); + if (!s || !*s) + s = getlogin(); + + if (s && *s) { + (void) strncpy(svp.plname, s, sizeof svp.plname - 1); + if (strchr(svp.plname, '-')) + return TRUE; + } + } + return FALSE; +} + +#ifndef NO_SIGNAL +void +sethanguphandler(void (*handler)(int)) +{ +#ifdef SA_RESTART + /* don't want reads to restart. If SA_RESTART is defined, we know + * sigaction exists and can be used to ensure reads won't restart. + * If it's not defined, assume reads do not restart. If reads restart + * and a signal occurs, the game won't do anything until the read + * succeeds (or the stream returns EOF, which might not happen if + * reading from, say, a window manager). */ + struct sigaction sact; + + (void) memset((genericptr_t) &sact, 0, sizeof sact); + sact.sa_handler = (SIG_RET_TYPE) handler; + (void) sigaction(SIGHUP, &sact, (struct sigaction *) 0); +#ifdef SIGXCPU + (void) sigaction(SIGXCPU, &sact, (struct sigaction *) 0); +#endif +#else /* !SA_RESTART */ + (void) signal(SIGHUP, (SIG_RET_TYPE) handler); +#ifdef SIGXCPU + (void) signal(SIGXCPU, (SIG_RET_TYPE) handler); +#endif +#endif /* ?SA_RESTART */ +} +#endif /* !NO_SIGNAL */ + +#ifdef PORT_HELP +void +port_help(void) +{ + /* + * Display unix-specific help. Just show contents of the helpfile + * named by PORT_HELP. + */ + display_file(PORT_HELP, TRUE); +} +#endif + +/* validate wizard mode if player has requested access to it */ +boolean +authorize_wizard_mode(void) +{ + if (sysopt.wizards && sysopt.wizards[0]) { + if (check_user_string(sysopt.wizards)) + return TRUE; + } + iflags.wiz_error_flag = TRUE; /* not being allowed into wizard mode */ + return FALSE; +} + +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ +#ifdef SYSCF + if (sysopt.explorers && sysopt.explorers[0]) { + if (check_user_string(sysopt.explorers)) + return TRUE; + } + iflags.explore_error_flag = TRUE; /* not allowed into explore mode */ + return FALSE; +#else + return TRUE; /* if sysconf disabled, no restrictions on explore mode */ +#endif +} + +static void +wd_message(void) +{ + if (iflags.wiz_error_flag) { + if (sysopt.wizards && sysopt.wizards[0]) { + char *tmp = build_english_list(sysopt.wizards); + pline("Only user%s %s may access debug (wizard) mode.", + strchr(sysopt.wizards, ' ') ? "s" : "", tmp); + free(tmp); + } else { + You("cannot access debug (wizard) mode."); + } + wizard = FALSE; /* (paranoia) */ + if (!iflags.explore_error_flag) + pline("Entering explore/discovery mode instead."); + } else if (iflags.explore_error_flag) { + You("cannot access explore mode."); /* same as enter_explore_mode */ + discover = iflags.deferred_X = FALSE; /* (more paranoia) */ + } else if (discover) + You("are in non-scoring explore/discovery mode."); +} + +/* + * Add a slash to any name not ending in /. There must + * be room for the / + */ +void +append_slash(char *name) +{ + char *ptr; + + if (!*name) + return; + ptr = name + (strlen(name) - 1); + if (*ptr != '/') { + *++ptr = '/'; + *++ptr = '\0'; + } + return; +} + +boolean +check_user_string(const char *optstr) +{ + struct passwd *pw; + int pwlen; + const char *eop, *w; + char *pwname = 0; + + if (optstr[0] == '*') + return TRUE; /* allow any user */ + if (sysopt.check_plname) + pwname = svp.plname; + else if ((pw = get_unix_pw()) != 0) + pwname = pw->pw_name; + if (!pwname || !*pwname) + return FALSE; + pwlen = (int) strlen(pwname); + eop = eos((char *)optstr); + w = optstr; + while (w + pwlen <= eop) { + if (!*w) + break; + if (isspace(*w)) { + w++; + continue; + } + if (!strncmp(w, pwname, pwlen)) { + if (!w[pwlen] || isspace(w[pwlen])) + return TRUE; + } + while (*w && !isspace(*w)) + w++; + } + return FALSE; +} + +static struct passwd * +get_unix_pw(void) +{ + char *user; + unsigned uid; + static struct passwd *pw = (struct passwd *) 0; + + if (pw) + return pw; /* cache answer */ + + uid = (unsigned) getuid(); + user = getlogin(); + if (user) { + pw = getpwnam(user); + if (pw && ((unsigned) pw->pw_uid != uid)) + pw = 0; + } + if (pw == 0) { + user = nh_getenv("USER"); + if (user) { + pw = getpwnam(user); + if (pw && ((unsigned) pw->pw_uid != uid)) + pw = 0; + } + if (pw == 0) { + pw = getpwuid(uid); + } + } + return pw; +} + +char * +get_login_name(void) +{ + static char buf[BUFSZ]; + struct passwd *pw = get_unix_pw(); + + buf[0] = '\0'; + if (pw) + (void)strcpy(buf, pw->pw_name); + + return buf; +} + +unsigned long +sys_random_seed(void) +{ + unsigned long seed = 0L; + unsigned long pid = (unsigned long) getpid(); + boolean no_seed = TRUE; +#ifdef DEV_RANDOM + FILE *fptr; + + fptr = fopen(DEV_RANDOM, "r"); + if (fptr) { + fread(&seed, sizeof (long), 1, fptr); + has_strong_rngseed = TRUE; /* decl.c */ + no_seed = FALSE; + (void) fclose(fptr); + } else { + /* leaves clue, doesn't exit */ + paniclog("sys_random_seed", "falling back to weak seed"); + } +#endif + if (no_seed) { + seed = (unsigned long) getnow(); /* time((TIME_type) 0) */ + /* Quick dirty band-aid to prevent PRNG prediction */ + if (pid) { + if (!(pid & 3L)) + pid -= 1L; + seed *= pid; + } + } + return seed; +} + +#if 0 +/* now found in earlyarg.c */ +/* for command-line options that perform some immediate action and then + terminate the program without starting play, like 'nethack --version' + or 'nethack -s Zelda'; do some cleanup before that termination */ +ATTRNORETURN static void +opt_terminate(void) +{ + config_error_done(); /* free memory allocated by config_error_init() */ + + nh_terminate(EXIT_SUCCESS); + /*NOTREACHED*/ +} +/* show the sysconf file name, playground directory, run-time configuration + file name, dumplog file name if applicable, and some other things */ +ATTRNORETURN void +after_opt_showpaths(const char *dir) +{ +#ifdef CHDIR + chdirx(dir, FALSE); +#else + nhUse(dir); +#endif + opt_terminate(); + /*NOTREACHED*/ +} +#endif + +void +get_nhuuid(void) +{ + unsigned char stmp[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + char *uuid = (char *) &stmp[0]; +#ifndef NONHUUID +#ifdef __EMSCRIPTEN__ + int uuid_available = 0; +#endif +#endif + + if (svn.nhuuid[0]) + return; + +#ifndef NONHUUID +#ifdef __EMSCRIPTEN__ + uuid_available = emscripten_run_script_int( + "typeof crypto !== 'undefined'" + " && typeof crypto.randomUUID === 'function'"); + if (uuid_available) { + uuid = emscripten_run_script_string("crypto.randomUUID()"); + if (!uuid) { + uuid = (char *) &stmp[0]; + } + } +#endif /* __EMSCRIPTEN__ */ +#endif /* NONHUUID */ + Snprintf(svn.nhuuid, sizeof svn.nhuuid, "%s", uuid); +} + +void +free_nhuuid(void) +{ + int i; + + for (i = 0; i < SIZE(svn.nhuuid); i++) { + svn.nhuuid[i] = 0; + } +} + +#ifdef __EMSCRIPTEN__ +/*** + * Helpers + ***/ +EM_JS(void, js_helpers_init, (), { + globalThis.nethackGlobal = globalThis.nethackGlobal || {}; + globalThis.nethackGlobal.helpers = globalThis.nethackGlobal.helpers || {}; + + installHelper(displayInventory, "displayInventory"); + installHelper(getPointerValue, "getPointerValue"); + installHelper(setPointerValue, "setPointerValue"); + + // used by update_inventory + function displayInventory() { + // Asyncify.handleAsync(async () => { + return _repopulate_perminvent(); + // }); + } + + // convert 'ptr' to the type indicated by 'type' + function getPointerValue(name, ptr, type) { + // console.log("getPointerValue", name, "0x" + ptr.toString(16), type); + switch(type) { + case "s": // string + // var value = UTF8ToString(getValue(ptr, "*")); + return UTF8ToString(ptr); + case "p": // pointer + if(!ptr) return 0; // null pointer + return getValue(ptr, "*"); + case "c": // char + return String.fromCharCode(getValue(ptr, "i8")); + case "b": + return getValue(ptr, "i8") == 1; + case "0": /* 2^0 = 1 byte */ + return getValue(ptr, "i8"); + case "1": /* 2^1 = 2 bytes */ + return getValue(ptr, "i16"); + case "2": /* 2^2 = 4 bytes */ + case "i": // integer + case "n": // number + return getValue(ptr, "i32"); + case "f": // float + return getValue(ptr, "float"); + case "d": // double + return getValue(ptr, "double"); + case "v": // void + return undefined; + default: + throw new TypeError ("unknown type:" + type); + } + } + + // sets the return value of the function to the type expected + function setPointerValue(name, ptr, type, value = 0) { + // console.log("setPointerValue", name, "0x" + ptr.toString(16), type, value); + switch (type) { + case "p": + setValue(ptr, value, "*"); + break; + case "s": + if(typeof value !== "string") + throw new TypeError(`expected ${name} return type to be string`); + // value=value?value:"(no value)"; + // var strPtr = getValue(ptr, "i32"); + stringToUTF8(value, ptr, 1024); // TODO: uhh... danger will robinson + break; + case "i": + if(typeof value !== "number" || !Number.isInteger(value)) + throw new TypeError(`expected ${name} return type to be integer`); + setValue(ptr, value, "i32"); + break; + case "1": + if(typeof value !== "number" || !Number.isInteger(value)) + throw new TypeError(`expected ${name} return type to be integer`); + setValue(ptr, value, "i16"); + break; + case "c": + if(typeof value !== "number" || value < 0 || value > 128) + throw new TypeError(`expected ${name} return type to be integer representing an ASCII character`); + setValue(ptr, value, "i8"); + break; + case "f": + if(typeof value !== "number" || isFloat(value)) + throw new TypeError(`expected ${name} return type to be float`); + // XXX: I'm not sure why 'double' works and 'float' doesn't + setValue(ptr, value, "double"); + break; + case "d": + if(typeof value !== "number" || isFloat(value)) + throw new TypeError(`expected ${name} return type to be double`); + setValue(ptr, value, "double"); + break; + case "b": + if (typeof value !== "boolean") + throw new TypeError(`expected ${name} return type to be boolean`); + setValue(ptr, value ? 1 : 0, "i8"); + case "v": + break; + default: + throw new Error("unknown type"); + } + + function isFloat(n){ + return n === +n && n !== (n|0) && !Number.isInteger(n); + } + } + + + function installHelper(fn, name) { + name = name || fn.name; + globalThis.nethackGlobal.helpers[name] = fn; + } +}) + +/*** + * Constants + ***/ +#define SET_CONSTANT(scope, name) set_const(scope, #name, name); +EM_JS(void, set_const, (char *scope_str, char *name_str, int num), { + let scope = UTF8ToString(scope_str); + let name = UTF8ToString(name_str); + + globalThis.nethackGlobal.constants[scope] = globalThis.nethackGlobal.constants[scope] || {}; + globalThis.nethackGlobal.constants[scope][name] = num; + globalThis.nethackGlobal.constants[scope][num] = name; +}); +#define SET_CONSTANT_STRING(scope, name) set_const_str(scope, #name, name); +EM_JS(void, set_const_str, (char *scope_str, char *name_str, char *input_str), { + let scope = UTF8ToString(scope_str); + let name = UTF8ToString(name_str); + let str = UTF8ToString(input_str); + + globalThis.nethackGlobal.constants[scope] = globalThis.nethackGlobal.constants[scope] || {}; + globalThis.nethackGlobal.constants[scope][name] = str; +}); +#define SET_POINTER(name) set_const_ptr(#name, (void *)&name); +EM_JS(void, set_const_ptr, (char *name_str, void* ptr), { + let name = UTF8ToString(name_str); + + globalThis.nethackGlobal.pointers = globalThis.nethackGlobal.pointers || {}; + globalThis.nethackGlobal.pointers[name] = ptr; +}); + +void js_constants_init() { + EM_ASM({ + globalThis.nethackGlobal = globalThis.nethackGlobal || {}; + globalThis.nethackGlobal.constants = globalThis.nethackGlobal.constants || {}; + globalThis.nethackGlobal.pointers = globalThis.nethackGlobal.pointers || {}; + }); + + // create_nhwindow + SET_CONSTANT("WIN_TYPE", NHW_MESSAGE) + SET_CONSTANT("WIN_TYPE", NHW_STATUS) + SET_CONSTANT("WIN_TYPE", NHW_MAP) + SET_CONSTANT("WIN_TYPE", NHW_MENU) + SET_CONSTANT("WIN_TYPE", NHW_TEXT) + + // status_update + SET_CONSTANT("STATUS_FIELD", BL_CHARACTERISTICS) + SET_CONSTANT("STATUS_FIELD", BL_RESET) + SET_CONSTANT("STATUS_FIELD", BL_FLUSH) + SET_CONSTANT("STATUS_FIELD", BL_TITLE) + SET_CONSTANT("STATUS_FIELD", BL_STR) + SET_CONSTANT("STATUS_FIELD", BL_DX) + SET_CONSTANT("STATUS_FIELD", BL_CO) + SET_CONSTANT("STATUS_FIELD", BL_IN) + SET_CONSTANT("STATUS_FIELD", BL_WI) + SET_CONSTANT("STATUS_FIELD", BL_CH) + SET_CONSTANT("STATUS_FIELD", BL_ALIGN) + SET_CONSTANT("STATUS_FIELD", BL_SCORE) + SET_CONSTANT("STATUS_FIELD", BL_CAP) + SET_CONSTANT("STATUS_FIELD", BL_GOLD) + SET_CONSTANT("STATUS_FIELD", BL_ENE) + SET_CONSTANT("STATUS_FIELD", BL_ENEMAX) + SET_CONSTANT("STATUS_FIELD", BL_XP) + SET_CONSTANT("STATUS_FIELD", BL_AC) + SET_CONSTANT("STATUS_FIELD", BL_HD) + SET_CONSTANT("STATUS_FIELD", BL_TIME) + SET_CONSTANT("STATUS_FIELD", BL_HUNGER) + SET_CONSTANT("STATUS_FIELD", BL_HP) + SET_CONSTANT("STATUS_FIELD", BL_HPMAX) + SET_CONSTANT("STATUS_FIELD", BL_LEVELDESC) + SET_CONSTANT("STATUS_FIELD", BL_EXP) + SET_CONSTANT("STATUS_FIELD", BL_CONDITION) + SET_CONSTANT("STATUS_FIELD", MAXBLSTATS) + + // text attributes + SET_CONSTANT("ATTR", ATR_NONE); + SET_CONSTANT("ATTR", ATR_BOLD); + SET_CONSTANT("ATTR", ATR_DIM); + SET_CONSTANT("ATTR", ATR_ULINE); + SET_CONSTANT("ATTR", ATR_BLINK); + SET_CONSTANT("ATTR", ATR_INVERSE); + SET_CONSTANT("ATTR", ATR_URGENT); + SET_CONSTANT("ATTR", ATR_NOHISTORY); + + // conditions + SET_CONSTANT("CONDITION", BL_MASK_BAREH); + SET_CONSTANT("CONDITION", BL_MASK_BLIND); + SET_CONSTANT("CONDITION", BL_MASK_BUSY); + SET_CONSTANT("CONDITION", BL_MASK_CONF); + SET_CONSTANT("CONDITION", BL_MASK_DEAF); + SET_CONSTANT("CONDITION", BL_MASK_ELF_IRON); + SET_CONSTANT("CONDITION", BL_MASK_FLY); + SET_CONSTANT("CONDITION", BL_MASK_FOODPOIS); + SET_CONSTANT("CONDITION", BL_MASK_GLOWHANDS); + SET_CONSTANT("CONDITION", BL_MASK_GRAB); + SET_CONSTANT("CONDITION", BL_MASK_HALLU); + SET_CONSTANT("CONDITION", BL_MASK_HELD); + SET_CONSTANT("CONDITION", BL_MASK_ICY); + SET_CONSTANT("CONDITION", BL_MASK_INLAVA); + SET_CONSTANT("CONDITION", BL_MASK_LEV); + SET_CONSTANT("CONDITION", BL_MASK_PARLYZ); + SET_CONSTANT("CONDITION", BL_MASK_RIDE); + SET_CONSTANT("CONDITION", BL_MASK_SLEEPING); + SET_CONSTANT("CONDITION", BL_MASK_SLIME); + SET_CONSTANT("CONDITION", BL_MASK_SLIPPERY); + SET_CONSTANT("CONDITION", BL_MASK_STONE); + SET_CONSTANT("CONDITION", BL_MASK_STRNGL); + SET_CONSTANT("CONDITION", BL_MASK_STUN); + SET_CONSTANT("CONDITION", BL_MASK_SUBMERGED); + SET_CONSTANT("CONDITION", BL_MASK_TERMILL); + SET_CONSTANT("CONDITION", BL_MASK_TETHERED); + SET_CONSTANT("CONDITION", BL_MASK_TRAPPED); + SET_CONSTANT("CONDITION", BL_MASK_UNCONSC); + SET_CONSTANT("CONDITION", BL_MASK_WOUNDEDL); + SET_CONSTANT("CONDITION", BL_MASK_HOLDING); + + // menu + SET_CONSTANT("MENU_SELECT", PICK_NONE); + SET_CONSTANT("MENU_SELECT", PICK_ONE); + SET_CONSTANT("MENU_SELECT", PICK_ANY); + + // copyright + SET_CONSTANT_STRING("COPYRIGHT", COPYRIGHT_BANNER_A); + SET_CONSTANT_STRING("COPYRIGHT", COPYRIGHT_BANNER_B); + set_const_str("COPYRIGHT", "COPYRIGHT_BANNER_C", (char*) COPYRIGHT_BANNER_C); + SET_CONSTANT_STRING("COPYRIGHT", COPYRIGHT_BANNER_D); + + // glyphs + SET_CONSTANT("GLYPH", GLYPH_MON_OFF); + SET_CONSTANT("GLYPH", GLYPH_PET_OFF); + SET_CONSTANT("GLYPH", GLYPH_INVIS_OFF); + SET_CONSTANT("GLYPH", GLYPH_DETECT_OFF); + SET_CONSTANT("GLYPH", GLYPH_BODY_OFF); + SET_CONSTANT("GLYPH", GLYPH_RIDDEN_OFF); + SET_CONSTANT("GLYPH", GLYPH_OBJ_OFF); + SET_CONSTANT("GLYPH", GLYPH_CMAP_OFF); + SET_CONSTANT("GLYPH", GLYPH_EXPLODE_OFF); + SET_CONSTANT("GLYPH", GLYPH_ZAP_OFF); + SET_CONSTANT("GLYPH", GLYPH_SWALLOW_OFF); + SET_CONSTANT("GLYPH", GLYPH_WARNING_OFF); + SET_CONSTANT("GLYPH", GLYPH_STATUE_OFF); + SET_CONSTANT("GLYPH", GLYPH_UNEXPLORED_OFF); + SET_CONSTANT("GLYPH", GLYPH_NOTHING_OFF); + SET_CONSTANT("GLYPH", MAX_GLYPH); + SET_CONSTANT("GLYPH", NO_GLYPH); + SET_CONSTANT("GLYPH", GLYPH_INVISIBLE); + SET_CONSTANT("GLYPH", GLYPH_UNEXPLORED); + SET_CONSTANT("GLYPH", GLYPH_NOTHING); + + // colors + SET_CONSTANT("COLORS", CLR_BLACK); + SET_CONSTANT("COLORS", CLR_RED); + SET_CONSTANT("COLORS", CLR_GREEN); + SET_CONSTANT("COLORS", CLR_BROWN); + SET_CONSTANT("COLORS", CLR_BLUE); + SET_CONSTANT("COLORS", CLR_MAGENTA); + SET_CONSTANT("COLORS", CLR_CYAN); + SET_CONSTANT("COLORS", CLR_GRAY); + SET_CONSTANT("COLORS", NO_COLOR); + SET_CONSTANT("COLORS", CLR_ORANGE); + SET_CONSTANT("COLORS", CLR_BRIGHT_GREEN); + SET_CONSTANT("COLORS", CLR_YELLOW); + SET_CONSTANT("COLORS", CLR_BRIGHT_BLUE); + SET_CONSTANT("COLORS", CLR_BRIGHT_MAGENTA); + SET_CONSTANT("COLORS", CLR_BRIGHT_CYAN); + SET_CONSTANT("COLORS", CLR_WHITE); + SET_CONSTANT("COLORS", CLR_MAX); + + // color attributes (?) + SET_CONSTANT("COLOR_ATTR", HL_ATTCLR_BOLD); + SET_CONSTANT("COLOR_ATTR", HL_ATTCLR_DIM); + SET_CONSTANT("COLOR_ATTR", HL_ATTCLR_ITALIC); + SET_CONSTANT("COLOR_ATTR", HL_ATTCLR_ULINE); + SET_CONSTANT("COLOR_ATTR", HL_ATTCLR_BLINK); + SET_CONSTANT("COLOR_ATTR", HL_ATTCLR_INVERSE); + SET_CONSTANT("COLOR_ATTR", BL_ATTCLR_MAX); + + SET_CONSTANT("BL_MASK", BL_MASK_BAREH); + SET_CONSTANT("BL_MASK", BL_MASK_BLIND); + SET_CONSTANT("BL_MASK", BL_MASK_BUSY); + SET_CONSTANT("BL_MASK", BL_MASK_CONF); + SET_CONSTANT("BL_MASK", BL_MASK_DEAF); + SET_CONSTANT("BL_MASK", BL_MASK_ELF_IRON); + SET_CONSTANT("BL_MASK", BL_MASK_FLY); + SET_CONSTANT("BL_MASK", BL_MASK_FOODPOIS); + SET_CONSTANT("BL_MASK", BL_MASK_GLOWHANDS); + SET_CONSTANT("BL_MASK", BL_MASK_GRAB); + SET_CONSTANT("BL_MASK", BL_MASK_HALLU); + SET_CONSTANT("BL_MASK", BL_MASK_HELD); + SET_CONSTANT("BL_MASK", BL_MASK_ICY); + SET_CONSTANT("BL_MASK", BL_MASK_INLAVA); + SET_CONSTANT("BL_MASK", BL_MASK_LEV); + SET_CONSTANT("BL_MASK", BL_MASK_PARLYZ); + SET_CONSTANT("BL_MASK", BL_MASK_RIDE); + SET_CONSTANT("BL_MASK", BL_MASK_SLEEPING); + SET_CONSTANT("BL_MASK", BL_MASK_SLIME); + SET_CONSTANT("BL_MASK", BL_MASK_SLIPPERY); + SET_CONSTANT("BL_MASK", BL_MASK_STONE); + SET_CONSTANT("BL_MASK", BL_MASK_STRNGL); + SET_CONSTANT("BL_MASK", BL_MASK_STUN); + SET_CONSTANT("BL_MASK", BL_MASK_SUBMERGED); + SET_CONSTANT("BL_MASK", BL_MASK_TERMILL); + SET_CONSTANT("BL_MASK", BL_MASK_TETHERED); + SET_CONSTANT("BL_MASK", BL_MASK_TRAPPED); + SET_CONSTANT("BL_MASK", BL_MASK_UNCONSC); + SET_CONSTANT("BL_MASK", BL_MASK_WOUNDEDL); + SET_CONSTANT("BL_MASK", BL_MASK_HOLDING); + + SET_CONSTANT("ROLE_RACEMASK", MH_HUMAN); + SET_CONSTANT("ROLE_RACEMASK", MH_ELF); + SET_CONSTANT("ROLE_RACEMASK", MH_DWARF); + SET_CONSTANT("ROLE_RACEMASK", MH_GNOME); + SET_CONSTANT("ROLE_RACEMASK", MH_ORC); + + SET_CONSTANT("ROLE_GENDMASK", ROLE_MALE); + SET_CONSTANT("ROLE_GENDMASK", ROLE_FEMALE); + SET_CONSTANT("ROLE_GENDMASK", ROLE_NEUTER); + + SET_CONSTANT("ROLE_ALIGNMASK", ROLE_LAWFUL); + SET_CONSTANT("ROLE_ALIGNMASK", ROLE_NEUTRAL); + SET_CONSTANT("ROLE_ALIGNMASK", ROLE_CHAOTIC); + + SET_CONSTANT("blconditions", bl_bareh); + SET_CONSTANT("blconditions", bl_blind); + SET_CONSTANT("blconditions", bl_busy); + SET_CONSTANT("blconditions", bl_conf); + SET_CONSTANT("blconditions", bl_deaf); + SET_CONSTANT("blconditions", bl_elf_iron); + SET_CONSTANT("blconditions", bl_fly); + SET_CONSTANT("blconditions", bl_foodpois); + SET_CONSTANT("blconditions", bl_glowhands); + SET_CONSTANT("blconditions", bl_grab); + SET_CONSTANT("blconditions", bl_hallu); + SET_CONSTANT("blconditions", bl_held); + SET_CONSTANT("blconditions", bl_icy); + SET_CONSTANT("blconditions", bl_inlava); + SET_CONSTANT("blconditions", bl_lev); + SET_CONSTANT("blconditions", bl_parlyz); + SET_CONSTANT("blconditions", bl_ride); + SET_CONSTANT("blconditions", bl_sleeping); + SET_CONSTANT("blconditions", bl_slime); + SET_CONSTANT("blconditions", bl_slippery); + SET_CONSTANT("blconditions", bl_stone); + SET_CONSTANT("blconditions", bl_strngl); + SET_CONSTANT("blconditions", bl_stun); + SET_CONSTANT("blconditions", bl_submerged); + SET_CONSTANT("blconditions", bl_termill); + SET_CONSTANT("blconditions", bl_tethered); + SET_CONSTANT("blconditions", bl_trapped); + SET_CONSTANT("blconditions", bl_unconsc); + SET_CONSTANT("blconditions", bl_woundedl); + SET_CONSTANT("blconditions", bl_holding); + SET_CONSTANT("blconditions", CONDITION_COUNT); + + SET_CONSTANT("HL", HL_UNDEF); + SET_CONSTANT("HL", HL_NONE); + SET_CONSTANT("HL", HL_BOLD); + SET_CONSTANT("HL", HL_DIM); + SET_CONSTANT("HL", HL_ITALIC); + SET_CONSTANT("HL", HL_ULINE); + SET_CONSTANT("HL", HL_BLINK); + SET_CONSTANT("HL", HL_INVERSE); + + SET_CONSTANT("MG", MG_HERO); + SET_CONSTANT("MG", MG_CORPSE); + SET_CONSTANT("MG", MG_INVIS); + SET_CONSTANT("MG", MG_DETECT); + SET_CONSTANT("MG", MG_PET); + SET_CONSTANT("MG", MG_RIDDEN); + SET_CONSTANT("MG", MG_STATUE); + SET_CONSTANT("MG", MG_OBJPILE); + SET_CONSTANT("MG", MG_BW_LAVA); + SET_CONSTANT("MG", MG_BW_ICE); + SET_CONSTANT("MG", MG_BW_SINK); + SET_CONSTANT("MG", MG_BW_ENGR); + SET_CONSTANT("MG", MG_NOTHING); + SET_CONSTANT("MG", MG_UNEXPL); + SET_CONSTANT("MG", MG_MALE); + SET_CONSTANT("MG", MG_FEMALE); + + SET_POINTER(extcmdlist); + SET_POINTER(conditions); + SET_POINTER(condtests); + + /* roles/races/genders/alignments */ + SET_POINTER(roles); + SET_POINTER(races); + SET_POINTER(genders); + SET_POINTER(aligns); +} + +/*** + * Globals + ***/ +#define CREATE_GLOBAL(var, type) create_global(#var, (void *)&var, type); +#define CREATE_GLOBAL_FROM_ARRAY(base, iter, path, end_expr, type) \ + for(iter = 0; end_expr; iter++) { \ + snprintf(buf, BUFSZ, #base ".%d." #path, iter); \ + create_global(buf, (void *)(&(base[iter].path)), type); \ + } + +void create_global (char *name, void *ptr, char *type); + +void js_globals_init() { + // int i; + // char buf[BUFSZ]; + + EM_ASM({ + globalThis.nethackGlobal = globalThis.nethackGlobal || {}; + globalThis.nethackGlobal.globals = globalThis.nethackGlobal.globals || {}; + }); + + /* globals */ + CREATE_GLOBAL(svp.plname, "s"); + + /* window globals */ + CREATE_GLOBAL(WIN_MAP, "i"); + CREATE_GLOBAL(WIN_MESSAGE, "i"); + CREATE_GLOBAL(WIN_INVEN, "i"); + CREATE_GLOBAL(WIN_STATUS, "i"); + + /* instance flags */ + CREATE_GLOBAL(iflags.window_inited, "b"); + CREATE_GLOBAL(iflags.wc2_hitpointbar, "b"); + CREATE_GLOBAL(iflags.wc_hilite_pet, "b"); + CREATE_GLOBAL(iflags.hilite_pile, "b"); + + /* flags */ + CREATE_GLOBAL(flags.initrole, "i"); + CREATE_GLOBAL(flags.initrace, "i"); + CREATE_GLOBAL(flags.initgend, "i"); + CREATE_GLOBAL(flags.initalign, "i"); + CREATE_GLOBAL(flags.showexp, "b"); + CREATE_GLOBAL(flags.time, "b"); +} + +EM_JS(void, create_global, (char *name_str, void *ptr, char *type_str), { + let name = UTF8ToString(name_str); + let type = UTF8ToString(type_str); + + // get helpers + let getPointerValue = globalThis.nethackGlobal.helpers.getPointerValue; + let setPointerValue = globalThis.nethackGlobal.helpers.setPointerValue; + + let { obj, prop } = createPath(globalThis.nethackGlobal.globals, name); + + // setters / getters with bound pointers + Object.defineProperty(obj, prop, { + get: getPointerValue.bind(null, name, ptr, type), + set: setPointerValue.bind(null, name, ptr, type), + configurable: true, + enumerable: true + }); + + function createPath(obj, path) { + path = path.split("."); + let i; + for (i = 0; i < path.length - 1; i++) { + // obj[path[i]] = obj[path[i]] || {}; + if (obj[path[i]] === undefined) { + obj[path[i]] = {}; + } + obj = obj[path[i]]; + } + + return { obj, prop: path[i] }; + } +}) + +#endif + +/*libnhmain.c*/ diff --git a/sys/libnh/sysconf b/sys/libnh/sysconf new file mode 100644 index 000000000..af871c187 --- /dev/null +++ b/sys/libnh/sysconf @@ -0,0 +1,157 @@ +# NetHack 5.0 sysconf $NHDT-Date: 1596498296 2020/08/03 23:44:56 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.39 $ +# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland +# NetHack may be freely redistributed. See license for details. +# +# Sample sysconf file. +# The sysconf file is only used if NetHack is compiled with SYSCF defined. +# It can be used to augment or override certain settings compiled into the +# program. +# +# This file can also be used to set local system defaults for run-time +# options, using the same syntax as an individual user's ./nethackrc file. + +# Which users can use debug mode (aka wizard mode; accessed via '-D' command +# line flag or OPTIONS=playmode:debug in the runtime options config file). +# A value of * allows anyone to enter debugging mode. +WIZARDS=root games + +# Which users can use explore mode (aka discover mode; accessed via '-X' +# command line flag or OPTIONS=playmode:explore in runtime options file or +# via '#exploremode' command during normal play). Same syntax as WIZARDS. +EXPLORERS=* + +# Users allowed to use the '!' (shell escape) and '^Z' (suspend process) +# commands to temporarily leave the game and enter a shell process. +# (To resume play, use the shell command 'exit' (for most shells) to +# return from '!' or the shell command 'fg' to return from '^Z'. +# For the typical multi-user system where players have access to a shell +# prompt when logged in and run the game from their own username, a value +# of 'SHELLERS=*' is appropriate. However, some inexperienced players +# occasionally get stuck outside the game by accidentally typing '!' or +# '^Z' during play and not knowing how to go back.) +# Uses the same syntax as the WIZARDS and EXPLORERS options above. +#SHELLERS= + +# If the user name is found in this list, prompt for username instead. +# Uses the same syntax as the WIZARDS option above. +# A public server should probably disable this. +# ["ec2-user" is the default user name on Amazon Linux] +GENERICUSERS=play player game games nethack nethacker ec2-user + +# Use the player name for matching WIZARDS, EXPLORERS and SHELLERS, +# instead of the user's login name. +#CHECK_PLNAME=1 + +# Limit the number of simultaneous games (see also nethack.sh). +# Valid values are 0-25. +# Commenting this out or setting the value to 0 constructs lock files +# with UID and playername, so each user may have one game at a time, +# but number of different players is not limited. +# Setting this to any other value constructs the lock files with +# letter and "lock" (eg. alock, block, ...) +MAXPLAYERS=10 + +# If not null, added to string "To get local support, " in the support +# information help. +#SUPPORT=call Izchak at extension 42. + +# If not null, displayed at the end of a panic-save sequence. +#RECOVER=Run the recover program. + +# Uncomment the next line to disable the SEDUCE option, causing succubi and +# incubi to use nymphs' charm behavior rather than their own seduce behavior. +#SEDUCE=0 + +# Uncomment the next line to enable some accessibility features such +# as S_hero_override and S_pet_override symbols for screen readers +# in the user config file. +#ACCESSIBILITY=1 + +# Uncomment to disable savefile UID checking. +#CHECK_SAVE_UID=0 + +# Record (high score) file options. +# CAUTION: changing these after people have started playing games can +# lead to lost high scores! +# Maximum entries for one person. +#PERSMAX=10 +# Maximum entries in the record file. +#ENTRYMAX=100 +# Minimum points to get an entry. +#POINTSMIN=1 +# Determine identity of "person" in the score file with name (0) or +# numeric (1) user id. +#PERS_IS_UID=1 + +# Help menu control; 0 - include "command line usage" entry in help menu; +# 1 - suppress it from the menu. Does not affect 'nethack --usage' when +# player has access to the command line. The usage feedback describes +# command line handling for UNIX so enabling it won't be much use here. +HIDEUSAGE=1 + +# Maximum number of score file entries to use for random statue names +#MAX_STATUENAME_RANK=10 + +# Show debugging information originating from these source files. +# Use '*' for all, or list source files separated by spaces. +# Only available if game has been compiled with DEBUG, and can be +# overridden via DEBUGFILES environment variable. +#DEBUGFILES=* + +# Save end of game dump log to this file. +# Only available if NetHack was compiled with DUMPLOG +# Allows following placeholders: +# %% literal '%' +# %v version (eg. "5.0.0-0") +# %u game UID +# %t game start time, UNIX timestamp format +# %T current time, UNIX timestamp format +# %d game start time, YYYYMMDDhhmmss format +# %D current time, YYYYMMDDhhmmss format +# %n player name +# %N first character of player name +#DUMPLOGFILE=/tmp/nethack.%n.%d.log + +# Number of bones file pools. +# The pool you belong to is determined at game start. You will +# load and save bones only from that pool. Generally useful +# for public servers only. +# Changing this might make existing bones inaccessible. +# Disabled by setting to 0, or commenting out. +#BONES_POOLS=10 + +# Try to get more info in case of a program bug or crash. Only used +# if the program is built with the PANICTRACE compile-time option enabled. +# By default PANICTRACE is enabled if (NH_DEVEL_STATUS != NH_STATUS_RELEASED), +# otherwise disabled. +# Using GDB can get more information and works on more systems but requires +# 'gdb' be available; using LIBC only works if NetHack is linked with a +# libc that supports the backtrace(3) API. Both require certain compilation +# options. See src/end.c and sys/unix/hints/* for more information. +#GDBPATH=/usr/bin/gdb +#GREPPATH=/bin/grep +# Values are priorities: 0 - do not use this method, 1 - low priority, +# 2 - high priority. Non-zero priority methods are tried in order. +PANICTRACE_GDB=0 +PANICTRACE_LIBC=0 + +# 'portable_device_paths' is only supported for Windows. Starting with +# 3.6.3, nethack on Windows treats the folder containing nethack.exe and +# nethackW.exe as read-only and puts data files which are generated or +# modified during play or by the user in assorted folders derived from +# user name. 3.6.4 added PORTABLE_DEVICE_PATHS to allow reverting to +# the old behavior of having the run-time configuration file and other +# data in the same directory as the executable so that the whole thing +# can be moved from one machine to another (flash drive or perhaps cloud) +# without updating folder paths. +#PORTABLE_DEVICE_PATHS=0 + +# Ordinary run-time options can be set here to override the builtin-in +# default values. Unlike all the SYSCF values above, individual users +# can override the overridden options set here by choosing their own +# option settings via NETHACKOPTIONS in their environment or via +# ~/.nethackrc run-time configuration file. +#OPTIONS=!autopickup,fruit:tomato,symset:DECgraphics +OPTIONS=perm_invent + +#eof diff --git a/sys/libnh/test/README.md b/sys/libnh/test/README.md new file mode 100644 index 000000000..c9cfed377 --- /dev/null +++ b/sys/libnh/test/README.md @@ -0,0 +1,8 @@ +Development helpers and tests for libnethack.a and nethack.js. + +Copy these files to the NetHack root directory. Commands include: +* run.sh wasm - rebuild makefiles and build nethack.js +* run.sh runwasm - simple testing of nethack.js +* run.sh lib - rebuild makefiles and build libnethack.a +* run.sh runlib - simple testing of libnethack.a +* run.sh bin - build the MacOS binary \ No newline at end of file diff --git a/sys/libnh/test/libtest.c b/sys/libnh/test/libtest.c new file mode 100644 index 000000000..31ca10e71 --- /dev/null +++ b/sys/libnh/test/libtest.c @@ -0,0 +1,115 @@ +#include +#include + +/* external functions */ +int nhmain(int argc, char *argv[]); +typedef void(*stub_callback_t)(const char *name, void *ret_ptr, const char *fmt, ...); +void shim_graphics_set_callback(stub_callback_t cb); + +/* forward declarations */ +void window_cb(const char *name, void *ret_ptr, const char *fmt, ...); +void *yourFunctionToRenderGraphics(const char *name, va_list args); + +int main(int argc, char *argv[]) { + shim_graphics_set_callback(window_cb); + nhmain(argc, argv); +} + +void *yourFunctionToRenderGraphics(const char *name, va_list args) { + printf("yourFunctionToRenderGraphics name %s\n", name); + /* DO SOMETHING HERE */ + return NULL; +} + +void window_cb(const char *name, void *ret_ptr, const char *fmt, ...) { + void *ret; + va_list args; + /* TODO -- see windowCallback below for hints */ + va_start(args, fmt); + + ret = yourFunctionToRenderGraphics(name, args); + // *((int *)ret_ptr = *((int *)ret); // e.g. yourFunctionToRenderGraphics returns an int + + va_end(args); +} + +#if 0 +function variadicCallback(name, retPtr, fmt, args) { + // console.log ("variadicCallback called..."); + // console.log("typeof name", typeof name); + // console.log("typeof fmt", typeof fmt); + // console.log("typeof args", typeof args); + name = Module.UTF8ToString(name); + fmt = Module.UTF8ToString(fmt); + // console.log ("name:", name); + // console.log ("fmt:", fmt); + let argTypes = fmt.split(""); + let retType = argTypes.shift(); + // console.log ("arg count:", argTypes.length); + // console.log ("arg types:", argTypes); + // console.log ("ret type:", retType); + + let jsArgs = []; + for (let i = 0; i < argTypes.length; i++) { + let ptr = args + (4*i); + let val = typeLookup(argTypes[i], ptr); + jsArgs.push(val); + } + console.log(`graphics callback: ${name} [${jsArgs}]`); + setReturn(retPtr, retType); +} + +function setReturn(ptr, type, value = 0) { + switch (type) { + case "p": + throw new Error("not implemented"); + case "s": + value=value?value:"(no value)"; + var strPtr = Module.getValue(ptr, "i32"); + Module.stringToUTF8(value, strPtr, 1024); + break; + case "i": + Module.setValue(ptr, value, "i32"); + break; + case "c": + Module.setValue(ptr, value, "i8"); // 'Z' + break; + case "f": + // XXX: I'm not sure why 'double' works and 'float' doesn't + Module.setValue(ptr, value, "double"); + break; + case "d": + Module.setValue(ptr, value, "double"); + break; + case "v": + break; + default: + throw new Error("unknown type"); + } +} + +function typeLookup(type, ptr) { + switch(type) { + case "s": // string + return Module.UTF8ToString(Module.getValue(ptr, "*")); + case "p": // pointer + return Module.getValue(Module.getValue(ptr, "*"), "*"); + case "c": // char + return String.fromCharCode(Module.getValue(Module.getValue(ptr, "*"), "i8")); + case "0": /* 2^0 = 1 byte */ + return Module.getValue(Module.getValue(ptr, "*"), "i8"); + case "1": /* 2^1 = 2 bytes */ + return Module.getValue(Module.getValue(ptr, "*"), "i16"); + case "2": /* 2^2 = 4 bytes */ + case "i": // integer + case "n": // number + return Module.getValue(Module.getValue(ptr, "*"), "i32"); + case "f": // float + return Module.getValue(Module.getValue(ptr, "*"), "float"); + case "d": // double + return Module.getValue(Module.getValue(ptr, "*"), "double"); + default: + throw new TypeError ("unknown type:" + type); + } +} +#endif /* 0 */ \ No newline at end of file diff --git a/sys/libnh/test/run.sh b/sys/libnh/test/run.sh new file mode 100755 index 000000000..f16571495 --- /dev/null +++ b/sys/libnh/test/run.sh @@ -0,0 +1,45 @@ +#!/bin/bash -x + +if [ x$1 == "xlib" ]; then + echo Doing lib... + if [ -f Makefile ]; then + make spotless + fi + cd sys/unix + ./setup.sh hints/macOS.500 + cd ../.. + make WANT_LIBNH=1 +fi + +if [ x$1 == "xrunlib" ]; then + LIBS="-Lsrc -lnh -Llib/lua -llua -lm" + BADLIBS="-lncurses" + rm nhlibtest + gcc -o nhlibtest libtest.c $LIBS $BADLIBS + ./nhlibtest +fi + +if [ x$1 == "xwasm" ]; then + echo Doing wasm... + if [ -f Makefile ]; then + make spotless + fi + cd sys/unix + ./setup.sh hints/macOS.500 + cd ../.. + make CROSS_TO_WASM=1 +fi + +if [ x$1 == "xrunwasm" ]; then + cd sys/lib/npm-package && npm run build && node test/test.js +fi + +if [ x$1 == "xbin" ]; then + echo Doing bin... + make spotless + cd sys/unix + ./setup.sh hints/macOS.500 + cd ../.. + make +fi + diff --git a/sys/mac/.gitattributes b/sys/mac/.gitattributes deleted file mode 100644 index ffe91d74f..000000000 --- a/sys/mac/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -NHDeflts NHSUBST -* NH_filestag=(file%s_for_68K_Macintosh_versions) diff --git a/sys/mac/Files.r b/sys/mac/Files.r deleted file mode 100644 index 3ea176ebf..000000000 --- a/sys/mac/Files.r +++ /dev/null @@ -1,301 +0,0 @@ -#include -#include "date.h" -#include "patchlevel.h" - - -/* Carbon 'carb' resource - * has been made obsolete by the 'plst' resource below. - */ - -/* Carbon 'plst' resource - * Single-file applications must have this resource for MacOS X to - * count it as a Carbon app rather than a Classic app. It contains - * an embedded Info.plist file, with the same format as would occur - * in an application based on a directory bundle. The attributes - * declared in this resource override the 'BNDL', 'FREF', and 'vers' - * resources in MacOS X. - * - * For further information, see - * http://developer.apple.com/technotes/tn/tn2013.html - */ -read 'plst' (0) "carbon.plist"; - - -/* Classic resources - * These resources are used in MacOS 9.x and earlier. - */ -resource 'vers' (1, purgeable) { - VERSION_MAJOR, (VERSION_MINOR<<4) | PATCHLEVEL, final, EDITLEVEL, verUS, - VERSION_STRING, - VERSION_STRING -}; - -resource 'vers' (2, purgeable) { - VERSION_MAJOR, (VERSION_MINOR<<4) | PATCHLEVEL, final, EDITLEVEL, verUS, - VERSION_STRING, - "devteam@nethack.org" -}; - - -/* Dungeon librarian files - * File data and quest.dat have gotten too big to be put into resources! - */ -#ifdef TARGET_API_MAC_CARBON -read 'File' (1000,"cmdhelp") "cmdhelp"; -read 'File' (1001,"help") "help"; -read 'File' (1002,"hh") "hh"; -read 'File' (1003,"history") "history"; -read 'File' (1004,"license") "license"; -read 'File' (1005,"MacHelp") "MacHelp"; -read 'File' (1006,"News") "News"; -read 'File' (1007,"opthelp") "opthelp"; -read 'File' (1008,"wizhelp") "wizhelp"; -read 'File' (1009,"air.lev") "air.lev"; -read 'File' (1010,"asmodeus.lev") "asmodeus.lev"; -read 'File' (1011,"astral.lev") "astral.lev"; -read 'File' (1012,"baalz.lev") "baalz.lev"; -read 'File' (1013,"bigrm-1.lev") "bigrm-1.lev"; -read 'File' (1014,"bigrm-2.lev") "bigrm-2.lev"; -read 'File' (1015,"bigrm-3.lev") "bigrm-3.lev"; -read 'File' (1016,"bigrm-4.lev") "bigrm-4.lev"; -read 'File' (1017,"bigrm-5.lev") "bigrm-5.lev"; -read 'File' (1018,"castle.lev") "castle.lev"; -//read 'File' (1019,"data") "data"; -read 'File' (1020,"dungeon") "dungeon"; -read 'File' (1021,"earth.lev") "earth.lev"; -read 'File' (1022,"fakewiz1.lev") "fakewiz1.lev"; -read 'File' (1023,"fakewiz2.lev") "fakewiz2.lev"; -read 'File' (1024,"fire.lev") "fire.lev"; -read 'File' (1025,"juiblex.lev") "juiblex.lev"; -read 'File' (1026,"knox.lev") "knox.lev"; -read 'File' (1027,"medusa-1.lev") "medusa-1.lev"; -read 'File' (1028,"medusa-2.lev") "medusa-2.lev"; -read 'File' (1029,"minefill.lev") "minefill.lev"; -read 'File' (1030,"minend-1.lev") "minend-1.lev"; -read 'File' (1031,"minend-2.lev") "minend-2.lev"; -read 'File' (1032,"minend-3.lev") "minend-3.lev"; -read 'File' (1034,"minetn-1.lev") "minetn-1.lev"; -read 'File' (1035,"minetn-2.lev") "minetn-2.lev"; -read 'File' (1036,"minetn-3.lev") "minetn-3.lev"; -read 'File' (1037,"minetn-4.lev") "minetn-4.lev"; -read 'File' (1038,"minetn-5.lev") "minetn-5.lev"; -read 'File' (1039,"minetn-6.lev") "minetn-6.lev"; -read 'File' (1040,"minetn-7.lev") "minetn-7.lev"; -read 'File' (1041,"options") "options"; -read 'File' (1042,"oracle.lev") "oracle.lev"; -read 'File' (1043,"oracles") "oracles"; -read 'File' (1044,"orcus.lev") "orcus.lev"; -//read 'File' (1045,"quest.dat") "quest.dat"; -read 'File' (1046,"rumors") "rumors"; -read 'File' (1047,"sanctum.lev") "sanctum.lev"; -read 'File' (1048,"soko1-1.lev") "soko1-1.lev"; -read 'File' (1049,"soko1-2.lev") "soko1-2.lev"; -read 'File' (1050,"soko2-1.lev") "soko2-1.lev"; -read 'File' (1051,"soko2-2.lev") "soko2-2.lev"; -read 'File' (1052,"soko3-1.lev") "soko3-1.lev"; -read 'File' (1053,"soko3-2.lev") "soko3-2.lev"; -read 'File' (1054,"soko4-1.lev") "soko4-1.lev"; -read 'File' (1055,"soko4-2.lev") "soko4-2.lev"; -read 'File' (1056,"tower1.lev") "tower1.lev"; -read 'File' (1057,"tower2.lev") "tower2.lev"; -read 'File' (1058,"tower3.lev") "tower3.lev"; -read 'File' (1059,"valley.lev") "valley.lev"; -read 'File' (1060,"water.lev") "water.lev"; -read 'File' (1061,"wizard1.lev") "wizard1.lev"; -read 'File' (1062,"wizard2.lev") "wizard2.lev"; -read 'File' (1063,"wizard3.lev") "wizard3.lev"; -read 'File' (1100,"Arc-fila.lev") "Arc-fila.lev"; -read 'File' (1101,"Arc-filb.lev") "Arc-filb.lev"; -read 'File' (1102,"Arc-goal.lev") "Arc-goal.lev"; -read 'File' (1103,"Arc-loca.lev") "Arc-loca.lev"; -read 'File' (1104,"Arc-strt.lev") "Arc-strt.lev"; -read 'File' (1105,"Bar-fila.lev") "Bar-fila.lev"; -read 'File' (1106,"Bar-filb.lev") "Bar-filb.lev"; -read 'File' (1107,"Bar-goal.lev") "Bar-goal.lev"; -read 'File' (1108,"Bar-loca.lev") "Bar-loca.lev"; -read 'File' (1109,"Bar-strt.lev") "Bar-strt.lev"; -read 'File' (1110,"Cav-fila.lev") "Cav-fila.lev"; -read 'File' (1111,"Cav-filb.lev") "Cav-filb.lev"; -read 'File' (1112,"Cav-goal.lev") "Cav-goal.lev"; -read 'File' (1113,"Cav-loca.lev") "Cav-loca.lev"; -read 'File' (1114,"Cav-strt.lev") "Cav-strt.lev"; -read 'File' (1115,"Hea-fila.lev") "Hea-fila.lev"; -read 'File' (1116,"Hea-filb.lev") "Hea-filb.lev"; -read 'File' (1117,"Hea-goal.lev") "Hea-goal.lev"; -read 'File' (1118,"Hea-loca.lev") "Hea-loca.lev"; -read 'File' (1119,"Hea-strt.lev") "Hea-strt.lev"; -read 'File' (1120,"Kni-fila.lev") "Kni-fila.lev"; -read 'File' (1121,"Kni-filb.lev") "Kni-filb.lev"; -read 'File' (1122,"Kni-goal.lev") "Kni-goal.lev"; -read 'File' (1123,"Kni-loca.lev") "Kni-loca.lev"; -read 'File' (1124,"Kni-strt.lev") "Kni-strt.lev"; -read 'File' (1125,"Mon-fila.lev") "Mon-fila.lev"; -read 'File' (1126,"Mon-filb.lev") "Mon-filb.lev"; -read 'File' (1127,"Mon-goal.lev") "Mon-goal.lev"; -read 'File' (1128,"Mon-loca.lev") "Mon-loca.lev"; -read 'File' (1129,"Mon-strt.lev") "Mon-strt.lev"; -read 'File' (1130,"Pri-fila.lev") "Pri-fila.lev"; -read 'File' (1131,"Pri-filb.lev") "Pri-filb.lev"; -read 'File' (1132,"Pri-goal.lev") "Pri-goal.lev"; -read 'File' (1133,"Pri-loca.lev") "Pri-loca.lev"; -read 'File' (1134,"Pri-strt.lev") "Pri-strt.lev"; -read 'File' (1135,"Ran-fila.lev") "Ran-fila.lev"; -read 'File' (1136,"Ran-filb.lev") "Ran-filb.lev"; -read 'File' (1137,"Ran-goal.lev") "Ran-goal.lev"; -read 'File' (1138,"Ran-loca.lev") "Ran-loca.lev"; -read 'File' (1139,"Ran-strt.lev") "Ran-strt.lev"; -read 'File' (1140,"Rog-fila.lev") "Rog-fila.lev"; -read 'File' (1141,"Rog-filb.lev") "Rog-filb.lev"; -read 'File' (1142,"Rog-goal.lev") "Rog-goal.lev"; -read 'File' (1143,"Rog-loca.lev") "Rog-loca.lev"; -read 'File' (1144,"Rog-strt.lev") "Rog-strt.lev"; -read 'File' (1145,"Sam-fila.lev") "Sam-fila.lev"; -read 'File' (1146,"Sam-filb.lev") "Sam-filb.lev"; -read 'File' (1147,"Sam-goal.lev") "Sam-goal.lev"; -read 'File' (1148,"Sam-loca.lev") "Sam-loca.lev"; -read 'File' (1149,"Sam-strt.lev") "Sam-strt.lev"; -read 'File' (1150,"Tou-fila.lev") "Tou-fila.lev"; -read 'File' (1151,"Tou-filb.lev") "Tou-filb.lev"; -read 'File' (1152,"Tou-goal.lev") "Tou-goal.lev"; -read 'File' (1153,"Tou-loca.lev") "Tou-loca.lev"; -read 'File' (1154,"Tou-strt.lev") "Tou-strt.lev"; -read 'File' (1155,"Val-fila.lev") "Val-fila.lev"; -read 'File' (1156,"Val-filb.lev") "Val-filb.lev"; -read 'File' (1157,"Val-goal.lev") "Val-goal.lev"; -read 'File' (1158,"Val-loca.lev") "Val-loca.lev"; -read 'File' (1159,"Val-strt.lev") "Val-strt.lev"; -read 'File' (1160,"Wiz-fila.lev") "Wiz-fila.lev"; -read 'File' (1161,"Wiz-filb.lev") "Wiz-filb.lev"; -read 'File' (1162,"Wiz-goal.lev") "Wiz-goal.lev"; -read 'File' (1163,"Wiz-loca.lev") "Wiz-loca.lev"; -read 'File' (1164,"Wiz-strt.lev") "Wiz-strt.lev"; -#else -read 'File' (1000,"cmdhelp") ":dat:cmdhelp"; -read 'File' (1001,"help") ":dat:help"; -read 'File' (1002,"hh") ":dat:hh"; -read 'File' (1003,"history") ":dat:history"; -read 'File' (1004,"license") ":dat:license"; -read 'File' (1005,"MacHelp") ":sys:mac:MacHelp"; -read 'File' (1006,"News") ":sys:mac:News"; -read 'File' (1007,"opthelp") ":dat:opthelp"; -read 'File' (1008,"wizhelp") ":dat:wizhelp"; -read 'File' (1009,"air.lev") ":lib:air.lev"; -read 'File' (1010,"asmodeus.lev") ":lib:asmodeus.lev"; -read 'File' (1011,"astral.lev") ":lib:astral.lev"; -read 'File' (1012,"baalz.lev") ":lib:baalz.lev"; -read 'File' (1013,"bigrm-1.lev") ":lib:bigrm-1.lev"; -read 'File' (1014,"bigrm-2.lev") ":lib:bigrm-2.lev"; -read 'File' (1015,"bigrm-3.lev") ":lib:bigrm-3.lev"; -read 'File' (1016,"bigrm-4.lev") ":lib:bigrm-4.lev"; -read 'File' (1017,"bigrm-5.lev") ":lib:bigrm-5.lev"; -read 'File' (1018,"castle.lev") ":lib:castle.lev"; -read 'File' (1019,"data") ":lib:data"; -read 'File' (1020,"dungeon") ":lib:dungeon"; -read 'File' (1021,"earth.lev") ":lib:earth.lev"; -read 'File' (1022,"fakewiz1.lev") ":lib:fakewiz1.lev"; -read 'File' (1023,"fakewiz2.lev") ":lib:fakewiz2.lev"; -read 'File' (1024,"fire.lev") ":lib:fire.lev"; -read 'File' (1025,"juiblex.lev") ":lib:juiblex.lev"; -read 'File' (1026,"knox.lev") ":lib:knox.lev"; -read 'File' (1027,"medusa-1.lev") ":lib:medusa-1.lev"; -read 'File' (1028,"medusa-2.lev") ":lib:medusa-2.lev"; -read 'File' (1029,"minefill.lev") ":lib:minefill.lev"; -read 'File' (1030,"minend-1.lev") ":lib:minend-1.lev"; -read 'File' (1031,"minend-2.lev") ":lib:minend-2.lev"; -read 'File' (1032,"minend-3.lev") ":lib:minend-3.lev"; -read 'File' (1034,"minetn-1.lev") ":lib:minetn-1.lev"; -read 'File' (1035,"minetn-2.lev") ":lib:minetn-2.lev"; -read 'File' (1036,"minetn-3.lev") ":lib:minetn-3.lev"; -read 'File' (1037,"minetn-4.lev") ":lib:minetn-4.lev"; -read 'File' (1038,"minetn-5.lev") ":lib:minetn-5.lev"; -read 'File' (1039,"minetn-6.lev") ":lib:minetn-6.lev"; -read 'File' (1040,"minetn-7.lev") ":lib:minetn-7.lev"; -read 'File' (1041,"options") ":lib:options"; -read 'File' (1042,"oracle.lev") ":lib:oracle.lev"; -read 'File' (1043,"oracles") ":lib:oracles"; -read 'File' (1044,"orcus.lev") ":lib:orcus.lev"; -read 'File' (1045,"quest.dat") ":lib:quest.dat"; -read 'File' (1046,"rumors") ":lib:rumors"; -read 'File' (1047,"sanctum.lev") ":lib:sanctum.lev"; -read 'File' (1048,"soko1-1.lev") ":lib:soko1-1.lev"; -read 'File' (1049,"soko1-2.lev") ":lib:soko1-2.lev"; -read 'File' (1050,"soko2-1.lev") ":lib:soko2-1.lev"; -read 'File' (1051,"soko2-2.lev") ":lib:soko2-2.lev"; -read 'File' (1052,"soko3-1.lev") ":lib:soko3-1.lev"; -read 'File' (1053,"soko3-2.lev") ":lib:soko3-2.lev"; -read 'File' (1054,"soko4-1.lev") ":lib:soko4-1.lev"; -read 'File' (1055,"soko4-2.lev") ":lib:soko4-2.lev"; -read 'File' (1056,"tower1.lev") ":lib:tower1.lev"; -read 'File' (1057,"tower2.lev") ":lib:tower2.lev"; -read 'File' (1058,"tower3.lev") ":lib:tower3.lev"; -read 'File' (1059,"valley.lev") ":lib:valley.lev"; -read 'File' (1060,"water.lev") ":lib:water.lev"; -read 'File' (1061,"wizard1.lev") ":lib:wizard1.lev"; -read 'File' (1062,"wizard2.lev") ":lib:wizard2.lev"; -read 'File' (1063,"wizard3.lev") ":lib:wizard3.lev"; -read 'File' (1100,"Arc-fila.lev") ":lib:Arc-fila.lev"; -read 'File' (1101,"Arc-filb.lev") ":lib:Arc-filb.lev"; -read 'File' (1102,"Arc-goal.lev") ":lib:Arc-goal.lev"; -read 'File' (1103,"Arc-loca.lev") ":lib:Arc-loca.lev"; -read 'File' (1104,"Arc-strt.lev") ":lib:Arc-strt.lev"; -read 'File' (1105,"Bar-fila.lev") ":lib:Bar-fila.lev"; -read 'File' (1106,"Bar-filb.lev") ":lib:Bar-filb.lev"; -read 'File' (1107,"Bar-goal.lev") ":lib:Bar-goal.lev"; -read 'File' (1108,"Bar-loca.lev") ":lib:Bar-loca.lev"; -read 'File' (1109,"Bar-strt.lev") ":lib:Bar-strt.lev"; -read 'File' (1110,"Cav-fila.lev") ":lib:Cav-fila.lev"; -read 'File' (1111,"Cav-filb.lev") ":lib:Cav-filb.lev"; -read 'File' (1112,"Cav-goal.lev") ":lib:Cav-goal.lev"; -read 'File' (1113,"Cav-loca.lev") ":lib:Cav-loca.lev"; -read 'File' (1114,"Cav-strt.lev") ":lib:Cav-strt.lev"; -read 'File' (1115,"Hea-fila.lev") ":lib:Hea-fila.lev"; -read 'File' (1116,"Hea-filb.lev") ":lib:Hea-filb.lev"; -read 'File' (1117,"Hea-goal.lev") ":lib:Hea-goal.lev"; -read 'File' (1118,"Hea-loca.lev") ":lib:Hea-loca.lev"; -read 'File' (1119,"Hea-strt.lev") ":lib:Hea-strt.lev"; -read 'File' (1120,"Kni-fila.lev") ":lib:Kni-fila.lev"; -read 'File' (1121,"Kni-filb.lev") ":lib:Kni-filb.lev"; -read 'File' (1122,"Kni-goal.lev") ":lib:Kni-goal.lev"; -read 'File' (1123,"Kni-loca.lev") ":lib:Kni-loca.lev"; -read 'File' (1124,"Kni-strt.lev") ":lib:Kni-strt.lev"; -read 'File' (1125,"Mon-fila.lev") ":lib:Mon-fila.lev"; -read 'File' (1126,"Mon-filb.lev") ":lib:Mon-filb.lev"; -read 'File' (1127,"Mon-goal.lev") ":lib:Mon-goal.lev"; -read 'File' (1128,"Mon-loca.lev") ":lib:Mon-loca.lev"; -read 'File' (1129,"Mon-strt.lev") ":lib:Mon-strt.lev"; -read 'File' (1130,"Pri-fila.lev") ":lib:Pri-fila.lev"; -read 'File' (1131,"Pri-filb.lev") ":lib:Pri-filb.lev"; -read 'File' (1132,"Pri-goal.lev") ":lib:Pri-goal.lev"; -read 'File' (1133,"Pri-loca.lev") ":lib:Pri-loca.lev"; -read 'File' (1134,"Pri-strt.lev") ":lib:Pri-strt.lev"; -read 'File' (1135,"Ran-fila.lev") ":lib:Ran-fila.lev"; -read 'File' (1136,"Ran-filb.lev") ":lib:Ran-filb.lev"; -read 'File' (1137,"Ran-goal.lev") ":lib:Ran-goal.lev"; -read 'File' (1138,"Ran-loca.lev") ":lib:Ran-loca.lev"; -read 'File' (1139,"Ran-strt.lev") ":lib:Ran-strt.lev"; -read 'File' (1140,"Rog-fila.lev") ":lib:Rog-fila.lev"; -read 'File' (1141,"Rog-filb.lev") ":lib:Rog-filb.lev"; -read 'File' (1142,"Rog-goal.lev") ":lib:Rog-goal.lev"; -read 'File' (1143,"Rog-loca.lev") ":lib:Rog-loca.lev"; -read 'File' (1144,"Rog-strt.lev") ":lib:Rog-strt.lev"; -read 'File' (1145,"Sam-fila.lev") ":lib:Sam-fila.lev"; -read 'File' (1146,"Sam-filb.lev") ":lib:Sam-filb.lev"; -read 'File' (1147,"Sam-goal.lev") ":lib:Sam-goal.lev"; -read 'File' (1148,"Sam-loca.lev") ":lib:Sam-loca.lev"; -read 'File' (1149,"Sam-strt.lev") ":lib:Sam-strt.lev"; -read 'File' (1150,"Tou-fila.lev") ":lib:Tou-fila.lev"; -read 'File' (1151,"Tou-filb.lev") ":lib:Tou-filb.lev"; -read 'File' (1152,"Tou-goal.lev") ":lib:Tou-goal.lev"; -read 'File' (1153,"Tou-loca.lev") ":lib:Tou-loca.lev"; -read 'File' (1154,"Tou-strt.lev") ":lib:Tou-strt.lev"; -read 'File' (1155,"Val-fila.lev") ":lib:Val-fila.lev"; -read 'File' (1156,"Val-filb.lev") ":lib:Val-filb.lev"; -read 'File' (1157,"Val-goal.lev") ":lib:Val-goal.lev"; -read 'File' (1158,"Val-loca.lev") ":lib:Val-loca.lev"; -read 'File' (1159,"Val-strt.lev") ":lib:Val-strt.lev"; -read 'File' (1160,"Wiz-fila.lev") ":lib:Wiz-fila.lev"; -read 'File' (1161,"Wiz-filb.lev") ":lib:Wiz-filb.lev"; -read 'File' (1162,"Wiz-goal.lev") ":lib:Wiz-goal.lev"; -read 'File' (1163,"Wiz-loca.lev") ":lib:Wiz-loca.lev"; -read 'File' (1164,"Wiz-strt.lev") ":lib:Wiz-strt.lev"; -#endif diff --git a/sys/mac/Install.mw b/sys/mac/Install.mw deleted file mode 100644 index f6cc4eab7..000000000 --- a/sys/mac/Install.mw +++ /dev/null @@ -1,291 +0,0 @@ -Building a PPC NetHack 3.6 with the Metrowerks compilers - -Note: If you are building using any compiler for OS X, use the instructions - in sys/unix. This file contains old instructions that predated OS X. - -You must be familiar with the Metrowerks compiler and know how to construct -projects. The NetHack source may come with the four pre-made projects that -are needed to build NetHack and the files it needs. These four projects are -in :sys:mac and are MakeDefs.u, DgnComp.u, LevComp.u, and NetHack.u. If you -do not have them, or wish to construct them yourself, see the section "Project -Contents" below. - - -1. Move the projects MakeDefs.u, DgnComp.u, LevComp.u, and NetHack.u to the -top level of the NetHack tree. If you are building your own, create each -project as needed, in the order given below. - -2. Create a folder "lib" in the top level. This is where the files used by -NetHack will be deposited by MakeDefs, DgnComp, and LevComp. - -3. Build and run MakeDefs. - -You will be presented with a list of options. Initially choose them all (the -default). Later you may wish to only run a few of them. The options are -"odemvpqrhz", each of which makes a file: - - -o creates :include:onames.h - -p creates :include:pm.h - -z creates :src:vis_tab.c - -m creates :src:monstr.c - -e creates :dat:dundeon.pdf - -v creates :lib:options - -d creates :lib:data - -r creates :lib:rumors - -h creates :lib:oracles - -q creates :lib:quest.dat - - -4. If you are _not_ using DLB, follow these directions. As of v3.3, DLB is ON -for the Mac. Copy the following files. You may want to change News or NHDeflts. - - a. copy ':sys:mac:MacHelp' to ':lib:MacHelp' - b. copy ':sys:mac:News' to ':lib:News' - c. copy ':sys:mac:NHDeflts' to ':lib:NetHack Defaults' - - d. copy ':dat:cmdhelp' to ':lib:cmdhelp' - e. copy ':dat:help' to ':lib:help' - f. copy ':dat:hh' to 'lib:hh' - g. copy ':dat:history' to ':lib:history' - h. copy ':dat:license' to ':lib:license' - i. copy ':dat:opthelp' to ':lib:opthelp' - j. copy ':dat:wizhelp' to ':lib:wizhelp' - -5. Create an empty file, ':lib:record' - -6. Build and run DgnComp. - This will create a file "dungeon" in the lib directory. - -7. Build and run LevComp. - This will build the level files (*.lev) in the lib directory. - -8. Build NetHack. - Move NetHack in the lib directory. - - ------------------------- - - -Building NetHack with MetroWerks IDE 1.x (DR7-DR10, DR11 was never used) - - -To build NetHack, you will need to create four projects at the top level of -the NetHack directory tree. These four projects are MakeDefs.u, DgnComp.u, -LevComp.u, and NetHack.u. The projects don't have to end in ".u", but you -should append some form of ".XXX" to the end of the project's name to -distinguish the project from the executable that it produces. The files -and libraries to include in these projects are listed in the "Project -Contents" section below. You must create and run Makedefs before creating -NetHack because MakeDefs will create files used by NetHack. - -Use the MacOS C/C++ template for each of the projects. The libraries included -will be overkill for all the projects (e.g. the C++ libraries are not needed). -Add the .c and resource files as indicated below. Unless otherwise noted, the -projects can use the default preferences: - - Font - The tabbing on all non-mac files is 8. All mac files have a - tab of 4. - PPC Processor - All projects must have the same alignment to build a consistent - NetHack. To share save files with 68K, the alignments - must match for their projects, as well. - Turn on Global Optimization (official version is compiled - with level 1). If you don't turn it on, some files may - not compile because of register overflow. [NetHack - only] - PPC Project - Set name to - Other settings [NetHack only] - creator: nh31 - preferred heap size:2500 - minimum heap size: 2000 - stack size: 128 [PPC only] - - -The SIOUX library may be replaced with console.stubs.c for the NetHack -project. - -NOTE: As NetHack 3.3, you must turn on OLDROUTINENAMES -- so you can't use -the default pre-compiled header. You should either remove it from the -preferences or insert another precompiled header that has this define off. - - ------------------------- - - -Building NetHack with MetroWerks IDE 2.0. - -This is for building a PowerPC version only. This doesn't take advantage -of the IDE's subprojects. These will be investigated later. - - -MakeDefs.u, DgnComp.u, LevComp.u: Select ANSI C Console PPC. - Settings: - PPC Target - + Change File Name to MakeDefs, DgnComp, or LevComp respectively. - C/C++ Language - + Turn off ANSI strict, ANSI Keywords Only, Expand Trigraphs - PPC Processor - + Turn on global optimization (at least to level 1) - -NetHack.u: Basic ToolBox PPC - PPC Target - + Change File Name to NetHack. Other settings - creator: nh31 - preferred heap size:2500 - minimum heap size: 2000 - stack size: 128 [PPC only] - C/C++ Language - + Options ANSI strict, ANSI Keywords Only, Expand Trigraphs - are already turned off, so you don't have to do anything. - PPC Processor - + Turn on global optimization (at least to level 1) - - ------------------------- -Creating projects for NetHack with MetroWerks IDE 3.3 (Pro 4) - -This is what I changed from the default settings when creating a 68K version. Some of -the settings may not be necessary. For example, NetHack doesn't use floating point, -so I didn't have to check 8 byte doubles. Some are interrelated. For example, the -codegen and the Math and MSL libraries used. - -For MakeDefs.u, DgnComp.u, LevComp.u: -1. Select File>>New Project...>>MacOS>>C_C++>>Standard Console>>Std C Console 68K -2. 68K Settings: - Target Settings: - + Set "Target Name" to {MakeDefs,DgnComp,LevComp}. - 68K Target: - + Set "File Name" to {MakeDefs,DgnComp,LevComp}. - C/C++ Language: - + Check Require Function Prototypes, uncheck everything else. - + Clear "Prefix File". - 68K Processor: - + Set "Code Model" to Large. - + Check 68020 Codegen, 4-Byte Ints, 8-Byte Doubles, Far Data, Far Method Tables, - Far String Constants. Uncheck everything else. -3. Libraries 68K - + Remove the C++ Library (it is not needed). - + Change math library to MathLib68K Fa(4i_8d).Lib. - + Change MSL C library to MSL C.68K Fa(4i_8d).Lib. - Note: The actual libraries used must match the CodeGen options in 68K Processor. - - -For NetHack.u: -1. Select File>>New Project...>>MacOS>>C_C++>>MacOS ToolBox>>MacOS ToolBox 68K -2. 68K Settings - Target Settings: - + Set "Target Name" to NetHack Debug and NetHack Final. - 68K Target: - + Set "File Name" to NetHack Debug and NetHack Final. - + Set "Creator" to 'nh31'. - + Set "Preferred Heap Size (k)" to 2500. - + Set "Minimum Heap Size (k)" to 1500. - C/C++ Language: - + Check Require Function Prototypes, uncheck everything else. - + Set "Prefix File" to LocalDefines.h. I use this header to define - OLDROUTINENAMES because the pre-compiled header doesn't have it set - any more. One of these days we'll fix up the code... - 68K Processor: - + Set "Code Model" to Large. - + Check 68020 Codegen, 4-Byte Ints, 8-Byte Doubles, Far Data, Far Method Tables, - Far String Constants. Uncheck everything else. -3. Libraries 68K - + Remove the C++ Library (it is not needed). - + Change math library to MathLib68K Fa(4i_8d).Lib. - + Change MSL C library to MSL C.68K Fa(4i_8d).Lib. - Note: The actual libraries used must match the CodeGen options in 68K Processor. - - -For Recover.u: -1. Select File>>New Project...>>MacOS>>C_C++>>MacOS ToolBox>>MacOS ToolBox 68K -2. 68K Settings - Target Settings: - + Set "Target Name" to Recover Debug and Recover Final. - 68K Target: - + Set "File Name" to Recover Debug and Recover Final. - + Set "Creator" to 'nhRc'. - C/C++ Language: - + Check Require Function Prototypes, uncheck everything else. - + Set "Prefix File" to LocalDefines.h. I use this header to define - OLDROUTINENAMES because the pre-compiled header doesn't have it set - any more. One of these days we'll fix up the code... - 68K Processor: - + Set "Code Model" to Large. - + Check 68020 Codegen, 4-Byte Ints, 8-Byte Doubles, Far Data, Far Method Tables, - Far String Constants. Uncheck everything else. -3. Libraries 68K - + Remove the C++ Library (it is not needed). - + Change math library to MathLib68K Fa(4i_8d).Lib. - + Change MSL C library to MSL C.68K Fa(4i_8d).Lib. - Note: The actual libraries used must match the CodeGen options in 68K Processor. - - ------------------------- - -Project Contents: - -MakeDefs.u should contain the following source files: - - src - objects.c - monst.c - util - makedefs.c - - -DgnComp.u should contain the following source files: - - src - alloc.c - sys:share - dgn_lex.c - dgn_yacc.c - util - dgn_main.c - panic.c - - -LevComp.u should contain the following source files: - - src - alloc.c - decl.c - drawing.c - monst.c - objects.c - sys:mac - macerrs.c - macfile.c - sys:share - lev_lex.c - lev_yacc.c - util - lev_main.c - panic.c - - -NetHack.u should contain the following source files: - - src - *.c [can do an add all] - sys:mac - *.c except mrecover.c - NetHack.rsrc - machelp.bh [for baloon help] - Sound.rsrc [if you wish to have a few, crude sounds] - Files.r [if you use DLB (on by default)] - sys:share - random.c - win:tty - *.c [can do an add all - termcap.c is not needed, but will compile to nothing] - - Note: src:monstr.c and src:vis_tab.c are created by MakeDefs -m and -s - respectively. - -Recover.u should contain the following source files: - - sys:mac - mrecover.c - mrecover.rsrc diff --git a/sys/mac/MacHelp b/sys/mac/MacHelp deleted file mode 100644 index 27946aea8..000000000 --- a/sys/mac/MacHelp +++ /dev/null @@ -1,158 +0,0 @@ - Macintosh-specific help file for NetHack 3.6 - -The following are options, features, or concerns specific to the -MacOS Classic port of NetHack. Bug reports, suggestions, comments, -and so on, should be addressed to: - - To: nethack-bugs@nethack.org - Subject: Mac NetHack 3.6 - -or you can use our on-line bug reporting form at - - http://www.nethack.org - -Please include your machine-type, system software version and other -relevant information (i.e. system extensions, monitor, accelerators -and so on). - - -=== Configuration of a playground - NetHack is packaged in a Dungeon Folder which includes: - NetHack - the application file itself. - NetHack Defaults - text file for default option settings. - License - licensing terms for nethack. - Guidebook - description of the game in long format. - Recover - the application to restore save files from crashed games. - Previous versions had a large number of data files in the Dungeon - Folder. These are now packaged as resources inside the application - file and will no longer appear in the Dungeon Folder. - - During play another file type appears: - Player level files (labelled "iName.n", i is a constant number, - Name is the player name and n is the dungeon level). - - Two other types of files will appear in the Dungeon Folder - as a result of playing NetHack: - Bones files (of previously deceased players). - Saved games (labelled "save/iName", i is a number, same as above, - and Name is the player name). - - The following files or file types may be thrown away: - logfile - if it becomes too large. A new one will be generated. - Player level files _not_ belonging to a game in progress. - Alternatively, these files may be processed by Recover, - which may be able to restore a save file from the level files. - Old bones files and saved games. - - -=== Resuming a saved game - Double-click (or open) the desired saved game file or open NetHack - and answer the "Who are you?" dialog with the player name of - the saved game in the Dungeon Folder. - - -=== Windows - The Dungeon Map and Message windows are the essential windows used - during window-mode play. During tty-mode play there is only one - window which displays the map, messages, lists and other info. - For window-mode play, lists (e.g. the list of objects that may - be wielded) and special info windows appear as needed. Windows - may be closed in the normal ways (i.e. clicking their close box, - choosing 'Close' from the File menu or typing the command - equivalent for 'Close', cmd-W) and the list windows may also be - dismissed by hitting the space bar (or Return or Enter Keys). - Hitting the ESCape key will dismiss special windows without - scrolling to the end. - - The command "Reposition" on the File menu may be used to restore the - the startup sizes and locations of the various windows. The - window positions are saved in a file labelled "NetHack Windows" - in the appropriate preferences folder. - - -=== Default options - The following options are specific to the Macintosh port: - background: - black or white - MACgraphics - use enhanced dungeon map symbols [TRUE] - page_wait - display --MORE-- after messages [TRUE] - - Default options may be set by editing the NetHack Defaults text - file (using SimpleText or your favorite editor). The following - notation is used: - - OPTIONS=name:Arnold,time,!tombstone - - It should also be mentioned here that there are two graphic - interface modes available: 'mac' and 'tty'. Choosing between - these interfaces is accomplished by the option: - window:mac - the default multi-window Macintosh(tm) interface. - window:tty - traditional Unix(tm)-style TTY window interface. - - See option help (?f or ?g) for more details. - - -=== Movement by mouse - The shape (direction) of the cursor over the Dungeon Map window, - typically, indicates the direction that you desire to move in when - the mouse is clicked. Modifier keys affect mouse-movement in the - same way that they affect keyboard movement. Clicking on yourself - means rest one turn and Shift-clicking on yourself means "open door" - in the subsequently indicated direction. - - -=== Sounds - Real sounds (resources) have been added for various instruments. - The option "silent" [FALSE] controls whether or not a sound will - be heard when an instrument is applied. - - -=== Explore and Debug Modes - As of version 3.1.2, you can enter Explore (aka Discover) mode or - Debug (aka Wizard) mode by choosing the appropriate entries on the - 'Mode' popup-menu section of the "Who are you?" startup dialog. - This same dialog allows you to specify your role, race, gender, - alignment, and name, of course. - - Starting in Explore mode is essentially the same as playing in - Regular mode except that if you are killed then you are given an - opportunity to override your death. Because of this advantage, - your Explore mode scores are not entered on the scoreboard record. - You also get a wand of wishing in your starting inventory and can - see your intrinsic abilities using the command ctl-X (also available - on the 'Explore' submenu on the File menu). - - Starting in Debug mode is only intended for developers and others - interested in characterizing bugs. Using this mode for other - purposes will have confusing results and eliminate your enjoyment - of the game! - - -=== Menus - As of version 3.1.2, the menus have been reworked to provide access - to all the NetHack commands and a special 'Kbd' menu was added to - facilitate play using only the mouse. In some cases, a command may - appear on more than one menu. In general, the commands have been - grouped to appear on an appropriate menu: - File - commands related to windows, start mode and play control. - Help - info commands generally not related to a specific game (i.e. - (key descriptions, version info, internal option editor). - Info - commands that are generally game-specific (i.e. inventory - related, describe features seen on the map or name things). - Equip - commands related to things you might wield or wear. - Act - commands for actions that you might do alone (i.e. wait, - jump) or do with another dungeon denizen (i.e. pay, chat). - Magic - commands for things that you might do with items (drop, - eat, read) or spell-related. - Bits - commands for things you might do to dungeon pieces (i.e. - open door, loot chest, engrave on the floor, climb stairs). - - The key related to a command generally appears to the left of the - menu entry for that command (i.e. w for wield and W for wear). A - leftmost # denotes an extended command (without a related key) and - a left cloverleaf or command symbol denotes a command that requires - either a control or command key modifier (i.e. holding down the - control or command key while hitting the related key). - - -=== -The members of the Macintosh NetHack port team hope you enjoy this game. diff --git a/sys/mac/NHDeflts b/sys/mac/NHDeflts deleted file mode 100644 index 02c66f0bb..000000000 --- a/sys/mac/NHDeflts +++ /dev/null @@ -1,161 +0,0 @@ -# NetHack 3.6 NHDeflts $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ -# Copyright (c) 2002 by Dean Luick, Mark Modrall, and Kevin Hugo -# NetHack may be freely redistributed. See license for details. -# -# Default settings for the Macintosh port of NetHack. -# Lines beginning with a `#' character are "comments" and are -# ignored all the way to the end of the line. Using this -# method, some of the lines below have been disabled so you -# can see an example without having those options actually -# set. Remove the `#' character to "uncomment" the line and -# allow those options to take effect. - - -### Display ### -# Uncomment for the traditional single-window tty interface -#OPTIONS=win:tty - -# Boulder symbol -#OPTIONS=boulder:0 - -# Color -OPTIONS=color - -# Fonts -#OPTIONS=font_map:NewHackFont,font_size_map:9 -#OPTIONS=font_menu:geneva,font_size_menu:9 -#OPTIONS=font_message:PSHackFont,font_size_message:9 -#OPTIONS=font_status:monaco,font_size_status:9 -#OPTIONS=font_text:geneva,font_size_text:9 - -# Don't make dark corridors look like lit corridors -OPTIONS=!lit_corridor - -# Enable sound and beeps -OPTIONS=sound,!silent - - -### Start-up and ending ### -# Don't display the game introduction and new feature list at start -#OPTIONS=!legacy,!news - -# Save game state periodically in case of crashes (recommended) -OPTIONS=checkpoint - -# How to prompt for things after death -#OPTIONS=disclose:+i na -v yg nc - -# Show tombstone and top scores at death -OPTIONS=tombstone,scores:10t/3a/o - -# Show top ten list in its own window -#OPTIONS=toptenwin - - -### User input and feedback ### -# Choose between menus or text prompts -# (traditional, combination, partial, or full) -OPTIONS=menustyle:full - -# Extended (`#') commands by menu -#OPTIONS=extmenu - -# Increase the number of message lines remembered -#OPTIONS=msghistory:60 - -# Enable the number pad keys -OPTIONS=number_pad - -# Pause for --more-- and make it boldface -OPTIONS=page_wait,standout - -# Ask for confirmation with the #pray command -OPTIONS=prayconfirm - -# Allow spacebar as rest command -#OPTIONS=rest_on_space - -# Display experience, score, and time on status line -OPTIONS=showexp,showscore,time - -# Turn off animations -#OPTIONS=!sparkle - -# Display a little more information with some commands -#OPTIONS=suppress_alert:3.3.0 -OPTIONS=verbose - - -### Character ### -# A Valkyrie... -#OPTIONS=name:Brunhilda,role:Val - -# The old way works, too: -#OPTIONS=name:Brunhilda-V - -# How about an Elven Ranger? -#OPTIONS=name:Silwa,role:Ranger,race:Elf,gender:Male - -# Always a human female -#OPTIONS=race:human,female - -# Or leave them commented out and the game will ask you - - -### Inventory ### -# Automatically dig if wielding a pick -#OPTIONS=autodig - -# Disable autopickup (toggle it with the `@' command) -#OPTIONS=!autopickup,pickup_types:$* - -# Automatically fill the quiver -#OPTIONS=autoquiver - -# Don't use fixed inventory letters -OPTIONS=!fixinv,perm_invent,sortpack - -# What you want to call slime molds -#OPTIONS=fruit:grape - -# Desired inventory display order -#OPTIONS=packorder:)[( - -# How much you're willing to carry without confirmation -#OPTIONS=pickup_burden:B - -# Put weapon in secondary slot when wielding another -#OPTIONS=pushweapon - - -### Pets ### -# What to call your starting pet, and its type -#OPTIONS=dogname:Quinn,catname:Vladimir,horsename:Silver,pettype:dog - -# Don't intentionally attack your pets -OPTIONS=confirm,!hilite_pet,safe_pet - - -### Unused options ### - -# Now obsolete -# -# background, large_font, popup_dialog, use_stone - -# Obsolete way to obtain reverse video; use at your own risk -#OPTIONS=palette:000/c22/2c2/ca0/22c/a2a/2aa/ccc/999/f00/0f0/dd0/00f/d0d/0dd/fff/999/444/622/62c/-222 - -# Options used in tty window mode, but not mac window mode -# -# menu_..., msg_window, timed_delay, use_inverse, vary_msgcount - -# Options used by other ports but not Macintosh: -# -# align_message, align_status, ascii_map, BIOS, checkspace, -# decgraphics, eight_bit_tty, ibmgraphics, ignintr, mail, -# map_mode, null, player_selection, preload_tiles, rawio, -# splash_screen, tiled_map, tile_..., videocolors, videoshades, -# windowcolors - - -# End-of-file diff --git a/sys/mac/NHrsrc.hqx b/sys/mac/NHrsrc.hqx deleted file mode 100644 index cc3db833f..000000000 --- a/sys/mac/NHrsrc.hqx +++ /dev/null @@ -1,991 +0,0 @@ -(This file must be converted with BinHex 4.0) -:$%jPG%KKBfXZFR0bB`"58e*$8P0&4!%!N!I4j"fk!*!%!3#3!mRS!!$)k!!!"r` -!N!30!"!!,3!`S!)!U!#3"4B!1!!R!1')'&0dE`a1CA4)B@0V,R*cFQ0UFfecFQ0 -PER4c+f036(0`F'pM!!"58e*$8P0&4!%!!&-"%!#3%V0,SqB!N!CM'`!!b!%`!!% -!N!J,Z3#3""8!N!AQ!9`!!3#3#!Zi!*!%&3"3!'i!qJ'i!!%!N!J(e!#3""8!8!" -Z!2S"Z!!"!*!)"p-!N!39!&!!EJ$k!EJ!!3#3#!I5!*!%&3"3!'i!qJ'i!*!$(!% -)!!J"5J$`!*!+"dePFh0KCf8i#J#3!a`",J!%!9)"bJ#3#JC6G'&dGA0V1!S!N!- -@!(`!fJ$i!BS!N!3"!*!'66J+!*!$'J#q!!B"8!%b!*!%!3#3"34*EQC[)$J+!*! -$)J!S!#J!M!#L!*!%!3#3"3e1G@aX)>EQ4[Gb!K1!S!N!-m$NjeE@*PFL"[CL" -VCAPc6d019!8UN!9-8e4$"dYPH@0[C'9)3PP8"%0SBA*$5%&5"5U3"8a69%8!N!- -J!#J!+!&+!Hi!N!S,4(9ZCf9[EL"0BA!i#J#3!b!!+!!S!+`"c!#3"!%!N!8,4'P -KCfj[Fh4TBh-i#J#3!aB!!400B@-J6Q9d5'&MDb")C@a`b5mr!*!$J!#3#`rr!*! -%r`$a!I!!N!2lm!m3(`#3!`qr$`%"m!#3!r[r%"$`!!$`$lrrmI!!$`rrqr!2!!! -2%"$r[`#3!`m"!I$lm!#3!r!3m!qr!*!$$`%2!2[`!*!$rr!!$lm!N!Ilm!#3"Jq -r!*!(r`#3!i!!rj!%m!#3!r!!N!2r!*!$m!#3!rc`!!$`!*!$rrm!!2!!N!32!!$ -`$r!!!!m!!2$rr`!!$`!!m2rr$rm2!!$`$r!!!!m!!2!!N!32!!$`$r!!!!m!!2$ -`$`r`$`!!m2!2!!!2!!$`$r!!!!m!!2!!N!32!!$rN!B!N!4!!!!"`$)J14!G#!m -)*qKIN!"$`%,J)R!41!iF!!i!"`!$!!!"`$2J1I!Gq!ri*rKrN!"r`(lJ2R!I1!i -F!!i!"`!$!*!$3$rJ)$!J+#!m)!3Q"#m%,h3Q"#!%*J3TC#N%*J3J"$rm2q!rm$r -i2r`rr$rm2r`rr$rm2r`rr$rm2r`rr$rm2r`!!!%!N!B2J!!!-'!!%#!3!"`3#!! -1%!J!$a!%!!H3!!3!!r!%!!(J"!!!m!3!-2[N!%mq'!"!(J!!3!m!!%!2J!"!%m! -!3"(J!#!3m!!J%(J!%!Jm!!`B(J!$i!m!N!-(J!!!!m!!!!(J!*!$m!#3!hJ!N!- -m!*!$(J#3!`i!N!-%!*!&$i!!!$rJ!"!rm!!F(rJ!$Kri!!mIr!!(Rr`!!rrm!!( -rr!!!rr`!-2rm!(rq'!"rrJ!!Irm!!(rrJ!"rmm!!Ir(J!$r`m!!rm(J!(rJm!!r -i(J!$i!m!N!-(J!!!!m!!!!(J!*!$m!#3!hJ!N!-m!*!$(J#3!`i!N!-%!!!"!!r -rr!!)!!B!#!i&!!Q4")!*b)4!#1K%)!Ki4r!*2d!3#[b!%!SH!"!+&`!3#41!%!L -*`"!)F1!3#!"`%!J!1"!)!"J3#'!!%!L3!!!3#@J!%!PTrK!)N!!!%!KJ!"!)!!! -3#'!!%!L3!!!3#3J!%!N*[j!!#*!!!"!)B!!3#!!!%!rrrr!2rr`!$rrq!!rrr`! -2rrq!$rrr`!rrrq!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr! -2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr! -2rrr`$rrrm!rrrr!2rrr`$rrrm!!!!J#3&rrrm!#3$2m3%"r`!*!($`#3!r%"N!- -2!*!($rm!!!m3N!6`!*!(qr!!$`'3"2!!N!Il[`!2%*!%(`#3"`qlm!m"N!32!*! -)qlrr%*!%(`#3#!qlm3'3"!m!N!Rl[a#3""m!N!Er!!$rZr(rrr%2!*!&$a$rra$ -l[r!!$r!!N!82!C!%$l[`!*!)$a#3"IZr!*!)$`'3"Iqlm!#3"`m3N!3I!2Zr!*! -($`'3"!m!$l[`!*!(m"#3!am!!2Zr!*!(m3'3!`m!!!qlm!#3"Jm3N!6`!!$l[`# -3"rm"!3r`!!!2Zr!!N!Irrr!!N!6l[`#3$Jqlm!#3$[Zr!*!1$l[`!*!1qlm!N!i -2Zr!!N!ll[`#3$Jqlm!#3$[[`!*!1$`#3!`)!N!2rN!N!N!I`!*!($r!!N!E`!*! -$rr!!!!r2!*!'m!r`$a!I!!!2c2!!N!A`$lm!m3(`!!r-c`#3"I!!qr$`%"m!$mc --m!#3"2!!$lra!3m!$rq3!`#3"2!2!2[rram!N!32!*!%m2$rrlm!m!#3"!m!N!6 -`m3%2qr!!N!82!*!%m2!3(`qr!*!&$`#3"2!2!3m!qr!!N!32!*!%m!$`%2!2[`# -3"!m!N!6`!!rr!!$lm!#3!`m!N!6`!*!&$lm!N!-2!*!%m!#3"[[`!!!2!*!%m!# -3"Jr`!!!2!*!%m!!2m!#3"`m!N!6`!2!2!*!($`#3"2!2$r$`!*!'$`#3"2!2$r$ -`$rq3!r!!$`#3"2!!m!m!N!F2!*!%m!!2m!#3"`m!N!6`!*!+$`#3"2!!$r!!N!F -2!*!%m!$`$`#3"`m!N!6`$`!!m!#3"Jm!N!6`$`!!m!r`rj!$m!m!N!6`!2!2!*! -($`#3"2!!$r!!N!F2!*!%m!#3#Jm!N!6rN!`!N!8-!&S!EJ$Z!C)!J84%!*!$6!! -#!*!&H!$'!)S"%!3#6dX!N!8+!%B!F`%3L"a$Eh9XC#"ZEh3JAM)JBQ9MBA9cC5" -H-#iJ)&ia!*!&#J!8!#S!0+!#!*!%!3!2rr`!#!!'!!J1"3!*N35!#FL%3!MS4#! -)H%I`#6p!%!VmJ"!+(J!3#KF!%!N6J"!)LF!3#($J%!J!F"!)!$J3#!!B%!Q8aP! -+95P3#P8T8!T9+9!+95P3#C6'8!J!!"!+C6'3!!U95P!+P8T3#T9+8!U95P!+C6' -3!!J!!"!2rrr`$rrm!!rrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrr!2rrr`$rr -rm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rr -rm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!!N!0!2q! -J-#!S)$`J"#5N+U3UT#5N)!3T*#UN+U3T*#!%2r`ri$r`2rJrr$rm2r`rr$rm2r` -rr$rm2r`rr$rm2r`rr!!!!J#3!rq3#3#3"r!!N!F2m!#3"[!!N!2rm!!!$mm!N!E -`$r!2%"m!!!r-m!#3"I!2[`$a!I!!$mc2!*!&m!$lm2!3(`!2c-c`!*!%m!!2[r% -"$`!2rj!$!*!%m!m!qrrr(`#3"!m!N!6`m2rr[`$`!*!%$`#3"2$a!3rlm!#3"3m -!N!6`m"!I$lm!N!82!*!%m!m"$`$lm!#3"!m!N!6`!2!3m!qr!*!%$`#3"2!!$rm -!!2[`!*!$$`#3"2!!N!82[`#3!`m!N!6`!*!'qr!!!!m!N!6`!*!'$r!!!!m!N!6 -`$r!2$`$r!!r`$`m!N!6`m!q3"!$`m!q3!`#3"2$`$j!%!2$`$j!$!*!%m2!2N!3 -!m2!2N!-!N!6`m!q3"!$`m!q3!`#3"2!2m!m2!2m!$r!2$`#3"2!!N!S2!*!%m2! -2m!m2!2m!$r!2!*!%m*!$$j!%!2$`$`m!N!6`N!-2N!3!m2!2$`#3"2#3!`q3"!$ -`m!m2!*!%m*!$$j!%!2$`$`m!N!6`m!r`$`m!r`!2m!m!N!6`!*!+$`#3"2q3$!# -3"5)!!3#3"9!"4!"N!Ai%!Np,!*!&"J!i!%B"I)J#AM!!N!1!!2q3"2!!N!2`!*! -$r`#3!r!!N!2mm!!!m!#3!rrr!!$`!*!%$`!!m!m!m2!2!!$`N!82!!$`N!82!!$ -`$`$`m!m!!2!!N!32!!$`m!m!m!m!!2#3"3m!!2#3"3m!!2$`$`$`$`!!m!#3"!m -!!2q3"J#3!`Q)N!!!N!6q!!B!!2rh!!B!#`1l!!N!!J#3!cm!N$2B!*!'&%%!N!8 -T3!!!-!!!'J!!!KK!"@YBL8!(i$P%))"!"*A!F"`"`K3!&3!8))r!rr!"q!#3!h1 -!)!#3"5!!!!jJ!3!3!*![F!"3L!)B"!%#J+)!"!))J!!!B!"")K0X!!!#+)!!!IL -*3!@J+83JJ%!%P8"3&!&#&!!9!"3JMm$rm!d)!*!$*%"3![2!!!3J!`!*N!!'e6R -X6#!!"FZF,l[ZF!!1Flc[Iqk2$'%BZmlc[aM'-ImD!J3!%"JK--!!N!-#!*!%UDl -j&+%N#P#YA1q"kP%846SJP(a#4#@Ll%!#55!&DeL*3!@J+83JJ%!%P8"3&!&#&!! -9!"3JMm$rm"-!2J!fG&a!"I`J%KSJ")!*)26IeV+5U3!'2'*S3$'))*'-BaM#%BS --SEc'-Ba*'-94$3d""!!3)#!33!#3!`)!N!5UdIJ!!"J!N!-M'!+!!*!$4L5#SN! -!!$-b!!+U!!!"q)P!"D!T4##!3!593&!8!8)8!"8!&##2`2r`)`!5!!QXBL!pr$q -4+L3-Z$P!PB95e#&a!!TS3Upi-BeI3HaM#-)3LJdK@XBaM!NBa*%8L!"rR2Gcr6* -pChRfImBeM(kS%&1Hplh1Fj*M'$U1Fk-BaLlRiZI1MDXb3!&9B!9V@2P"rErTI## -!3!6eIprhrhq9q"Ai&IL2`2rhC3I)r)L[iZh,r#"mb#"cI#RqPiqj5#'[ciUSM5$ -%6SL!)Urp#2[6qJiK'FI4miNBa)SNL!#-BaLNBc4VQ-BjJNBe9%8%%&4M'-BaM&* -rreI4M'-BaM@"2%M4MQEXMriCDC!!!Iq2IM'aMmIrN!5A-``c$#"q"rmRrLIrN!2 -iT3+&&)LXBaV,r$q4+$q)I%!1N!#&&E8K)3!6+32`a*&iAd6dB`M#%BU0)4M'%BK -*'05%4%J!M'%IT'-mDaM'-(*'054)U""hiaM'(rr5BaKqNBaM'-BdKq4)dBaL!3J -%)I*0DeMj5rfpq$a!!N!%pIIrGrprJIP"r4Ai6rrm#+-#L45)G'-Gdr`J%KJJF(p -!$T!!!&Db%J%!%LSL+-54###!K'-B`K'+M+%BaK'-549Y4)4)!*aK'#4M-QXBaM! -+69988+J4*#FjcK#%%Q-B8T'-CcM'0BNZ5G'FBrmB"%"b5!(iL8SPT3!!3!*!"*3 -8!93"3!!K3#88)%rrr!LM!T-8L#49%&2m2i!)*)!iJ!#3!)!k63`!%'(2h#FiMR8 -!"(4mlhi1Mh4r',S1LiML4L6q12a[R[HMic&V&hR`mE5+LrkS$L2DeVA[Hp*M(pl -ZFjVAZFla*%E1E')!i!"`DC9V@)P+*D8!!%!#3!58&!&8!8!!)8!P&#"2rr`(E3+ -qjdKcYZ!pr#"rq5!!!)!!m!!3!*!$%#!!N!8"!*!-!3#3"L!!N!9!)!!!3#!!N!4 -!F!*`!*!$J!#3#B!%!!C!!*!*!IL*5L@P!!"!!N!%P"3"9!&!!#&!*43J6rrm!#! -!!!3!N!3Krq!!#5!!N!SJ!*!'!J#3'!1!`!!!3#!!N!-$J!!%!*!$!3#3#3F!N!- -"J!#3#!9V@)P+*qF!!%!#3!58(!(F!F!!)8!P&#"2rr`!N!3%!*!%3!#3!`M!!*" -+!3!%!!N!$J!6!"J!'J!G!#!!*3!U!#`!-3!b!$B!1`!p!%)!4`"-!&%!9J"E!'! -!C3"Q!'J!D`"`!(-!H!"p!))!K`#-!*%!PJ#E!+!!T3#S!+d!XJ#h!,`!`3$'!-X -!d!$9!0S!h`$N!1N!lJ$c!2J!r3$r!3-""3%)!3i"%!%9!4S"(`%N!5N",3%b!6F -"1!%l!8!"3J&(!8`"83&@!9X"B!&P!@N"EJ&c!AJ"I3'#!BF"LJ',!Bi"N`'6!CJ -"R3'L!DF"V!'a!EB"Z`(!!F8"bJ(0!G!"dJ(A!G`"i3(Q!HX"m!(e!IS"r`)%!JN -#$J)6!KJ#(3)L!LF#,!)a!M-#1!)p!N)#4`*,!Nm#9!*C!Pi#C!*U!QX#F!*e!RS -#I`+%!S8#L3+0!T)#P`+E!U!#S`+S!Ud#XJ+f!VS#[3,$!XN#c!,5!YJ#f`,I!Z- -#j`,Y![-#p`,p!j!$#3-2!a8$'`-I!b)$*3-T!bm$03-j!c`$3J0)!dX$6J08!eS -$A`0P!fS$E`0e!hS$J!1&!iS$M`18!jN$R`1P!kX$X31f!lN$[!1r!m-$b!20!p% -$eJ2A!p`$i!2N!qF$l3!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B -!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!D3!`)'!3B!"J!'!!B!"J)'!3B -#"J!'!!B""J!'!JB""J!'!JB!"J!'!!B!"J!'!!B!"J!'!JB""J%'!!B""J!'!!B -!"J!'!!B!"J!'!!B!"J!'!3B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B -!"J!'!JB""J)'!3B!"J%'!!B!"J!'!!B!"J%'!!B!"J)'!!B!"J%'!!B!"J!'!!B -!"J!'!!B""J!'!!B!"J!'!!B!"J)'!JB""J!'!*!$"J!'!!B!"J!'!!B!"J!'!!B -!"J!'!3B""J%'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B -#"J!'!!B!"J!'!3B""J!'!!B!"J!'!!B$"J!'!!B!"J!'!!B$"J!'!!B!"J!'!!B -!"J)'!!B!"J!'!!B!"J-'!!B!"J-'!!B!"J-'!JB#"J)'!!B!"J)'!!B!"J!'!!B -!"J!'!JB$"J-'!JB!"J!'!!B$"J!'!!B!"J-'!!B!"J!'!!B!"J!'!!B!"J!'!!B -!"J!'!!B!"J!'!!B!"J!'!!B""J%'!`B!"J!'!!B""J!'!JB!"J!'!!B""J!'rrm -!!![HN!!!N!6r!!F!!2rp!!F!$`6P!!`!!`#3!d)!N$`i!*!-"S!!N!99UeBL8!( -i$P%)%!)!#)T`"`"`!F%&!!#N!!S)%2i$rrJ!N!dJ!*"!"84!!*!%#P!!!!`!!!X -!N!-JJ!!!!IiL8!&S#P%)%!)!#)T3"3"3!8%&!!#N!!S)%2i$rrJ!N!N$`!!!)!! -!#Q!!!"!!$!#3(("`!*!3(!#3"!B!N!4%J!#3#"!!N!BJJ!"9UeBL8!&S#P%)%!) -!#)T3"3"3!8%&!!#N!!S)%2i$rrJ!N!8i!"J!p#!!!#!!!!f3!!$915a5)!!#jFi -AcIFi!!(!1mlhrZM`aK',[1mlmBaM(mJ5!)%!"!B)6!#3#5TVJ#)!L3%!J+Fli(X -!JL!1L!dI%%L%f,h%!#++!!!"rL*3!@J+83J3!J!)LP!&!&!"338!!+3!#JJ3rJ2 -rq!li2J!!%FiJ!I`J!#!J!`!j)(hIeV*5U!!$(M%d%"M%##)J4M'-)4LJbKZ-BaM -%NBaM%-J9!%%!"!J)6$!!N!5!!*!$+V4845K*!T4,@-B!T*4&%9')%+L3!*%*D-B -N!#55!&@V9L*3!@J+83J3!J!)LP!&!&!"338!!+3!#JJ3rJ2rq"&))J!ENM%J"I` -J"%`J")!T6d698Y*KF3!&&#&8)"M%%"![4M'-)3LJdKA-BaM!NBaM%-3BJ!%!"!J -)""!!N!5!!*!$+J4!!!!'!*!$#-B!S!#3!a'*%IL3!!!!$-BJ!!JJ!!!"rL*3!@J -+83J3!J!)LP!&!&!"338!!+3!#JJ3rJ2rqh&!%!!N1M%3"I`r)T)N")!Trd5&-G3 -KF3!&0#DA[#G'TmK3ap#-)3LJiK'XBaM!NBa9%833!"rR2Gcr6*pjhRfGdBeM(kS -%)ZHplh1Fj*M'$U1Fk-BaLj!!5,RcSfV'*!!@5PT9UeBq8(p[qPm)%!)!#2TIrIr -IrhrP2i#Rq!Tr%2i$rrb54mMm4%BaH"hm)#&5)%Xi)!p%MjL))Dr!#94"q'*)aX! -%P[i`MldrS-)4R(dI1*'-5+*#%!!M'-BT'-dDaM'1BT'094&*"#-BaM'-Ba5BapA -mBaM'-Bejra)dBjQpa2rTQU8!!IrMhiaXBr(rN!@,aM"JaJ`3(m"rr%IrL2q3"2b -53S8N4%IaMZ[m2rS`2l"m)!p%K498)5%2LC5"%'*)[#I)PXB`M#%BS1)4M'%BK*' --9%4#%!!M'%IT'-iDaM'-A*'054)U"#2iaM'(rr5IrKHNBaM'-Bd35")dBaL!#)" -"+d,9UeBq8[p[IJm3!#)!#2Tqrr[IrhrJ2j3(r3Tr#2rrr!0a3SNN4%BaM@[m)#3 -4)%Kq)!p%!"@bS3%!%48"%'*)K"!3&mB`M#%BU0)4M'%BK*'0BNK"%!!M'%B*'-d -DaM'-!T'0543U"#-)aM'%)35BaK5NBaM'-Bd554)dBaMrm)"#Id+!!IiL8SPT3!! -3!#)!#)S#J!T3!8!!""3!43S)#2rrr!!43T%N4%BUMZ[m2b$a*,"pS!p%J&Da%J! -384B4&'*)LSJJN!"'-B`K'+M+%BaK'-549Z*)34!!*aM'+4M-QXBaM#+6998B+J4 -R'FjcM'%8Q-B9T'-CcM'08NZ5G'FBJ"%!"!UP9DY@)P+*D8!!%!!L!!L+!S!+8!& -!!!38!%8+#!Mrrr`!%8+M*-3k+SJVr#!(%-!!1'!!4)!k6T)!%'$RlK1F4c+!!)p -(c[IJk2G(mBZJk,L1*'*2`*!!Ia[R2FMic&V&hR`FE5+LrkS$QZDeVA1Hj*M(lVZ -FjVAZFla*%E1E')!1!!m+@J!"rL*5L@P!!"!!)J!)LJ+!#P!"3!!%&!"&#JJ)rrr -m!"C#[XG#%GY`(IrJq"!!N!-J!(d!%!!-!"!J!*!'J!#3$%!!N!9`m!#3"4!)!!! -3#!#3""!F!3#3"#!!N!NJ!3!"%!#3#9@V9L*5L@P!!"!!)J!)LJ+!#P!"3!!%&!" -&#JJ)rrrm!"!!!!3!%!!!%IJ!!"!!N!XJ!*!'!3#3$5!!N!X"%!J!!"!)!*!$!4! -!!3#3"#!!N!NJ!!!"i!#3#J(q)P+*D8!!%!!L!!L+!S!+8!&!!!38!%8+#!Mrrr` -!N!3%!$J!!"!!N!-3!*!Yi$!!N!MJ!!)!N!4!!*!)!F!!N!e9UeBL8SRj`!!3!#) -!#)S$J!j`!F!!""3!43S)#2rrr!#3$4!!N%X"!!3!#3!1!"-!'3!D!"d!)!!P!#S -!,!!a!$)!0`!m!$i!3`")!%d!8J"A!&`!B3"Q!'F!D3"Y!()!GJ"l!)%!KJ#,!*! -!!*8!QJ#I!+3!U3#X!,%!YJ#l!-!!a3$+!-m!e!$C!0i!i`$S!1d!mJ$h!2`"N!- -%!3N"$!%4!4J"'J%I!53"+3%Z!6-"0`%m!8%"3J&&!8S"6!&4!9B"@`&J!@8"DJ& -[!A-"H!&p!B)"K`'-!C%"P!'9!CJ"R3'G!D)"T`'X!E%"YJ'l!F!"a3(+!Fm"e!( -A!GS"h!(K!HB"k`(`!I8"qJ(r!J3##3)1!K-#'!)G!L)#*`)X!M%#0J)l!Md#3J* -(!N`#83*@!PX#B!*P!QS#F!*f!RF#I!+"!SJ#M`+@!TF#Q`+I!U3#U3+Y!V)#Y3+ -k!Vm#a!,)!X`#d!,A!Yi#iJ,T![!#p!,j![i$N!-+!a%$&J-G!b3$+`-b!cN$3!0 -&!dN$6305!eN$B!0N!fJ$E`0f!hS$IJ1&!iX$N!!$P31D!jm$T31U!l%$YJ1l!m! -$a32+!mm$e32E!q!$j32S!qX$l`2c!rJ$r33""!B%"`3-""!%&!3B""J%(`!(!!F -!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F -!"`!(!!F!"`!(!!F!"`-(!JF""`%(!3F!"`-(!JF#"`%(!3F#"`%(!`F""`%(!JF -""`%(!3F""`%(!3F""`%(!`F#"`%(!3F#"`%(!!F""`%(!3F""`%(!3F""`%(!JF -""`%(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!JF""`)(!3F!"`-(!3F -""`%(!3F""`)(!3F""`-(!3F""`)(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F -""`)(!`F#"`%(!!!""`%(!3F""`%(!3F""`%(!3F""`%(!JF#"`)(!3F""`%(!3F -""`%(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F$"`%(!3F""`%(!3F""`%(!3F -""`%(!3F$"`%(!3F!"`!(!!F$"`!(!!F!"`!(!!F!"`)(!!F!"`!(!!F!"`-(!!F -!"`-(!!F!"`-(!JF#"`)(!!F!"`)(!!F!"`!(!!F!"`!(!JF$"`-(!JF!"`!(!!F -$"`!(!!F!"`-(!!F""`%(!3F""`%(!3F""`!(!3F""`%(!3F""`%(!3F""`%(!3F -#"`)(!`F!"`%(!3F""`%(!`F""`!(!!F""`!"!!Irr`#3!d)!m!#A!*![!3!"!!N -!!%Z*!!`!!%Z-!*!$&J!+@APEDeae9QKAEeKX8f*8DP9Z8L`!N!-@!!TC@9Y,A&9 -@5&G[@%a63P4+98j5,!#3!d*J!!#B!*![!3!"!!N!!$J*!!`!!$J-!!!)`T!!!*! -%l`!+!!$rpJ!+!!`$C`!+!!)!N!-d!*!a!i"0!*!G(i(!!*!'F"`(!(!!N$T83*C -5J!!"J!#3%J+J!*!%&S&!!*!%J!"3&!8!8!#3#383!-$!!!#!!*!A!FB!N!i$J!1 -!!!!*#"C!N3'3!&*%"54!6!!i!!(Ki!#3#4D"6J#3!`d!!&!8"3"3!!&93!!!$c` -!hlRp*58!!,PhaI0pcJ!"MK21jrZM$')1AHGjhiaJaMp#J))!3-)6'!#3!`3!N!- -&65%GqA43P@Q"#UCYT#UD3URb3d32FK)ALd!qGU!!L$2rP[P4!!#J#3!!9j3&!&! -!!TC!)N!I`rM99NP'%K!"4iL0"!Ba""*4%M'84'--SajM'-BNM'$')b0!3J""!J% -)!*!$"!#3!`9@)5-CM%!!N!Y5j%(9MFc+h!43L!3N9)NTGXpJJ$3!%35!A2B&JGJ -!!UU)8!qI``L2dP##(j!!!88*&HJ+-D[SCUS`M%3M$5+YBaM'")a9+88L!"ZCfjq -h,fjZHhmaJaRe3(+K&BaGhGhCQC[fjQCQQCP09$[eM5d+U$j3QU4#r*5*4ZaJ[NL -J%lL%cF2mr`YJ!*!$LM"I``L&1EP5%Rcb441N(`R2%!5UUp#2G2m1)NeMk2R%LT8 -3L4)!"QCP*P0-QCQFK5T8U5JJFU(9M'D3"@95QC!&38j(pEA0#SJ)r+JIJ55N5AD -[i-PC2k&&5Aer$F2FN!!!!$m'-2r$#)!8CL)9%!*&)(iBNL%,k5Vq-)a%BidL$1- -)d#5+LLL4%J!HBRdQ8ibCQCKP+P4*48$ri41-CT!$Brrp8TQ3"3&81qq0,-J!2T! -!bU4#r+5*&UJ46fSLS6P5"3(GIP6rr!!!LM"r``J!9+C5%"!%484&'*)L""!R4M' -84'1-SJcM#XSNL3T%N3S!*QCK*P0-QCQB&53SUB9!M'-6M'D3"#)K8TQ3"3$NKF@ -+%K!!%4#)"#3NT5N@U!T)5Q*"3LN&!&8!9)!!!!K5,jr$#)!j'BNJ!3`jqi6R%Fb -J!4"(cZI$Sh4q$&d(4F4a#N5I#MmIQGNH8bbCERMLj#NAp8#-AI&cRGhGfGQG8TC -QCRGh!%p%"E(Ki!!"(h+rrbGEk4Di'ckaS%%$j)F!93"6i!#3!b(SRm2i!"!!!-! -"!*!()!!1!*!*!3#3"3''!*!%"!)!!!J3!*!$!31!!!J!N!8)!*!+1!#3#J3!!"q -!!*!%!3#3"&F!F!#3"5!IrJ#3"J)!N!G!!*!A'!`!!!J3!*!$"J#3!a!!N!83!*! -9"!#3#!)!N!4`!*!'!F!!N%J"!!3!#3!1!"B!(3!H!#%!*!!T!#i!-!!d!$8!13! -q!%!!43"+!%m!9!"C!&i!B`"S!'N!D`"Z!(-!GJ"k!)%!KJ#,!*!!!*8!Q3#G!+) -!T`#S!+d!XJ#f!,d!`J$(!-`!d3$@!0X!i!$P!1S!m3$f!2X!r`'3!`8""`%+!4! -"%J%@!4S"(J%L!5B"+J%Z!6)"0!%h!6X"23&%!8J"6!&3!93"@!&F!9m"B`&S!@m -"G!&i!A`"I`'!!B-"L!')!Bd"NJ'A!CX"S!'P!DS"VJ'b!EB"ZJ'q!F)"aJ(+!Fi -"dJ(@!GJ"fJ(G!H!"j!(S!H`"m!(d!IJ"r!)!!J3##!),!Jm#&!)C!Ki#)`)S!Ld -#03)p!N8#4`*+!Nm#9`*H!Q-#D!*X!R!#G3*k!Ri#J`+*!Si#N3+9!TS#S3+S!Ui -#XJ+c!VF#[J,"!XB#b`,4!Y8#f3,I!Z8#k3,[![8#r!-!!`B$#J-1!a!$%J-A!ai -$)`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-a!cF -$2J#3$2q3"JB'rj!'!!$rN"`!"rq3"J-$!3-""3%(!!B!#3!)!3-!"!!%!3F!"J% -%!!8"!`%'!!B""J!'!!B!"J!'!!B!"J!'!!B#"!%%!38!"J%&!3B!#!%(!!B!"J! -'!!8!"3!'!!B"!`!'!!B!"3!)!!B!"J!'!!B!"J!'!!B!"J!'!!J!"J!'!!8""!% -'!33!"!!'!!-!"3!&!!8!"3!&!!3!"3!&!!-!"!!&!!-!#!!&!!8!"3!&!!8!"3! -%!!8!"J!)!!B!"J!&!!3!!J!%!!B!N!-'!3F!"J!&!!B!"J!'!!8!"3!&!!8!"3! -&!!8!"3!&!!8!"3!$!!-!"!!%!!8!"3!&!!8!"3!&!!8!"3!&!!8!"!!&!!B!"J! -'!!B!"J!'!!N!#3!*!33!"!!'!!N!"`%+!!B!"3!&!!B!"J!&!!B!"`-)!J8""3! -&!!J"#3!'!3B"!`!&!!J""3!'!3F!#!!)!3J!"J!(!`F!"J!*!!J!"3!(!3F#"`% -%!33!"J!)!!B!#Iq3+!!'!!B!"`#3"!XQN!!!N!6[!!m!!2rd!!m!$`5C!!`!!`! -"!$i!N$Y`!6)!N!3'!*!@!93!N!8IJ1!!N!S1!$J!N!X&!*!k+)J#6**!!!!*!*! -G&S#J!*!($RcJ#J!S!*!)m!!!"3!%!!!`!!!%!*!G"``!N"%(!!#)!*!$"#%!f3# -))"N'L33$4))"!*!,!93!N!8@r+!!N!3-!!!+4+!+!#J!!!P+J!!$!I[!!!A46Rj -K55!!"-6[`Ajhlc`!!2!!MjlcrhSB--)1,hchchq'$!Bar38!3)!#!`36$!#3"!) -!N!3+Q4"alq,d+"+9CJ%%8UEE%)T9L%8VX!ai!mi!!(4D!(jk!!!4!-rrPX5RJ!! -%J!L!!!TFS!S!+!!!%Nb!"%B"r#r`"GIeNT&)`!!*,4#$3)!``J!"#H#)BBS3KKJ -a3ai`````L)B-"M%-KS!JJ!)%"!%%!*!%!J#3"!UQ%#)BB``J!*!0!8N5K!94(Ki -Qi!#JK93!#J!N84EdU%!!N!-4!#!+8+!+!#J!!"+9!%!-!I`S%!@#P*5JKr)!#KB -4"8%!8-)%%3S45'#'%))B-N+Y-----!L'$%94&)3!$[1HlRfh&XeRHIGh4M%BaqU -!+&))8``ZFjcR1FjcT5XjcR1M'-9,N!#"k9%K)59!!+#-!)5I4")4&T5`,Z1NJ"% -!)!T3TrS!+1i!N!-3T&rer#J3"Br-D%#%`J!5&"-*II"23dJ)&1P2S)B3JKJd3Nd -`````#)8558S84!!4M'-8MP-R-jM'1)T'-4M%+S!S8JK6$$'-BaM'-BaP,-BaM'- -Ba693HrP5A-bN3"%JP95)4%4a%ADAX$%84)!MXP!+8+3EJ1m4!*!$!44rrI`S%!@ -&"K#JK5qI%K3JN3-)N!$#%q3P+LKJKpkIq$K#$,$p$mm)K4+SLL4%!!q-)a5-8dB -M'-B`JNBUT8453%5+$dX-,h[Hpm)aM'8SaM'-BaM%"6L(q9&5d)!"qIbN!r!r4*! -!N8D@-#m8b2`K6&#Edlpiri-4!*!$IJarqI`S%!@!"5d8K!)!)K4!B3-)N!#q)!* -&+LKJKK#''$4#$,$"$3#)K++T4%3N!"'-)r5-8iBM'-B`FN9+SN5+J%5+#%X--Ba -M'-2rrq8SaM'-BaM%"4#(p9$Fd)!!)L$&9)K%44%4GTIS8I93KN%!L5M5#8["lar -ri!!#$%2jr#J3"B!&8`L%!J!L&)"rJ`N3JK!%42IiB)B3KK`b3Ja``3b!L)5K%84 -%*!!4M#-%M&0')aM'-!T&4%9&#S$rrJK($$'-BaM#%)3P+-BaM'-Ba!83Hr23dXb -!!%)JK!#%K%85%4D8#&%'8B9"-ST2mrP+IbN3!*!$%44'(r`S%!8!&C-85!!!358 -)J8-*%)3,k!)%'''+%)BF-8)-F-%X8)L%34)NK"3!%BaM&)a6*L-BaM#+6)4)aJU -!J`BB4``aM'-BaM'-C5M'-BaR1F`&83AK85%K!!(m)B98!!4&*&%@R!54&&'!J8d -&)!!"5J!T%3#3"+4)!I`S%!@!$ScL5!!J`-Ih!6ca$cP%%%(%(jlcm(SEd2i-,d$ -d,`Ki34)Nr"4rMr1Hj(a6&L-AHI"aY)4)[qU!J`A[`[22HplhZFjcT5LjcR1DeV3 -$[S3"GKiH!!#%2RJ$rq4kcp%@J!c1kik!J3(mN!!!!8S!+1i!N!4$`!(m,r!&!!3 -!!$!!)!#3#%!!N!i)!*!'"J`!N!8)!J#3!d!J!*!%"!F!N!0!!*!'%!#3#J%!H!# -3#!&8!!"!!!!@J!#3"3%!N!3"5J!S!*!'3!!(i!!&!*!'3!#3#)!!N"b)!J#3!d! -J!*!%4!#3"#!!N!BJ!*!CJ!!!&S!!N!8"!*!%!FS!+!#3"34!!*!%"3#3,(!-!*! -*1!#3"%!!N"`"9!#3"4q!!*!&!J#3"3i!1!#3"31!!*!%"3#343%!"!!,!"!!&`! -I!#!!)`!Q!#`!-3!c!$J!13!q!%3!4J"-!&)!@3"I!'8!D`"a!(F!H!"k!(i!J`# -(!)d!P3#F!+)!U!#Z!,-!Z!#q!-3!a3$,!0%!eJ$G!1-!k3$[!28!q`'3!`J"$J% -9!4i")`%S!5d",`%d!6B"13&"!8-"5!&0!9)"9`&F!@!"C3&U!@`"E`&d!AB"I`' -%!BN"MJ'6!CJ"R3'K!DB"U`'d!EN"[J($!FB"a`(+!G!"d!(A!Gi"j!(T!Hm"p3( -l!J!#"3)+!Jm#&!)C!Ki#)`)S!Ld#-J)d!MB#13)m!N%#4J*,!P!#93*D!Pm#C!* -T!Qi#F3*e!RS#J!+'!S`#NJ+C!U%#U3+b!V3#Y`+p!XF#c`,@!YX#h`,M!ZJ#l`, -d![S$!3-'!`N$$J-6!aX$*!-V!c!$-3-f!ci$330(!di$9!0C!ei$C30X!h%$H!0 -r!iJ$M!16!jJ$R31I!k%$TJ1Y!l)$[`1r!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`1 -r!lm$[`1r!lm$[`1r!lm$a32,!p8!!2rr!*!)rj!'#!MrN!B!!2q3*!3%!3-""3% -*!3F"#3!*!3-""3%&!3J""`%%!3F"!`%(!3J$#!%)!3J"#!%)!3J"#!%)!3J"!`% -%!3B""`%'!3J"#J%*!3J"#!%)!3F""`%)!3J#"3!(!3J""`%*!3J"#!%)!3J"#!% -)!!J"#!%*!3X""`%(!3F""!%(!33""!!)!33""`%(!3F""`%(!3B""`%(!38""J% -(!38"#`%(!3F""`%(!3B""`%'!3F""`%,!3F""`%(!38"!`%&!3J!!!%*!3N"#!% -(!3J"#!%)!3F""`%(!3F""`%(!3F""`%(!3F""`)&!38""3%&!3F""`%(!3F""`% -(!3F""`%(!3F""3%'!3F"#!%)!3J"#!%*!3S"#J%,!33""3%)!3`!#!!,!3F""J% -'!3F"#3%(!3J"#3)+!38!"J!'!3S"#`!(!3J#"!%(!3S""3%)!3N"#!%)!JS!#!% -*!JN"#!--!3X""J%*!3F""`%%!33""`%*!3J"$rq3+!)*!JN!#VEE!*!$4!#3#3J -!$!"k!%%!HJ!-!!J!N"-)!!`!IJ"r!(i!$!!)!*!,"`!*!*!$4!#3%J(!!8!"3!G -`!L!"3!#!!*!5!F!"`!(!"r!$i!(!!)!!#3!)!*!$4!#3#K!!-!"H!))!AJ!`!"! -!N"-3!$!!IJ$q!(i!-!!3!*!+#!!'!*!$4!#3&4!!+3!A!!N!#3!I!*!9%!!j!"m -!$`!2!"m!#`!,!*!$4!#3&!J!P!$S!*!!!*!!!2J!N"8)!*`!q!$`!2!!q!!!#`! -%!*!$42J!N!!!N!!!k!#8!!J!N"Ai!2!!m!$i!*`!#!#3&J3!"!#3!d3!N!32m!J -3#"!)%!J3#"!)%!J3#"!)%!r`!*!)$r!Iq"L3%Kri$r!!N!8(!!F!N!0%!3!#J!4 -!$Z!#J!+!!i!!N")"!!1!"m!2i!1!!i!$J!#3%`B!"`#3!d3!(`!*!!N!&`!T!"! -!N"8I!!m!$`!I!$N!%!#3&33!#`#3!b!!-!!3!8)"l3!%!*!)#d4eEQGPEfiJ6@& -`+!S!N!-f0DP6G'PMD(4TEQFJ6@&dD'9YBA4TFf0S)%0PER4bG@dX)%&YFh4PFQ4 -KE5`J-6Ni0G!a1C!$!*!$J!$rN!6`!*!$m!#3!rm!N!2`!*!$r2!!!2!!N!2rr`! -!m!#3"!m!!2!!N!32!!$`!2rr!!m!!2!2!3(`$`!!m2!Im"m2!!$`mI%2N!-!!2# -3!amI$`!!m2%2rr!2!!$`$a#3!`m!!2!!rrr`$`!!m!#3"!m!!2q3"J#3")!!rj! -%m!#3!r!!N!2r!*!$m!#3!rc`!!$`!*!$rrm!!2!!N!32!!$`!2rr!!m!!2!2%"$ -`$`!!m2(a$j!$!!$`N!-I(`m!!2$a!3%2$`!!m!m3%2!2!!$`$`ram!m!!2!2%"$ -`$`!!m!$rr`!2!!$`!*!%$`!!rj!'!*!%3$rJ)$!J+#!m)!3J"#2%*#3TP#T8+P3 -Tj#3%)q3J"$rm2q!rm$ri2r`rr$rm2r`rr$rm2r`rr$rm2r`rr$rm2r`!N!0!2q! -J-#!S)$`J"#2%*#3U9#T8+"3N*#@N*#3Ma#!%2r`ri$r`2rJrr$rm2r`rr$rm2r` -rr$rm2r`rr$rm2r`rr!!!!3!2rr`!#!!'!!J1"3!*N35!#FL%3!MS4#!)H%I`#6p -!%!VmJ"!+(J!3#KF!%!N6J"!)LF!3#($J%!J!F"!)!$J3#!!B%!J!!"!)!!!3#!! -!%!J$`"!)"#!3#!Q3!"!)#P!3#!T3%!J*i"!)"!!3#!2J%!J!!"!)!!!3#!!!%!r -rrr!2rr`!$rrq!!rrr`!2rrq!$rrr`!rrrq!2rrr`$rrrm!rrrr!2rrr`$rrrm!r -rrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!r -rrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!!!!3!2rr`!#!!'!!J -1"3!*N35!#FL%3!MS4#!)H%I`#6p!%!VmJ"!+(J!3#KF!%!N6J"!)LF!3#($J%!J -!F"!)!$J3#!!B%!L(`K!*@$83#@!0%!SXD*!!#Y+@N!!*8T83#%aN%!NJ#4!+d"D -3!!SAd*!!#5JT%!P)*4!)amB3#!!!%!rrrr!2rr`!$rrq!!rrr`!2rrq!$rrr`!r -rrq!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!r -rrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!rrrr!2rrr`$rrrm!r -rrr!2rrr`$rrrm!!!!J#3!rq3#3#3"r!!N!F2m!#3"[!!N!2rm!!!$mm!N!E`$r! -2%"m!!!r-m!#3"I!2[`$a!I!!$mc2!*!&m!$lm2!3(`!2c-c`!*!%m!!2[r%"$`! -2rj!$!*!%m!m!qrrr(`#3"!m!N!6`m2rr[`$`!*!%$`#3"2$a!3rlm!#3"3m!N!6 -`m"!I$lm!N!82!*!%m!m"$`$lm!#3"!m!N!6`!2!3m!qr!*!%$`#3"2!!$rm!!2[ -`!*!$$`#3"2!!N!82[`#3!`m!N!6`!*!'qr!!!!m!N!6`!*!'$r!!!!m!N!6`!*! -+$`#3"2!!N!S2!*!%m!#3#Jm!N!6`!*!%rrm!N!32!*!%m!#3!`m"!I!!N!-2!*! -%m!#3!r!Im"m!N!-2!*!%m!#3!r(a$`m!N!-2!*!%m!#3!r$`(am!N!-2!*!%m!# -3!r%2rr!!N!-2!*!%m!#3!`m3N!-!N!-2!*!%m!#3"2rrm!#3!`m!N!6`!*!+$`# -3"2!!N!S2!*!%m!#3#Jm!N!6rN!`!N!3#!*!$rj!*!*!(m!#3"`r`!*!'m!#3!rr -`!!!2c`#3"[!2m!m3(`!!$mc`!*!&m!qr!2%"m!!2c-m!N!A`!2[`m"!I!!r-c2! -!N!6`!!qrm3%2!!rrN!-!N!6`$`$lrrmI!*!%$`#3"2$`rrqr!2!!N!32!*!%m2% -"$r[`!*!&$`#3"2$`%"m2[`#3"3m!N!6`$`%2!2[`!*!%$`#3"2!!m"$`$lm!N!3 -2!*!%m!!2r`!!qr!!N!-2!*!%m!#3"3qr!*!$$`#3"2!!N!Elm!!!$`#3"2!!N!B -2m!!!$`#3"2!!m!!2rrm!!2!!$`#3"2!2(`r`%"$r$am!$`#3"2!2$r%"N!6r$`! -2!*!%m2!3m2m3(r$`%2!2!*!%m2(r$mcar-m2mI!2!*!%m!m2(mc`r-mI$`!2!*! -%m!!2!Im"$r%2!!!2!*!%m!m!m"#3"2!2!!m!N!6`mIm2!C!$$`ram!m!N!6`m"! -I(rrr(a!3m!m!N!6`$`(`m3%"m2%2!!m!N!6`$am!m"!3m!mI!!m!N!6`!2m!$rr -r!!r`!!m!N!6`!*!+$`#3"2q3$!#3"3G"8&"-!*!'"e"548B!!3#3"!G%394"!!) -!N!3(8d&@43!$!*!%"d*26N8!"!#3"$aZD$-a!*!$!8C548B!"!#3!i!!!3#"!!) -!JJ!$!)-!"!#%5801)`!%!!!$k!!"!qN!!J2U!!-$k`!%!q`!N!-1!$i!6J#k!E) -6L3!%-!S!N!1&!)%!N!Mrrre2"%CTE'8+8Q9NFQ&h)%eKF!"5%3!-8(*PGQP[GA- -J6A0R!&!4!!T5CA"[FfPdD@pZ!%i!!!%Y!*!%"e*PCh9XBA)!'mJ!$89ZG'9b)%9 -iF'a[FQ8!!&J!!5d!N!3%8f&fC3"68`!",3#3"!44G@Pd!&&4!*!&5!##!*!)rj! -$q`4&C'Pd"&9ZC'm!@J!!!5d!N!3$3h9d!&J!!!4$Eh"j!%-!!!93BA0dC3"@!!! -&3faPBA)!N!LX!)-!N!Mrrrhr!dYLC!a$EfjdFQpX)%YPHA-!'mN!#e"eEQ0dG@& -dD@pZ!"[+!!K#FQ&MDf9dF`!Eb`!&B5!Y)'d!'m`!"@iJ,5"k!"[0!!9")#dJ63! -EcJ!&6L!Y)&S!'mm!"6!J,5!j!"[3!!%Y!*!%##KPFf0KF'8T!*!%"bKcF'&MC5N -!N!3)+'4PE'9dC5N!N!3)+(*PG(9bELN!N!Kc!)3!N!MrN!2E"%KPE(!(6h"dD@p -ZF`!!6`!",3#3"!4)C@a`!!!r!!a%CA0MFQPLC5",CAN!!#B!!5d!N!3(9Q9bFfP -[EJ!!GJ!(5'PcG'pbH3!!9J!39Q9bFfP[EL"'C@&dGA*PF`!!)`#3"5S!J!#3#2q -3!rX"&!j"BQpeG#"1CA4)B@0Vb3#3"!%Y!*!)aJ#&!*!)rrrpl`4*EQC[$8PZGQ9 -ZG'pbH5""E'`!!'N!%%PZGQ9ZG'pbH5"6C@aPBh3!!%N!"N&NDR9cG!!!)`!",3# -3"!P-EfpV)%4[Gfi!!$S!$%4PFf0bD@*P)%pZC3!!1`!04'9cBh*TBQ8J6@&ZH3! -!,`!04'9cBh*TBQ8J9(*KF!!!AJ!",3#3"!a$B@aX)%e[ER0dCA)!!%-!#djKE@8 -J6f*UC@0d!!!M!!Y%DA0MEhCPFQPPF`!!A!#3"EN!L!#3#2rrqpm&6@&RD@-*4(* -[F#"*G'9Y!!"N!!Y%FQp`)&0PE'9MG!!!4!!'8'PMDh9`!!!X!!e8EfGRE'8JF'P -MDh9`!!"!!!%Y!*!%!d9KG!!!C3!%8Q9KC!!!FJ!&8A9KCQB!!(%!!d4TF!!!)`! -",3#3"!Y-DA0d)&0`C@aXF`!!+`!+3f&cG#"6F'9XE!!!@J!$@Q&`!!"k!!C*ERC -[Df8!!#-!!e*eBJ!!)`#3"EF!L3#3#2rrZlm%3QPdF`C6C@&bBfJ!!(-!#N0XEh0 -P)%4[Eh)!!'-!#8p`C@iJ4'p[FJ!!E`!&3A"`E(N!!'%!"%YTBfX!4"%!!5d!N!3 -'9@jdFQ&`!!!M!!9'Eh*MC3!!)`!%6'p[G!!!)`!",3#3"!G&EQGbBACP!!"&!!0 -%DA!!!#-!!e0TG!!!)`!",3!!)`))3faTEA!J9A!!!$`!#N0XD@eL)%4[Gfi!!$i -!N!@,!-S!N!MrN!3,F(9ZBh4eBA4TEfi#)#i!N!3#)#`!N!3#)$X!N!3#)$S!N!3 -#)#%!N!3#)$m!N!3#)#X!N!3#)#d!N!3#)$d!N!3#)#-!N!3#)#3!N!3#)%!!N!3 -#)#B!N!3#)#S!N!3#)(i!N!3#)&m!N!Ki!-X!N!MrN!3)BR*KBfYPG(-"@`#3"!& -G!*!%!5J!N!3"+3#3"!&l!*!%!Ad!N!3"2!#3"!%q!*!%!9i!N!3"B!#3"!%R!*! -%!5)!N!3"A!#3"!%[!*!%!A`!N!3"*3#3#'-!c!#3#2q3"!9K)#dJE3&K!*!%!@) -!N!3"B`#3"!&N!*!%!@8!N!3"CJ#3"!&R!*!%!@J!N!3"D3#3"!&U!*!%!@X!N!3 -"E!#3"!&Y!*!)B`$0!*!)rj!%"@iJ,5"k!@i!N!3"E`#3"!&`!*!%!A%!N!3"FJ# -3"!&c!*!%!A3!N!3"G3#3"!&f!*!%!AF!N!3"H!#3"!&j!*!%!AS!N!KM!-i!N!M -rN!3&35!Y)%d"33#3"!&#!*!%!8-!N!3"4!#3"!&&!*!%!8B!N!3"4`#3"!&)!*! -%!8N!N!3"5J#3"!&,!*!%!8`!N!3"63#3#'-!c`#3#2q3"!91)#dJ@J&1!*!%!8m -!N!3"8!#3"!&4!*!%!9)!N!3"8`#3"!&8!*!%!98!N!3"9J#3"!&A!*!%!9J!N!3 -"@3#3"!&D!*!)DJ$*!*!)rrrpr`aMEfjdFQpX)'YPHA-"BJ!a!!!"DJ!b!!!"EJ! -c!!!"D!!d!!!"E!!f!!!"H3!h!!!"D`!i!!!"G3!j!!!",3#3"!&N!%3!!!&`!&! -!!!&b!&)!!!&d!&3!N!C4!0!!N!MrN!3&-#!Y)$N"-!#3"!%a!*!%!6)!N!3"-`# -3"!%d!*!%!68!N!3"0J#3"!%h!*!%!6J!N!3"13#3#*%!b!#3#2q3"!ChDATKFQ3 -+3A4dFQPLGA4PF`!!H!!04'9dC@0d)&9ZFf9PEJ!!C3!*4Qa[Eh)J6@&`!!"Q!"" -(C@jPFQ&dC5"0EfjcG'9b!!"R!!K*C'9ZG'PQH3!!D3!*6'pMBA4TEfjc!!"[!!j --CACPE#"8C@aPF'pbG!!!GJ!%9fPcD!!!G`#3"9m!d3#3#2q3"!GMGA*bC@jd"PG -PBA"[EJ!!+3!&3A*YEh)!!&X!"9*TEQGc!!!p!!C"EA9XCA3!!#)!"94[Efac!!! -S!!4(EfaN!!!N!!C6F'9XE(-!!#X!N!8X!)!!#J#!!*!$J3#3!i)!N!1$!*!$K!# -3!i8!N!1'!*!$K`#3!iJ!N!1*!*!&,!$)!!S!b!#3!mN!N!2+!*!$b`#3!m`!N!2 -0!*!$cJ#3!mm!N!23!*!$d3#3"C!!!!d4T6)`-5"$EfjdFQpX)%YPHA-3T6)`-L" -3G@jMG(9KG'P[EJfP-M!c)%*bB@0VCA4c#U8b-$3JB5!Y)'d+T6)`05"Z)#dJHJU -P-M!f)%%J,5"0#U8b-$FJ6L!Y)&S+T6)`1#!`)#dJ13+P,3JET@9cBf&`C3FJTA0 -`B@0P#!LPC'9XCA4P#!fPFQ9dGA*Z!*!$C3!0"`+PBh4X,@)(#U9MG'`YDJF1T@0 -dE#eZ"`LPBh4X,@J($+9MG'`YE!FCT@0dE#ej"`ZPBh4X,@X(&D9MG'`YG3+P,3F -%T@0dE#eN"a#PBh4X,A!(%U9MG'`YFJF8T@0dE#ed!*!$)J!3!5i",!%l!6S")3% -r!5X",3%p!5-"*!&!!5B"+J&q!9m!N!-L!"!"@`&G!5J"+3&l!Ad"2!%q!9i"B!% -R!5)"A!%[!A`"*3#3!a`!$3&K!@)"B`&N!@8"CJ&R!@J"D3&U!@X"E!&Y!*!$(!! -0!@i"E`&`!A%"FJ&c!A3"G3&f!AF"H!&j!AS!N!-F!!d"33&#!8-"4!&&!8B"4`& -)!8N"5J&,!8`"63#3!a`!$3&1!8m"8!&4!9)"8`&8!98"9J&A!9J"@3&D!*!$&J! -+!6!"-3%b!6-"0!%e!6B"0`%i!6N!N!0#!!J('+9MG'`YH!F&T@0dE#eP"`DPBh4 -X,@B("k9MG'`YC`F*T@0dE#eT"`qPBh4X,@m(&U9MG'`YGJFAT@0dE#eh!*!$%!! -(!5N"@`%p!5)"+!%N!5X!N!0,#c&cG#"YC@je)%P%4&G54!SM)'pQ)%e&6P9c6d0 -19!8UN!9-8e4$"P*PFb"*4%4A8N3)8Q9cCA*fC@4'9e*%"5U3"8a69%8!N!-E!!J -"6`+P,3%r!5B#T5d"GJ&@##0fCA*cD@pZ!*!$*J!-!@N"53FMB@4UGA0d!U8Y!6S -"1`%[!9i#T5d"3`8MEQ&YC3&F!*!$0!!#!*!&C`%%!(X"9!3#6dX!N!8,!&%!@!& -JL!4H-&ia!*!&#J!B!#S!1+!#!!%!N!0%!!-!N!9G!3i!F3&+"!*1E`#3"9d!A3" -a!*N%!ePPF`#3"JS!6`"3!91)!Pi`!*!&#J!@!#S!0U!#!*!&$J"%!%3!XJ(9!)" -%4$!+!*!$$J"+!'S!d`(A%iJ!"$!+!*!$3!!3!A-"B`&[!@%("+9MG'`YC!+P,3F -MG@jdFQ&`"L0QEh*MC38ME'p[G!+P,3&&"#0NDA!%)h0TG!+P,3%m!6i!N!-8%dj -PG%KKBfXJ8(*PCQ9bC@jMCA-!N!06!!m",J+P,3J8T5"MG'`YG!8MDR9YF!JME@p -ZFh4PFJ8MGfP`C3+P,3&K!A!("+9MG'`YC!8MBfKKG!BMEfCQCA)&)h"bBAN&)h* -TC'8&)h4eFQi!N!1F!)F!N!MrN!0l!d&MG!4AB@Pd!!!Z!!%Y!*!%#&4PE'9`Eh* -d!&34!!4+G@e`!!!M!!G0EfjcG'9b!!!M!!4ADA"P!!!M!!%Y!*!%"8&`F'aj!!" -K!!03BAN!!(!!"%YTBfX!4"%!"%0SBA3!!#-!"8pQCQ9b!!!M!!43FQ&j!!!M!!4 -5D@4P!!!M!!48GA*Z!!!M!*!&,J!2!@3"4!%X!8!#T5d"C3&b!A%%)f4TF!+P,3% -V!9S"HJFMD@jfEfYP"#0bG@)!N!0#!"%-T6)`15"$GA*bC@jd!U8Y!AF"H!&4!@B -"G!&K##0PEQKKEQ0P#L0dGfphC@&`Efi#T5d"9`&8!8%#T5d"8!&5!*!$m3#'!*! -)rrphq`9&FA9TF!G$GA*bC@jd!"[4!!%Y!*!%$>C@aN)&GPBA"[EJ!!G`!24AK -MD'&ZCf8J9f9KF'pZ!!"i!!e6C@aPBh3J8A9TGQ9b!!"4!!Y'DA*P)&&eDACPFJ! -!CJ!&9'KbEhF!!(3!"8&`F'aj!!"K!!G&EQKKEQ0P!!!M!"&8GfmJ9f9KF'pZ)%0 -[E@*KG!!!)`!",3#3"!TAC@&b)%&bE@pb!!"A!!K8B@YP)%pQCJ!!9!!+3A0V)&* -PE@pfC3!!33!",3#3"!C3GA3J6fi!!&!!"P*PE@pfC3!!8J#3"6!!N!F%!!$GN!B -!!3#3"`)!N!F$!*!("2q3"J#3!bS!3J!Z!1)"XJ!&!3#3"aG`%P0PE'9MG#"K)%0 -SBA*KBh4PFMB`#J#3!e3!N#!J!!"!!*!Srj!'!*!%!5i!%!#3"5J"%J!m!@)%"&" -XBAN!N!91!4)!BJ&L"!44G@Pd!*!&*!%1!%!"CS!!N!C3!%J!B3"k!*!(8!#k!'% -!lJ#3"hJ!5!#*!(S!N!Gi!,`!L3$Z!*!(H!%q!)N"B3#3"bN!5J!j!2!3"%jKE@8 -!N!8B!"3!1!!dS!)!!3#3"9!!*!"J!%L)"9*[E'8k!*!'8!#@!'!!ZSJ&8Q&MC6T -P!*!&H!!8!)J!5)J(4f9ZC'9b1J#3"RJ!PJ#)!,b)"N&XD@GZ1J#3"AJ"%J#)!6k -)"8e[C'8kD!#3"4-!5!!N!2+)$&GSEb"KFQ8JH@pe2`#3$!%%!!%AF!#3!c!!N!F -%!!$GN!B!!3#3"`)!N!F$!*!("2q3"J#3!c!!N!F%!!$GN!B!!3#3"`)!N!F$!*! -("2q3"J#3!c!!N!F%!!$GN!B!!3#3"`)!N!F$!*!("2q3"J#3!c!!N!F%!!$GN!B -!!3#3"`)!N!F$!*!("2q3"J!!#-i!!3#3!a`!N!01!*!%rrm!N"#!)!#3"8!!3!# -3#8J!N!0)!*!&"!!"!!3!N!B)6J#3"#)c-L+3"5-L%4)L)MYiXL+3"K)M-bY$1l- -LN!-c-L+3"5-L)K)5[(h$)T!')5)M-b9$)eXb)L)c)T!*)eHA8b+3#50$1d-bZd) -L)L3b)T!$-L)M0,CpRFXL)b)L)b+3"M1l3c)PBb)L)l-cZfc'E(ICU[fb)e-M-b+ -3#E4$-b1mXd0,HCQCUT!$rkUBa6-L*M-c)T!()b1d3c-b*'amb0aP9EZlE'9EY&D -c-L46-c)K)c)5)lY8+l4$-M-b*FCXZd-L)K&,4%ZdYV-c-eXc-L)MZj!$3V3VY$1 -3"E-L@d-b)L'lN!0%4E3c4,8c)LYPXb+3!bXl4$0%-dZl-c1l-c-L)9ZlY%3cY%4 -%1l-MCM)LN!3N*83d0%5l3c-b46-c)L*8Zl4%3lY%4$0EA&-b)T!&*84$0%5d-c) -L*6-c-L0EZl4%3cY%5c*FDc-LN!BQZd0$Y%3c-L)V3c-L+l5lZdXc+d4%-V@d-L+ -3"%)L0E4%-c4$-c)L)d3c)L@dZd4%3cY$0$)f4$)LN!3b)PY$-c3cN!3L)N-b)LC -,Zd4%-b3d4$)QY$)LN!4#)V4$-c3l-j!$)L)c-L+eZlZd4$-MY8-b*N-b)T!%3b+ -l4$0$-j!$0$)L)M)LDlZlY%3c+eDd-MBc-b+3"$3LY%-c0$13"$)L)M-PDlZd4%- -c1eCPXN8c-b+3!a%V)N3cN!BM)T!$-caEZl4$-c0,9E99Zc-b)T!$%4Xb0$13!c) -M-b)L)5)b9EZ3!c-L1l9EZl[--b+3""%E3c3c-c)L)c)LN!3c@lZ3!d-M5e9EZl4 -ADc)LN!-4%e-l-b-b)M)b)T!$)$C9@lZlXcZe@lZlY,aQY$)L)K%5`c3b-c)L-M) -LN!-Vc&@lZl3c4E9EZlY$YV[&Y#)K%4,,*$-M-L-LN!3V8la9ZlZc0&YEZj!$-f@ -e9QGfZlYSfc4$)M)LN!3VC6-m9EZdY,@lN!5d3f@lZeA-amc-M$3c)T!&1maE3c9 -VZlY9DlZ3!l4$1f@l4,Z3"$0V4$)L)L-L)XaV4$-cbe9QCEZ3!d4%-c9EXc-d4$1 -3!eZlN!1e9V9F@l-c-b*P9P@lN!0%3d-c0VY$-j!&0'Xc-l0&E-c'3c-c)L+m9PZ -lZl4$0$-c0VY%-j!&ZlXb-cAF@lY%3c-b)L%X99Y%4%-cN!3fY$13"#)NY$1c)he -EZl4%3b-L)c*'9E3cN!3b)c1fXc13"#)VXc06@0@l4*!$-L)L098d@l-b)T!%)c+ -l3c13!c)L+d-bE0GEZlY%-c-L)VZlXeZc)T!'-VXd4$-c-L)NXc*&@lY%4$-c)L+ -l-c0#Zl3LN!BbZd-cN!-b)L08-d5d4%-c-b-L+d-L)M0&Y$)cN!-L-c0E3c13!c) -L)QZl-l-c3c-b)L*$-L)L-c5l3c-c-L)M-fXc-c4%-L%Pbc)N8c1d-b)L1l-b)L) -c-l4$-cZdY%4EZj!$99Xb*'@c)M1c0&@c)L-l-c-b)MZlN!1d3c-b)VY%Zl-cYEY -Q4$)L-N)VaV-K%83L)c-b0%4%3c)dY$-L@d53!c5l9V)N3b)c0$5e-L%5Xc13!c) -VZl5d-dY$-L+l-c0%-c5l-L+d-c-N4,Zd-L)b)c0%-LZlY%-cN!-M)VXcN!BL)MY -$-c1lZc3c5c)M-c-b+d3c-c)L-b)L5c-M-j!%)L)MYEZ3!c-L-cXb)c0$-L4%0$) -L)b+3!cXb)c-c-L)M)T!$)c13!c)L*E-cN!-b*%Xc-L-c)T!$06-M-j!$)L)b)L) -c-b-c3b*#1c13!c)N5d-cN!-LN!-Q3b-cN!-LN!8M-L)L-c3L)d-c-c)MZd-cN!- -b)L)QXc-d-c-L-c)L)M)b)L)M3L)L)d3c-b1l-j!&)L)PY$13!d-LN!NM-L+3!c@ -c-cZd-j!&-M)PY$13"#+3"6-b)T!&-b)lY8)eZd3cN!3L)LZc-j!%)T!+)b-c)L- -d99@l4,-c3c-L)LYL-j!%)T!$-L+3"M-M-c)L-c)L-j!$3d-c)L)MBc-L)M-LN!J -l@d-cN!-L-L+3!b-lY$-c)L)MDc)cY@Xb)T!'+eZl@c0$3c-LN!-c-N1d-c1c)L+ -mZl9EY$)L)M)LN!-VZl3c0#-c3c0%-b)N-N4$-c5l3dI'@d4%-c-L)L-L)MZlY$) -LN!8M-L1c-d4$-b)L1l@d1c-c0%-b-c-b)VZ3!c-LN!BVZl)b-c-b)T!$5l-N3c- -dZd1lZl4$@lZl-b)L-j!&YN)L)c)LN!3M-L+dYEZlY9Zl4,9EY%Y$)L-c-b)L)cX -b)T!*)f@d-d4,3c13!l0$0%)L)c-LN!-b)l)LN!-K)T!&Zd-b)M-c-M3c4%-c0E) -L)L-LN!-K%V)LN!F4*&3c)K)K)L)l4$1c-d8b)T!%)5)L)E3LN!BK%5Bd-L+3"6Z -l3d-d9$)LN!FK+c)LN!-M)L%4YM-LN!3K)NZl3dZl3c)LN!-M)L)5)4-b%4)L)b) -K%FXLN!84)N5lY,Zc-b)K%M)LN!853b%4)M)L)5Yc)T!(-d3lZlXc)L)!N!F1!!$ -ZN!B!!Gf3"J!#c*!'!!1lN!B!"+U3"J!&L*!'!!ChN!B!"e@3"J!)4*!'!!NLN!B -!#K'3"J!,QC!'!!aQN!B!$613"J!2!*!*3J$`!*N!N#m"!!%!#3!!6)N!$!!!6)` -!!!Q)N!!!N!6q!!B!!2rh!!B!#`1l!!N!!J#3!cm!N!H!!*!("!#3%#!!N"!"!!E -!!*!'SJJ!N!3"5J!!!B!!!0!!!"$#!#YDa%S!ri2P%))"!"*AKm(Jq)8!"8!&##2 -`2r`!IJ#3!acJ#!#3"5!!!!jJ!!!3!*!&J!#3"`i!N"!J!*!3!i!#K%!3`#!)&!8 -3!#!34!!!!`!##4#EB!!!%83!&!r%5J#ZqU83JJ%!%P@pIlqSK3!&3!8))r!rr!0 -#!*!$#4!8!,R!!!3J!`!*N!!!e6RX6#!!!6PcKIGpcJ!"a(HGlrh4iB`M&hRHGq- -BaMr3d"!J!)$"#BB!N!33!*!$"8ehb+8*)&+&DZGm$e+)SLR4"+2L%L%Y&f)!%NN -!+eV%5J$Glf83JJ%!%PEZkh[BK3!&3!8))r!rr!6!$i!0R4F3!8IJ%KSJ")!*)2( -IeV+5U3!"4ia0#!Ba"")ZM'-B3M&"P$HBaM'*)aLU)C!!D!JJ!)%"!))!N!33!*! -$"9D2`!!!`!!!!4M!&!#3!`)a*"85!!!"QC!!!"93!"32a%S!VYDP%))"!"*9hAH -eU)8!"8!&##2`2r`)`!5!!QXBL!p(rj%U*!bi18#4K9,8)A%!!Nd)9Hm'-D[S2ia -K'%)43D3V@-BaJ5-BNL+)3!2mjlZIkC2V1mqcrM'XBr9!JTch[HjcR*-B`G4cR4M -'-AFr&cjdE9Q5!!UV!#YDamS2hHpPm))"!"2@lZYlhq9q"Ai&IL2`2rhC3I)r)L[ -iZh,(i(c))(0m+Ik9MlP))Dr2`P84T"L*d4!%9IqK(hTr3F3M12SqF5-BN85)3!4 -M'-8M'D0FaM(-%M'USLNJJU-BaM'-BT2rqVk-BaM'-D`*iND-FcGNIr$,6*32r([ -aVYDr(rq3!rjGhAHeU"q"rmRrLIq3!riT3+&&)LXBaV,(rj%S2iKm3!k9K4@e)5% -!"'8JIKL5,`[SPBaK'%)a8D3M'-)a#5-DN!#)K%!%B`Mp)aRM@-BaJj)aU5*&3)1 -r'-B`rrk6'-2dM'-BaM'N2b*'M'-3#%!K$j*V@XI+Aph[B2%!#3!6eZlVHprJIP" -r4Ai6rrm#+-#L45)G'-Gdaq!5'#"`Id!1P3"@XK)"!!4&4%8BNL%%%!k-BaK#-9' -8)aM#-BNLVDL3!)4!"1-)`5-CNeM'-B"5DUULK8#*)6R1F)3JNaM#P)aM1FBaV%P -b6ScM(rM!)J159!r%5P'ZeU!"!!N!%PAGGl@S!!K3#88)%rrr!LM!T-8L#49%&-I -rJ!JNJ$L!!*'!1Nd-!"!S1IZ%ja(1S!#+Mjh[`G(ZMq-A3G&a(%M%Rm,(ihch[4m -CLeLlciH0T&4Ip8"a(YDeVh[HNaMqph1FeVh1GiNL0R0M%!F!!i0-UeV%5P(Glf! -"!!N!%PEZkh[B!!K3#88)%rrr!GY!VlR5(1fi$dIJIrNJ!!#!!2%!%!#3!a!)!*! -')!!+!*!+)!#3"3)!N!8#!3!!!J%!N!3#!i!6J!!!"!#3#33!)!!b!*!*&!r%5P( -rrm!"!!N!%P2rN!2i!!K3#88)%rrr!!J!!!%!N!3)Iq!!#5!!N!SJ%!#3"N!!'`# -3%!%!N!8F"J!!!J%!N!3F!3!J!*!$#!#3#6J!N!--!*!*!9V%5P%!N!-"!!N!%P! -!N!8)8!P&#"2rr`#3"!%!N!33!*!$#-!!N%S"!!3!#3!1!"-!'!!D!"d!)!!P!#S -!,!!b!$-!13!q!%!!43"+!%m!9!"C!&i!B`"S!'N!D`"Z!(-!GJ"l!)!!K3#+!)m -!P!#C!*i!S`#S!+X!X!#e!,S![`$%!-N!cJ$6!0J!h3$L!1F!l!$a!2B!q`%!!3) -"#!%+!3d"%`%9!4S"(`%N!5N",J%b!6F"2!%p!8!"43&(!8`"83&@!9X"B!&P!@S -"EJ&c!AJ"I3'#!BF"M!'2!C!!!C-"Q!'B!Cd"SJ'R!D`"X3'f!EX"`!(&!FS"c`( -5!G8"e`(F!H%"jJ(V!I!"p3(k!Im#"!)*!Ji#%`)B!Kd#)J)R!L`#-3)f!MJ#23* -#!NF#6!*3!P3#@3*H!Q-#D3*[!R!#G3*k!Rm#K!+*!SS#MJ+5!TF#R!+J!U8#U3+ -Z!V-#Z!+m!X!#``,*!Xm#dJ,B!Yi#i3,P!ZN#l3,b![F#q`-!!`8$#`-4!aF$(3- -K!b3$*`-V!c%$0`-l!ci$4!0+!dd$8!0@!e`$B30R!f`$F30h!h`$JJ1(!i`$N31 -@!jX$S31Q!kX$X31f!lN$[!1r!m-$b!20!p%$eJ2A!p`$i!2N!qF$l3!'!!B!"J! -'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J! -'!!B!"J!'!!D3!`)'!3B!"J!'!!B!"J)'!3B#"J!'!!B""J!'!JB!"J!'!JB!"J! -'!!B!"J!'!!B!"J!'!JB""J%'!!B""J!'!!B!"J!'!!B!"J!'!!B!"J!'!3B!"J! -'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!JB!"J)'!3B!"J%'!!B!"J! -'!!B!"J%'!!B!"J)'!!B!"J%'!!B!"J!'!!B!"J!'!!B""J!'!!B!"J!'!!B!"J) -'!JB""J!'!*!$"J!'!!B!"J!'!!B!"J!'!!B!"J!'!3B""J%'!!B!"J!'!!B!"J! -'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B#"J!'!!B!"J!'!3B""J!'!!B!"J! -'!!B$"J!'!!B!"J!'!!B$"J!'!!B!"J!'!!B!"J%'!!B!"J!'!!B!"J-'!!B!"J- -'!!B!"J-'!JB""J%'!!B!"J%'!!B!"J!'!!B!"J!'!JB$"J-'!JB!"J!'!!B$"J! -'!!B!"J-'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B""J% -'!`B!"J!'!!B""J!'!JB!"J!'!!B""J!'rrm!!![mN!!!N!6r!!F!!2rp!!F!$`6 -d!!`!!`#3!d-!N$0!!*!)!F!!N!`d!*!&!UUeBL8!Ir!r+)3)!3!%46i2`2JIL#J -!"5!!8%#(m"rr`!#3#!Fi!!!%!*!'!`#3"b!!N!K!!*!2!3#3%N!!N!JU)J#3"9+ -!!!"J!!"B!!!""!!"8"rL*3"A[l8SK!J"!!4&+[VrVr@)+!!&)!"33)I`(rr!!*! -)#2`!!!3!!!&-!!!$!"!!$!#3!b!!N!MJ!*!2$`1!!*!3i!#3"$!!N!-#*!#3#B! -!N!8""!!#UV9L*3"V@ZXSK!J"!!4&0leVhAU)+!!&)!"33)I`(rr!!*!%!F!!`!M -m!!!%!!!"XJ!!!p8j,&)J!!"1A1&mhh1!!"a(HGlrh4iB`M&hRHGq-BaMq)#3!!3 -)!#!`3Q!!N!J"8e`"%!4)#!3&1Gm$f!34!(4!D2L#4#E&lL!"&&!"8"rL*3"A[A8 -SK!J"!!4&+eVeVV@)+!!&)!"33)I`(rr!Gm(`!!#1F3!)r!!%"!"J"b32J!2IeV* -5U!!!8H-633'-3))Lk-BaK#-8'80aM'-BNM'-BKL!U!))!#"!3Q'!!*!$"!#3!`& -9SU)T3NJ8SPV'-!8NSLL+M%#&4)5)5dBa)!%NN!!#UV9L*3"V@ZXSK!J"!!4&0le -VhAU)+!!&)!"33)I`(rr!LN%3!0b4L3!Sr!#*K!#3!!8Tk)!$e9,5BA%!!*&#&8) -"M%%"!rM'-B3K&"T#ZBaM'")aM')B3-3!#!!J3%!JJ!#3!`3!N!-"8#)!N!-`!*! -$4M!&!*!%M%L2a)!!!'Ba!!""!!&3(q)P!&HpG5L%#!%!"%8V@[@ZYBJS!!8J!&" -!Kr!IrpZ+!)!")G')J#Mrj&*%J*!!"6rSJ!1&-G3KF3!!Nd*THm*dDRb&@2S4K#% -8(%)eM'-B%M'+SLK!J!$r1HlRqQ6lc[2XlSaV'2e3)4FplhZFjb6'-(8FjdBaM&b -#4FqG'eBa)!#b8Y+UY@2P"qYDkbq%#!%!"(dh[@[GH[mTr!8r`&2iKr!Irq552NI -L)M',`1Mm"#T%#@F%!HL!!iqBL#'[`!%94"q'*)aX!%PIaK(hTr3B3M12SqF5-BN -85##!!4M'-8M'D0BaM(-8M'USLNJK'-BaM'-BT-BqVq-BaM'-DmriND-FcHiRrdc -9+9!IrMhieleeq2q3"FAV@[@ZYB$q!rrL2ra(rj!%j*)8+5)L2iah@2rr4JIf$i3 -"k)!$K498)5%2i4P)%3BNLm*mL9M'%B3M&"a#-B`M%*)aLSL)))!"'-)r5-C`eM' --BZ5-DNL48#%IaM'-2rqNrr#p)aM'-BaSJN#4SaM%!%3##9S@UV9Mj5rV@ZX(L!! -4!!4p0leVhAVr!IbJ2qK6q%Irrq!ELK4*)L)aM'YBr!5#*!N2a!(SJ!-!&E+K!3! -#%9!4"L5)33%!5-B4K#-9'N)aM#-3NM'X53J3J!%B`M")aQM@-BaJ&)aU5+&3)4K -'-B`K##6'-+8M'-BaM'L55*'M'-IrK!)6qK93(q)P+0HpG3!)!"%!"%8V@[@ZYB! -!)+!#+&"!4rrri!#+&)NL)M&8GeMrj"iNPJqd!HL!!i"@X4)!%")4B4&'*)LSJJM -SaM'%)a8C3M'-)aL5+Ya*#"#!!6M'-8M'C0BaM'%8QUUS`9!M1-jcR'-)T-B`V5- -BcR'-DT*FNk-ia!#)!#"9+UUeBL8SkeVV!!J!%3!%46HpDpekJ!!JS!)S8%"(rrr -J!)S9'5BKd94"@2`!iKJ!"``!#)!$J$T1NJ!3&!jqi6R%FbJ!#+Mjh[`G(ZMq-A3 -G&a(%M%Ri#)2ihcRZ4mCLeLlci10T&4Ip8"cA0DeVR2FNaMpeh1FeVh1GiNL0R0M -%!(!!H&,48"rL*5MA[A8!#!!4!!4&+eVeVV@!!##J!LK33%Irrq!!XKAf1K#1fi$ -Sr"m#!*!$"!!2J!-!%!!-!"!%!*!'#!!!S!#3#3J!N!81#i!!N!@!3!!!J%!!N!5 -!i!J!N!-"!*!*!3!)!!L!!*!)!UUeBL8SkeVV!!J!%3!%46HpDpekJ!!JS!)S8%" -(rrrJ!)!!!#!!J!!!L2`!!J#3"`-!N!8J#!#3"K!!!+!!N!N%!*!'"!#3"3L!3!! -!J%!!N!-)J%!)!*!$!3#3#3%!N!-2!*!*!9!IiL8Srrrq!!J!%3!%44rrN!5!!## -J!LK33%Irrq!!N!3J!F!!!)rm!!)!N!F$!*!'#!#3#!'`!*!3"!#3"3F"J!#3"`F -!3"!!N!-#!*!*$J#3$JUeBL8SJ!#3!`J!%3!%43#3"b#J!LK33%Irrq!!N!`#!*! -(!`#343%!"!!*!!i!%`!C!"S!(3!J!#8!+J!X!$-!0!!l!%!!3J"(!%`!83"@!&X -!B!"P!'S!D`"Y!(%!GJ"k!(m!K!#*!)i!N`#B!*d!SJ#R!+`!V`#d!,N![J$$!-J -!c3$5!0F!h!$K!1B!k`$`!28!qJ$r!33""`%1!4%"&J%G!4m"*!%T!5i"-`%i!6` -"33&'!8F"5J&2!9%"9J&E!@!"C3&U!@m"G!&i!Ad"JJ'(!B`"N3'@!CN"QJ'G!D) -"SJ'R!D`"X3'f!EX"`!(&!FS"c`(8!GN"h!(I!H%"jJ(V!I!"p3(k!Im#"!)*!Ji -#%`)B!Kd#)J)R!L`#-3)f!MX#3!*#!NF#6!*4!PB#@`*J!Q8#DJ*[!R8#H`*m!S% -#KJ+-!T-#QJ+E!Tm#S`+S!Ud#X3+h!V`#`J,)!Xd#d3,9!YN#i!,R!ZX#mJ,j![d -$!J-(!``$%J-B!ad$)`-T!c!$0`-q!d8$5J01!e)$9`0H!f8$D30Y!h3$H`0r!i- -$LJ13!!19!jS$R`1N!kS$V`1f!lX$`!2&!mS$c`28!pN$hJ2M!qJ$k`2Z!r)$pJ2 -l"!!%N!-*"!S%$`36""F%'`3E"#)!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`! -(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F$"`)(!3F""`% -(!!F$"`)(!JF""`%(!JF!"`-(!!F""`)(!3F""`%(!3F""`%(!3F""`-(!JF""`% -(!JF""`%(!3F""`%(!3F""`%(!3F""`)(!3F""`%(!3F""`%(!3F""`%(!3F""`% -(!3F""`%(!3F""`)(!!F#"`%(!!F$"`%(!3F""`%(!3F#"`%(!3F$"`%(!3F#"`% -(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F#"`-(!JF""`!!!3F""`%(!3F""`% -(!3F""`%(!3F""`)(!JF#"`%(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!3F""`% -(!3F""`%(!`F""`%(!3F""`%(!3F""`%(!3F""`%(!`F""`%(!!F!"`!(!`F!"`! -(!!F!"`!(!!F""`!(!!F!"`!(!!F$"`!(!!F$"`!(!!F$"`)(!3F""`!(!!F""`! -(!!F!"`!(!!F!"`)(!`F$"`)(!!F!"`!(!`F!"`!(!!F$"`!(!3F""`%(!3F""`% -(!3F!"`%(!3F""`%(!3F""`%(!3F""`%(!JF#"`-(!!F""`%(!3F""`-(!3F!"`! -(!3F!!3!(rrm!!"%Q!!%!N!-F!*!$6J#3"2rr!*!3J%!!N!9!!%!!N!P)!*!$5!# -3"3J!!3!)!*!'%%i!N!3%N!-&"*!,"C!%!J%#!33&"33%"3F4%JS&N!`#!J@3!`F -("!N("3H3"!8&"*!%"`8&"*!,"C!$"*!$!3)""3F,%483"`@3$3)#"38(N!-%#3F -&"3F*"`8&"*!%"353%`8&#a%A%3X("C!)"!@3"!3&!3)&"!3'N!-*"`F&"3F*"`8 -&"*!%"`53"`8%N!8&"j!$#a%@&a)2#33&N!B%"38%"33&"33%"33&"!3'"!H3"!8 -&"!X,"`8&"!3&"`F&N!-(#JX4$!X,$4%5%KFB'4N5#J3%"`N("C!'"!8%N!J&"*! -H3!`@3!`B($3N&"`8("a%A&K3B&"L3"4Q3""J8%K%*"`8%"!8,"`@3"!53#`8 -&"!F%"!N(N!-&N!3%"`X0%!d4%4-3#j!%#T!%#a!,N!-+"`F,#`F("33%"JN("C! -%"!%%"!8%!33%"3F(#3F%"j!&"33&N!-%"!X0$!X,"JF("353"!%""j!*#`H3!`3 -'"!N("C!&"!3(#3N("`N("`3("`3*"j!&"!8&"`D3"33%#`F("C!&"!%(N!N*"j! -(#`F&N!3,N!-("33&N!-%"38("!N(N!B&"`F'#3N'"*!$"j!$"C!%"!3"#3H3#!B -*"j!'#3F&"!8,#`F&N!B%N!-&"`3*"j!*"T!$"353!`F*"`F&"33&"!3*"j!3"3X -(#a!,"`8%"353"J@3!`3,"j!$"JH3#!8%N!3*"j!$"C!$"!3,"j!*"!H3"J8,%!X -("`8&"*!-#`H3#J8&"!3&"!3(N!-&N!-%"!F*"j!*"!H3"J3'#`F("C!$"*!("`5 -3!`B,"j!+"C!$"*!%"j!%"C!$"!X(N!S%"`B(N!3%"JX("`8&"*!)"C!%#`N(N!S -&N!3%N!3(N!-&N!-%#`H3#33%"`B(N!3%"!X(N!-&"*!)"`8%"!H3#`@3"!F%N!3 -'"C!&"`X(N!N%"!B'#3F("J3%#`F("C!$"*!("`8&"!H3#33(N!-&"3F&"353"!@ -3!`30#3H3#!8%"!B,#`F("*!$#`F&N!3%N!F("`3%"j!%"3H3"38("`@3"353"!8 -&"!X,"j!*"T!%#3d0#3B%"JX&N!8%N!8"!33("38(N!3&"`F&N!8("33&N!-%N!3 -&"3B0#3H3"`B%"T!$"`Q3"!X*#3F&N!8%N!8"!33*"38(N!-&N!i%"!%%"!8%#3X -(N!F'"!3'#!B,#3N(N!33$3F&N!-%"33&"!3"N!-("`8(N!-&N!3%"C!&"*!$"35 -3"3F'#`F*"`N(N!3'"!D3!`X,#3H3"!B*%!X("C!$"*!%!C!%"`X&"!F("C!%"!3 -&N!F%N!8!"JX*N!3(N!B%"`B,#`N(N!F0#`X*"`8%N!8"N!-%$38&"`F&N!X%N!3 -&"!3'$3d,#C!$"j!&"JB*"JX*#3H3"JN,#3N0#3N("*!$!C!%""!("!F("C!+"*! -%"38(#`B($3X*"j!&"T!$#`B*#3F*"j!&"!X,"`N*#`d4%!X(N!-+#a)@"`8("`@ -3"33&N!-%N!3&"`X,"`8($3N*"j!$"T!$"`X*#3H3#3B0#3H3"!N,$C!$%!f3""% -0"!F("C!$"!8%"C!%"!F($3d*"j!$"3X,#3N("`N*#`X*N!-(N!S,#3H3$JX*"`F -&N!-%"33%"33&N!-4$3X(N!3&N!-0"`N*#`d,#`F*"j!+"JN,"j!+"38%"!8,#3H -3"3Q3"!X*#3X1#3H3"3@3!`3,N!--#`N*"`N(N!S&"!X*"j!'"3F&N!8("`X*"C! -$"`F&"`X,$C!%#`H3"3@3!`3%"`d,$!N*"j!0"3B,"j!("C!'"`F*"j!$"C!%#a% -0#`N(N!J&"353"3d,#`N(N!J&N!F'$3H3!`8("`8("C!&"j!$"3F("38(%"8,"j! -)"C!%"!3("!3'#`X*#3F("38("C!'"!@3!`F,"j!$"C!$"`F&N!3%"j!$"38,"3X -5%`X(N!J&N!8%"!N,#`B'#`H3!`8&"!8%"C!%"*!$"38(#3H3"!8(N!-&"33&"!F -("C!$#`d9%3X(N!N&N!-%N!-(#3H3"!X(N!-&"!8%N!J&N!-*"j!'"38("38%N!- -(N!-&"3F,#3H3#3@3!`53!`H3!`8%"!F%#3N,"`53"J8&"*!$"38%#3H3!`@3"`5 -3"!8*"`F&"`B*"j!("C!%"*!$"`F&"33&"3F("JN("`8&"!3("C!$"*!$"38%#`H -3!`@3"`53"3X("`B%"JN'"j!%"C!("!F'"38%N!3'"!B'#3F("38("C!%"*!&"JX -(N!-&"3H3"!8%N!3,$3F'"!3'#`B%"j!%"38%N!-'N!3&"33&"!3("!3'"JH3$3X -(N!F*#`N'"J3%"`X,"JB%N!-'#3B%"``*"`8%N!3'"`F&N!F(N!3*#3H3"`8("C! -$#3H3#JQ3!`X,"T!$"*!$"J3'!`3($3d("*!$!3%'"`@3#!3(N!F&N!-(N!-&N!3 -,"j!,#`X*"!3("`53!`F%"!B%"`N*"`53!`%%#3@3"!H3!`8%"!H3"`8&"j!%"C! -%#3H3$38%"33(N!-%"`3%"JB(N!-'N!-%N!-&N!3(N!3&"!3(N!F&N!N%"JF("C! -$"j!%"C!&"!3&"3N("JF&"!3(N!3'N!8("C!&"j!$"33%"JH3"3@3#J3'"`@3"!F -("C!("*!$"33(#3F*N!-("`B%N!-'"!B("`@3"!H3!`8&"!B(N!8&N!S%"JN&N!i -%N!J&N!-("3F("*!%#`F&N!B("38%"JH3"3@3#`3,"`@3$J53"3@3"33&"`F%N!- -'"!F("C!)"!B(N!3&N!`%#`F&N!3(N!-&N!3%N!-&"*!&"C!+"`3&N!-("`8("C! -$"*!$"j!%"3F&"3F("C!&"!3,"`@3"!H3"!@3"J53!`8%"C!'"!8%"3F%"!@3!`3 -(N!3&"`3%"JN(N!-&N!3("`@3"33%#`N("C!$"j!%"C!&"*!("33&"*!*"38%N!- -(#`F'N!3*#3H3!`8%"j!$"3F&N!3%"!N*"`8("C!)"*!&"33&N!3%N!3&"!3&N!N -("`N'"!B,"j!)"C!&"*!%#3N'"3F&N!F%N!B&N!8%N!J&N!S("`N*#`X(#3H3"38 -("C!&"*!$"`X%"C!&"!8&"*!'"C!%"*!+"C!&"`@3#!3%"J3%"JB(N!8&N!B%"!d -%N!J&N!-%N!3&"353#!F*#`N("`@3!`F&N!J%N!F(N!B&N!8%"!X'"*!%"`X,#38 -&"*!&"353"`F*"j!$#3F&"3H3!`@3#!3%"38%"JB(N!3&"j!$"353!`F0"`F,N!- -(N!-&N!3%"C!&"*!H3"38("`8&"j!*"38%"!F%"!H3"J3(N!3%"a!0#`X(N!B -&"`53"!8%"C!$"*!$"`F*"`F&N!N%"!8%"!F&"!8("C!$"j!&"C!$"!3("`N*"`B -'"`3'"j!&"JB%N!-&N!3%"!H3"J@3"!3%"38%"38%"!8&"`F*"`@3#33&"!8%"!H -3!`B%"JB%"JH3!`N*"JB,#3N(N!8,"j!'"C!$"!@3#`F,"`@3$J3&"3F%N!-*"JF -,"j!%#3X,"`N*"j!$#`X(N!B&N!i(N!3&N"%%N!-'#j!$"`8(N!B&"`F&"3H3!`B -(N!-'"J@3$!3("!8&"`@3#!%&N!-%"C!%"!3'N!-%"C!$"!3'"J8&"!H3"`B("33 -*"J@3#J)&"!3#!J8("C!+"!@3"!)#"!B*"JB&N!-""!3""!8&"!H3#!8&"`X&N!X -""38#"3)#"`F&N!-%N!B&N!3"!3)&#`B("`@3"!53"!@3!`H3#!8(#3F&N!S%"C! -$!T!%"3F&N!-""*!&"`8%"3)#!3F,"C!*!38#"38(N!J*#3F&N!8%"!8&"!8&"*! -$!38&!J%("`8"N!-%"!@3"J)"!JX("C!+!J%&"3H3"`N(N!-&N!3""!3&"353"`8 -%!J%%"`8#!C!$"!3&"33%"3%&#K%&N!`#"C!$"j!$"!F*"j!%"C!%"!#3"aN!!2q -3"*QC!!(rN!4QCJ!#rj!%-c-!!rrrc-bCQ3!%rrr-c'CQ!!Arrmc--c-!"[rrQCP -QCJ!(rrqCQ6-c!!MrrfD3"!!*rrpQCM-c!!V-c*QC-c-!#mc-CQBc-`!-c-aQCJ# -3!`h-c$13"!!1c-`c-`#3!`qCQ@CQ-c-!%*QC-j!%!"'CQ6-c!*!$%QCQ-c-!N!- -6CQB!N!88-c-!N!89GhF!N!8@998!N!8A4%3!N!8B)L)!N!8C%4%!N!B)[J!"!*! -$(!#3!di!N!6rr`#3%)!J!*!&3!"!!*!*5!#3!dJ!N!8%!!%!"!#3"JK1!*!%E-C -Xc-c'Gfc-c'c'TRT'c-E-aQE-c+CR%A4(DQc-E-aQUNGQChHU4Xc'c-c'aUE-N!2 -'E-c-5RUUGUCk4QCXE(DNCXCN&X4-c*!$aNChT-E'c-aXE-4QGk&(4NC-afTXT+T -RDNT-a(E-N!4UV'DQc-CXc-aQaRTkGNCfGdCQc'GQCdG+UNG'aXc'aQI-ChCQc*! -%C+Ch4NCf&QCdCXaUc%DQ4'4'4QGXc-aQI'aRc'aQCRTRC(4RDKCfUQ4QCmaQ4+H -U&NCR4(CQc+GQaRE'c'TdCU5K4dGRCdGQG'TfE-c'UNTf5RC'5QE'GkGXCmE-CU6 --HRTf4(S@G%HQ4kCQc-aXC"URCRCk3@c'HQc-CXb3"'G'4RB@C%CQC'Td4-b3"'H -UCRGQGQChaQCQC'a%CRDNCfS@Gk4N4NCf4XCXc*!%TR4'GNGXCmaXCfc'CQE+CdG -RCdGhGRGfC'6-aXb3!m6'ThCk4UahChc*aRafaN&kG(SATf4R4fD3"-b3"-I-akG -fGfGhc%GNCkCmCXCfTNCNC'GKC'CUC-b3"XCmGj!$CQCR6%V+4'I'4NGfCkCfS@G -UGT!$E-b3"'c'I+CQGk4dG%4d5RCQDXCfCQChGRCdGQHNCQc-N!4Xc(c"GhDQ4RB -@C'4'GdTfCQI+TRbKCd4kaQE-E-b3!dE"c'E'CRGU&RHNC%CRTdaR5Q4fGQG%CQC -%E-E-CXc'CRc'N!2%GfGR4hGfGQ4NI'bKa%HKCaC%C'c-c-E-I-CXaXaXChGdHKH -RC'GNC(E'E-a(B@C%CXGhc-c'GhE(Cmb3"AGf4Q4NChThCf4fGQV-ChT'4'aNE-c -%GhCfE-I-c-E-a'CRTRDRC'5NE%G-b'CQGhGRHQV'c-CRN!0%E-E-N!0XaQChGK5 -NUNG(CfG#I(V'4R4mE-CXI'Gda%V-I-b3!f6(CRCdTkDUGN4k&R4'&TGXGm&Uc-E -(FDaQUXb3"FI(4'Tm3@4f4RB@C%CU"T4QDNHXE-aQ5Nc+'XD3!mb3!fCXaXI%DQD -NTRHNC'GX&mUKG(E'E%akUQ'NE-b3"@ahCdV%CfahCQCdE'I(N!#N5N4Qc'c'c%' -K&Qc-c'E-c-E'4%GNG(CNCRGhc(Cf&KP+T'CXE-c'a"&Qc-c'CXc-E'CNT(4NGR4 -h4RCQCXI'G"CdI-c'E'E-a-b3!fE-N!6(4RC%aRDQT(GhTQE(DQ&"c'b3!mc-aXc --E-CQE-c-E'I-ChGU`AHRGQ4fTU4'4%5Qc-E-CXCXE-aXE'4'c-c'C%SDG(&fGNC -+5UU3!k&+4d&XCXE-CXE-N!4UTmaXE'5N%8Tk38T+UU4"SDT+GfCNTQc-CQE-E-a -XCU'UGQc'C%T%C'T+HQTUUX4'4Xb3!fc*TXE'E(c'CQCf%4UNGXCRHUT%G+3@4dG -'aQI-N!2'aQbTE'c%c-E-E'CN%D&faXGd5QT"a%UU5USAE-c'aQE-N!1@E'I-c'a -XaXE"URE(E'G+UNTU5NUUUNI-CXCQaXaQE&PQGmaQCQGQCmG"GQCRT+5USD&+S8U -Ua'c-c(aXE-c-aaT+DUCQI(GQE('XE-ad4(&"4%T%T%4NaXc'aQCXN!3CN4UQ4mE --aXCN4QbNG%TdE-E(5NUK5@aQaQaQCXc-aKT8NCSDE(aXN!9mBDT'aXaK4*!%GQC -NE'D3!fc-SA%4N!-Fc*!$aXCXCXCfV-E'bNT+DQTXE-aXN!6-CUT"4"%4('CXE'D -3!fGUa%V+CQUUT+T'Gmc'N!6-CQ`4&"4%%4GQCmI+bNUUCRUQc-c%UNC+4(4Qc'C -RCfE-aNT+4+UK&dGQN!0N&(TfBD(-E'aUT''THRaQE'GXafc'&+CU%4&"5RCfG(T -%F8TaS4UU&QURDNUKTQaQafCXc'`D4Q3D4+4hGXaRCkC(G%SD&"5R5RT"3DUNTQb -3"-CQUUUKUUUKCh('N!0RCQDRHN53!a4%3D&"T"&-E'E-akC"UUSDT%4fGfaRCfT -+&dT+4%5N4'UNS8UK34C'E-c'TK5NDUTQYQE'CRC'T+UK3A&"UT!$5U'K5U38UQC -%CQC(UU%AUN4kUQE-c'C%UR4h4(4%G%6%5N&"UUSDUUG+CN4(4(5N58CkI'aXTa& -"S@&kHNSDS8UKT*!$C'UN5RCa5RCRTkC+GNGQ4XCm`DT"4+5N4%TdT%T+DUTmCU' -3!a%4aQ4QaQI'Gfamc-c'TQGUHT!$UNUUT+HUSDc%UN4d5NV-SDUKV'D3"-c-C%4 -U4NUUUNUU&-E(ah4mc+GXbUUUaUSD3@E'UXamc'a+5Q4KG%T+UNT(E'c(C+c'N!5 -T%@GUT%CQCQQQCQCf38&%4NDUTU&"GXc'aQ3@c'c'CN5U%CURDUC'Ci&XC%U3!d5 -NTUDU'U&%GfE(a+E-aQC+DK3@4QS@E-aX4'aQT%TRTNTh4mC"3Ac(E-aXUXc-bRT -d4%UNG-6'CN&Qc'HUUNT'5N4fc-DNTXE-E-bUV-c-CQa+3Dc-5XaXa+4QDUU3!dC -K5Rc-CK%AaXCQCUSAaQCXaQT%4Xc'aXb3"'UUDN&kHUTmE-bR4XaXc'GfCQc-N!4 -Qc-c'c*!&aNTkGRGUG"E-CNCXN!0QUUT"GXE'c-bRE-aXI-c-CXc'F84aGd5UNfa -Q4Qc'DT!$GQT%c*!&CXE+aXCQCXaQG'4fI-4Q4'5UI-4Q5UUU3A&a4QE'c!#3"`` -!!*Q3"J!"CT!'!!*QCM-cCQB!!c-cCT!%!!3c-fCQ-c-!"613"'CQ!!BcN!B!"`! -!998!N!-)UT!'!!PhN!B!#P@3"J!,4*!'!!`LN!B!!"%@!!%!N!-F!*!$6J#3"2r -r!*!3J%!!N!9!!%!!N!P)!*!$5!#3"3J!!3!)!*!'%%i!N!36"a)*"`S5%`J#!`) -4%K86#3B(!`)$!K)4!`F5!`)4!`B#!K!#!`8#N!3"!T!$"J-3!`8'N!-#!K!$!K% -$"K)(%a-)%JB#!K!4%JN)%JJ("`B'!K!#%`)#%3F#%3-'%JF5%JF'!K%3!a!$%3- -#N!84!J-(!J-4"K%(%JB(%`S6%J+3!`-4!`B(%4%6%4)4!`B(%a-'!J-'"J)(%3B -(!`-'%JJ9#48(%j!$"K)5%"!("JN6"K%'"a-(#3B*N!-#!`)#%J-3!J)(!`)(!J) -$!T!$%K)(!`B'"`-4!J-#!a%#!J-#%3F$%a3(N!-*"a)("K)("a-("a13!a)+"a% -$"a%#"J)#%3B5!`)'!K!#!3)'%JF'!`8'"`B#!a!'"a!#!K-8&3F$!JB#!K%$!K! -$%JJ(%K)#"J-*"a)#!K%(%4!'%JB'%K-(%K-6"J-$%JB6#3N)%K%%%JJ$"JF6N!- -(%a3*#3B$%a-(%JB#"JB$!J-#%`F'!a%(%3-4!`)3!J)(!J)$"JF(%JF$"JF'#K- -0#JJ5"`-4%a)4!K)*#K-'%K-*#3F(&!F6"`B3!JB#"a)4#4)3!J-5#!B(!JB$%T! -$!`B6"JF'"K-#"a%'%T!$"`-5"`-4"`F4!`S6%J-#%3J6#K%$"J)$"J)$"`d6#4) -#"a-$!`B4!K%(%3B$%4)(%a%("JF'"`J(%K)(N!-'"`-'%3)'"`N'"`F6"JF4%`J -("a%#N!-'%`B'%K-5"`F*$480%`S6"`d("J-4%4-6#!)'"`F*&!N5"J-'"K)(!K% -#"JF5%JF$"K)6"`-4"`F5%3)'!`B*%`F$"a-6#3B5"`-5!`F5"a30&4-(N!-+%J) -4"a)$"J)#"`B(!J-$%!-("K)("J-4%3-'%J)("T!$!J)'%4%(!`-5#K-*"`)(%J) -4!K!#!K%$!J-#%JB*!`)$"J-#"`-'"K!#!K!$"3-5%4-(%3-(%JH3!`)$%K)("`B -'!JF(#3N@"a%#!J%5!J-'%J+3!`-'"a'3!`-'!`)4!K%5%`B(%JF5N!-("K)(%JF -5!J-'%3)4"K)5%`F5!`B'#"-0#4)+%a%'!`B(!`)4%3)3%a)6#JB5!`F'"`B5"JJ -5"`N6N!-'"`F5"a)(#4-*"a)(%3)$!`)$!J-$!K%#!JF6"a)("J)$!JB$%3-#"JF -$%`F'"a)(%JF5"JS'!a%("K-)"`F$!K%#"K)$%JF#!`)$%3)'%j!$!JB#!K!#!a- -4!a%#%3)4!J-#%3F'%JF'"`B'#")(%J+3!a-#%3F(%j!$%3B4!a)$%JF#%3B#%3) -4%3B6#K-'!K)5%`B#!`B$"`F'!K%#!`B5"`N'"JF5&3d8"a-5!`)3%K)(!`B'%JF -(!T!%!`B(%`B5!`)$%JF5%3F(%`F(#3N(!`)5%K-5%J)5%JB$"J)("J-#"a-("JN -$%JF5"`B8#")'!J)(!a)5%!)5"JF5!`+3!`B'%J-#!`F6%`)3!J)$!K%5"`N+#3B -'"`F$"J)5"JF4!a)$!JB#!`F'!a%(%JF6"`N*%JB$!K)("JB6!K)'!`B(N!-5%a- -5!`)3!J-5!4!#!K%5!`-'#JB5"a%(%JF'%3B#%4-("K)'"3-'N!-5!J-#!`B("a) -$%K-("JF'!K)6%K-5%JF'"`B4!`F5%3B(%K38"a%5"`B$!J-4!`-'!JF'"`B$!J- -("JF'!T!%%!)3"`-'%3)(%`F5!`B#%a-("a-)"`B#!a%$%K)'"`B$%JF(!`S6%J- -#%3)$#3F'!`)$!`B(%4)4!J-2!K%$"J-#!`)3!`)$%JB$"J)'%JJ("JF'%3-4"a- -(%JF(%J)'"a+3!a-'!JB#!JB$"`8'%3F5%K-(!`B("J)#"K)(%`F5"K)5"`B#"JJ -6%`B'"a%#!a)6""%4"T!$%JF5"a%)#4-(%a-(!a)#%3-6#3N6"`B(%3F("JB("J- -5#3F)#3F'%JF+#4-(#3S6"`-("`B6%JN+"J8$"j!%%a-5!`B("a-9#3F'!T!$%4- -(%a)(%JJ'"K%$%4))"K-("K-5"`B(!`B'"`-6#3N'!JB'!a))"a-'!a+3!a36%JF -#!`F5%`N(%J)'!`B'%JS6"a)#!J-#!JB(%JF6%3F(!`F$!K%$%3F(%JF5%`J(!a% -$%3F("JB(!a%(!a%$%3N6%K-'"`B'!J-$%3)'"a36"a)$%3)'"K-+%`F5"`-'!a% -3!JB#"JB5%JF5"a)5%4%#!K%5"a%$!3+3!`F(%`F$!J)$%JF$"JF5"`-'!`B#!a! -("JF5#JN8%`F5%a)'"a%#!K)(%JH3!`B'!J-'!J-#"K-(%J)(%3)5N!-'%J)3!J) -'%JF'"JF*"a)&"a%5"a%6"`-'N!-)#3F'"`B#"J-#%JN8%a-(%JB$!J-3!T!$!a% -$"J-5%`F5#K)(%J-#"J)5"`B#!K)6"JB#%J-(#3F5"`)5!`F'"`)3!a)$"`B#%JJ -6"`)$!`B'!`B'!`F'%3F("JF(%JB#!j!$%J-'%J-5%J-#%4-(!`)#%!-'%`)'"a) -5"K%'!`)3!K%4%JF'"a)4!`)'"JF$!J)4"a-'N!-5%JF'"J+3!a%&"J)#"3-4"`B -#"JF(%K%'!JB("JF5"K)$"JH3!a)5&"3,"a%$!3)$"a%4!T!$%3B'"a)("`J("JF -5!`B#!`B'!J-'%K-(%a)'"a-5%J-#%3-9%JF$"JN(!JF'%`N,%a)("JF6"`B("K% -#!`)$%!-'"a-5%`D3!`-'%4%$!a)6"a)6"`F6"a-("a)(&!F'!JB6"`B$!JB$!K) -'"J-4!J)'"`B5!J-'%JF("K%'%`F*"a)(&3J4!J-("J)$"4%(!J-6"`B5!`F5%J- -'"J)4!JN)"`)4!K)("J-#!J-(%4%(%J-'!J%4"a)6%JF(%JF6#4-'#!F#!K%("J) -$!JB(!`B(!`-("JB5!T!$%3-3!K)(%4-)%a)5!J%#!a)(%3F6N!-(!`)(%a)(!J- -5%`S*#JB("`B3%!)4!`F'%4%("K)(%K-5%J-(!K%4!J-#"K-(!a-#"`-("`B#%4% -'!`B'"a%$!K!#"K%$"T!$!`)3!a!(#!B'!J-)%K)'!`F'"`J(%a-(%`F4!`%$"JF -5%`F#%"%#!`)"%3)#%`J("a)(#a-$!J)3!K)(%JF'"a%("J)4%J)'"`D3!`F5!JB -'#"-'%K-(%JB#%4%("a)'"a)#"J)#%"!$"J)3!`B##3N+%`F#%")6%JJ5"`N(%JB -(%JF9#K-6#!B("a)("K)6"`N'"`S6%JF'!JF(%K-(#!B#"J)$%JF6%3F5&K8("JB -5N!-$"JF4!`F9#!N'!`)$"JJ8%JS6"`B$!J-$"a%$%3B$"a)6%JF$!a-5%JF'%J) -$%JB$%K)@&3X6%`F4"K3+%`-#!JF'"JF5"`B("J)4%4-6!`B'!`-#%4%'"J)$%`F -(%JB'!J)$%3F'!`F$"J)$%J)(#3S+#3)(%3F5!`)'N!-4"JB"!J)'%a))!`)$"a8 -+%JF6"`B#%3F5"a)'%JB5"JF("K)5"a)'!`)4!J-6$"-*%T!$%`B6"J-4N!-+%J3 -#N!-$%K-("`B("3)3%4-("K)5"`D3!`F5"a)("a-("a-("J-#"K!#N!-5"K-0#") -("a-)%JF#%3-8"`F5"a%5%`B'%JF5#3N(%J-3"`F5"`B$!K!#!K%$%JB(%3-#%a) -)%JF'"a)(%JB'!a%6"JF'"J-(%3B$!`)'!J)3"`-'!`)##!F4!`-#%3-#!JB'#") -'!T!$!a!#N!-$%JB6#4)(%a)(&!F5!a%$"a-(#!F$!J)5%JB%!K)(%J)3!J-#N!- -3%J-3!a%#%!-#%!-4%`B#!K!'%J)#%!-4"`-(%JF$"K%$"J-#!J-#"K)4!`8$!K% -'"`F5%")5"`B$"a-5%K!5"`-#N!-5%`S5!`8(&3S("J-'"a)$%K%("K%4"`)$"J- -#!J-#%"!#"JN("`N5!K%(%K)#!`B(!`B#"K-6!`F("T!%%JF6%K)#"JJ0#3B$"a- -)%J8$"K)*#JF)"K)'"a%#"K!#%3F*$3F5#3B#"K-(#3F*%`F'%3)$%JF#"a-5%JF -#"a)9&3F#!3F6%JF$%4!#!J-#"J)("a-'%JF)%`)#%JF(%K)(%J)$"J)#"JF5"a) -'"`)$!JB$%a-(%K-#!a%(&4-,%`F'"JS6"J)#%!F'%K)#!K))&43'"`D3!`)$%K- -5"JB)!`)4!J)3"JB5!`B$"J)4%3-4"3-#%3B$%K%("JJ6%JB'!`F5"a-6%J-#!a% -("JN(&!N6"a)("J)'%3F5!`)4!K!(!`B4!`F$"`F*%JF'"a%5"a-6#!B(!J)(%`N -(%3)#!`8$!a!#N!34"a%$"K)("J)"%!)#!`-#"a)$!J-#!`B3!K%#"a)(%K)#"`B -(%`F6%JF'!JF5%JJ*N!-'"J)(%3)'%4%$%!-4%JJ5!T!$%3)$!`B#%3+3!a3*%`F -3%3F4!a-(%K-5"a)$"J-#!`)5!JF'!a-8"JF5%J-#!J-'"J-("JF(%K-("JF'!K) -5%`N5"a)4"a+3!a3(!J%#"a%'"a-6%JS5"a)4"a)'"J-#!`B'!K-)%3B("`B("K% -$!J-'"a)(%`F'"JJ6"J-'"`N)%a%$!K)(#3N+"J)#%3)2!a%4!a)("K)("a%'!JF -'%`B$!JB("J)$%!)#"J-(%`S6%JB$%JB$"JF6"`F6"a)(!`)#"JJ5%JF'%J)'%`B -5&3S(#T!$%J)$%K)*"a)(%4)#"`B(!`%"!J)6%JB'"a)5"J)("JF'"a-(%J)$"K) -+&K-'"J)5"`J(%J-5%J)$#K38&3N5%`-6#4-)"a%("K-#"JB(%`F#%a-9&!F(%JF -5!JB(%`N(%JB$"J-5%`F6%`)$%3F5%JF'%`F$!a%(%a)$"`B$%J-'%3F#!J%#%!) -#!`F'%`-#%Jd,#4-6#3S6"J-#!a%$%3-4"a-5%`F6#"%#N!-$#4)6"`)3%3)$"K) -(%JB#N!-4"`F$%!)!%J)$%3)$"a%#%!X6%JB(!a)3!J)3!JB'!T!$"JF$!J-'"JF -$"T!$%`F(%a)6%`F*#4-+"a%5!K)'!JB$%4)5$3S6&"%5!a%$%K81%3B#!J-#!J% -"!J-5"`B5#3F'!K%'!`F4!J)$%JS*&!-(%3-5"a)6"a!#!K!#!`N("JF'!`)"!J% -#%3F5"a-(%!-("J-"N!-#%JJ8%JB(#4-*"JF5!`F5!`B'%JF5!`)'!a%(%`)'!K! -#%3-5%K-("JB$!J)4!J-4"`-'!a-("J)#!3+3!`B(%`N6"`F5#!F(!a%5"a3*"K% -4!a%5!K%$!J)6"`)$!K!#%JF0&`J6"J)("JB*!`B#"JN+$489%`-5%JF4%3-5&!S -6%a)6"a)4!`B("a-6"`)("a)+%a)(%4%'"K!3%4)5#"-6#K%(#3F)%J)'!JB+&!d -0#3B'"`F4#3F6%JF6%`F$!J)$!`B'"`N(%K%$!K!#!`B(%JF5!K)("`)#!`#3"aF -!!2rrc*!%!!(-N!B!!Xb3"*QC!!2-c*Q3"!!%c-bCQ@CQ!!@CQFc-QCN!"TQ3"J! -(QC!%CQB!#*QCCT!%!!PQN!B!#QD3"$-c!!YQCM13"!!--c0QCM-c!!dcN!B!$J! -!)L)!N!-2hC!'!"#lN!B!%DU3"J!5L*!'!"0hN!B!&&@3"J!94*!'!"BLN!B!&a' -3"J!!#)B!!3#3!a`!N!01!*!%rrm!N"#!)!#3"8!!3!#3#8J!N!0)!*!&"!!"!!3 -!N!B)6J#3"%4!0%3c-%0$4$-c3c4%!$-`-%4%-c3d-d%d4%3d-$13!d0$-$-d&%4 -%-j!$4$-$4!"%&$3c3d%4%c-d-$-c3c4%-c-$-d4%3d-!-!4%-$-c0$&%-d4"%84 -%-c3cN!4"3c0$3c0$-c3d-c0$0#-cN!0"0$4%384$-d4$-c-d4"4%-6"!4$!`3d- -`-c!`-c0!-a4%3d4%0$4%3d-$0%4%3c-c!c383d-c-`!c0$4%3d3d0$13!d-c!d3 -`!c4$4$-d-d4$4"-c-$-`!$3d383c-d4%0$3c-`-d3c-%4$!80%-c3c0$!c-d0$- -$3d53!c"$4%4$3c0$-d3c-d0%0$4$-`-c3d-d-$0$3$53!a-c!d0%4$4$!c!d0$1 -3"8%$!c13"%0%-d4$384"-c0$0$3c4%3$0%3cN!3d4%-`4$"%-c0%-d4%-$4%4$4 -"-a0%4$3cN!0%-c!c-a3c3c-a-d4$3d3c"$-c&%3dN!-c0%-84$-c3d-$0%3c4*! -$-a3c4$4$-c0$-c-80"4$0$4%4$0%0$0%-!3c3d-44%0%4$4%0%4%3c3c0%3c3$0 -%3d4$4"4%3d-$4$0%3a4%0%4%3d0"-c-`4$-c3c3$"%3c3d0"4%4$!$0$0%3c3d- -d3d&%-c3d4$-`!c0%3d0%3c4$3d4$3`3c-a3c4%4"%838&%-c&$3d!$-c"$0$3d4 -$4$3c4%-`4$0%4$4"-49"0%4"0%3c4$13"%-c0$4"3a-$-d-d0%!`-d-c4%380$- -84%3c3`-d!c3c3%13!d4%-$-a0%&$-`4$3$4%4%0%0%4"-c0$4%3c-`-$4!0%0$- -$343c3d0%0!-d4$-44%%d4$-c-%0%N!0$-%0$0%0$!c4$&$4$-c-d0$-d4*!%3d3 -d0%4"4%-c-d4%3838&%0%N!0$4$3c-d53""&%4%0%4%-c%84$-c"%3d4%&%3d-d3 -63c4%0$4!0%4%%8-84*!$0$383c!c-"3d4%4"3d4%38&%0!4%4$380%343d&$4%3 -`0%4$-j!$3d-84"%c4$0%4$3c3d-d4%0"384$&"4%N!-8363c0%4%3d4$4$0$3d3 -4-c3d-d3d3a384*!$0$4%-a4"-`"%4%0%-d4$3d3d%83c4%0%36-c4%0%0%-d4%3 -c&%0!-%3d-d-c0%-d4"4%3`-c0%36-d&%0%4%0%4$4$4$0$!c4$0$3`-$4$4%&"3 -cN!0%4$-d4%0%4$4$&%53!c3c!d53!c-d3d%d!d-c-$-c0"3c3c4$0%4%0%4%3d3 -c4%3d-c3c3d9%4%13!d!!4$0"3d3$4$-c3c!d-d%c4%-c!c0%0%-d4%0%0%-d!c0 -%-d-$3`0%4$3`0%0"&$0%3c-d0$0%3c4"3a4$-d-%-d-c0$3c0%3c4$4%4%%63d3 -cN!-`-d-c&%&$0$4$0%4%3c0$-j!$3c-c4%38%63d4$-c0$-$4$4%4%0$4%0%4%- -c0$0$-j!%4%0"&%0%4"&$-d3c3a-c&$-d3c-$3d-c-d4%0%4$4$4%-43d4"&"363 -c0%4$3d%d4%-c-d53!c-c4%0%3d0%4%0"4*!$38383c0%0$0"4$-d0%-c0$0$-c4 -$4$3c"$0%-d3d4%36360%N!0$-d&"3d4$-d4%-c-%0$0$3c"%0%4$4$4%N!Bc-c" -%3c-c4$3d-%3$-d3c4%%c0%3dN!0$4%-d4$3c3`3c0$4%-c4$0%3d0!4$3d4%&$3 -c4%3c4*!$0$3c0$!c4$3c3c!d3`0%-c0%-c0$3d%d0%0%0$36-d4$4*!%0$0$N!- -c4%!$0$3%4$0%-c0%%8-`&%0"-%%d-d4%&%3c4$!d3`4$!d4%0$4$-c4%-83d0$- -40%-c4$0$&%4%0%4$N!3c3c4$3c%c3c4$4*!$36-d&%4$0"-c3d4%0%%$3`-c4%0 -"3c0"4$4%-c4$3c0$4$0"3d-c3c4%0"0%-6-!-d4%384$-d53!d0$-d-c-c3d3a0 -$3c3d4%0%0%0%0$4$0$-c0$-d&$3d-`0$-c!`0$3c4$3d-$0$-c0$4%3d4!0%3c3 -d-%3c4%-c4!-c-c53!c-dN!-$0$-d4*!$3d!c3c3d3c3d4%&%0%-c4$3c4$4$&%0 -%-`0%4%0%N!3c-c!a4$0%4"4%4$3`0%-c&%!8360$-c!d&%&%&$3cN!4%3c-d3d3 -dN!0$0"-d0%0%3d53"!4$4$4%N!0$4$-d-d4$-853!c4%3d3d3d4%-d4"-83d0%- -8384$0$3`0%13!c0"4$0%-d4%0$-c0%4%0"0$3c-d3c3c-d4$-c3c0$!c-d3d4%% -d4$-d3c3d3c!8-c3`-c%!4$13!c3c3$-d-c3c4%4$&%4%-c4%N!-c-d-d3c0$3c3 -6-c3d3c-d-d0%4%0%3d53"N0%3c-c3d4%0!-d-j!$0%4%0%-c3c!c-d%d0!4$"$- -d4$13"%3c3j!$&%3d4%4$-c"%-`!d0!4%4$0%-d0$4%-cN!-a3d4%3d4%-%4$N!- -c-d%c!%4%0%3d4"4%4%-d3c-d0%3$4%-c4$-%4*!$3d3d3`!c-d-d4$4"3d3d-%- -d-c3d4$4%-c0%3c4%4%0$4%0%3$4%N!0$4%3c&%-d3d0%3a4$4*!%3c0%4%"!-d3 -d4$"%4%0%N!0$0%4%-c0%0%38-d4$384$3a%8-$-c4%%8!%3d-d4$4%4$4$3c%a4 -%-d3c36&%0!-84$-c4$&%N!-!N!F&!!"QN!B!!613"J!#Gj!'!!09N!B!"%53"J! -&)T!'!!!)IJ!"!*!$(!#3!di!N!6rr`#3%)!J!*!&3!"!!*!*5!#3!dJ!N!8%!!% -!"!#3"JK1!*!%%c!#-`#3""-$!`)J-!!b!$#3!c)b-$!J)!#3!a!L)K!c!!"!!!! -`!!!J!J!!-!!K%J#3!b)5)J#3"#!#!!%3!%!`!$!%!!)`%#)J!$-!!J)J!`!")5% -!)3-#!L)!!!)J!3!c!J!`)!!4)!)$-$!!)*!$!L)4!3!5)J!L)J!J!")J%!!c!!) -!!!)5)c!c-#!$)3!L)K%J)J!!!5)!)3!#)"%!%!!`!J#3!b%"*!!!-J)"!J)!N!3 -J!J!b!c!#%#-J)5!!-3)!!$!`)#!!!#%`%K%K)J#3!a)L!!!J!#!#!L)4)L!!!J! -#!`!4)J!`)$!L)3!!!L!L%3)J!#-#)#-J%4%")!!3)J)J)"!3)!-#!L!")J-L!4! -K!K!!!#3%!J!K)4%!)!%5)J!`%3!#3$-!!M%K)"!!)J)5)!)!%J!J)#)K%!%J)T! -$)!)4)!!`!b!3)J!`!L)")L!!!!)J)J!!)K)5!!)$3J)J)!!5-!-b!L!L!!"#)3) -3%6!!%K!#!`!!)J!`!5)!)5!#-J-!-#!#-#%#!L)$)K)30!)#)#!c!b!L!#!L)!) -!)5!J!$)#)!)5%L!L%J!"!M)K!!)J!!0!)K%J!!)$!J%!)6)#!`!L)J%!!K)J!#% -!!L%!)!!"-a!#%L-J)J!!!`!"!`-#N!-!)J)K!3!!!L)5%#)5)3%5!L!L!3!`!!) -L)J#3!`)J)!!b)J!L)3)!-L#3!b)#%3-3!J"!!!!#)"!!3!3#!!!3!#)5!J%J!5% -L!#!#%J)L)!)!N!-")J!#N!-5!!)L!"%#!L)J!J)L)K)J%#)5)5!K%J%J%K%3-`! -!!K)$!L)#!5!#%!)4!J!#%K)J)!!!!L)5)M-5)L-c)!!3!$-`!#)!)!)L!L%3)J! -L!L!K%!%L)3!#!!)"!J)J!5!J!!)$%3)%%K-!%3!#!!!#)J!3!*!$-#!!%3!4)L) -J!J!!)4!`!L!!)L!4)!#3!a!"!#!J)M-#!#)5)4)L)#)J-!%K!#!$)`!!)#)#!!- -J!L!J)J)$!#!J!!)`)L)6)!)!!L)$)!)3)#)d!J!#!b%K!J!J!J%!!J)J!J)L)L- -d)`!K!5-6)!)L!L!!!!)L!6)4)!!M!!!J!"!#!K!#%b!J)L!K)L)M)b)J!L!!%5! -#N!-3-!%`!!-!%!!!%3%$!3!!-J)5)J)4)5!!!3!3%%)K%L!!N!B#!#%#!!!%)3) -!%L)K!5)J)!!K!J)!!"!!!!)!!J!!!j!$!L!K-#)5)L)4%L)J)!)M)4%5)b!!)J) -#-!!!!b-N)!-J-J)!-5!J%"%J)J%4!K!#%L%b-#!!)3!M"#)!!!)!!#%$)!!"!$) -L)5)!)5!3%#%L!M)#!J#3!b!J!$-#!#)b!5-M3#!L!K)4)T!%%4!!)!-!)$!!!`) -!!L"$)$)b!`)`)`)#)L%5!K!L)K%M)!)!)!)!!J-b-5!5!!&!)*!$!$#3!b!M)L! -4)K)#)K)!)#)c-3)J-`!c)J!3)$)!-J!#)`-`%b!!)5%c)L!L%#!#)J!$-!#3!c! -a!L!J%K)c!!!b!`-5!!)K!M-!%"!J3J!!)$3!N!-#!!)L%3)L)$!$!!!$!`!b%!) -!N!-L)J-#!J!#)J)#!!-!!L!!!5)J!`-`-$)`%J!L)J!c-#)J-d!!-!!!%5!!-`) -!!J)K%5)J!`%J!`!L!!)`"$"!)M!!!!)#!")K)J-J-`!#-J%5)L!!)$-!)#!!N!N -#)!!L!"%33L%#)J)!)K)`!J!4!!!5!J!J!`!!)!!!-J)J)!%!!K!#)J&!)5!L)M! -#)#)!!a!#!#!#-$)J)$0!)!)b)#!#)!!5!J!L%L%3!#)`)#!#)#)J)b!#!L)$"!) -b)L!L!*!$-#)#)!)#!!)!)4-J-c!#!!!`!L!`!$!d-!)$)#-J-!)!)3-!!!)`)J% -3)#-$"$-!-!)!N!3#!d0!)")J"$!c!*!$!L!J!#)J!J!b!$"$3!0#)$3!!!3d3`- -!%L!%!`3J!$-!!J"!!#!J!`!J)#)c!!!d!b-#!%!c)c)$!3!!%`!J!#)L!*!$-!- -`-#!L!b!!)!-!-!-!!`!#-!)")#%!)#)J)#)#!!!b-"!!%#!J!J-!-!!M!!)!3%! -#!")J%!-!!!)4)33#!b%#-M)M-#-$!$!c-`!`)*!$-!-#)!)#!#!!)5!J!`)$!5! -#-`)`3c!!!#-$!!!L!!!3)!!L)6)J!`%#)#-!!K3!!!-d-$-!-$!!!#33)J!a!#! -#!`!!!`-!!3*!!!)L!$!$!`!J!#!M-%!!N!-L!#)#)!)$!`!`!M-#)!#3!a%c"$! -%!b!!"!!`-#!!)$!M!J!5)`!!-$!L)!!"!!3J!#-`)!-`!J!!)J"!-L)!N!-$)#! -L!L!"-#*!-!0$!!)J-!)!-`!!!J!M-!!#!`#3"#)`)3!L)$!%!$!#%`!J!$!")!! -b!J!J)!!b)#)#)L!#%J!J!!!$-$!$!$!#!#!!!!%J)c!!N!-#)#-5*!)%%#)K!3! -J!c3$)#-!3`-!!#!#)!)`0$!L!J-!!J!L)!!$!K)#)L)`)`!J-!!!-c!J-#!#)%0 -!4$!!N!-M)*!$!!!M-J-b)J!$!!!#)J!`!j!$)$)c)`3!!b!!)%!L-M!L!J#3""! -J!!*!)"%"!!!d-J-#!!-!!$!!)#)!N!-c-!)#!$)#!`!J!$)#)b)!)!3!-#!!-c- -$-$-J!J%!-*!$!`-!3J-`)J#3!a!3)!!J!`#3"`3!!*Q3"J!"Zj!'!!+UN!B!!iL -3"J!%Gj!'!!!)PJ!"!*!$(!#3!di!N!6rr`#3%)!J!*!&3!"!!*!*5!#3!dJ!N!8 -%!!%!"!#3"JK1!*!%35)R)RBR&L%aFR)L*aG"&8F@%4)LF84(%4%5*b4%&4%Q%L* -eBRB8%LBK*fBQ%Q&b)@%4CfGfGK*fCAFR&P%4&@FQ*b4#*Q8QBKChGfB5*N8L%KB -LCb)5CfBACK*K)5&K*fBP9d*fCL4@*")A&a)N38&b&L)RFRFR)RGdB5&Q&b*Q%A) -4GR)RB8BP&eF5G(Bf!L%5Gb*L%@GK*bB4%KFR%5FK%LCh)KCQC"%Q)4CK3LCR)R% -Q*h*L)4&K)K*'Gb%4*K&K)@)Q&QB9&a*fCb35%d-4%R)RB5GK%@&a0N4b)L%L)K) -N3@&KBK%Q4K)ACL48&8CeFR*RFK349RB54"*LGf)bGRB8CaBK&b)b*R*LC@08-(C -5GbBA*K)9BQ%d&h)5&eC"%5)d)4%KCK*LBA)93"96GQ*L&aFL%A3LGP3R)LC5%L% -8%8F5BR*f*b*L*Q)RFL&Q&"*K*b94BL*hN!0Q)K)A*L*48L*LBLBQ)L*#&(Ca34& -N&a*L&K9$*b*h&hFL%4*bFKFPGb*LB4)QB5GRGK4K%RCh)K*K%8%LGbFL*R*RFKF -L)5BL*Q*LF4%84RBR%5Ca4hFK&a&PCb*QCRF5FQCKF@B@GLFQ)QF@34-@BL%9)A& -"&hCLB4%KFR)8*f89CL)L3NF4GfCQB484%4)Q*Q9K*%%5)L)K*'Gb)Q%R&")Q9(* -A)4%4*QCR%4&#FPGKCK*a%83A&a0N4b)N)K4%-5&K%N)K8K&LBQGa34&"&5&KCbC -'*NGhB54"*P3P99&#)Q*L)5GKB8*LCh)R)dC"FR)RGa%43RBQ%d&h&eB@99*a%53 -MGh%4&bFLF5)LC8%L&hGb%4%@)LGP3R*e&PC8Ch0"BQ84Ca&h*a&b%L)Q3A0%4hF -@&K4L*hH3!aGa3988)9-5GeBQ%L*&348KFRC#4&3@)K&4%b*b*h%R)LG84f*K4P% -QB@)N%@&"GL%4%RBN4"*fF4&#)LGbFL)R)QBLF4Gb)5)L*R3A)QCL%4&a)Q*K%K% -K&N*L)Q)LCQGL*L%L%C!$*R*b)5BR)5F@&K4b)A)44hB8FR&44'BAFRBLGh)4%@3 -5*L*K&LFLFL%5%R)L*"*A*bGR&&-@&d4LFLG"BKBK%4FQ9aF83")QCL*h*bFL&Q) -Q%KCA&44'&K*LF@3A)5%@&a8K)5)@3KB8)@%LF8*L*Q%@&h&&-@%Q*aCfCb)L)4* -#*MGK%4*LCQ95GRC"35*LB5)L%L%aFLBA)A&b&@Gh)4*5)4F44"GKCPFL*f&hFQB -4&R&Q%LBK*hF5GLBK&b&R)LB5*534FACKF@GfFK)LF9BN)4%QBKBL&h*fCK8LBRF -KCK)K3@Gd*f*9*fCKGb)KBL%K%54@*#CK&bGb*@)RFKCRBL*b)K34)P)QB9FR)Q% -A*hGa&8)R)Q)8*LFL)4GKGb)RC5*K*Q*K)Q)5%M4LF5Gd3R9N*h)QN!4KB5%5*hC -f)6F89f*4)@*hF5%M84FLGb-QFR*e99%LB5CRB4*f%NGN8K9#Gf&h*RF5%@BN*Q) -L4"C')K&84")MBQ%5!5)@)L)R%@)K%R%ABQFRCA9(*8-4FK4b&9*8B5%L*#CdF53 -5)4%R*h&")R&K*h&a)LFP-4Ca9#GQ9$33FLFR%f)5%L%@%4)RCd%5)AGa8KB9BL4 -%-435BK45&`%9BR*M4NGh)4%8%K)@44BA)L)5%4&R&&38FK%A)QCQF94#*9944a% -L&K%4CR34CaC@*R%4BLF5GK*LF@%A)R*f9R8!84F4)8)Q%5CbCR)Q)4G&4bGK%LB -L3R)4&&)LGQGb%e4aFAF4"'BRBA%L%5BK&e&KCa%@CK%@)4%84b*PGbG%4#*Q*#* -%4'F4)5CaCQBLF4*"FA35)4%KBA8@&RFQ&P8%Gf&R&R3"FLGb&hFK%K864#*Q)Q% -R%5*K%5%4GLB598B4)Q)4*f)R*LBLBLB54P0%GL*aF4-LFKB4N!-KB4%M4"%5BR% -54#GaB4G@GQ)L88!5GbC"Ch&QFL)4G#9"44%Q&h*bB4)8Cb&K&f4hCL)L85)KF8) -Q%RBKCh)8)K35FL)LFLBLF50L*QB4FQ)L4#*a&b*aCRCR%4BAF4!AFL*L%5&%4#8 -5FRGf%@*RChBN%8)ACf*b*KCbBL*aC%GbGLB4)83d%d&4*L*LFM%Q8K&#G(FQ*Q) -R)A&LCLC4!QGbGR)L384N4K*%*N&"&a%N&%*N3Q%QBQ)QC(FR)435)d)Q&Q*d%A% -5ChG"FL4bFQ)4Cf)@*L*4*%B93Q%Q&%)P"hCQCLFLC6)R)44"%6*b%N%hB@Ga!K3 -K%9%A&(BQCR*L"N)P84)N&KB4&%3N45FL-8CQCL9")5*P%@%LCK)R45%8&#C8%KG -QGK8434*"*')4BKCQ%NBL3A&8)LCQ&dF53Q*@3K-bGK*4GK9(-4BAB5GfCT!$*QC -LC%*K*QCA%L4(*QC%)R)@F63b*LBa%4)@B5CQCe%QBQBK)K&RBP*L*KGb)K-P"aF -4*4)5*b&%GQD3!f)KB4)QGf*b%5*LF5&K*RCR3"%Q%90P38GRBN*QCP*Q&fBL4LG -a)L*hGf)KCb)5CK%@Gf*R&L&#%83L*bCK*#)5B"*&B4&R)L)R*e&#Cb*(3K*#GK% -L%a)P%aF43L%8%K3K*4853QGa*hFQC4&N)Q&L&R*KF4BL*fBd&L8$8Q*c%!&f%a% -L)N)P3LCL)5C'F83%4#F8*Q%KF488C4&"*f493(*f)8%5G4*$%4&fCKC`4!#3"`F -!!2q3"J!"QC!'!!*QN!B!!pf3"J!%Zj!'!!@UN!B!"RH3"J!(4*!'!!!4$J!"!*! -$(!#3!di!N!6rr`#3%)"!!*!&3!"!!*!*5!#3!dJ!N!8)!!%!#!#3"K"1!*!%#43 -9&!Q3"43-#438%38&%4%&N!36&Im1r`lr$JN&%C!'"4)*$!i,$!@3!a)'%`N8#a8 -5"4-*N!F8#C!'&"@3!`8'%C!&"C!$%K)6"`N8ra8(""'3"!84"4)*&Im-$4%&N!- -5%`N9&3i*%K)*N!B8#C!(&!`1r`88%C!'"385%a)6#485"385%a'3"!8&%a39r`i -9%K%&"4)6&"6r&3N&%K-*N!89#3N8#C!%&!crra),%C!'"385%a-8&!@3"")*"4% -4"385#431$K81&"%4"3B*#3`2&"+3"!Q3"")8#C!(&"Arr`B8"4%&N!85%K-*#K% -&N!8'#4%&N!-6&"81#a8-%`88"4)*&3i9%T!$"JN6%`8&%K3*N!F9&Im,#43*%38 -5"4)5%`N8&384N!3&"4)*%J85#439$K8-$48("!N$"3S1&!@3!`B6&383%386&!N -*%a-*N!-9$!`8$!N&N!35%JN*&!`&%3-4%3@3""-8&"81&488&"8-&!B!%K!&&!i -&N!85&"3%"388&")6#3J*#439$Im9#4%&%JB6%a39#3F5%C!("3B6&3crN!-&"4) -'#43%""%$"438"3B&N!35&436#4Ar%JB*N!-8#C!$&3i&N!-5"K-(%`N9#`N4%"! -4N!-&N!-5&3i-rrm&"4)6#3N8"J-3"3N8%4-&N!3'#Im,#4Ar&!F*N!-(%J8&"K3 -5%385%JB5%JN8&Im8%3-4N!3&"3N9N!-1r`8&%K)(#3N'!a!X&%J@3"3N-"4% -*rj!$&3N5"K'3!`86#4%&%38&%K)6#46r$K33%"'3!`8@3"2m&N!-'%K)*&"! -$"431"C!$%3@3!`F8"4%*$[m-#3N&"4'3!`8'#4'3!`@3!a)5#439r``&%C!%"38 -*$"@3!`i5"385N!-6&!83"48,"4%&N!85#384#Im9%`B&"4%3%"%&"3S&%C!%"C! -$%JN8r`i0%4!4"386$!i8%aAr#38'"3B5%JN*%3B9&!83"C!&%K3&%3N8"33&&2m -&%"%3%388#4'3"!8&%JN*&"Ar&3N4%385&3i*"K)9ra35%J85"K)(&"%5#a8&%3@ -3!`B5#435"4-&%C!$%`i-"3-3"388ra)4N!-&N!-(#439$[m1%`8&"`N5"38($!i -9%`B&"4)'#3`&"`N5"K)&N!-5"JN8%J85#384""%8$"33%4%5&2m9"C!&%K-8&3m -9$[m*"385N!88$[m1&4)&"3B5#Im*"C!$%K-,#38%"`N8"C!%%a)4%3B,$4)4"3B -0r``8"C!%%JN8&C!$$!N4"C!%%T!%&2q3!a8&%385$434"C!%"JN9!33-#4%&N!3 -5#4%4"3N9$K-ǡ&38&#"3)%a-9&3N*&"%&%38&%K)'%K)*&Im-#4%4"385&"3 -&N!35#3X"""34%3@3"")*"4%4#3i-&4-8$JX&N!-'#K8&%C!$"3B5%"%&"4)'%T! -%%a6r$K34N!-&"3B9&!@3!a)6&")*"4%&N!B*"4%&&!`9&3d9ra)4"385#3N4N!3 -&%`83%3@3!a+3!`B6%a39&434%4!&N!-*$4)'%K)6&!S&%384"C!%%K-6%388$[m -9r``9%4%&"4)*#4%%%4%%3%4%&%T!&"K)8$`i*%C!$"385%K39%K)6#438%"% -&N!B5%`N4"KArN!-1$")4%!8&%JF*%C!$"3B8%C!$"385N!3'%JN*&3i6%4%$%4% -&%JN1&!B6#485%4%&N!85%JN*"46r$Jcrr`N3%4%&N!-*#K)4%3B+#a'3!`8&"K+ -3""-*&!i-"4'3"!8&%JN0&3J5#434N!-&N!85%JQ3!`lrN!--#4'3"!@3!`N8"`8 -5#3`-"4%4"385N!-6%JN*&2m9%3-4""'3!`86&C!$%K36%"%&N!85"3B8#439$[r -r%a!$""'3"!8*&485#48-#4'3!`8&%T!$%a)6#48-#4!4%384%38&%K39&43+%!3 -4"C!&%K)(&!84%Jcr&!85%K'3"!8+-#4)$#3N&%4%&"4)5%a)6#4Ar&")3%"' -3!`@3!`B8r`i-#4!$"C!(%K3*"386&2q3!a3*&!84%38ǩ%`8$"3S5%4%&"4) -5%a-*#Im1&4'3"`8&%K6r$K8*%"%&N!B5%`N4%386&3X8%J@3!`B8&!N5#489%J- -%"4)*%J8&%T!$%`N*&3i-&!-4N!B&"4)9&4-'#3N4%3@3"4)*"4%4%a6r#3@3"4) -5&"@3"!8#"4'3!`8'#488#4-6#481$[m8""!3%C!%"386&435N!-*#4%&N!3'#4- -4%4-9&"%4"C!&%JB(&"@3!`3$%4!3%4%&"K-8$"88&Im9#C!%%C!&"385#3i5"4) -5%a8)"38'%JN6%38*ra)3%3@3"a)5#"6r&433%!-3N!-4"38*&"81rrm9#3J(#3N -4N!8&%K3*"C!$%K)*&4)&"4-*"JN9ra3#%"%&N!-5"C!%%K)*&480%K%3N!84"38 -*&Iq3!``8#3N6#434N!-&"K3*"C!%%K)*ra85#435%`N*$!N#!a%&N!-5"4)&%T! -$%a39&3N4%3-3%4!4%38&&"Ar$J`9&43(%a6r&"-*&"-4%3@3"")6#`i8%a)&"4) -5&"3#%"%&N!J'%K)*&3lr"4'3"`85#46r$J`9N!-6%`N1rrm6%`N4%3@3"4-9&4) -5"C!%%K-8!K!3"C!'%T!@3!a3&%38&%C!$"3B*&3i-&C!$$JB6#Im8"385&!N -4"384"385&"35"4%&"4)&%JN4%"%4"C!&%J85N!-6&3`8#4)'%J8&%38&%K39r`i --&48*%a-8#38&%K)6&"34"4%&"4)9%`84"385N!36#4!$%4%&N!B5%JB*$43&N!3 -5%K-&"4)*&2rr$J`8#")6%`N&"4+3!`J*&4-4"4%&%K35%4%&"4+3"!B8%K!4%3@ -3"4)5"K)*&4)4N!3%"38*&!N8$!lr&")'%a)6%K%&N!-5N!-6#484%38N&%4% -&"4)5"JB5#484%"%&%3@3""+3!`N9%K!4%"%$%!8&#Irr$J`1&!85N!-*"4%&N!- -5"K)6#436"38'&!8&%4%&"4+3!`B6#488!a%4"C!&%K)*&!i&%C!%%"!4%JIr$!i -9&3i*%K)6#4%4"C!$%T!$"JN8&3N5&384"384"385"K)6%JN9$")4N!3&%J85"a6 -rr`84%334%"!&"3F9r`i9#481%a)(%a!4"C!$%T!$"K-*$2m-$K%&N!-4"385N!- -6%JN9$K85%3@3"")6&2m1ra)4!a%3%"%&"3N9&3i*"JVrra38#4%&N!-5"4+3!a- -8r`lr$!N&%3@3""+3!a-6#43-&3`9%J8&%a-*#439$!N%%C!&"4)*&Im*"4)*&3l -rra33%3@3""+3!a-*$[m1&48&N!B5"K)5#3N9$K81rj!$&!@3!a)*&"31"4'3!`3 -4"4)+ra8&"4)*$"89$"83%3@3"4)5%`Rr$K3)#43&N!85%JF)#439$K8-$J`*"38 -4"3B*#439#4'3"!8'#489"4%&"JN9$K88r`84%38&%JB5%K-*&3i*%`N8%a%&%T! -%%`N*&"@3!rm1%`84%38'%K-*#4Ar"J@3!`B*$"34"!8&%JN1$!N6#`N4N!-&"4) -5%a-8$K85%K-*&!85%K-5%`Q3!a89$K89%K'3"!85N!-6#489&!B&"JN9&4)4%38 -&%K3-&")'&2m5%3@3!a)5%`N8&3N5N!-6#486%K13!a)'"4)8&!i&N!-4"C!$"K) -5%`N*"4%&%T!$"JN8$K)&"3Ir$385%JN9ra)4"385%JN*&43&%T!%#43-%a-8#4% -4"3B*$!d4%3@3"")'%JB6%K%4"3B&"4)'%`N8$4)5&2m*"C!$%``1$JN&"3B6#"8 -9"C!&"K)*&38&%K%&"JN8$2m8%"!4%38'%T!&%4%&N!35N!-'"JN9&3Rrr`@3!a) -5&!i9"`8&%a3-%K%4"4%&N!-'"a34"C!&%K)*&"33%4%&"4)5%a-'"4!4"4%&N!- -5N!-6%`RrN!35"C!$%K6r%K!4"4)*&"84N!-&N!35#43&%3@3"4)'%a3'%4%&%K- -*#4-'%4!4"C!'%JB5%JN9rrm1#3@3!a)*&!-3"C!$%JN8&"%4"4%&"3B(&"-&N!F -'%K-8#38&"JN8#3F6!a!3%3@3"K)'%JN9rj!$$!@3!`B8"4!3%38&"K-8&384"38 -4"4)6&!i&"4%4"C!$%J85%K8*"3B8&!N6%`)$%"%&N!-5"C!$%K)*&!i9%K-8&"- -5#3-3%4%&"4)(#438%3@3"!B*$!`5"C!$%4%&N!3'#3`*#438#3S*!K!4%3@3"JB -&"JN8$"3&"4-8&C!$%"!4"C!$%K-*&"8'"C!%%K3*&")&%C!'"385#3i-&488#`N -5!K!4%3@3!a)&"K+3!`N8$K-&N!-6&481#3-4%38&"K)6&"Ar#385%a-5#3N6%C! -("385#480$"89#4)&!J)$%3@3!a)&%T!$#3N,$J84"38'#3lr$!84"C!$%K)*&"6 -r&4)5"K13!`Q3!a%&"4%4"C!$%JN9&3lr&3@3!`-!%"%%"385"4)5%`J*&484%3@ -3!a-8ra88%38&"K)5%`N8r`N5%K-6#C!%&4)4N!-&%38&%a3-&3`9%K%&"4%!!J- -4%3@3!a+3!a-8&434N!-&"4)8r``9%`8&%JB5#!N8&4+3!a13!`Q3!a38%C!%"38 -5#4@3!`i5%4%&%38!!K%3%3@3!a)5%`N8$!N4N!3&"JN1&488"C!$%K)6#43-%J8 -'%`Q3"439%4%%%385#3X1#a36!K%&N!34!J-3!`84"3B6#439&384%"%4"4)*r`` -9&4)&"4)5%`N8&4)&%K-*N!B9"4%4"JN8$!i9#433%"%4"4%4%K)3!`-4N!-&%`N -9$JN4%4!4%385#3`9N!-'"385%K-*#485"4)6#C!&&"35%3B*#439&385"K3&N!3 -4"385#4%$%3-4"3B8&3N4N!8&"4)6$!i9&4-&"4)'%`N8&!8&%K)6#C!&&43&#C! -%&!`*"3N1%a%&N!B5&43'"38(&3i1%a'3"J8`9N!-'"C!$%JF*&"3+"4)5#C! -&!*!(&J!!c-bCN!3!!Fc-QCPQCJ!#QC!'!!1CN!4QCJ!%QCPQN!3!"@D3"J!'CT! -%-c-!"fCQ-j!%!!Jc-fCQ-c-!#613"J!+-j!%!*!$#b)L!*!&$"%4!*!&$3!!)L) -!N!-1!!!4%3#3!`m!N!34%3!3L*!'!"&hN!B!%P@3"J!64*!'!"3LN!B!&4'3"J$ -r!*!)!3#3!mRS!!$)k!!!"r`$XkJd!hS!N!-F"TB!&eG*6N3!"`$#9%e36!!"!5* -1G@e`!!%"1N&-8P3!!`&54%P86!!%!B*69&)M!"%"[QPMFc3!"!+@D@0c)`!%!Y* -*3diM!!3$$QPME$3!"!0+4%a24`!!!iC'6dj8!!8$NNC26N3!!J2D3e958`!)!rj -ZD$-a!!!%DNC548B!"!4f3Nj%6!!!",*048j9!"-%[Ne195-!!3@Z8e45)!!!"FC -NBh4L!!!&dQPMG')!!!AHB@0dBJ!$"HT`F'&d!!F''J#!!#d!N!0i!*!&J3#3#i) -!#!#3!b!!N!@$!!m!N!2H!*!&K!!A!*!$3!#3"B8!(!#3!eS!N!@'!#%!!!%#!*! -&K`"f!!!jh!#3"B!!-J#3!ji!N!@"!2d!!%h1!*!&J!!h!!!LkJ#3"B%!33!!)`3 -!N!@"rrmJ!!MJ!l1Qf!#!rrm!!%lQ!l1PV"1)!58!!%li!l1Q%"1*!6%!!%*4!l1 -Pm!#"rrmJ!!M`!l1PK!#!rrm!!!b-!l1QB"1)rrm!!%jQ!l1QL"1*rrm!!%kH!l1 -PZ"G`rrm!!&+%!l1P[!#!!'JJ!!%Q!l1Q,!#$!*%!!%Z4!l1P(!#%!*8!!%iG!l1 -Pi!#&!*S!!%im!l1Pr!#'!4%!!!l1Pj!#(!*m!!%pQ!l1Pf!#)!+-!!&"G!l1 -PJ!#*!+N!!%m+!l1Q0!$*!+i!!%`P!l1QR!$+!,X!!%b1!l1Rk!$,!-F!!%bd!l1 -PM!$-!0!!!%cD!l1Q2!$0!0B!!%ck!l1PX!$1!0`!!%dD!l1PD!$2!1)!!%dk!l1 -Q"!$3!1J!!%eD!l1PT!$)!1i!!%ed!l14Y!$4!28!!%fk!l1Q)!2Srrm!!!&!!*! -%!qRrr`!!!F3!N!3$k[rr!!!-XJ#3"!2VrrmJ!$Sk!*!%!qcrrb!!1Vi!N!3$k2r -r!!!#5!#3"!2Trrm!!!+-!*!%!qVrr`!!#N3!N!3$krrr)!!l3J#3"!2XrrmJ!$Z -'!*!%!qMrr`!!!Y!!N!3$kIrr!!!$e!#3"!2Urrm!!!P!!*!%!q[rrb!!1mS!N!3 -$l2rr)!!mcJ#3"!2Srrm!!!6B!*!%!qRrr`!!"Y`!N!3$k[rr!!!+L!#3"!2Vrrm -J!$h5!*!%!qcrrb!!2pB!N!3AF!%A!!"4rJ1cT0",LIrr)!!00J1cTe4,M2rr!!! -@`J1cTe"-$!"G)!!X+J1cTda-LIrr)!"GRJ1cTdK-M2rr!!"R+J1cTd4-#3&C)!! -MC!1cTd!!P`"*"!!LT!1cTc`!Q!"5"!!M(J1cTcJ!Q3&0"!"G@!1cTc3#!2rr)!! -j"!#3"!)$rrmJ!$P-!*!%!J6rrb!!1C3!N!3#"Irr)!!h9!#3"!)(rrmJ!$HF!*! -%!J(rrb!!0q3!N!3#"[rr)!!i,!#3"!))rrmJ!$Kd!*!%!J,rrb!!1,`!N!Errb! -!1J#3"S$rrb!!3GS!N!@"rrmJ!%(P!*!&J[rr)!""m!#3"B2rrb!!3IX!N!@%rrm -J!%)'!*!&J2rr)!"#%3#3"B(rr`!!3Q-!N!@#rrm!!%,X!*!&Jrrr!!"$1!#3"B6 -rr`!!3qJ!N!@!rrm!!%4I!*!&KIrr!!"%M3#3"BErr`!!808!N!@(rrm!!%qp!*! -&L2rr!!"&9`#3"BRrr`!!4K3!N!A+rrm!!%E2!*!&brrr!!"(AJ#3"Fcrr`!!4pS -!N!A0rrm!!%K"!*!&c[rr!!")U!#3"Frrr`!!53m!N!A*rrm!!%Pf!*!&d2rr!!" -*j!#3"FMrr`!!5MN!N!A4rrm!!%V1!*!&J!#"&!",-31cT0J!J3#*&!",B31cT53 -!J!%#!!"26J1cT5`AF!%I!!"4bJ1cTG!AF2rr!!"5,!#3""1)!6N!!&1f!l1QG"1 -*!88!!&2U!l1Qa!#!rrm!!&3H!l1Ph!#"rrm!!&45!l1N%!#!rrm!!&5'!*!&J[r -r!!"c+J#3"B(rr`!!K&3!N!@$rrm!!)d@!*!&K2rr!!#H-!#3"BArr`!!TVS!N!@ -'rrm!!+mm!*!&Krrr!!#heJ#3"!G0CA0cB@GP"P0dBA4eF`G%G@jRC@pZ"%ePER8 -%9'9iG!Y%D@&REQpcG'PMF`4198a-"%jeEA!*9@jcD'PQG'9N"e0SD@CdC@3)5'& -MDdC[ER3+8&0)B@0V4QpZG!T38dKKBfY'Efjd$8eTFf-Z)&0dFQPZCh-+9&4C)&G -TEQ4[G`GYC@jeBQ&b"h0eBQePER8$5f*N"%KPE(!%5@jQE`0"Bh3&6@&RD@-%3QP -dF`aMEfjdFQpX)'YPHA-,F(9ZBh4eBA4TEfi)BR*KBfYPG(-&B5!Y)'d&EL!Y)(S -&35!Y)%d&6L!Y)&S&-#!Y)$N'GfPkBA*N"f0eFR*PER3%68j9)`j3FQ9Q)%CTE'8 -J6Q&YC39&FA9TF!GKFfYZB@eP"90dBA*d#d&LEh9d,f9bFQpb"d0[EQCTFQd,3@* -[GA3[CA*bEh)(3fpZCQPbE3Y1CAG)B@0V4QpZG!a38dKKBfY'Efjd)$Q6)`: diff --git a/sys/mac/NHsound.hqx b/sys/mac/NHsound.hqx deleted file mode 100644 index f0cebe97c..000000000 --- a/sys/mac/NHsound.hqx +++ /dev/null @@ -1,4197 +0,0 @@ -(This file must be converted with BinHex 4.0) - -:#e0[G@jNFbjbFh*M!(*cFQ058d9%!!!!!!!!!!-,a@BE!!!!!!%!!!-+K!!$#B3 -!!!&"!!!"MJ!)Tc`pR`!!$rF!!!'1!!LR2$fI!!!2q!!!!Bi,8fpeEQ4c,R*cFQ- -#!!!!FR0bBe*6483"!2rrrrm!!!!!FR0bBe*6483"!2rrrrm!!!!!!!!!!!!!!!! -!!!!!$hQR2DiI!!!!!!!$#m83X3!!!C8!#+Fm2eJ!!"$"!!!"P3!)Tc`r@!!!%-3 -!!!'9!!LR2$q"!!!3e!!!!C8!#+Fm2kX!!"$P!!!"P3!)Tc`rd!!!%2X!!!'1!!L -R2$rR!!!4"`!!!Bi!#+Fm2qJ!!"%)!!!"S!!)Tc`rlJ!!%3d!!!'J!!LR2%!"!!! -4(3!!!!!h3!!"!!%!"3!!!+!!!B"4!!!!!!!8!!!!!!!!0aC@lSZM!!!h&!!!0a8 -!2)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)# -!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIi#!JB+$Ji5&KBD'KSD'KB@%K)1 -#JS'"J)"rIhprIhprIhprJ)#!J)'"JB+#JS1$Ji1$Ji+#JS+#JS'"J)"rIhjpIAY -kHAGfG(0aF'p[EQp[F(*cGRKlIB#%KSL,MBq3!*!!N!#3!)q0M)Z*L)D%Ji'!Ihj -qIAepIAepIAepIRjrIi#"JB+$K)5&KB@&KB@&KB@%Ji1#JB"rIRelHAGeFR"YDfP -RC@9PC@GTE("dHAf#KSU1NT@AQ*QBPjD8NBq-LSL'K)+!IhemI(YlHhYlHhYmI(e -pIRq!JB1$K)5&KBD'KiL)LBQ)KiD%Ji&rIAYjGR*ZDQ9KA9YC9eGC@ejMD'jeHi+ -)MT5CR*qKSU'JRTbCPT12M)U(KB1"IhjmHhTkHRTkHRTkHhYmIAk!JB+$K)@'KiL -)LBU,LiZ+LBL'KB1"IRYiG'pUC9pD9P*26Np38eGEB@CYG(Z%M*1DS+5SUUUUU+@ -LRTZANiq-LBD$JAppI(YkHRTjHAPkHRYmIAk!JB+$Ji5%KBD(L)Q*LSU+LBL(KS@ -$J(ekGR&XCf&E99&058P*5de499YLDA*lKBkAS+HXX,+bXDqVTk1HQC@4MBQ'Ji" -qI(YkHAPjH(KiHAPkI(erJ)'#JS1%KBD(L)Q,M)f0MBb+LBL'K)&qHR9aDQ0G9e& -,4d0"3%*%5%e8A'9[HSD4R+DZY,LkZVLeX+ZQSCZ@NSf*KB*rIAYkHAKhGhGhGhK -iHAYmIS#"JS+$K)@(L)Q+Lib-M)Z+LBL(KS1!IAKcE@CI9e")3cik1$Sm38K4@Q9 -[HiH5RUH`YVUm[,UhXkfSSTfBNiq,Ki5!IRakHAKiGhGhGhGiHATmIRq!JB+%KBD -)LBZ0MSq3!)q1MBZ+L)5!I(KcE@CI9Nj(3$Se-M%c0Me&8&aTGiD9SUki[m2&a-+ -qZ,+VTCqCP)q,Ki5"IRakHAKhGhGhGhKjHAYpIRq!JB'#Ji5&KiL+Lib0MBf-M)Z -+L)@"IAGbDf4E8da%2MJc-#ma0$T#6PYVHiZEUVDraFR+b-5rZ,'USjfANBf*KB+ -!IRalHRPjHAKiHAPkHhapIRjrIi#!JB+$KBD(LBU,M)b,LiZ+L)@#IRPcE'9F98a -&2MJc-#ma0$T#6PYVI)kHVER"amV+b-1pYUkRS*U8MiZ)KB+!IhjpI(amHhYlHha -mIAeqIRjqIRjqIRq!JB1&KiQ+Lib0MBf-LSH%J(aeEQCH98j(3$Sd-6!`-MBq5&C -RHBZGVEV%bXh0bX@qYkqQRjQ6MSU'K)+!IhjpIAamI(amI(amIAeqIRjpIAepIRj -rJB+%KSL*LBU+LSU*L)D%JAeiF@TM@P0-4$ik0cBf1$Y#5P9NG)@@TE+ma-M*am1 -qYkqSS*U8MiZ)KB+!IhjqIAepIAamI(apIAjqIRjqIRjqIRq!JS1&KSH)LBU,LiZ -*L)D$IhTdE'9F98a%2MJc-$!a0$Y%8@&cKCHSYX()c-h,am#jX+QJQT51LSD$JB" -rIRjpIAepIAjqIRprJ)"rIhjqIRjqIRq"JS5'KiL)LBQ+LBL(KB0rHR9ZCejA6dK -!1M8a-$!b0Mj+@@TqND1c`-M1d-r,a,bdUk+EP)q,Ki5#JB"rIhjqIRjqIRjqIhp -rJ)"rIhjqIAepIAk!JS1&KiL+Lib-LiU)KB*pH(&UBeT66%3q1$-`,c!b0d"0AA# -&QDZkaXl4dXr+`lU`TjqANBb)KB1"J)"rIhprIhprIhq!J)'"JB"rIhjpI(amI(j -rJB1&KSL*LSZ-M)U)KB&pH(&UBPY66%8r163a-$!b0d"-AA''Qkfmb-r6dp$*`VQ -[TTf@N!#,Ki5$JB#!J(prIhpqIRjrIhq!J)"rIhjqIAepIAeqJ)'$KBD(L)Q*LSQ -)Ki@$IhTcE'4G98j'3$Xh0$-d0MY$6Pe[JjDSYm2,cp(1bF+jX+HIPj'-L)@$JS' -!J(prIhjqIRjqIhq!J)#!IhjqIAepIAjrJ)+$KBD(KiL*LSU+LBH%J(YdE'9F8da -$2$Bb,bi[-MP%8Q4iMD#b[mR2dY(0alkfV+1EP)k+KS5#JB"rIRjqIRjqIRjrIi# -"JB'!IhpqIRepIAjrJB1&KiQ+LSZ,LiQ)KS5!Hh9ZCej@688q0c%Y+b`[0$j,@fq -&QUbmamr6dp$+`lU`TjkANBb)KB1"J(prIRjqIRjqIRprIi#!JB'!IhpqIAepIAk -!JB1&KiL)LBU,LSU)KS5!HR4XC&e86%-m0M!X+bd`06p-AR1*RDqqbY(8e0$*`VL -[TTf@N!#,Ki@$JS'!IhpqIRjqIRjqIhq!J)'"J(prIRepIAeqJ)+%KSH*LSZ,LiZ -+L)H%J(YdE@4F8da$2$Ba,LdY,c3q5eaaKjb[[mV5eGA4bX+iVk@FPC!!LiH&Ji+ -"J(prIRjqIRjqIRjqIi#!J(prIRepIAepIS#"Ji@'L)Q+LSZ,LiU*KS0pGfpRAPC -046dh-LiX,#ic2%PDES5CV,c)d069dF[$ZV#RRjH4MBQ'K)+"J(prIRjqIRjqIRj -qIhprJ(prIRepIAeqIS#"Ji@(L)Q+LSU,LiU)KB*qH(&SB&G24cmi-LmY,M!f2NY -FEi5BUVR&cG$4cXR#ZE#SRjL5MSU(KB1"J(pqIRjpIAepIRjqIRprJ)"rIhjqIAj -qIRq"Ji@(LBZ-M)f-LiU)KB&pGQpQA94,3cXd,LXU+bmf3%pKGSZIX,l*cp,4cXM -!YkqQRTL5MBU(K)+!IhjpIAepIAepIAeqIRprIhprIRepIAeqIi##K)D)LSU,Lib -,LiQ(KB&mG@jPA94,3MNb,#NS+5`d3&"MHBqMYF2-dY66cXHrYUfNRCD4MBQ(KB1 -"J(pqIAepIAepIAeqIRprIhprIRepI(epIS##Ji@(LBU,M)f0MBb+Ki0qGfpQA94 -,3MNb,#JQ*LNa2%aKH)kMYF20dpA8cmLrYUfNR*D4MBQ(KB1"J(pqIAepIAepIAe -qIRjrIhpqIAamI(apIRq!JS5'L)U,M)f0MBZ*KS0rHR0UBPP35$mi-LiU+5S[1%C -BES@DVEh)d026d-R#ZE#RS*Q6MiZ*Ki5#JApqIAepI(amI(apIAjqIRpqIRepIAe -pIS#"JS5'L)U,Lib-M)b+L)5!Hh9YCPe85d-m0M%Z,5ia1846CRZ2SV2!bFr3cm[ -%Zl5XSjfANSk,L)D%JS"qIAemI(amI(amI(amIAepIAemI(apIi##K)D)LBZ-M)b -,LiZ+Ki5"I(C[Cej@6N8q0M%Y+b`[0N&3C(Q1SV2!bY$4d-c&[,@XT*kBNiq-L)D -%JApqIAamHhYlHhYlI(amIAepIAemI(epIS##K)D(L)U,M)b-M)Z+Ki5"I(G`D&p -@683l05mV+LSY08"3CAU2Sl6"bp$5dFc&[V@YTCqCP*!!M)Q'Ji&rIRemHhYlHhY -lHhYmI(apIAamI(amIAk!JB1&KiQ+M)b0MBf-LiQ'JhjiF@TK9dj&2$8[+LJR+M% -m6'&hMD'c`F[4dp,0aVqfVUDJQT53!)f+Ki5"IhjmI(YlHhYlHhamI(apIAemI(Y -lHhapIS##K)D*Lib0MSf0M)Z)KB*rHR0VBPP35$mi-5dU+5X`1NPFFBHEVEc)cY( -4cXM"Z+qSSCZ@NSk,L)D$JApqIAamI(alHhYlHhYlI(amHhYlHhYpIS#"Ji@(LBU --MBk1MSf-LBD#IRG`D&p@683l0#mV+5JV-Mj3CAZ4TEE$c0,6dFc&[,@XTCkCPC' -0LSH%JAppI(YlHRTkHRTkHRYlI(amI(alHhYmIRq"JS5'L)U-MSk0MBf-LBD$IRP -bDQ&C8%K"1cBa,LdZ-Ma+A('(QkflaXh3d-h(`,H`U++FPj12LiL&JS"qIAalHRT -kHAPjHAPkHRYlHhYlI(apIi##K)D)LBZ-MBf0MBf,LBH$IhTcDf0D8%Fq0c%X+#F -U-$Y+AR5+RV#qb-r5dFl)`EQ`UD+FPj12LiH&JAppI(YkHRTkHRTkHAPjHAPjHRP -jHRYmIS'$KBH*LSZ-M)b,LiU*L)@#IhTdE@CG98a%2$Fa,5XV,MC%9QZ"PUQjaFh -4dXr+`lbcUk@IQC@4MBU'K)&qIAYkHAPjHAPjHAPjHATkHRTkHRYmIAq"Ji@(LBZ -0MSk0MBb,LBH%JAefEQGH98a$1c8[+bJR+M*!8fQ!PUUlb0$8e0(-aEfdV+@HQC@ -4MBQ'Ji"qIAYkHRTkHRTkHRTkHRTkHRTjHATlI(k!JS5&KiL*Lib0MSf0MBZ)KB& -mG@aN@e*)2cJa+bFP*b`h4eadLk'c`Xc5eG22b-'iVkLLR*H6MiZ)K)+!IRalHRP -jHAPjHAPjHRTlHhTkHRTkHherJB1%KSL+M)f1MSk0M)Z)KB*pGh"RAP904$`e,bS -Q*LSc399XJjQX[-M3e064bm5mXkbPRjQ8N!#-L)@#IhemHhTkHAPjHAKiH(KjHAT -jHAPjHRYmIS'$KBH)LSb0MSk1MSf-LBD$IRPbDQ&B6N8m0#iS*#-Q,ce4DB#AUl[ -)d069dXc&[E5XTCkCP*!!M)Q&JRppHhTjHAPjHAPjHAPkHRYlHhYkHRTlI(erJB1 -&L)U-MBk1Mik0M)U'JRjiF@TK@%p(2cJb,#JR+#ml6'*jN!#NYX61dp66cXHqYkk -RSCZ@NSk+KS1!IRalHRPjHAKiH(KiH(PjHRTkHATkHhaqJ)+%KSH*Lif0MSk1MBf -,L)@"Hh4XBeT458!j-L`S*LFY1%PHGBbKXm,0dp66cmM"Z,#SSCbANSk,Ki1"IRa -lHRPjHATkHAPjHATkHRTjHAKjHRYmIS##K)H*Lib0MSk0MBb,L)@#IAKaDQ&C8%F -q0c!U*5-P,Me4DS1DVVr+dYE9dX[%Zl1VT*kBP*!!MBQ&JRppHhTjHAPjHAPjHAP -kHRYlHhTkHRTmIAq!JS5&KiQ+Lib0MSk1MBU(K(pjFQYK@%p&2$3Y+#3M*Lim8'L -!PkZmbG(9eG,-aEfdV+@IQC53!)b*KB*rIAakHRPjHATkHAPjHATkHRTjHAPkHha -qJ)+%KBH*Lib0MBk1MSf+Ki@!HR0XBPP34cih,bSQ*#FZ1djNI*1RZ-E2e0A5cFD -rYUfQS*U9NBf*KS1!IAYkHAPjHAPjHAPjHAPkHRTjHAPjHRaqJ)+$KBH*M)f1Mj! -!Miq1M)Q&JAaeE@4E8NP!1$%V*L-N+M9(A(1-SV6$cY29e-r)`,H[Tk'EPT+1LSH -%JAjmHhTjHATkHRTkHRTkHhYlHRTjHATlI(jrJB5'LBb0MSq2MSk0M)Q'JRehF'G -I9Ne%2$3Z+#-L*Lmr9@k'RV,#cG6AeY(+`VQaU+'FPT+1LiH%J(jmHRPiH(PjHAT -kHRTkHRTkHRTjHATlI(k!JS5'L)U-MSk2Miq1MBZ)K(pkFfYL@P&)2cF`+53L*5X -j6'0mP+QlbG(@ep61alkeVD@IQC@4MBQ&JRppHhPiH(KiHAPjHAPjHATkHRTjHAP -kHherJB5'L)Z0MSq2N!#3!*!!Mib*KS&mG@eN@e**3$Na+L3L)bJd4PaeMU5faFr -9eYA3bF#hVkHKQjD4MBU'Ji"pHhTjH(PjHATkHRTkHRTlHRTjHAPkHherJB1&KiQ -,M)b0MSk1MBb*KS*pGh"SAeC04$Xd,LJN)LBa3PKaLU#c`ml8eYA4bX+jX+QLR*H -5MSZ(Ji&qI(TjH(KiH(KjHAPjHRTlHhTkHRTlI(erJ)+&KiQ,MBq3!*!!N!#3!)q -0LSH$IRG`CPa658!i-#FI'aXJ,8&DG)kPZFM5f0R@dFV"Z+qRSCZ9NBf*KB*rIAY -jH(KiHAPkHRYlHhYlHhYkHAKiHATmIS##K)D*Lif1MSk0MBb,LBD#IAKaD'"A6N8 -q0LmR)L%M,$a5E)@GXF(0e0I@dFV$ZV'TSTbANiq,L)5"IhelHRTkHRTkHRTkHRY -lHhYkHAKiHATlIAq"Ji@(LBZ-MBk2Miq1M)Q&J(YdE'0D8NP!1$!R)4mJ*cC,C(q -BVVr-e0MAe-h&[,1USjbANiq,L)@"IhelHRPjHRTkHRTkHRYlHhYkHAPjHATlIAq -"Ji@)LSZ0MSq3!*!!N!#2MBU'JAaeE@4E8NJr0biP(KXE)M&(BAf@VF$0eGRCeFr -([V@XT*kBNiq-L)5#IhelHRPjHAPkHRTlHhYlHhYlHRPiH(PkI(k!JS@(LSb0Mj! -!NC'3!)q0LB@"Hh4YC&Y558!h,bJL(KdN-8GKHjDX[Xc8fGR9cXHqYDbNRTL8N!# --L)@#IhelHRPjHAPkHRTlHhYmI(alHRPjHAPkI(k!JS5(LSb0MSq2Miq0M)Q'JRe -fEQCF8dT"1#mR)4XD)#j%ARU8Ull,eGRCeXr)[V@XT*fBNiq,L)5"IRakHAKiHAP -kHRYlHhamI(amHRPjHAPlI(k!JS5'L)Z0MSq2N!#3!)q0LiL%IRG`CPa658!i,bB -I'KNI,%&EGj+U[Fc9fY[AdFQrYUfNRCL6Mib)KB*rIAYkHAPjHRTlHhYlHhamI(Y -kHAPiH(PlI(k"Ji@(LSb1Mj!!Miq2MSb*K(pjFQPJ9dj&263X*"iD(#Bi8Qf*SVI -(dpREf02,`VL[TU#DPC'0LBD$J(jmHRPjHAPkHhYlHhYmI(amHhTjH(PjHherJS5 -'KiQ,MBk2Mj!!N!#2MBU'JAYcDf*C8%Bp05XL("FC)M41DiHKYmM6fYcDe-c$ZE# -SS*U9NBf*KS+!IAYjH(KiHATkHhYmI(amI(alHRPjHATlIAq"Ji@)LSf3!*+6P*1 -5NBk+KB"jFQPI9Na#16%S)"N@'#-f8'b)SVI)e0[GfYA0a,UaU+'DPC'0LBD$Ihe -lHRPjHATlI(amI(amI(alHRPiGhGiHRarJB5(LBb1N!#4NC'3!)q0LiL%J(PbD@" -A6dBp05`N(4ND)M*,Ci1HY-E5fGcDe-h%ZV'SSCU9NBk+KS5"IRakHAPjHATlI(a -mIAepIAalHAKiH(PkI(q"Ji@)LSb0Mj!!N!#4N!#2M)Q&JAYdE'*C8%Fq0biP(KN -B(bp)C)'FXX64fGcEeXl&[,+TSTZ@NSk+KS5!IRakHAPjHRTlHhamI(apIAalHRT -jHAPkHhf!JS5(LSb1Mj!!N!#3!)q1M)U(JRefE@9F8dT"16%R(KF8'5P"ARbBX-2 -5fYhFep$([E5VSjbANiq,L)5"IRakHAKiHAPkHhYmI(apIAemHhTjHAPkI(k!JS5 -'L)U-MBk2Miq2MBZ)K(piF'GG9%Y#16!R(KF9'LJr@hQ9VF$2f0cFf0()[V5VSjf -ANiq-L)@#IhelHRPjHATkHhYlI(amI(amHhTjHAPkI(k!JS5(LSb1Miq2Miq2MSb -*KB"jF@KH98Y#15mP("34&L3m@AH8VF(3fYlHfY2+`,DYTCkBNiq,L)5"IRakHAK -iHAPkHhYmI(amI(amHhTjH(KjHhf!JS5(LSb1Mj!!NC+5NBq0LB@!HA"SAP9-3cS -`*K`8%"-J0e4cND[!cpRHhYV6bX#fVD@HQ*12M)L&JRpmHRPiH(PkHhYmI(amI(a -mI(YjH(KiHAYpIS#$KSQ-Mj'5Nj15NT!!MBU'J(PaCee658!f,#)A%!d6)caDHCD -[`p,DhYhCdXLqY+ZMR*H5MSZ(KB&rIAYjHAPjHRYmI(epIAepIAemHRPiH(KkHhf -!JS5(Lif2N!#4NC+4Mif+KS"jF@KI9Na$1M!Q("32%Kmf8h14UVr3fYrIfp6+`,H -ZTCkBNiq-LB@#IhelHRPjHATkHhYmI(amI(amHhTiH(KjHRapJ)+&L)Z0Mj!!NC+ -6Nj'2M)L#I(9XBeT34cie,#)C%4!C+dCPK+#hbGAFhYc@cX5kXDQKQjD5MSU(Ji" -pHhTjHAPjHRYmI(apIAepI(akHAKhH(PlIB#$KBL-MSq3!*'5NT+4MSZ(JhaeE'0 -D8NP"1#mP("88'LT$BAqEXXA5fYhEeXr&Zl+TSTb@NSk,Ki5"IRakHAKjHATlHha -mI(apIAemHhTjH(KjHhaqJ)1'LSf2NC+6P*56NBk+KApiEf9F8NJr0LdM'K34&bB -qA(UAVm,4fGhFf0()[V@XT*fBP*!!M)Q&JRpmHRPiH(PkHhYmI(alHhYlHhTjH(K -iHAYpJ)1&L)U-MT!!NC+6Nj+3!)f*KB"jF'GH98Y"1#mQ(4B6&b8l9h@5UVl0ep[ -Ef0(*[lDYTCqCP*!!MBQ'JhppHhPiH(KjHRYlI(amI(amI(YkHRPkHhaqIi'$KBL -,MBk2N!#4NT+4MSU'J(PaCej85d%i,L3C%Jm9*$aCGj5Y`G$ChGcBdFLqYDbNRTL -8N!#-L)@#IhelHRPjHATlI(apIAepIAemHhTiH(KiHRaqJ)+%KiZ1N!#5NT16Nj' -1LSD"HR&SAeG146`d+Km@%"%F-8eXLkDlc0MGhY[8c-+jX+HKQjD5MSU(Ji"pHhP -iH(KjHATlHhamI(epIAakHAKiHATmIS#$KBH+M)k3!*'5Nj15N!#0LB4pGQePA&* -*3$J[*4`@&"XU3PppQ,$$d0RFfpE2aVfcUk1GQ*52M)L&JAppHhTjHAPkHRYlHhY -lHhamI(YkHAPjHRYpIi'$KSQ0Mj!!NT18P*+3!)f+KApiF'GH98a$1M!Q("33&#) -k9hD6V-$2fGhGfG,*[lDYTCkCPC'0LB@#IhakHAKiH(PkHRTlHhTkHhYlHhTjHAT -lIAq!JS5'L)Z0Mj'5Nj15N!#0LS@!HA*TAeC04$Xb+5!B&4FM1&0`M+5jbG6CfYI -5bX'iVkHKQjD5MSU(Ji"pHhPiH(KiHATkHRTkHRTlHhTjHAKjHRYqJ)+%KiU0Mj' -5Nj16NT!!MSZ(JRYdDf*B6N8l-LFG%`i4(643EifR[-c@fpcCdX["Z+qRS*U9NBk -+KS0rIATiGhGiHATlHhamI(amI(YlHRKiH(KkI(k!JiD*M)k3!*+6Nj15N!#1LiH -"Hh4VBPP34cid+L!A%4%E,NTTKk1jbYEFhG[9cF5kXDLLR*H6MiZ(K)&qI(TjH(K -jHATlHhYlHhYmHhYkHAKiHATmIS#$KSL,MT!!NC'5NT+4Mib*K(efEfCF8dP!0b` -J&3d,&#P&C)1IYXR@h0lFeXr'[,1USjfANiq,L)5!IRYjH(KiHATlHhamI(amI(a -lHRKhGhKjHRaqJ)1'LSk3!*'5Nj16NBq0LSD!HA"SAe9-3cN[*"J2#a!K1eTkPl( -%dp[HhGM4alkeV+5HQ*53!)b)KB&rI(TjH(KjHATlHhamI(amI(akHAKiH(TlIAq -"JiD)LSf2N!#4NC'4Mif+KS*lG'aM@P&)2c8V(a82%"Xb6fk-TV[-eY[FfG,+`EL -[Tk#DPT+1LSD#IhakHAKhH(PkHhYlHhYlHhalHRPiH(KiHAYqJ)1'L)Z0Mj'5Nj1 -6NBk,Ki*mG@eN@e**3$BX)KJ4%"SZ5@L(SVM*e0[FfY6-`lUaU++FPT+1LiH$J(e -lHAKiH(PkHhYlHhYlHhYlHRPiH(KjHherJB1'L)Z1N!#4NT16NT'2M)L%IACYC&Y -45$id+4d5#`X@,%PTLD5lc0MHhpc9cX5lXUULR*D5MSU'JhppHhPhGhKiHATlI(a -mI(amI(YjH(GhH(TmIS##KBH*M)q4NT58NT'2LiL$IRG[CPe656me+Ki6#`X9+NG -RKk+jbpIGhY[@cF5kXDQLR*H5MSU(Ji&qHhPiH(KjHRYmI(amI(amHhTjH(GhGhP -lIAq"JiD)Lik3!*+8P*58NSq,KS&kF@KH9%Y"0LSG%3F&$b4#C)5KZF[AhYrFeXr -&Zl+USTbANSk,Ki5"IRYjH(KiHATlI(epIAemI(YlHAKhGhGiHRaqJ)1'LBf2NC1 -8P*56NBk+KB"jFQPJ9de%1M!M&``($4mj@RUBXXA8h0rHf0(([V5VSjfANiq,L)@ -#IhakHAKiH(PkHhamI(amI(alHRPhGhGiHAYpIi+&L)b2NC18P*58NBk+KS&kFQT -K@%p'26-T(4)-$KXc8A'3!+UrcpRGhGV6bX#hVUDIQC@4MBQ'JhppHhPiH(PjHRY -lI(amI(YlHhTjGhGhGhPlIAq#KBL-MT!!NT59PC55MiZ(JRefE@4E8dT#16!N'4% -2&LP%C)5IYXR9fphEe-h%ZV'SSCZ@NSk+Ki5"IRYjH(KiHATkHhamI(amI(YlHRP -iH(PkI(k!JS5'LSf2NC18PC56NBf*K(jhEfGH98a#15iM'!m-%L9!B)#FY-I8fpl -Fep$([E5VT*fBNiq,Ki5"IAYjH(KiHATlI(amI(amHhTjH(GhGhKkI(k"Ji@)LSf -2NC+6Nj+4MSZ)JhjhF'KI9dj&1c!N'!m,%L-qARqFY-I8fplFemr'[E5VT*fBNj! -!M)L&JRjmHRKhGhKjHRYmI(amI(alHRPhGRChHAYpIi+&KiU1N!#4Nj58P*14MiZ -&J(PbD&p@683l-5FF%3d4(cK@GT5Z`Y$ChGcBdFLqYDbPRTQ9NBf+Ki1!IATjH(G -iHATlI(apIAamI(YjH(GhH(PlI(jrJS@)Lik3!*+6P*@8Niq,Ki*lFQPJ9dj&1c% -Q'a%-$ade8h15V-(3fYlGfG,+`,DYTCqCP*!!M)L&JRppHhPiH(KjHhamIAepI(a -lHRPiGhCfH(PlIAq"K)H+MT+8PCD@PC13!)f)JhaeE'0D88Jq05SH%``-&ba*DBL -MZX[@h0hDe-c$ZE#SSTb@NSk,Ki5"IAYjH(KiHATlHhamI(amHhYkH(GhGhKjHhk -"JiD*M)q4NT18P*14Mib*K(piF'KI9Ne%15dJ&!S)%54"BS1JYmV@hGrFeFl&Zl+ -TSTbANSk,Ki5"IAYjGhGhH(PkHhamIAamI(alHAKiH(KjHhf!JS5(LBb2NC18PC5 -6NBk*K(piEfGH9%Y#15iL&3`*%54!B)'HYXR9h0rFeXr&[,1USjfANiq,L)@#IRa -kH(KiH(PkHhamI(amI(YkH(GfGRGiHRaqJB@)Liq4NT59PC56NBk+KB"kFfTK@%p -'2$%P'3i)$"dh9RH@Vm24fplGf0()[V@XTCfBP*!!M)Q&Ji"pHRKiH(KjHRYmI(a -mI(amHhTiGhGiHATmIS##K)H+MC!!NT18P*55Mib)JhaeE'*C8%Bm-LFE%3`1'c0 -4FC!!UVr1f0hGfG,*`,HZTTqCP*!!M)Q&JhppHhPiH(KjHRYmI(amI(amHhTjH(G -hGhPlIAq#KBL-N!#6PTHAPT@6N!#-Ki&lG'YK@8p'2$)R'a!*#KF[6Qq2UVr3fYl -HfY2,`EL[Tk#DPC'0LBD#IhakHAKhH(PkHhapIAepI(alHRPhGhGiHATmIS'%KiZ -2NT19PTD9Nj!!MBQ$IACYC&Y45$me+am8$3dA,%KSKk1jbYEEh0V6bm1jX+QKQjD -5MSU(K)&qI(TjH(KjHRYmIAepIAamHhTjH(GhH(PlI(q#KBL-MT!!NC+6Nj+4Mif -+KApiF@KI9Na$15dK&!X)%59$C)@KZ-V@hGlEeFl&Zl+TSTbANSk,Ki5"IRYjH(G -iH(PlI(apIAepI(alHRPhGhGhHAYpJ)1(LSk4Nj58P*@8NSq,KS"jF@KI9Na$15d -K%`J$#KipB)'JZ-[Bhq(Hf0$'[,1USjbANSk+Ki5"IRYjH(GiHATlI(epIAemI(Y -kH(GfGA9fH(TpJ)1(Lik4Nj59PC@8NT!!M)H#Hh4VBPK246Xa*4N2#JdE-e*cNUc -"d0RGhGR5bEqfVD5HQ*53!)f*KS0rIAYjH(KiHATlI(amI(amI(YkHAGhGhKjHhe -qJB5(Lik4Nj5@PjD8NBf)JhadDf*C6dBm-LBD$`N+'$"2FC!!Um$3fYrHfY2+`EH -ZTU#DPC'0LBD#IhakHAKiH(PkHhapIAemI(alHRKhGhGiHAYpJ)1'LBb2NC18PC@ -8NT!!M)H$I(9XBeT45$mf+Ki5#JS9,%YXM+LpcYMGhYV8bm+iVkLJQT@4MBQ'JS" -pHRKhGhKjHRYmI(amI(amHhTjH(GhH(TlIB##KBL,MT'6P*@9P*+3!)b)JhefEQ9 -F8NJq0#NG%``,&La*DSUP[-hBhGlEe-c#ZE#RSCZ9NBf+Ki5"IRakHAPjHATmI(e -pIAepI(YkHAGfGRGjHhf!Ji@)M)k3!*+6Nj56NBq-L)0pGQePA&0*3$BX)"3-#a8 -V5@U+TEc0f0hHfp6,`VL[Tk#DPT+1LSH%JAjlHAKhH(PkHhapIRjqIRemHRPhGRC -hH(TpIi'$KSQ-MT!!NT19PC56N!#,KS&kF@KI98Y"0b`I%3B##b&!BS1KZFcChq$ -Gf-r&[,1USTb@NSk+KS1!IRYjH(GhH(PlI(epIAepI(YkH(GfGAChHAYpJ)5(LSf -2NC+8P*58NSq-Ki*lFfTK9dj%1LmM&3N$#4Xh@AZDY-M@hZ$HfG$([E1USjbANiq --LB@#IhakH(GhH(PkHhapIAjqIAelHRPhGhGiHRYpIi+&LBZ0Mj'5Nj56NT!!M)L -$I(0VBPK04$S`*"J0#!`F0PCiPl$&e0cIhYR4b,keV+5HQ*12LiL%JAjmHRKhGhK -jHRapIRjqIRepHhTiGhGhH(TlIB##KBQ-Mj'6PC@9P*13!)b(JRYcDQ"A683k-#- -9#J8*'MCAHCQcapEHiGrCdXLrYDbPRTL6MiZ)K)&qI(TiGhKiHAYmIAjqIRjqIAa -kH(GhGhKjHhf!Ji@)M)k3!*'6P*56NSq-L)0mFfYK@%j%15iJ%38!"KSiA(qIZFc -Ci1,IfG(([E5VSjfANSk+KS5"IAYjH(GiH(TlIAjrIhprIRemHRKhGA9fH(TpJ)1 -'LBb2NC+6Nj16NBk,KS&lFfTK@%p'26)Q'3d(#KJb8h@9X-A8hH$IfY,)[V5VT*b -ANiq,L)@#J(elHAKiHATlI(eqIRprIRemHRPhGhGhHATmIS'%KiU0Mj'5Nj16NSq --LB4pGQeNA&0+36FV(3m&"4!S5'b1UX(5hH,Kh06,`EHZTCqCP*!!M)Q'JS"pHhP -iH(KjHRapIRprIhpqI(YjH(GfGhKkI(k!JiD*M)q3!*+6Nj15Mib)JhefEQ9F8dT -#1#dJ%JJ'%#G(DSbT[p$Ei1$FeF["YkkPRjQ8N!#-L)D$J(elHAKhH(PkHhepIRj -qIRemHhTiGhGiHATmIS#%KiU1NC18PC@8Nj'1LS9qGfjP@e*)2M8T'`m'"4%S4QQ -+U,r3fq(KhGE0`lQ`Tk#DP*!!M)Q'Ji"pHhPhGhKjHRapIRprIhpqIAYjH(GhGhP -kI(k"K)H-N!#5P*D@PT@6N!#0L)0mG'YL@%j%1LmM&JS%"K8a8R@@XFE9hZ(Jfp2 -*[l@XT*kBNiq,Ki@#IhelHAKiHATmIAjrJ)#!IhjmHRKhGR9fGhTmIi+%KiZ0MT! -!NT16Nj+3!)f*K(jhEfCG9%Y#15iK&3X($b0"Bi@MZmlDi1$GeXl$ZE#SS*U9NBf -+Ki5"IRakH(GhH(TlI(jrIhprIRemHRKhGhGiHATpJ)+&LBb3!*+6P*58Nj+2LiD -!HA"QA94,3MNZ)K3+"JdJ2&k!RlR-fH$KhYM2aEZaU+'EPT+1LiL%JAjmHAKhGhK -jHheqIRprIhjpHhTiGhGhH(TmIS#$KSL,MT!!NC18P*14MSU'J(PbD&pA6N8p-bB -D$`S0(6GAHCLbaY6FhphBd-HpY+ZMRCH6MiZ)KB*rI(TjH(KiHATmIAjqIRjqI(Y -kHAKhGhKkI(k!Ji@)Lif2NC+5Nj15Mib)JRadE'0D88Jr0#JD$JF*&c&4Fj5[a02 -Fi0rDdmR!YUfPRjQ8N!#-LB@#IhakH(GhH(PkI(epIRjqIAalHAKhGRCiHAYqJB5 -(LSf3!*+6Nj56NT!!MBU'JATcDf*C8%Fp-bFF%3X0'c06GC5Z`p,EhYhCdFQrYUf -PRTL6Mib*KB+!I(TjGhGiHATmIAjqIRjqIAakHAKhGhPkI(k!JiD*MBq4Nj58Nj1 -4MSU'J(PbD@"A6dBp-bFD$`N-'M*5G*1Z`p2Gi0rEdmV!YkkPRjQ8N!#-L)D$Ihe -lHAKiH(PkI(eqIRpqIRalHAKhGRGiHAaqJ)1&L)Z1N!#5NT16NT'1LiL#I(9YC&Y -558!h,#!9$3`@+NGSL+@mcGMHhY[9c-+jX+HKQj@4MBU(K)&qI(TiH(KjHRYmIAj -qIRjpI(TjH(GiH(PlI(erJS@*M)q4Nj59PC55MiZ&IhG[C9a656me+Kd5#JJ5*d0 -NKU1lcGMHhpc@cF5kXDQKQjD4MBU(K)&qI(TjH(KjHRYmIAjqIRjpI(YjH(GhGhK -kI(q#K)H+MBq4Nj58P*14MSU&IRG[CPa55$ic*aS0!`)0*89UM+R"dYhLiYlAcX@ -kXDLKQj@4MBQ&JRpmHAKhGhGiHRapIRprIhpqI(YjGhCfGhKkI(k"K)H,MT'6P*@ -8Nj+2M)L$IA9YC&T45$me+ai5#JS8+8GRL+@mcYVIi0c9cF5kXDLKQj@4MBU'K)& -qI(TjH(KjHRapIRprIhjpI(TjGhCfGRKkI(k"JiD+MC!!NT18P*56NBf+KApiF'G -H9%T!0LSG%!F%$L4$CSLP[Y$EiH,Heml%ZV'SS*U9N!#-LSH%JAjlHAKhH(KkHhe -qIhq!IhjpHhPiGhCfGhPlIB'%KiU1N!#4NT18P*14MSU&IhK`Cej@6%-k,Km4"3% -)($YJJk1mcp[LiprBcm@lXUQLQjD5MSU(K)&qI(TiGhKiHAYmIAjqIRjpI(YjH(G -fGhKjHRf!JS@*M)k4Nj@9P*15MiZ'J(PbD9p@683k,b%6"`)*(6aJJU'kcGRIi0h -@cF1kXDLKQT@4MBQ(K)&qHhTiGhKiHRYpIRprIhpqI(YjH(GfGRGjHhf!JS@)Lik -4Nj58P*14MSZ'JATcDf0D8NJr0#FD$`N0(6KCHTLaaG,Ch0V8cF5kXDQKQjD5MSZ -)KB*rI(TjH(KjHRYmIAjrIhpqIAYjH(KiH(KjHherJB5)M)q3!*'6P*16NBq,Ki* -lG'aL@9")2c8S'Jm,%#%mA(fEXmE5fG[Ce-[#ZE#SS*U8N!#-LBD$J(jmHRPiHAP -kI(eqIhprIhjpHhTiGhGhH(PlIAq#K)H,MT!!NT16Nj+3!)k,KS&mG@eNA&0+3MJ -X(a32%b)m@hZBVm,1eGI9d-R!YkqRS*U9NBf*Ki5"IhakHAKiHATmIAjrIhprIRe -mHRPiGhGiHRYpIi+&L)Z0Mj'5NT+4Mif+KS&mG@jQAeC24Mdb*adB'53j9(12TlV -(d026cmM!Z+qSSCZ@NSk+L)@#J(jmHRPjHATlIAjqIhprIRelHRPiH(KiHAYmIi' -$KSQ,MBq3!*'4NC!!MSb)K(jhF'PJ@9"*3$8T(aNC)cK6FBfNYmA0dG$0aVqfVUH -JQT@4MBU(K)+!IAYkHAKjHAYmIAjrIhpqIRalHRKiH(KjHRYpIi+&LBb2NC+5NT+ -4Mib)JhpjFQTM@e*,3cN[*4iG*6G3E)HHXX$*cFh+aEkhVUHKQj@4MSZ)KB1!IRa -kHAPjHRYmIAjrIhpqIAalHRPiH(PkHhaqJB1&LBb0Mj!!N!#3!)q1M)U(K(pjFfa -PA9C24cdc+L3L+6P2DB5EVVc&bX[)`lffVUHJQT@4MBZ)KS1"IhelHRPjHRYmIAj -qIhjqIAalHRPjHAPkHhaqJ)+&L)U-MT!!N!#3!*!!Mik,L)4rHR0XC9jA8%P#1#m -T*L`j6@H!PUQi`FE)aX+lY+fQS*U9NBk,L)D$JAppHhTjHATlI(eqIRprIRjpI(Y -kHAPkHhapIi##K)D*Lif1Mj!!Mik0LSH%J(TeEQKK@P404$Xb+LFX18jRJ*DSYVr -%aX6!ZE1XTCqCP*!!MBU)KB1"IhelHRPkHRYmIAjrIhprIRemHRTjHAPkHhaqJ)+ -%KSQ,M)f0MBf0M)U)KB&mGh&VC&jB88P!0bmU+cG+BRZ4Sl+l`F2#[VLbUk@HQC@ -4MBU)KS1"IhelHRTkHRYmIAjqIhprIRemHhTkHATkHhapIi'$KBL,MBk2Mik0M)U -(K)&mGh*VC&jA88T!0c!X-$Y0C(b4Sl#k[m'rZlD`UD1GQ*53!)b+Ki@$JAppI(Y -kHRYlI(eqIhprIhjpI(YkHAPjHRYmIRq"Ji@)LSb0MSk1MBb+Ki5"I(GbE'CJ@P4 -04$Xe-M9!8'9lMk#YYEZpZlLcVULLR*H6Mib*Ki@$JB"qIAalHhYmIAeqIhprIhj -pI(YkHRPkHRYmIRq"Ji5'L)U,M)f0MBb+L)D#IRTdEfPMA9G34cmh0$Br6f0iM*f -UXlLkZEHbVDHJQjD5MSb*Ki@$JS"qIAalHhYmI(eqIRprIhjpIAalHRTkHhapIS# -#Ji@(LBU+LiZ,LiU*Ki5"IRTeEfTPB&Y96N8q1MNr6&pcKjLPVl@iZ,@aV+DKQjH -6Mib+L)D%JS"rIAalHhYlI(eqIRprIhjqIAalHhTkHRYmIAq"JS5'KiQ+Lib-M)Z -*Ki@#IhYfF@aRB9a@6dFr1MT!6Q"dKjHNVE1eYE1[UU5IQTD5MSZ*Ki@$JApqI(Y -lHhYlI(eqIRprIhjqIAalHRTkHRYmIAq!JS1&L)U,M)b-LiZ*Ki@#IhYhFQeTC&p -D8da&3$j$6PpaJj+IU+kaXV#YU+1HQC@4MBZ*Ki@%JS"rIRemHhYmI(eqIRjqIRj -qIAamHhYkHhYmIAk!JB1&KiL*LiZ,LiZ+L)D$J(ejG'pUC@"F9e"+480(8&eYISf -DT+UZVkkVU+1HQTD5Mib*Ki@$JS"rIRemI(amIAeqIRprIhjqIAemHhYlHhapIRq -!JB+$KBH)LBU+LSQ)KiD%JAjkGR*ZD@9KA&G46%P+8&YTH)H8RD@TUkZTTU+HQTD -5MSb+L)D%Ji&rIRemI(amI(epIRjqIRjqIAepI(amI(apIAjrJB1%KSH)LBQ+LSQ -)Ki@$JAjlH(4`E'KNAeT86dY,8&TSGi@5Qk+RUDQRTD'GQC@4MSb*KiD%Ji&rIRe -mI(amI(epIRjqIRjqIRepI(amI(apIAjrJ)+$KBD(L)Q*LBQ)Ki@$JApmH(4aE@P -PB&Y@8Np29&eTGS52Q*qMTUDNSTqEPj53!)f,LBH'K)1"J(pqIAamI(epIRjqIRp -rIRjqIAamI(amIAeqIi#"JS5&KSD(KiL)KiD&K)+!IAThFh"XD'4J@eG88eCGCh1 -!Lj5ERk+MSU#GQTD6N!#0LiQ(KS5$JS&rIRepI(apIAeqIRjqIRjqIRepI(amI(e -pIRq!JB+$KBD(KiL)L)H'KB1#J(jlH(9bEQYSC'"F@&CBA@9`I)H3!*DERk#JRTb -CPT12MBZ*KiD%Ji+"J(pqIAepIAepIRjqIRjqIRjpIAepI(epIAjrJ)#"JS5&KSH -(KiH(KS@%JS&rI(PfFh"XDQGMAeaD@PjQF(U%MC1BR*fGR*UBPC+2MBZ*KiD%Ji+ -"J(pqIRepIAeqIRjqIRjqIRjqIAepIAepIAjrIi#"JS1%KBD'KSD'KS@$JS&rIAY -iGA0`E@TRC'&IAf&QEACrL)k8Q*QDQTL@P*'2M)U)KiD%Ji+"J)"rIRjpIAeqIRj -qIRjqIRjpIAepIAepIRjrIi#"JS1%KB@'KSD'KB@%Ji'!IRakGh4bEfaTCQ*JB'& -QERCrKif5PTHBQ*D8NT!!MSb+L)H&K)1#JB"rIhjqIAepIRjqIRprIhjqIRjpIAe -pIAeqIRq!JB+#Ji5&KB@&KB5%Ji+"IhjmHRKfG(&[E@PRC@4PD@pfIS5+Mj+8PC@ -8NT'2M)Z*KiD&K)1#JB#!IhjqIRjqIRjqIRprIhpqIRjqIAepIRjqIRq!J)'#Ji1 -%K)5%K)5%Ji+"J(pqI(TiGR0aEfaTCfCRDQpfIB1*MC!!NT16NT'2MBZ+L)H&K)1 -#JB'!IhpqIRjqIRjqIhprIhprIhjqIRjqIRjqIRjrIi#"JB+$Ji1%K)5%Ji1#JB& -rIRelHAGfG(*[E@YTD@a`GRb#KiZ1Mj!!N!#3!)k0LiU)KiD%K)1#JB'!J(prIRj -qIRjrIhprIhprIhpqIRjqIRjqIRprIi#!JB+#Ji1$Ji1$Ji+#JB"rIRemHRPhGR4 -cF@pYE@pbGRZ!K)L,M)f1MBb,LSL(KS@%Ji+#JB'!J(prIhjqIRjrIhprIhprIhp -rIRjqIRjqIRprIi#!JB'#JS+#JS+#JS+"JB"rIhjmHhTjH(GeG(*aFA*dGhYrJiD -)LSZ,LiU*L)H'KB5$JS+"JB'!J(prIhprIhprIhprIhprIhprIhprIhprIhprIi# -!J)'"JB'"JS+#JB'"JB#!IhjpIAalHRPiGhCeG(9fH(YrJB5'KiL)L)L(KS@&K)1 -#JS'"JB#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)#"JB'"JB'"JB' -"J)#!IhpqIRemI(YkHRPiH(KjHRaqJ)+%KB@&KB@&K)5$JS+#JB'"J)#!J)"rIhp -rIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!JB'!J)#!J)#!IhprIRjqIAe -pI(alHhYlI(erJ)'#JS1$Ji1#JS+"JB'"J)#!J)#!J)"rIhprIhprIhprIhprIhp -rIhprIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhjqIRjqIhprJ)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)!!!%*!!!%!!3!&!!!!S!! -"J&%!!!!!!"3!!!!!!!"#&PEZLk-!!%)8!!"#&3!mJ)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhpqIRjqIRepIAa -mI(amHhKhGhGiGh9dG(CkIAjrJ)'#JS+"J(jlHAKiHi##JS+#JS+#JS+#JS1"H') -p)"dJ(b-R,$)f1MSh1$BY'`B!#!`1$`S$#KNR-cJk2N0)6P0DAQ&J99&CB@adGA9 -fHAk&LBZ0N!#5NT+4N!#2MBU)L)Q0NC'4N!#3!*!!N!#3!*!!N!#3!)q2MiPkBe* -26Nj38eCDAQ"IAPpG98-`+5SV,#`Q)b`i3da38P9DAQ0RDfj`E'*LDh4qJi+#JiD --NT@AQCZGRCfFQjQAPC56PCQEQjZEQjZDQTUDQTUCQ*1#E&pF@PTFAf0QD@YUD@T -SANXl0cJi1$Fa-6Y'89KDA@&PD@eaGAGiFQTZGhq)LiU,M)q9QTbHSD1NT+5MSU# -HR*ZERU+LSU+LSD'KSD'JS+#JS*U(FQGPBf0NCfYZFA*bFA*`C&"$38"!3$ii1N9 -3@Q"LC@KXF(4iHhemGA&hIiL2N!#3!*!!NT@DRk'MTDHTUDLSTU5LSD#JSkDQTUD -QTU@PTD@PT+5NT*k-GfeUD'KUE("cGRGfGRGfD99+5%C'4N-p3%Y9Af9RDQeaG(K -mIi"qGh9mK)f6Nj16PCQHSU5QU+UXV+ZVUDHPT+1NTkQTUDQTU+LSU+LRTkHRTk+ -4I(*[E'YYEh*fHATjHATkE9P16%T+5NC"4%jBBQKUEA"cGhYqJB*rH(KrKSq9PC@ -9PjUJSk@RUDZYVUfYUkQRTU@QUDZVUkZUUUUUUUQTUDQSU+@@J(CcEfj[FA4iHRa -mI(amF&e58%e-5dK#49"CBfPVER*eHAarJB1"HAQ"L*'APTDAQ*ZJT+DSUUbZVkq -ZVDZTTkDRUkfXV+bXV+ZVUkZUUUUUUDLEKATeF@p[FA9iHhamIAepFf"98Np06%P -$48pBBQPXEh*fHAarJS1!HAQ"LC'APjHAQ*ZJT+DSUUbZX+q[VDZTU+HSUkfYVDb -XV+bXUkZVUkUUUDQJM(eiFh"`FA0hHRapIAeqG@0A9&"168Y&4%e@B'KVER*eH(a -qJ)&rH(L!LC'APjHAQ*UISkDRUDZYVkq[VDbUU+HSUkfYVDbXV+bVUkZVUUUUUUQ -MNS*kGA&[F(*eHAYmI(apGfCC9&"06%T&3NP6A'9UE("cGRTmIS"qGh9qKiq@PjD -@PjQGSU5QU+UXVUq[VDbUU+HRUUfYV+bXV+ZVUkZUUUUUUUQQQBKpH(*[Eh"cGRP -lHhamH'YF9P*05dT'3%419f&SDQjaGAKkI(jpGh0jK)f9PTD@PTHDRk1PTkQVVDq -ZVDbUU+HRUDbXV+bXUkZVUkUUUUUTUDQRRiq"Hh9`EQj`G(GjHRTlH@pK@9426%T -(38"+8eaPD@a[FhCiHRamGh&fJ)Q5PT@9PCDBRD'MTDHTUkfZVDbUU+HQU+ZXV+Z -VUkZUUUUUUDQTUDQSSjH*IhKbEfeZFA4hH(PkHA*PA&G46%T)3Me%69CJCQPYF(0 -fH(TkH("aHS51PC58P*5@QCkKSk@RUDZYVDbUU+HQTUQVUkZUUUUUUDQTUDLSU+L -RTCf2K(eeF'eYER"dGRGhH(4TAPP66NT(4$ip4NpBBQGUER&dGRKiGh"YG(k)NT5 -6Nj18PTZISD1PTkQVV+bUU+DPTDHUUUUUUDQTUDLSU+LRTkHQTU+@LS*lFfpXE'e -`Fh9eGR9XBPa@8%Y(48!l2NK3@f0QDQe`Fh9fGA&UEAH!Lj+5NT+5NjDERU#LT+D -SUUZUU+DPT+@SUDQTU+LSU+HRTkDQTUDQTD5GN!#(JAPaE@YUE'paFh0dF'9I@e4 -15NC$2$P!59*GBfCTEA"bG(4bE'K`HB11NC'4NC'6PTZHRk'MTDHTUULQTD5MTDL -SU+LRTkHRTUDQTD@PTD@NSTQ,KB"hF'aUDQYZF(*bFQTJAPT568K%3$Ni3NT8AQ0 -QDQe[FA*bEQGSFRZ'Mj!!N!#3!*!!N!#5PjZGRk'MTDHSU+HPT+1MTUHRTkHQTUD -QTD@PTD5NT+5MRj1(K(jeEfYTD@YYEh"aEf9HAPK35dC#1c8j3NY@AQ*QD@a[FA& -`DQ9UG(f)MSq2MSq3!*1AQTbHS++NTUHRTU5MSU1QTkDQTUDPTD@PT+5NT+1MSk' -CM)@$I(0YDQKTDfeZEh"XB9eH@&"+4$mf-cY%69KHB@9SE'j[F'jRBfYeISQ0MBf -0MBq6PjQERCqKSk@RTk@MSU+MTDDQTD@PTD5NT+1MSk1LSU'GNB@%JAKaDfKSD'T -XE@j[DPpGAPK358)j-63q4P"CA'"ND'YYEfpXC'0XGAq*M)Z,Lib2NjDBQTbHRk' -MTD@NSU'KSk@PT+5NT+1MSk1LSU+LSD'IPiQ$JhjdEQPRCfKUDfaZEfPIA9pD8%F -q-Lmi38T69eYJC'KVE@pZDf0MEAD!LBU+LSU-N!#6PCHBQTbHS++NT+1LSD'LT+5 -NT+1MSk1LSU+LSD'KRjU0Ji1"HA*XD'GRD'PUE@p`D9pHB&T246FZ-ca%6P0@@f" -ND'YYEfjUBf0ZGi#)LBL)LSf4Nj5@Q*QERCqKSk5MSD#KSk5NSk1MSk+LSU+KSD' -KRjb4K)+$IR9ZDQGRD'PTDfj`F'KIAf"D6Mmb-6P!5Np59PYJC'KXEQpZD@*PF(L -#L)H(L)U1NC+8PCHCQjfISD+MSU'JSD1NSk1MSk+LSU+KSD'KS*f6KS'$J(PaE'K -RCfKSDQe`FR&RAepI@%Ni-cJq4de28PGEB'9TE'j[E@GLD(*kJiH'KSQ-Mj!!NC1 -9PTLDR*kJSU1LSD#KSk1MSk+LSU+KSD'KS+#GPBL#JS&mG@eTCfGRCfPXEh*dF'9 -HAPa53$Fk2N9,68p59eaKCQTYEfpYCQ0VG(f%KB@(LSf1Mj'5P*DBQTbHS+'LSD# -JSD1MSU+LSU'KSD'JS*qGPSL"JS*qGfpVD'GRCfGUER&dG@eKA9a94cdp3%9,6%e -29&KHBfGVER"[Df4PEhGrK)5'LBb0MSq4NT5@Q*QERCqKSD'JS++MSU+LSU'KSD# -JS*qGPBL"JS*rHA&XD@GRCQGUEA&eGR4SAPY@5d9%4%K-6%a1899DB'9UER"`EfK -MDR0kJB5&LBU,MBk2NC+8PTLDR*kIS+'JS+'LSU+LSU'KSD'JS*qGPBH"JS+!Hh0 -YDQKRCQGUEA&eH(G`BPY95dP-5de168e06e0BA@0SE'paF@ePCQphIB1'L)U,M)f -1N!#4Nj5@Q*UFRTqJSD#JSU+LSU+KSD'KS+#IR*+'JB+#JAadEfYSCfCRDQeaGAK -jG@GE8dY-8P*58Np16Nj49PYKCQY[FA*`D@9XG(Z#KSL*LSZ-MBk3!*'6PCHBQTb -HRk#JS+'LSU+LSD'KSD#JRjZ2Ji+#JS&pG@pVD@GQCfTZFRCjHRGV@e"+6PCB@&9 -46dj18&4CAf9UER&cFQeQDA*iJ)H)L)Q+Lib0Mj!!NT19PjQERCkIS+#JSU+LSD' -KSD#JS*kBM)+#JS+"IAC`DfPRCQGUER*fHATiEPa16&*BA9jB8e&26P"6@&eMD'e -aFh0[CfG`Ghq'KiH)LBU,M)k2NC+8PTLDQjfHRjqJSU+KSD'KSD#JRjf9L)+$JS' -"IAC`E'PRCQKVEh0hHATjF&e-6P9DB@0F9e048&"59eaLD'eaG(4aD@G[Ghk'KiH -)LBU,M)f1N!#4Nj@AQCUFRCkIS+'LSD'KSD#JS*kENB@#Ji+#JRefF'aTCfGTE(" -dH(TlHA"F6&&CA@4QB&T@8e&48eGFB@GYFA4eFfYSEhGqKSL(L)Q+LSZ0MSq4NT5 -@Q*UER*kIS+'LSU'KSD'JS*kBLi1%K)+#JRafF'aTCfKUEA&eHAYlH'jD6e9FB@C -QBejB99048eGFB@KYFA9fG'eTF(KrKSL(L)Q*LSZ-MSq3!*+8PCHCQjbGRU#KSU+ -KSD'KS*qFNSD$K)5$Ji&mG("XD'GTDfpcGhTmHhCV@90CAf9RCf9J@PG88P4AA'& -SEA&eGR4YDR&jJ)D(KiL)LBU,M)f1N!#4Nj@AQ*UER*kJSD+KSD'KS*qGPiZ%K)5 -$Ji1"HR0[DfKSDQeaGAKkHhPcCPTBA@4RCfKSBeeC9P489eaLCfebGACdEQYcHS# -'KiH)L)Q+LSZ0MSq4NT5@Q*QER*fISD'KSD'KS*kEN!#&K)@%Ji1$IhKbE@TSD@a -[FhGkHhYhE@9JA@&SD'KTD@CJ@eG99PKGBfKZFhChG@jYGAb"KSH(L)L*LBU,MBk -2NC+8PTHCQTZGRk'KSD'KSCqFP)L%KB@%Ji1#IACaE'PTDfjbGRPlHhPbDQKMB'G -UD'KTDQGLA9PA9eTIC'P[GAGiG@p`H(f#KiL)L)L*LSZ,MBk2NC+8PTHCQTZGRk+ -LSD'KS*fALi@'KS5%K)5"HR4ZDfTVEA&eHAYlHR9YE@eQCQTTD@PUDfPMAeYB@9a -JC@YaGAGiGA"bHRq%L)L)L)L*LSZ-MBk2NC+8PTHCQTZGS++LSD'JRTL0KBD'KB@ -%KB0pGR&XDQYYF(4iHRalGQpZFfpTD@TUDQTVE'TPB&aD@eeLCfebGRKiGA&eI)' -'L)L)L)Q*LSZ-MBk2NC+8PTHCQTZGS++LSD#HQSq'KiH&KB@&KB&kFfjVDfe[FhG -jHhTfF'peG@pUDQYVDQYXE@YPB&eEA&pNDQpdGhPjG(*jIi1(L)L)L)Q*LSZ-MBk -2NC+8PTHBQTZHS+'KS*kDMiD(KiD&KB@&JhaeEfaXE@pcGRPlHhG`FAGkGfpUDfY -VDfaYEfaQB&eGAQ&RE(&eH(TiFh9pJ)@)L)L)L)Q*LSZ-MBk2NC+8PTHCQTbISD' -JRTU2KiH)KSD&KBD%IRGaEQaYEh*fHATkGh"bHAamGQaVE'aXE'e[F'aQB9pIB@9 -UER0hHRYeFRQ!K)L)L)L)LBQ+LSZ-MBq3!*'6PCDBQCZGRk+KRTQ1KiL)KiD'KSD -&J(KcEfeZF(0fHATkGh&cHhjrI("VE@eXE@eZF(&XCQ*JB@0REA*fHRajFhGqJSH -*L)L)LBQ*LSZ-MBk2NC+8PCHBQTbHS+#HQ)f(LBQ(KiD'KiD#HR4`EQj`FhCiHRT -fFA4mIi+!G@aXE@eYE@j`FR"UC@*LBfCVF(9jI(YeGAb#KSQ*L)L*LBQ+LSZ-MBk -3!*'6P*DBQCUGRk#HQ)f(LBQ)KiH'KiH%I(9aEfj`FR9iHRPfFR9pJB1#H@jXEQe -YE@j[FA*ZD'4LBf9TER0hHhYhG(U"KBQ+LBL)LBQ*LSZ-MBk2N!#5Nj@@Q*QERTq -HQ)k)LBQ)KiH(KiH&IhGcF'p`FR9iHAPfFR4pJB1$I(&XEQjZEQj[FA0aE'GNBf9 -SE(&fHRYiG(Q!K)L+LBL)L)Q*LSU,M)f1N!#4Nj5@PjLDRCkGQT!!L)Q+LBL(KiH -(Ki*kGA&[F(&dGhPjGh*dIB'$K(jbE'jZEQjZEh"bFfpTC@4NCfY`G(KkHA4iJ)5 -)LSQ*LBQ*LBU+Lib0MSq4NT59PjLDR*fGQT'*LBU*L)L(KiH)KAjhFh&`FA0fH(P -hFh0lJB5&Ih4YEQpZEQj[F(*dF@YRC@4QDQjcGhPjGAH!KBL,LSQ*LBQ*LSU,M)f -1Mj!!NT19PjLDR*kGR*5,LBZ+LBL(KiL)Ki0lGR*aFA0eGhKiG(*jJB5&JAGZEQp -[EQj[F(&cFfjSCQ9QD'aaG(GiGACrKBL,LiU*LBQ*LSU,M)f1Mj!!NC18PTHCQjf -GR*L1LBZ,LSQ)L)L)L)D!HA9bFA*dGRKiGA*hJ)1%JhP[EQp[EQjZEh&bG("UCf9 -PCfTZFR9fG(CqKBL-LiU+LBQ*LBU+Lib0MSq4NT59PTLDR*fGQT+*LSZ+LBL)L)L -)L)4qH(4bFR0eGRGfFR0mJS1$I(&YEfpZEQj[F(&cFQeSC@4QD'a`Fh9dG(Z$KiZ --LiU*LBQ*LSU,M)b1Mj!!NC18PTHCQjfGQjD-LBZ,LSQ)L)L)L)L$HhGdFR*dGRG -hG(*iJB1%J(9ZEfpZEQjZEh"bFh&VCf9PCfTYFA0cFRL#KiU0M)U+LSQ*LSU,Lib -0MSq4NT59PTLDR*fFQT++LSb,LSQ)L)L)L)H"HhGcFR0dGACeFR0mJi1$HR"[F'p -ZEQj[F(&cFfpTCQ9PD'YZFA*aFhk'LBf0M)Z+LSU+LSU,M)f1Mj!!NT18PTHCQjf -GR*L1LSb-LSU*L)L*LBQ(JAYhG(0cG(9fG(&fJ)1$Ih4[F("ZEQjZEh"aFh*YD@C -PCQKXEh&`F(H$L)b1MBb,LSU+LSU,Lib0MSq4NT19PTLDR*fFQj@-LSb-LiU*LBQ -*LBQ(JAYhG(0cG(9eFR&jJB1#Hh&`F@pZEQeZEh"aFR&XCf9PCQKVEQpZF(b'LSk -1MBb,LSU+LSZ,M)b0MT!!NC+8PCHCQjfGR*U5LSZ0M)Z+LBQ*LBQ*Ki*lGh4cFh4 -dFh"bI)+#J(G[FA&[EQeYEQp`FA*`DfGPC@CSDfeYEA1!L)b1MSf-LiU+LSU,Lib -0MSq3!*'6P*DAQCZGRCZBN!#+M)f-LiU*LBQ*LBQ(JRYhG(0cG(4bEh4qJS*qFfp -aF'pZE@eZEh"`FR"XCf9PCQKUE'YXGS+*MBq1MBb,LSU+LSZ,M)f1Mj!!NC18PTL -CQjfFQTH1LSf0M)Z+LBQ*LBQ*L)0mH(9dFh0cF@peIi+"I(*`FR"[EQeYEQp`F(* -aE'KQC@CSDQYUE(Q%LSq2MSf-LiZ,LiZ,M)b0MSq3!*'6PCDBQTbGR*U9MBZ1MBb -,LSQ*LBQ*LBQ%IRPfG(4cFh&[Gi#"JATaFA*`EfjYE@j[Eh"bF@aSCQ9PCfPTD'e -kKBU2N!#2MSf-LiZ,LiZ-M)f1Mj!!NT19PTLDR*fFQT@0Lik1M)Z+LSQ*LSQ*LBD -!HRGeG(0bF'phIi'!HA&aFR"[EQeYEQj[F(&bEQPQC@9QD'KRE(Q%Lj!!N!#2MSf --LiZ,LiZ-M)f1Mj!!NT18PTLDQjfEQC@1Lik1M)Z+LSU+LSU*LBH#I(KeG(0bEfj -fIi'!H("aFR"[E@eYE@j[Eh"bEfTRC@9QCfGQDhQ$LSq3!)q1MBb,LiZ,LiZ-MBk -2N!#4NT5@PjQERCZCPBf,MSk0M)U+LSU+LSQ*LB9qHRGeFh*[EA4pJ(piFA*cF@p -YE@eYEQj[F(*`DfKQC@9QCQ9UH)+*Mj!!Miq0MBb,LiZ,Lib0MBk3!*'5P*@AQCU -FR*U@MiZ1MSf-LiU+LSU+LBQ+L)*mH(CdFQpYFRarIhKaFR0aEfjYE@eYEQp`FA& -YD'CPC@9PBfKfJBH0N!#3!)q1MBb,LiZ,Lib-MBk2N!#5Nj@@Q*UFR*UAN!#,MBq -1M)Z+LSU+LSU*LSU&IhYhGA0`EA"jIRjjFR*dFR"ZE@eYE@j[Eh"bF'YSCQ9PC'* -QFhk'M*!!N!#2Mik0M)Z,Lib-M)f1Mj!!NC18PTHCQjbDQ*+-M)q1MBb,LSU+LSU -+LSU)JhjkGR4aEQjfI(ejFh*dFh&[EQeYE@jZEh"aF@eTCf9NBf*NEhb$LSk3!*! -!Mik0M)Z,LiZ-M)f0MSq4NT19PjLDR*UBP)f,MSk0M)Z+LSU+LSU+LSU(JAajGA0 -[EA*kIATdFA4dFR"ZE@eYE@jZEh"bF'YSCQ4MB@&UH)#(M)k2Mik0M)b,LiZ,M)b -0MSq3!*'5P*@AQCZDQ*D3!)Z0MSf-LiU+LBU+LBQ*LSU'J(aiG(&YERClHR9aFh4 -bF@pYE@eYE@jZEh&bEQTRC@0KB'9cIB1*M)k2Mik0M)Z,LiZ,M)b0MSq3!*'6P*D -BQTZCPj1-Lik1MBb,LSU+LSU*LBU,LS9rHhGcEfe`H(TfFA*dFh*`EQeYE@eZEQp -`FR&YD@CNBPpKE(L!KSZ0Miq1MBf-LiZ,Lib-MBf1Mj!!NT19PTLDQTL@MiU-Mik -0M)Z+LSU+LSU+LSZ+KApkGR*ZEA0jH(0aG(9cFA"ZE@eYEQjZEh&cF@aSCQ0JAf9 -bI)+)Lif2Mik0M)b,LiZ,M)b0MBk3!*'5P*@AQCUCPj50LSk2MSf,LSU+LSU+LSU -+LiU&IhTfF@eZGAPeFA*eG(*aEfjZEQjZEQp`FR0`E'KPBPjJDhCpK)Q,MBq2MSf --LiZ,LiZ-M)f1Mj!!NC+8PCHCQTL@NBZ,Miq0M)Z+LSU+LSQ*LSU-LS9rHR9`E@p -fGh*`Fh9dFR&[EQjZE@jZEh"bFh"VCf4JA@*[HAq&L)Z0Miq1MBb,LiZ,Lib-MBk -2N!#4NT59PjQBPT51LBb2MSf-LiU+LSQ*LBQ+LSb+K(jjG'pYFRGeF(&dG(0bF'p -ZEQjZEQj[F(*cF'YRBepHCR*kJ)D)Lif2MSf0M)Z,LiZ,Lib0MBk3!*'5P*@AQ*D -8NBU)MBq1MBZ+LSU+LSQ*LBU,M)U%IRKbEQpeH(4`FR9dFh*`EQjZE@jZEQpaFh4 -aE'GMAepTG(Z"KSQ,MBq1MBb-LiZ,LiZ,M)b0MSq3!*+6PCH@P*+-KiQ1MSf-LiU -+LSU*LBQ+LSZ-L)*mGR"[G(PjG("bGA4cFR"[EQjZEQj[F(&cGA*YD'4JB@YfI)+ -(LBb1Mik0MBb,LiZ,LiZ-M)f1Mj!!NT19PT55MSH'Lik1MBb,LSU+LSU+LSU,MBb -(J(TcEh0kHhTdF(0eG(0aF'pZEQjZEQp`FA4fG'jTC@"LERGpJiH+M)q2MSk0M)Z -,LiZ,Lib-MBk2N!#4Nj58NBk)JiH,M)f-LiU+LSU+LSU+Lib0Li4qGh&bHRepI(4 -`G(9dFh&[EQjZEQjZEh"bG(CeF'YPB@4[H(k%L)U0Miq1MSf-LiZ+LSZ,Lib0MBk -3!*'6NT!!MSL#K)Q+Lib,LiU+LSU+LSU+Lib0LB&kFh"iIhprI(4aG(9dFR"[EQj -YEQjZEh"bG(GfF@aQBQGbHRq&L)Z1Miq1MBb-LiU+LSU+LiZ-MBk2NC'1M)L"JBD -)LBU,LiU+LSU+LSU+Lib0Li4pGR&hIi+"J(TbFR9eG(*`EfjZEQjZEh"aFh9hH(0 -YCf4UGAb"KSQ-MSq2MSf0M)Z+LSU+LSZ,M)f1N!#3!)k,Ki"rJiD(L)Q+LiU+LSU -+LSU,M)k0Ki"iFhCqJi5#IhKaFh9eFh&`EQjZEQj[Eh"bG(CiH(0YCfC[H(k$KiZ -0MSq1MSf-M)Z+LSU+LSZ,M)f1Mif+Ki"pJS@'KiH*LSZ,LiU+LSU,M)f1Li0kG(G -qJiD&JAefFA4fG(0aEfjZEQj[Eh"aFh9hHRPdE@GUG(Z!KBQ-MSk2MSk0M)Z,LSU -+LSU,Lib0MBZ*KAjlJ)1%KBD(L)U,LiZ+LSU,M)f1Li4lGAKrJiD(Ji"kFh*eGA0 -aF'jZEQjZEh"`FR4fHAYjFfaTEhPqJiL,MBk1MSk0MBb,LSU+LSU+LSZ-MBU(Jha -kIi+#Ji5&KiQ+LiZ,LSZ,M)f1M)9mGRQ!JiD)KB*qGR&dGA4bF'pZEQjZEfp`FA0 -eH(TmHA*XEACpJSD*M)f0MSk1MBb,LSU*LBQ+LSU,LiL&JATjIS#"JB+$KBH*LiZ -,LSZ,M)f1M)CpH(b#K)H*Ki1!HR0bGA4cF@pZEQjZEfp`FA0eGhPmI(G`EA4mJ)@ -)Lif0MBk1MBf-LiU+LBQ*LSU,LSD$IRKjIAq!J)'#K)D)LSZ,LiZ-M)f1M)CpHAq -%KBH)L)@#IA9aG(9cFR"ZEQjZEh"`FA*dGhPlIAaeEh0lJ)5)LSZ-MBf1MBf-LiZ -+LBQ*LBU+L)5"HhCjIAjrIi#"Ji@(LBZ,LiZ-MBf1MB9pI)'&KSL)LBH$IhGbFh9 -dFR"[EQjZEh"`FA0dGRPlIAjkFh0lJ)1)LSZ-M)f0MBf-LiZ+LBQ*LBQ*KS0rH(9 -jI(eqIRq!JS5'L)U,LiZ-MBf0M)9qIi5'KiL)LBH$J(TbFR9dFR&[EQj[Eh"aFR0 -dGRPlIAppGR4lJB5(LSU,M)b0MBf-LiZ+LBQ*LBQ)K)&mGACkI(amIAjrJB1&KiQ -+LiZ-MBf0Li0rJSH(L)L)LBL%JAYcFR9dFR&`Efj[Eh"aFR0dGRKlIAprHAClJS5 -(LBQ+Lib-M)b-LiZ+LBQ)L)L&JAjiFhClHhYlI(eqJ)+%KSL+LiZ-M)f0LB1"KSL -(L)H(LBL%JAYdFR4dFh&`Efp[Eh"aFR0dGRKlIAq!I(KpJi@)LBQ*LSZ-M)b-LiZ -+LBQ)L)H$IhYdG(KkHRTlHhaqIi'$KBH*LiZ-MBb-L)1&LBL)L)H)LBL%JAYdFR4 -dFh&`Efp[F("aFR0eGhPlIAq"IRTqK)D)LBQ*LSU,Lib,LiU+LBL)L)5!IACbGAP -jHRTkHhapIi'$KBH*Lib-M)b+KS@*LSQ)KiH)LBL%JAYdFR9dFh*`F("`F(&bFh4 -eGhPmIS#"Ihf"KSL*LSQ*LBU,LiZ,LiU+LBL)KS&qHA0cGhPjHAPjHRYpIi'$K)D -*Lib-M)b*KSQ,LSQ)KiH)LBL%JAYdFR9dFh*aF("`FA&bFh4fH(TmIS#"J(q$L)Q -+LBL)LBQ+LiZ,LiU+L)L(JhjlG(*fH(KiH(KjHRYpIi##K)D)Lib-LiU*LSb,LBL -(KiH)LBL$J(TcFR9dFh*aF("aFA*cG(9hHAYpIi'"JS+'LSU+LBL)L)Q+LSZ,LSU -*LBL%IhYeFA4hH(GhGhKiHRYpIi##K)D)Lib,LSQ,MSf,LBL(KiH)LBH#IhKbFh9 -dFh*aF(&aFR0dGAChHAYqJ)'#JS5*M)b,LBL)L)Q*LSU+LSQ*L)@!I(GaFhGhGhG -fGhGiHRYpIS##K)D)LSZ+LSb2MSb+L)H(KiL*LBD"IRGbG(9dFh*aFA&bFh4dGRG -iHRarJB+#K)L0MSb+L)H(L)L*LBU+LSQ*KS&pH(*cGRGhGRCfGRGjHRapIS##K)D -)LSU*M*!!N!#0LiL(KiH(L)Q)K)"lG(*eGA4cFR*bFR*cG(9fH(PlIS#"JS1'M)q -1M)U)KiH(L)Q*LBQ*LBD"IAKbFRChGhCfGAChH(PlI(erJ)1&KiQ*LBf5NBk-LBH -(KiH)L)Q'JRjiFh0eGA4cFR*bFh0dGAChHAYpIi'#Ji5+N!#4MSb*KiH(KiL)LBQ -*LBD"IAKcFhChGRCeGA9fGhKkHhapIi'$KBH)LBf6Niq-LBL(KSH(L)L)K)"lGA* -dGA9dFh*bFh0dGAChH(TmIS##Ji1'MT14MSZ*KiH(KiL)L)Q*KS&pH(0cGRGfGR9 -eGA9fGhPkHhaqIi'$KBD)MT56N!#0LSH'KSD(KiL)KB&qH(0cGR9eG(0cFh0dGAC -hH(TlIAq"Ji1%Lj16Mif+L)D'KSH(L)L)KB"pH(0dGhGfGR9dG(9fGhKjHRYpIS# -#Ji5'MT@8N!#0LSL'KSD'KiH)Ki*qHh9cGACeGA4cFh4dGAChH(PlIAq!JS1%L*' -9NSk,LBH'KSD'KiH)KB"pH(4eH(GhGR9eGA9fGhKjHATmIAq"JS1&M*@9NBk+L)D -'KSD'KiH(K(pmGR0eGRCeGA4dG(4eGRGiHAYmIS#"Ji1&MC@8N!#0LBH'KSD'KSH -(KB"pH(4eH(KhGR9eGA9fGhKiHATlIAk!JB+%Lj5@NSq,L)H'KBD'KiH(KB&pH(4 -dGhGfGA4dG(4eGRGiHATmIAq"JS1%Lj59NSq,L)H'KBD'KSH&JAjjGA9iH(KhGR9 -eGA9fGhKjHRYmIRq"JS1*NTD8N!#-LBH'KB@'KSD(KB&qHR4dGhGfGR9dG(9eGRG -iHATlIAk!JB+$L*+@Nj!!M)Q(KS@&KBD'KB&qHhCeH(PiGhCeGA9fGRGiHAPkI(e -rJ)'#Kiq@PC'0LBH'KB@&KBD'KB&qHR9dGhGhGR9eG(9eGRGiH(PkI(jrJ)'#Kiq -9P*'0LBH'KB@&KBD&JRjlGh9iHAKhGhCeGA9fGhKiHATlI(jrJ)'&M*5@Niq,L)D -&KB@&KBD&JAjlGR9hH(GfGA9eGA9fGhKiHATlIAk!JB+&MC59NSk+L)D&KB@&KBD -$IhejGAGjHAKhGRCfGRChH(PjHRYmIAq!JB1*NC@9NBf*KiD&K)5&KB@#IhahGAG -iH(GfGA9eGAChGhKjHAYmIAq!JB1+NT@6MiZ*Ki@%K)@&KB5!IAThGhPkHAKhGRC -fGRGiHAPjHRYpIRq!JSD1Nj@6MiZ)KS@%K)5&KB0rIAPeGhPiH(GfGA9eGRGhH(K -jHRYpIRq!JSL2P*54MBU)KS@%K)@&KB*qI(KfHATkHAKhGhCfGhKjHAPkHhapIi# -"K)U4PC54MBU)KS@%K)5&K)"qHRGhHAPiGhCfGA9fGRGiH(PjHRapIRq!K)Z4P*1 -2M)Q(KB5%K)@&K)"pHRGhHRTkHAKhGhChGhKjHATlHheqIi#"KBf5P*53!)b*Ki@ -%K)5%K)&qI(KfH(PjH(GfGR9fGRGhH(KjHRYmIAjrJSL1NT55MSU)KS@%K)5%KB* -qI(PfH(YkHAKiGhGhGhKjHATkHhapIRq!JSL1NT56MiZ*KS@%K)5%JRppHRGhHRT -jH(GfGRCfGRGhH(KjHRYmIAjrK)Z3!*+6N!#-LBH&K)5%K)5$J(elH(GkHhTjHAK -hGhGiH(PjHRTlI(eqIi#$LT!!NT55MiZ)KS@%K)5$J(jmH(GjHRTjH(GfGRCfGhG -iH(KjHRYmIAk!KSb2NC+2LiQ'KB5$K)5%JhppHRGiHhYkHAPiGhGhH(PjHRTlHha -pIRq"K)Z3!*+6NSk,L)D&K)1$JRppHhGiHRTkHAKhGRCfGhGiH(KjHATlI(eqJSQ -0Mj'4MSZ)KS@%Ji1%K)&qI(PhHAYlHhTjH(KiH(KjHRTkHhapIRq!JBD0N!#5Nj+ -1LSL'KB5$Ji&qI(PhHAYlHRPiGhGfGRGiH(KiHAPkHhapIi1+MBq4NBk+L)D%K)1 -$K)5"IRajH(TmHhYkHAKiH(KjHATkHRYmIAjqIi'(MC!!NC+4MSU)KS5$Ji1!IAY -iGhPlHhTjH(GhGhGhH(KiH(PjHRYmIAq%LSf2N!#3!)k,L)D%Ji1$Ji1!IAajH(T -mHhYkHAKiH(KjHATkHRYmI(eqIi+)MBq4NT'1LiL'K)1$JRppHhKhHRYlHRPiGhG -hGhGiH(KiHAPkHhapIi@,MBk3!*!!MSU)KS5$Ji1$JRppHhPiHRalHhTjH(KiH(P -jHRTkHhYmIAjrJSH0Mj!!NC'2LiL'KB5$JRjmHhKiHRYlHRPiGhGhGhKiH(KiHAP -kHhapJ)@+M)k2Mik,L)D%Ji1$Ji*rIAYjH(YmHhYkHAKiH(KjHATkHRYlI(eqIi' -'M)k3!*'4Mib*Ki@%Ji*qI(TiH(YmHhTjH(KhGhGiH(KiH(PjHRYmIB#&LSb0MSq -1M)Q'KB5$Ji1#IhelHAKlI(alHRPjH(KiHATkHRTlHhapIRq"KSZ1Mj!!NC!!MBU -)KS5$JRjmHRKiHhalHhTjH(GhGhKiH(KiHAPkHhYmIi5*M)f1Mik-LBH&K)1$Ji1 -!IAakH(TmI(YkHRPjH(KjHRTkHRYlI(eqIS#&LSf2N!#3!*!!MSZ)KS5$JRjmHRK -iHhamHhTjH(KhGhKiH(KiHAPkHRYmIi5*Lib0MSk-LSL'K)1$Ji1!IAakH(TmI(a -lHRPjH(KjHRTkHRTlI(apIS#%LBb1Mj!!N!#2MBU(KB5#IRakH(KkI(alHRPiH(G -hH(KiH(KiHAPkHhYqJiL+Lib0MSf,L)D%Ji1#JS&qI(YjHAYmI(YkHAPiH(PjHRT -kHRYlI(eqIi+(Lif1Mj!!N!#1LiL'K)0rI(YiGhTmI(YkHRPiH(KiH(KiH(KjHAT -kHhf#KiQ,Lib1MSb*Ki@%Ji1$JRpmHhPjHhamHhYkHAPjHAPkHRTkHhYmI(eqJ)@ -+M)k2Miq2MBU(KB5!IAYjGhPmI(YlHRPiH(KiH(KiH(KiHAPkHhb!KBL+Lib-MBb -+L)D%Ji1#JS"pI(TjHRamI(YkHRPjHAPkHRTkHRYmI(eqIi+)Lif1Miq2MSb*Ki@ -#IRakGhKlI(alHRTjH(KiH(KiH(KiHAPkHRYqJiH*LSZ-MBf,LBH&K)1#JS&qI(Y -jHAYpI(alHRPjHAPkHRTkHRYlI(epIS#&LSb0MSq2Mik,L)D%IhalH(KkI(alHhT -jHAKiH(KiH(KiH(PjHRYmJBD)LBU,M)f-LSL'KB5$JS+!IAakHATmIAalHhTjHAP -jHRTkHRTlHhapIRq#KiZ-MBk2Miq0LSL'JAelHAGjHhamHhTkHAPiH(PiH(KiH(P -jHATlIS1(L)Q+LiZ-LiQ)KS5$Ji+"IhalHRPlI(amHhTkHAPjHATkHRTkHhYmIAj -rJiL,M)f1Miq1MBU)K)"pHhKiHRamHhYkHRPjH(PjH(KiH(KjHAPkI)'&KiL*LSZ -,M)Z*Ki@%Ji+#JAjmHhPkI(epI(YkHRPjHATkHRTkHhYmI(eqJ)@*Lib0MSk1MSf -+Ki0rI(TiHAYmI(YlHRTjHAPjHAKiH(KjHAPkHhf#KSH)LBU+Lib+L)H&K)1#JS" -pI(TjHRepIAalHRTjHATkHRTkHRYlI(epIi+'LSZ-MBk1MSk-LSD#IRajH(TmI(a -lHhTkHAPjHAPjH(KiHAPjHRYrJiD(L)Q+LSZ,LSL(KB5$JS&qI(YkHAYpIAamHhT -kHAPkHRTkHRTlHhapIRq$L)U,M)f1MSk1M)Q&JAelH(KkI(amHhYkHRPjHAPjHAK -iHAPjHATmJ)5'KiL*LSU,LiU*Ki@%Ji+!IAalHATmIAemHhYkHRPkHRTkHRTkHhY -mIAk"KBQ+Lib-MBk1MBZ)K)"pHhKjHhamI(YlHRTjHAPjHAPjHAPjHATlIB'&KSH -)LBQ+LiZ+LBH&K)1"IRalHAPlIAepI(YkHRTjHRTkHRTkHRYlI(erJiH*LSU,M)f -0MBb+Ki0rI(TiHAYmI(alHhTkHAPjHAPjHAPjHAPkHhf#KBD(L)Q+LSZ-LiQ(KB5 -#IhalHRPkIAepI(alHRTkHRTkHRTkHRTlHhaqJ)@)LBQ+Lib-MBf,LBD#IRakH(P -lI(amHhTkHRPjHRTjHAPjHAPkHRYqJS@(L)L*LSU,M)b+Ki@%JAemHRPkI(epIAa -lHhTkHRTkHRTkHRTkHhYmIi1'L)L*LSZ,M)f-LSL&JAjmHRKkI(amI(YlHRTkHRT -kHAPjHAPkHRYmIi1'KiL)LBU,Lib-LSH'JhpmHhPjHhepIAamHhYkHRTkHRTkHRT -kHRYmIS+&KiL)LBU+Lib-LiL'K)"pHhPiHRepIAalHhTkHRTkHRTjHAPkHRYlIB# -%KSH)LBQ+LiZ-M)Q(K)"pHhPjHhepIAamHhYkHRTkHRTkHRPkHRYlIB#%KSH(L)Q -*LSZ,LiQ(KB0rI(YjHAYpIAemHhYkHRTkHRTkHAPkHRTlI(f"KBH(L)Q*LSZ-M)Z -*KS*qI(TjHRapIAamHhYlHRYlHRTkHRPkHRTlIB#%KBD(KiL)LBU+LiU)KS5"IAa -kHATmIAemI(YlHRTkHRTkHRPkHRTlHharJiD(L)L*LSU,M)b,L)0rIAYkHhapI(a -mHhYlHhYlHRTkHRTjHRTlI(q$KB@'KSH)L)Q+LSQ)KS5#IhalHRPlIAepI(alHRT -kHRTkHRTkHRTlHhaqJB@(KiL*LBU,M)b,LS@"IRYkHhamI(amHhYlHhYlHhTkHRT -jHRTlI(q$K)@&KSD(KiL*LBQ)KS@$J(emHhPkI(epIAalHhTkHRTlHRTkHRTlHha -pIi1'KiL)LBU+LiZ,LSD#IhalI(epI(amHhYlHhYlHhYkHRTkHRTlI)#$K)5&KBD -'KiL)LBQ(KS@$JAjmHhTkHhepIAamHhYkHRYlHRTkHhYlHhapIS+&KiL)LBQ+LiZ -,LSD$J(emIAepI(amHhYlHhYlHhYkHRTkHRTlIB#$Ji5%KB@'KSH(L)L(KB5$JS" -pI(YkHhepIAemHhYlHRYlHhYlHhYlHhamIS'%KSH)LBQ+LSZ,LBD%JAjpIRjpI(a -lHhYlHhamHhYkHRTkHRTlIB'$Ji5%K)@&KSD(KiH'KB5$JS"pI(YkHRapIAemI(Y -lHhYlHhYlHhYlHhamIAq$KSH)L)Q*LSU+L)@%JRpqIhjpI(alHhYlHhamHhYlHRT -kHRTmIS'#Ji1%K)5&KBD'KiH'K)1$JS&qI(YkHRapIAemI(YlHhYlHhYlHhYlI(a -pIAq#KBH(L)Q*LSU*KS@%JS#!J(pqIAalHhYlI(amHhYlHRTkHRYmIi+#Ji1$K)5 -%KB@'KSD&K)1#JS&qI(akHRapIAepI(alHhYlHhYlHhYmI(apIAq#KBH(L)L*LSU -)KB5$JS'"JApqIAalHhYmI(amI(YlHhYkHhYpJ)+#JS1$Ji5%KB@&KSD%Ji+#JS& -rIAalHRaqIRepI(alHhYlHhYmHhamI(apIRq#KBD(L)L*LBQ(KB5$JS1#JApqIAa -mHhYmI(amI(YlHhYlHharJB+#JS+$Ji1%K)@&KB@%Ji+#JB&rIAalHhaqIRepI(a -lHhYlI(amI(amI(epIRq#KBD(L)L*LBH&K)1#Ji5$JB"qI(amHhamI(amI(YlHhY -lI(k!JB+#JS+$Ji1$K)5&KB5$JS'"JB&rIAalHhaqIRepI(amHhYlI(amI(amI(e -pIRq#KBH(KiL)L)D%Ji+#K)@$JB"qIAamHhamI(amI(YlHhYmIAq"JB'#JS+#Ji1 -$K)5%K)1#JB'"JB"qIAalHhaqIRepI(amHhYmI(amI(amIAepIS##KBD(KiL)KS5 -%Ji+$KB@$JS"qIAamI(amI(amI(YlHhapIi#"JB'#JS+#JS1$Ji5%Ji+"JB#!J)" -qIAalHheqIRepI(alHhYmI(amI(apIAeqIS#$KBD(KiL'KB5$JS1%KB@$JB"qIAa -mI(amI(amI(amI(aqJ)'"JB'"JS+#JS1$Ji1$JS'"J)#!J)"qIAalHheqIRepIAa -mI(amIAepIAepIAjqIi'%KSH(KiH&K)1#JS5&KB5$JB"qIAepI(amI(amI(amIAk -!JB'"JB'"JB+#JS+$Ji1$JB'!J)#!J(pqIAalI(eqIRepI(amI(apIAepIAepIAj -qIi'%KSD(KS5$Ji+#K)@&K)5$JApqIAepI(amI(amI(apIS#"JB'"JB'"JB+#JS+ -$Ji1"JB"rIhq!J(ppIAamI(jqIRepI(amI(apIAepIAepIRjrJ)+&KSD'K)1$JS+ -$K)5%K)1#J(pqIRepI(amI(amI(eqJ)'"JB'"JB'"JB'#JS+#JS'!J(prIhq!Ihj -pIAamIAjqIRemI(amI(epIAepIAeqIRprJB1&KS@%Ji1#JS1%K)5%Ji1#J(pqIRe -pI(amI(amIAk!JB'"JB'"JB'"JB'#JS+#JB#!IhprIhq!IhjpI(apIRjqIAepI(a -pIAepIAepIRjqIRq!JS5&KB5$JS+#Ji5%K)5$Ji+"J(pqIRemI(amI(apIS#"JB' -"JB'"JB'"JB'"JS+"J)"rIhprIhprIRepI(apIRjqIAepIAepIAeqIRjqIRjqIi# -"Ji@&Ji1#JS+$K)5%K)1$Ji+"J(pqIAemI(amIAerJ)'"JB'!J)'"JB'"JB'"JS' -!J(prIhprIhpqIAemI(eqIRjpIAepIAepIRjqIRjqIRjrIi'$K)5$JS+#JS1%K)5 -$Ji1$JS+"J(pqIAemI(apIAq!JB'"JB#!J)'"JB'"JB'"JB#!IhpqIRprIhppIAe -mIAjqIRjpIAepIAeqIRjqIRjqIRprJ)+%K)1#JS+#Ji5%K)1$Ji+#JS'!IhjpIAa -mI(epIi#"JB'"J)#!J)#"JB'"JB'"JB"rIhjqIRprIhjpIAamIRjqIRepIAepIAj -qIRjqIRjqIhq!JB1$JS+#JB+$K)5$Ji1$JS+#JS'!IhjpIAapIAeqJ)'"JB'!J)# -!J)#"JB'"JB'"J(prIRjqIhprIRepIAepIRjqIRepIAepIRjqIRjqIRjrIi#"Ji1 -#JS+"JB1%K)1$Ji1#JS+#JB"rIRepIAepIAk!JB'"JB#!J)#!J)#"JB'"JB'!J(p -rIRjrIhpqIAepIAeqIRjqIRepIAeqIRjqIRjqIRjrIi'#Ji+#JS'"JS1$Ji1$Ji+ -#JS+#J(pqIRepIAepIRq!JB'"J)#!J)#!J)#"JB'"JB'!IhprIRprIhjpIAepIAj -rIRjqIRepIAjqIRjqIRjqIRprJ)+$JS'"JB'#Ji1$Ji1$JS+#JS+"J(pqIAepIAe -qIi#"JB'!J)#!J)#!J)#"JB'"JB#!IhprIhprIRepIAepIRpqIRjqIRepIRjqIRj -qIRjqIhq!JB1$JS'"JB'#Ji1$Ji1#JS+#JS'!IhjqIAepIAjrJ)#!J)#!J)#!J)# -!J)#!JB'"JB#!IhprIhpqIAepIAeqIhjqIRjqIRjqIRjqIRjqIRjqIhq"JS1#JB' -"JB+$Ji1$JS+#JS+#JS'!IhjqIAepIAjrJ)#!J)#!J)#!J)#!J)#!JB'"JB"rIhp -rIhjpIAepIAjrIhjqIRjqIRjqIRjqIRjqIRjrIi#"JS+"JB'"JB+$Ji1$JS+#JS+ -#JB#!IhjqIAepIRq!J)#!J)#!J)#!J)#!J)#!JB'"JB"rIhprIhjpIAepIAjrIhj -qIRjqIRjqIRjqIRjqIRjrJ)'#JS'"JB'"JB+$Ji1#JS+#JS+#JB"rIhjqIAeqIRq -!J)#!J)#!J)#!J)#!J)#!JB'"J)"rIhprIRepIAepIRprIhjqIRjqIRjqIRjqIRj -qIRprJ)'#JS'"JB'"JS+$Ji+#JS+#JS+#JB"rIRjqIRjqIhq!J)#!J)#!J)#!J)# -!J)#!JB'"J)"rIhprIRepIAeqIRprIRjqIRjqIRjqIRjqIRjqIRprJ)+#JB'!J)# -"JS+#JS+#JS+#JS+"JB"rIRjqIRjqIi#!J)#!J)#!J)#!J)#!J)#!J)'"J)"rIhp -qIAepIAeqIhprIRjqIRjqIRjqIRjqIRjqIhq!JB+#JB#!J)#"JS+#JS+#JS'"JB+ -"JB"rIRjqIRjqIi#!J)#!J)#!J)#!J)#!J)#!J)'"J)"rIhpqIAepIAeqIhprIRj -qIRjqIRjqIRjqIRjqIhq!JB+"JB#!J)#"JS+#JS+#JS'"JB'"J)"rIhjqIRjqIi# -!J)#!J)#!J)#!J)#!J)#!J)#"J)#!IhpqIAepIAjrIhprIRjqIRjqIRjqIRjqIRj -qIhq!JB'"J)#!J)#"JS+#JS+#JB'"JB'"J)"rIhjqIRjrIi#!J)#!J)#!J)#!J)# -!J)#!J)#"J)#!IhpqIAepIAjrIhprIRjqIRjqIRjqIRjqIRjrIhq!JB'"J)#!J)# -"JS+#JS+"JB'"JB'"J)"rIhjqIRjrIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!Ihp -qIAepIAjrIhprIRjqIRjqIRjqIRjqIRjrIhq!JB'"J)#!J)#"JS+#JS+"JB'"JB' -"JB"rIhjqIRjrIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhpqIAepIAjrIhprIhj -qIRjqIhpqIRjqIRjrIhq!JB'"J)#!J)#"JS+#JS'"JB'"JB'"JB"rIhpqIRjrIi# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhpqIAepIAjrIhprIhjqIRjqIhpqIRjqIRj -rIhq!JB'"J)#!J)#"JB+#JB'"JB'"JB'"JB#!IhpqIRjrIi#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J(pqIRepIAjrIhprIhjqIRjrIhprIRjqIRjrIhq!JB'"J)#!J)# -!JB'"JB'"JB'"JB'"JB#!IhprIRjrIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(p -qIRjpIRjrIhprIhpqIRjrIhprIhjqIRprIhq!J)'"J)#!J)#!JB'"JB'"JB'"JB' -"JB#!IhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)"rIRjqIRjrIhprIhp -rIhprIhprIhpqIRprIhq!J)'"J)#!J)#!J)'"JB'"JB'"JB'"JB'!J(prIhprIhq -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)"rIRjqIRjqIhprIhprIhprIhprIhprIhp -rIhprJ)#!J)#!J)#!J)'"JB'"JB'"JB'"JB'!J(prIhprIhq!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)"rIhjqIRjqIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!Ihq -!J)#"JB'"JB'"JB'"JB'"J)"rIhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!IhpqIRjqIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!IhprJ)#!JB'"JB'"JB' -"JB'"J)#!IhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(pqIRjqIhprIhp -rIhprIhprIhprIhprIhprIi#!J)#!J(prIi#!J)'"JB'"JB#!J)'"J)#!J(prIhp -rIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhjqIRprIhprIhprIhprIhprIhp -rIhprIi#!J)#!J(prIhq!J)#"JB'"JB#!J)#!J)#!J(prIhprIhq!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)"rIhpqIRprIhprIhprIhprIhprIhprIhprIhq!J)#!J)" -rIhprJ)#!JB'"JB#!J)#!J)#!J)"rIhprIhq!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!IhprIRprIhprIhprIhprIhprIhprIhprIhprJ)#!J)"rIhprJ)#!J)#!J)# -!J)#!J)#!J)#!IhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhp -rIhprIhprIhprIhprIhprIhprIi#!J)#!IhprIi#!J)#!J)#!J)#!J)#!J)#!J(p -rIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhp -rIhprIhprIi#!J)#!IhprIi#!J)#!J)#!J)#!J)#!J)#!J)"rIhprIi#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)# -!J(prIhq!J)#!J)#!J)#!J)#!J)#!J)#!J(prIi#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J(prIhq!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhp -rIhprIhprIhprIhprIhprIhprIhprIi#!J(prIhprJ)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J(prJ)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhp -rIhprIhprIhprIhq!J(prIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)" -rIi#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhq -!J(prIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!Ii#!J)#!J)#!J)# -!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!Ihq!J)#!J)#!J)#!J)#!J)#!J)"rIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J(prJ)#!J)#!J)#!J)#!J)#!J)"rIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J(prIi#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhq!J)#!J)# -!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)"rIhq!J)#!J)#!J)#!J)#!J)#!Ihp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)"rIhq!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!Ihq!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)!!!%0!!!%!!3!&!!!!S!!"J&%!!!!!!"3!!!!!!!"$&PE -ZLk-!!%-8!!"$&3!mJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!Ihq!Ii#!J)"rJ)#!J)#!J(q!J)"rIhprIhprIhprIhprIhp -rIhq!IhprIhprIhprIhprIi"rJ)#!J(q!J)#!J)#!J)'"JB'"JB'"JB'"JB'"JB# -!J)"rIi#!J)#!J(q!JB#!JB'!J)#"JS'"JB'#JB'"JB'"JB'!Ii'!Ii"qIi"rIhp -rJ(prIhq!Ihq!IRk"J(prJ)"qJ)&rIi"rIi"rJ)"rJ)&rIRprIRjrIhpqIi"rJ)" -rIi'"Ii#"J)#!J)"mIS4pH)"rHhemHhepHhTqIAYqIAk!IAf"JAjqJ(prJ(jqJAp -rJ(q!J(jrJ)"rIi"rJ)"rIRjqJ)"qIB'!Hhk$J(aqJAppIRq!J(eqJ)"rIhjrJ)# -"Ihb#KRYpKi&pJS#!K(pqKSCrJ)@%JS&rJB&pJS9pIB@&IAb!K)*pI(q#JAf"KAp -lJBU!GB+(Hhb'J(f&Jhf"JRk!K(pkJBCiI)f!GB'(K(q"KAPkK(TqL(KeLiYcFSU -*G(q)H(b&Ii1#G(H1MRCbJB'%M(aTHTH-DhQ5I(H0IR+(KA0rM(PcIhk'L(GcHBH -1G(',J('"JhGmLRT[KRTfN!"pFi4kI)0mIAafJBClIS4pJB4pKiTkIB@*MhaZIBU --I'jrLi&cFRamJRe`LBP[HiU*H@k%QS&VK*L+EhfEJ'f(MB&iFAD,LA"jI@q0P'K -bQiP`K*5)JBH%LBejHC@9Df@JS9YMPB4UG)'"IB&pFAq6JR+(M(+#RS&aMT4rI)k -*H)#%GAb#GhD!IfYlQR*NRBGIMTTVGTk*GC!!LA#2RR"ZPB*UJSC[GiKbG)afCS1 -8Hf4qQ)CaJ*H)HC'CJ(Q'MB*fIB&dGAecGACbH@pTG)5+E'Q3!)YlMSb$JS#0N!# -&IAD'N!"eFBGjEAYcF(pUB)1$FhTmK)GpL*+0LB#(PjH(G)@8JAaeDhjfBh9dCQe -mKQeBKjpjFAU(R*1"L*',M*Z@HhQ(JRq%G@&XK(GID(KlHhT`GT@'ECLSGR@XVS& -qQC@+K(Z2Lf*VHQpfE&plI'CbK(aXGiq-IAf-R*f3!)Z9Q)Z-L(Z'MB*XA(#$GQ9 -NF(TfI(pbDA@9PATpP+1@J*UUJ@b#R*PZBhpjDR4dDQp`GBTe8AQMG&L,RB+%QTk -2LBq+L)U#JieeD)Cf8'U-HeGMJ(GZEh9pGA#'RiefMDLGIRf6Lhf3!*&aERajF'j -XEhTfE(CfERGbGi0aHTZ5K*DGN!"rKjf'HjL-FRC`FApbDA&pH9eYL@pKH(KVJjD -"KU+9LTL5J)LINAQ0KPejS(eEFSCmGR4RCRKfB'b0K(L8Qib@QBZ*LSH-NiplE)@ -1ER@5Gf+!HPpaFeaUIR"`N!#@JSqLN!##N!#6Kj@BJBH(H(q,L(KeI'pVH@YCA@C -jFf&rR)q%N!#GNi5$LD'FG)#IKh12NAYpHfpSF(0E@QYHCBPpDC+NL(k2PRGpUjK -pNS*bS*p[HTKk9Qk$CP"GEQ"AH)YhFSDESS9YKk+MMhQ-QBk8LAZHS@PKIR9TE&Y -1@f0`KAjUFjfVJ'b3!*b6PBarKD5JHC1hKQ5%K'*QD%a@Ef*GGiPkGT1@H)1KNB1 -9QBk6S*'B[TGbSip(CT&D2fPF3h@&AR1@FQQAQQjZVV4cGkZTNTkfU)U"K)&cCQ0 -F9&9FC'KZHRjUCiq3!'9rVj4jN!#HT,5PMDh(Le5)U&`pEfP#@@YHFhY9AT9r9iL -CFiZNKSqrV)HhcTU2Q(TaJRP33&aMC'Y4AS"TAQG[K(GmR)0lT,+PRUh%UiZ6M(e -hCeY989KRDPYADA"L@(D+EA@@MRqJ`jkAeX@EVjZ&LRGf@$TTFdG2DQKE@@9DAhe -bFiU"MV@JN!$*eUHZc*YYKjCk9dY@DR&66QaM694TEPYQLhj`Sl@ATFV5ZE+hT*1 -)IATS69TfC8T2Bej29eC9CAKfBhqVTCbUaFc$bl'BPiD(L@C2BQpI9PK@68K@A99 -5BS0eAk$"QD6%dZ'mP,'cMAjeE@*QFf**8ej(29*94e0kG9"dUU5UZ,6@jVbNVlU -9FSGbAi*R2PYM8$mV6Q4'6P9FGhH-Tk5c[GMXVU$AYB1)I(KeC'PI89K006e(89X -i4RaXFCLGVF62h-r"aV+QT)"cKS"Q@@4U6$ir0%G8-M9HC@9fQ+QUa0,1f-V!`k+ -CPR4qIeeeIN)e@88M3PSi+8pZDhLBSV[CbF6HcmE#NTUVIQKhIR0H66dl46%Y8$3 -H@faHL+5DYq65Zq$SZl1bQ*H*DA+$G%Xp6NFX)N&*)cGKB@4qTX2!aG21iH$%Z)b -8[RT'G(YQB$`U26XR,$3S5R"@G+UYaq(FdZ$dflLVSCf2A&"fE%3c,bJX3$)E,8a -+8(D'PFRB[0([f0RU[DZhQj9iBiec9P8Z-8Bc("NX1#dd@(f8Ql(#[Z(cd-r0Ylq -eJQq6QQ&1CN3X6MiB-6dV1NpULk1XUEhFiF@qdlbHRi"bJR"dG%a19P0F0b&,8$j -$5(5IPTbVY-l8a,bmZDfaQR@@TA9aH&T)@9`K&dFX%6G(9B5-K+R)cXh0cFR&X+f -YLBfCJ(TT8Pe0068k4LNJ9PGFMSqAXlR2[kE&[U1JRTk+KTb%H)*cF8i`683Y,bi -[0f@%BhZcVE#p`mh"aFQ`[VH5Y+KaI'a155dS+KFE*#ip8S"qJX6'SVE+cF1MX,b -*Kkk6FBCq8&9N5$Y)589$9Q4QJBq8Tk@LXE#VSkLRPD5DKCZEL)*M594'1cdH+$i -Y8'pKH*QPUlV9`lAIhm#cVmHVIUUJ8P&H0L-V&4Fr,aK+HAQ"PTZNZEbjYVZjTkq -aS+#6P+1"Bf0G@8)p68&(5%aeI("hKjkDMjHQ[E1JTkbkXDDmPeeeI$id65J826i -V5fKJHCk@P+h+aVE5flLZb-fSN!#PNeTH5b9#1K)N1640DQeRFC!!PBQLZ*kC[X# -QXF5`UE@PNT&qA&CM6bBm@5ibCP*3H@9@JU1@Ll$&VlRFem$"Xk@4GRC1+dJk&bF -q2c93C@'1MfHIekbCb1+lS-MBXTUGMfKRBMT*@b!XEP%kD(&8E)YXDU1GFC[#S*U -jYUHecl"pNTG`DQaG6da69dC0CNa1EP4SViPNXm'G[-qiUm2#LSb2A9KH98%hB9B -TA)03AC0hCTbeMSr-Zi1[`D'`SSClFS&f9NYAC'9VA&4lGPCKE("ZFT+4JTbPQk' -EXG+YLCUPNheVHAa18QTA9f*&,9*V9@5'HB5dZDQ`YlV!Y*D5T)9VE9pK@&*939e -b9eYICA4dN!#VQSkF[VD0TVb0JT1-M(&JHQYLEePTENYNE9"+8@jlEAkDQC+KXD5 -Vf,5([-+@Tk&`F(KK6e&,2Mib06e)AeC`RC!!M,'qT+M0[SqXaj@1U)alGh&V8R9 -e3'YV0QD)C@1,N!"THk'&JT*iJk19MCHJRi#3!+D!G)4mEPpB8dYMDNPLLfpMMj0 -qQlqQR,Hca-HMRj!!L)pL9Qe@3cNk6$p(A%YaRA4`Tjf&UUf3!++XT,HhRSb6S(a -IJTPi@'CVAhCY8'YVAR4Y9f4rG'*rQBqCYDfPZl+5KBkHLPp@G'%mAQ0$6ejaC&5 -3!*U&RTQTZVEIbjHcUiZ(CQ&cAdp+4dp09Pj4CRGQG)*fJjq'E+qlL,I)RTqKQ)U -,Q)CpK@pkM'aN@NaUDP064Q5&APk+N!#9Ul1USlUQJT+-Ghq$CeahG@KV9PeqFQU -#M(q3!,+DL+qiSk#6K)b!@P&VF&CFG@9RKhKSIh0ZLB*lHhU4LS#@N!#5UD#&L+# -9GB1AKS11Ji#1FPpkANYQ8e9aA@'$HR58R*ZAN!#VX*H'J)L@NRPaMjKaCQjYG@C -VGQ"pPA+&PhQ1Rhq%Nh9pRRYFEi15I@f2JQH*K'GYGhGJCiaeFjTqFD+EKk+8LU@ -DJiHAQBZ"HS+2ENpH9Pjc6%e`DfTmJh5*Rhk'YCTrSjL'Sj@$Piq(PjChEhTZGh& -NI(akG'#!LQThF@L2Kh+#IB@3!)H'L*Q@JT!!JA@&F('$CA@KDQ@JIh'3!)1!LBH -0LTfKJSf,FibTMeKIK@92D9p6EhKGDSGcGiL"J)@JTSQ@[UQ3!+bHMU'NMhQ-F6j -`INpKD'GE6Bq!5RpX8+16AjH[P*!!SjerNkU*Lj!!FR*LCSTbAA+*J@U(NA#+Nf* -YR*@2XijRRU'#L)"bE(ab4e0[9&4[FA&MBT'+F*&dGUf0T-fiUil%fAQJ`S@'EPY -Y@9GF8dj)@eP1F&j,J(*8J+'ENU5kXjqEREUmIB'EI@TmM&eCNh*1J)YT8fL0CNL -,VipqMkfINCq4S+P[Dijk6dq0E6"fDNChBPTlHfYHQVq'Vp+@XFR!b)qFY9U'Y%* -5INj188p*A(p+-h&k@&Z!Q)@)VTq)RV5pRSZMTD5)G*q5C(')HQf(GN&GK(9PAfb -#JRq%K*HUQif+Pk9eBSGZA@9(@PT)LAp%DiQ%N!#9P*He[k@bXUc-XhGrUCYH6Qp -K05a5HPNpF(&CIhGLHAPiJjPlAm#jE,'hKlh"N!#5QiarJhGNNSY,E(pIBfeZ8cp -ZFeb,QikNRT+VZCPcHSCq9bKDN!"C2(''GiZJNSDZVA5DXBqYXBqIPhZ4N@0CAdF -rAf-dCDeRAkUPJAfCKeGbI9P[Lj!!N!#&TEHSX+1IU(aRHS@)D@&fDfalFR"XA@4 -hE&H!YCD*[lQ5U+*cGQa35c8mAQ"QFS#HTk2%c*LF[Tb"L)Q8MfTGHiG[AeYHD&T --Bi#-P)k8TS1"ThCGIfe-5PpkFAUBMkM4XTkcXTf%J(T2B)9H6h"dD(YmAAkdI81 -*`ijhP)b8T(K6D(TL5P"15@q,Gh@efkUak,0cVGCf1hGqA'05@B1"Bf'AP9aaL(Y -qIRpeHDZL8(DM5'QJ5&+6JAQ6UCZEi-jiR,f'GATN8&YQ4%@+P&acTj&iKT1$Kjq -$Eib-KSTaEReI8QpN@PjIKi0KSHA&QU62[(Z(N!"bDfC95Qb+FRfCMi9mMijMISa -RC@4[M)KL5h@$2NZ*CQ'6JSl5dF2IfE'TSBU)8bjX@b"5E'4rGS+LP(GVQDYSCk5 -*3@HcDc+&H6YCF'0TPkKhR1'hVGDeQDQ*F(TYAQ*YD@4YI*1KNB@2JQChG8G9FP3 -p8A"RBRKcFS1BQj'VYUZcTkc5`CbIQi"iI'G9Bh"B9B&p@RZEGPPLD9jDF(&8DBG -`KTq!L*Z8PSU'MhZBZ)H6[l#STk'1GCDK4%#LILj-IP`PGjNcAT9BGSjNKTq"LTQ -+GhQAI&k5QAGcNm#ANpZXLXD`L*Z9Gf9N4bG)9L8[G(a@Dk1PMCUZP)HMM@*rKPG -AD@GUJ+#'HDqRR,UVYmfQJiQ8GdeAA$Bq6MpFFfjkQU1$RFLEIBPcChKJ5PGFDRT -ZECA$ViHbil1)`XKrJ(T'8Q!r4QK21hD2BA+cX)b@QjfMJ)L$8A119%amGfb'FQQ -FTk'SRBf&RBT0AR45DRp,@U#IK*qbQjkXMSbPJfeXEB"QARGKEBaT@A#0MA+#Ihk -LM'jmHfekIQCdLBDCRS#%b0b3!(bbUATSBfGaEP41G)0aISQ(LS#(Heq)M%T4B&H -!H8eeRiq*QT5Dam1,MF$&Q(f5SSTI5Q0RCA0KHieGKlGjDjZLF$a9C$T,A6YBGQf -6SC+ZcXLMRX,&TB*mUE"S9S'$M'meG*4YJ(&dL'PhL@T8A'eD3NG0@9aQMj@4XVU -XVG,JQ)h%UB4mKTYeGjCiHiQ'H95"Md&`Kb!rH%Be2&&D9@jFDjq@Pk1ki-Lk[+[ --b*UUTRYeJ)&TETed1A5@9%4cE%P54M&ME6KDKQPXNUUbTDDmZUH8NDk[MQp`Pi9 -NIS1&NhKbP++-KCU&G(KYD6SrH%8ZB&*3H(b"KT1fP(1`ZReaQDk0H*'FKS+NVD+ -CQE@cLAk4RiG@18",0a-22&Sl5SebGFkkRVl"ZU#5NTDbR'GVLi*hKhU$P(YpJiL -0Ij9i8R4S894*4PeV69'(VV@YY,1V[jk'TS"38dpHC%SqCj'"JkZpTCDp`*5FUCD -#E9pQGP8R29GC@%eSLRq1TCfYYTfLSSL3!'e9K'P3M+@(JDl!STQFN!"hE'")@9% -d89a6CA&VFk#YLj5`Ul1p[-+fVVq24'&a3Lm`2eCF5fUVIPZka@eVPiGZK*@%H(f -3!+UmRh#2YTG[BRL2FQH(Ff9m@&f&@e*iG(L$DRHiY)U6UTf-U*0DIhp#DT!!C&G -qKR+'Nh*aPTD$Ii'&Kj+,L,#ZKC@SL("qDNGK9Lj8D%06HRTdG)12IC!!TTHXZ+q -PSG6&LULEGi9U8PCUGeY`P(jLE)&F3&K40$G@E(GlKkqi[-c-bV'p`S#-YC4`D(P -Z5ea9,Mj59@9SGSfRYD1ablU5G)U*A&YQ@&pbER9kFjQdPSKfD*'3!'PeN!#,B&b -ETRZ,Uk'KTTUFPiZ4Qj0T4PGD3c3G+die+PpeLEQaXGVQfFr9cVHPIR#2HNKCG'0 -PGP3mD)"33'pY9QGZJCb9KAkGVB#%V+5CSUQPQ+#iRAb%C%GE5LNe@'pIARZ0UUk -BQUUlS(U(I(UKK&YhLReM9fGXH@8d@(p`Ij+$JV#kLSD[bk+)T)QCZ(9eVijJCQ4 -$-8G20c!`3h*ZDERGT+64ZTfeZCf-MiCdJ(U)VhjLK(*JA90HC9Y469eaG)"fE*U -3!'f0Q*qUVYR&TG$0S)&lJ%mJ*b8L1%43Dhf8YkUPcEkKVU#"JiprEhfAK&4EEfK -cC9C`GAapGTQaRi"rK'CIG(CRDiqLPD(0bEhAZBKfA&T5)"Bl3#BX9A*mMjH+SXk -hNV6EfF#GUlfDJS"kC$e!86T#B@CbJi*hGSk+BQ*`FQ"'FC@&QlbrZ,R*XC@`S(9 -iB6e4F'pF8faN6h4S6BbNI(5@VU1MYV1PS)KSFR&-9fe58h9jJBk(LC5'C@Z$J(U -"LBkTZkfRUELeMRTXC@j6-d&FBP03B(0dBQprHi52LT1VUVcA[*58XDf'GhKpG&K -LFAD+Jh"XBeC29%dk6RCX8A@hdEUddpI!VjD,PSGM9PYC8fGb9&9hF&48CBHbN@q -aak'RX*fAP(&3AQeCEB9FC+qXHibPNRKS9dKHDP&@E)#HPiDK`F#YS+1PPTD6D&q -)LdddCeic2N&#Ci*iH+6$`m'kY,QkMQL$H%j9B&pFBi'1JAk1PiKUBhKpE'"VKiT -dGj+MNAf0PjDEP)Z5QjQ(KC&`@'YG3cBc9f&0HCq4QkDS[UQ9V*&rMfaLJS9lHAf -"HRD'JeYVMQ4KMRq!QSQ$LS1&LB9qFh'*P(GlR*U"Gi+(HQGJC@9I@'&fMjZ!KUD -SUBf$U*KpPiPfQ*0dIj0pCRjm68aYCNY8EQaULiGSLCk2Pi9pT+5AQD'YS+1IKjb -BA9PZBej28R*VG(Y`Q)TFHBejDh0jI)Q%Mk+8QTf,RT9`H)"rG@H!Ih+-NS0aChP -lFhejJTD2NjH9TjjiBhZ%3cYa96YSI@eaNk+-M+#-Lk+#M,bCKU5GPD'LJR+)I@e -aD'CTE@jTB9TUEeT*8Q4PCh'1TjDGb-A![TbU[TZ!IAebCQ4KDh*fGA@(EPPpJhT -aCi&pG)CjL*YkI)0XK*!!JC0rEC@JQCk2KTq,6(542NZ4F'Q8P+5bR+5GKSPaCRT -K5'*VBh4kGRaiJ)KMEjb+IikDYV+BTk+(M)&PB@j[A'k)HBUMNSZ-JfKKF9G3C&e -VGh13!*bIU)q3!+kBL**rPUjfEBqCL9jXIPpMBePEB(PpF(H4QSQDQA+&N!"RH(p -DJl#(F*@bUC5DTCD%I'KHIAa6D)&PFiG`EhGrJ8p5IfTNJiqFUCk*QDQ>+#CB@ -)DTDlRB@EXSaREA&X@%TEDR4dHBf0JRpmG'4FBQTTC(bERTqGTEZPJBfMNSL3!)L -&RU1*P*&ZKi&*9Q426f0N5@kLD9+*E&'(H90pK@H#Sk'XcG1l[XZdT+qTMA0QC@* -EAeYHDPG)69ph984`G'*PICq@JSqUU(YfVTpaPU+"RmHUSFLjM)'@Ld4(I9-V@RK -YG(4lNheHFB*G4fTVESb%IS+3!*TpJ*1%FiLMMBLfd0A&U*q`UA&FF@C4-cGkD%" -iF9L(DMK@DQCSBh#$N!#SV*UF`,H&TEb+N!#GQE@MMDbjPfjrNeB[6%Xp06TK8NC -kF9aqKhjfICHAK*!!ZEbSVXl2PTUiMB5)E@aQEi*IED*q@hb!D9jDBQ*45f*YBR# -8Qik3!)b,MSk3!)'DYi@,bUQBZ*!!Kj4SEA"8C'PbJ'L!V*Q#I(Z!@MY38dC!4QK -qJ)1&RV@HM*qfYk#J`,bRZmDHIiZ)B%G*88Nd1PTaFhU"J)jb8'CTA&aCBRLAQ*+ -ecX,!d-LKPV#fMA#1R(CLD'4B5N8k(6CJ480XKjQ@Q*Z@U+H*IR4aI(&UKCqRT+' -i[DZNMj'GHfe[C(1!F9KMI9Nl@@C*3fjd8e+#Z*q&UCb(RiKUIC')FBLkXDA'e-H -[T+5'F(GmB%&5@NaA68*E5MC+15eMGf0rRUE!j-qIb1QULULYPjL,IE+iH(LFJda -LIcd[@dmr4PTLD(aY@@*`IA0QIjqHMC[%bkqVaEbDS+&fEC5%@@TrJ)KiJCaqF)9 -T4f9j@&KP68aKBepKBA&jBR+,Mk+HV0c1YpEL`,#jQA4kE9TVHhGLDh0DB'YG66d -f1$9&C9P8LC4rL*ZYUk+ITX$%YVhHilZbV)f(D%TB66Nl6PC'9RjbBAKaDRPL9R* -rG(Q*JiqdRALCUjk2JTqMPl@JPE16LCTdEBad8@0Z68GUFQjrGQ0XGRpR9(GZ8A1 --Fh@NYjk8SE5rVU+aYCQ3!*f*KTb5J'pIBeB[1&Fk0%0&DApmIB'9PS@*MiqFUCb -AVlZ`VELkUj0qGQTGA&PYEdTIK&K0H'C*9eaNEfYbJCUeSC5XQSqYRRTrNTD0KBq -KXDb2JRjZEh"B8Qp[9PCFEhYLBRKS5QYj5RLLDhQLQk+LT+qSV+L)QDD5Yl4jLUL -AJACUC("I-LNf5PG+-%*lE&GrGhqIIRqMRTDK[,LYeXQNYUfKUjarDAU4E&0rJf9 -cC$a!6NNe18Nl8RTTCj'VSBH4UTfAS*bU[UDD`-bcTkqZMR4bFR"QCQpZCPaKC9e -23%"%58P#9'PkK(H3!+f6QE1HUF1NSEHcYEl"ZV#NRCKiEiaQ4@C+,8j28e)j9'* -(49"BCh0XCBURQCLfd,U`cVqLVVLUS+5AM*Q,IijqFQC(4%K"2N"19NP5I)*IEj' -!D@TrIhb1MTbSTDkJUY#mQTZIQ*LKRBk-PSKRDR"A6d`m26`j490HCB1%BB@bMPT -fYUCdLE@NLDE*Z*@J[kH%R*YcMj9DAA9F9@PG4%j93e9U9P"dPhT[Ul#2TEDEJSb -VR(L'Q)Z+N!#)QUH5N!#6NSPbDeaQLQJl@AjJ5AGf@(4pCPKXMS'+TT+0X,'*P,f -MHiL5I(@CTB1&Q)*rMfYDIQ9(98p8C@TIAiQ$B)5IH@f1NB5FU*HN[+bMYTjrM*H -+EQKdDR"jB8jAGACB9&jRF'4XKS0qLj@&JTqUNAb)PSU&N!#3!*1TR(D(SC'4Mh9 -iKRK96@KUA9C5@Q&YF'GpLAq(IS#MQ)14S+DBMk'@N!#fSR'(NSLINR+%PB&SCf9 -CBe)[4eFm5fCID)18KRZJVjqFSDb`VD+GUVbaLBbIK(k%GA"dL)0GCA4A8Q4@4%j -F@8P6GhYeHAD5RhZ0[l5IUV#LU-5[NUkMHSZ9IAU0L@aXG@PI8&CE5&CA194jAPP -kFQCrJ(D+PBkEYUbM[-2$[E'bSC@DP*q6F)@%C@YF6e!q38a!1PCJ49f+G&epNAQ -%QSb4SD+SV+Ubam#JSU'PYT'+QS+'H'PL2eTM,6j518aN4db&HePfNSD"LCbkTBk -TUjkNUl#5M+qDLDDQPTHQN@*RD9TK4MjA3N"@A'*FDA0UHhGZQTpmQDfDTDQSVjf -CR)f-Q*QDSCZ9QjD(Gh"mA#jBC6T"8&KM9eKUEhb+FQ@9YCCqRVDYVV5kUC+[VBb -BMiDDNi&TAhaa6'0P38T-3P&FDf96G*5(J)kKVCb*QCqCYUk"RED9MjfHQSq-IfC -TDPP-9A"R5ePXC'f!FPTZN!#(GhL@V*+3!*U(LCL4JSH6PB9pPDQLS+HAIS9mA@4 -S5N4L8caUHP9TN!"fDBb'FSqELT'4Jj1QPifAP)HAUC+8XkD@U*L!K(&HB8dq5cS -L0NG"6@efBS5`RD1[VF5aPD@LRUfJLT@DP*!!KBH@R)KbIfp-CfT(@Pim3dG$@f* -PC''-Tj+HYmE6YD'YRTDDP)plEi+,HhU3!*@+JRPmJ'KQJQe+@fj95'GY9&*RF@4 -XMik*TUH8PULkXU@GPD5QNTLGR+LFKiD%Ff4MBe&&8N-b3dC-@&TECRPdHj@@VV# -%TpQZRmR"Tl+fSik1QTD-J@eNC99186e$9#ihB99PF'U2Lfq4U*UAS*k5M*@PPS@ -BRjb6KjHIRk'5LSb0IfefGep89Na!4eeH8f*dFRZ3!)arN!#NN!#'PB5%RBKfQDL -6MjZXYDDYYC@5SRYIG'aA9d)e6NBk8PP6@'q$GS@dVTq`TjUXUk#EKiZ9KBQ1KU' -iLAHPP9eTIQ949eBl5R&C9(*GAiKqC)1VQSDMYDHDUE@JP*''LiGYHCU>Z6FAZ -'Hh&eD%09FeT3Ch"PC(CmF(+1M)'5J(qYVjbCRkqdS(q,XTb!NSjbIiaSBR0KAPG -!8f4889jVB&9YK(aiLjkHKB@cVi1DaUk8VUL@ZEH2Mj11Kfj869eA2MSh3PP46fG -`D'jjHBQAQDDDRl#ERl'NPTqTL(LFQ)HGPi10NR*ADApN1MK+8&&EE'4YKR4ZIi' -5Rik,M)5GU)H@UC!!NjD,PjqFNT5YS)LBPiZ&D9KI6MG$8NBm6e4'DAe4C+@GG)@ -eXBbDbF'ETlUXTUZINUbREA+@GejcDde+9Nim3P*GA9&0BAU#GRbUZ*54V+'S[C+ -C`*@1T*LFQT54HRL!G'4GAeYJBdY,FApQCi"V@B#(Bh+2LB@"LCb0KTD6P*Z0Jjr -"TjUqRiLXPh&`Hfe066SRC(T,@hCABiTdAi1BIRU+K)fKRCkNRT@CT*bGVUZPRC5 -JRB*jFQaE-#p"-$G,4%pKDS')K*'T[CU*[,+)RkqDLC+@JSUEM(q0PhjpLR&hNB" -TB&Y89@*24'aU1P')IA1EZ+#9X,+KRDDfQ@KiM)@0Ji5KPhYfI)4rLBK9B)KJ6h" -eC'G[8$eTH&YMG(U2RjQEZXbYSlbAJl@THBLIMhb%I'YqL'T5@P94A8e2GR9EAR& -hEfYbJBGqFAkCTVHkTl$"YUbRU+fFLBeh9&edE9YA4dGE1$Pd9e+#B@',MSQ$SE# -*LCD*Mjq8L*'BTk++Um'8Rl*cGkaU1RCm48&E5#p@G'&@9@k&F'k-TkH,KCQMQj' -@P*!!N!"iDCbiMjZrUjZJRTL5M)"U9%!k5%T&2MYBB%4AJ(jrQ*Q-QkqUT,DhT+5 -CLT+CQ)KlQDClGD#3!'q6LdG8G8ik8Na%9Na(DRPdI)U5ND#JNUr"SD+cQBqHQ*! -!J)DJJ'4[HBb#F(plEfPEDQjJF'j66f*VDA&lK)f!FiQHRU1GN!#DUTPiSFf6HU1 -HG(5-F@Z&CNYGCepMFfTJC@PdGh"VGSKqI)&qPTH0RCU5Qk+CPE'hQjfFN!#IN!" -JDieT-%480daJ9PeRFA4mJAkEVC&iKkHJL)ZHS*!!LB'#PjL6Q*@APBq)ISL&E@Y -I2$eG@NG5@9jaH(L8XTD#TkqIPBHCUjU)K(9aT+GTGU@FJ(k)LSQ1L'KECQ4H9&0 -F8%aBCQ4RPjGlS,'FR+UhX*UBRT&mKTZ"GT@CKQYXLi"hJ'j[D9TXFfCRD9aBAPC -MGQekKS1BP)QaeV5+T,UEL*QDNk@9GSH(DA"rG'426ep6@'YPE'4@DfaPGh9cJhY -kMT'5Y-kKP-HeP+LRQkDLI'L"KfpQB@&U9$K'C@P8@A9bDAk&HSb@I)'9G@q8MS' -DRiCqREDGRVkVND'QKR1"M(jVC&9-B'G@6e038'GTA(1,L)Q3!)Z+P*QCN!#1L)D -DQjZVVVM!Y*Z*Qk&lDfpI58"28N"1A8!pAfTPCAL1R+HCQEkqTE@VJS#&GAU+I(b -DPRb)QTDIQ'ePL(0%@i&`9eCPEfGSDQb%K@jkJi'KVCZ8NTL3!(H"M(H$R(j[SD+ -)SkqNPi#&M'jLFfG#2%pB8NpFCh"aD(9pK+@PK*V*UiU[XTkSTik!MBp`FiemD(C -hDQTQEfj18f4D99KVLBaqKCfJPU#KRUfEGi19MC+@LSf0HA"XEAYfC&KGDRb0H'Z -ARQjXNBGRIj0qG)#2K)ZVP(H#KRTZGB"qIB15NBQ2SDD1KSG`EhpVB(ahAQYbFh0 -EIC4JC)9rG(bKSBkSSSbLUSppP++,H@emRC+!K(4aGeY5B&9B8d&FE&YSLk#@P+1 -MSTZS`DQ+PkbBKCQDK)&qF'CFA("[5e#"H9KbJR&qG&CQI(YYCS1FQTk6PV1RP+L -IJSL#H(jhM*&[KTYlF(Z(Kf*DH@pFCS#'AQZ3!'"'DA"RFA0UFAq1SDU`YUDCV+k -@Qj1-UTjrK*!!Q*+%FQCQ88C%2%G-2d0GC9eiL(CrQT@"L+5q[D@fcV1TXkbFQCP -fDAGcG'jdI'"JG'YF6%jR86KPEP0iKRZMX*!!LjZFR*Z+MD@0HCQ4LU18MTL)IB@ -9JAQ6JR*hI(*PKhJr8@&-3NCPF'9pJf50`U'4QU#ULiQJNjkKSE'6NEDTLBZ@Gep -aAdYKC9P*4eeN8N*AGR9SDhb,Sl@NU-1jTkkHM*5,JB4qFQq-Ti9RJBpdC@PNBQT -M9'4dB'*iHiq,9QQFLi#9Mi@IV)q1RC+RURC`MBTlIBGrJC5)Bh'4Gh*[9'Kb86p -PL@GKLRYSMD*lI+'5NCQ+NjQTXTDBT*@EQhTbNBCE@@CNDh*HA(KZ89&QIhPUF)' --Kj'RSjbIPT@HLhqFRS'%Qjf!J+QEGhP`BQP93@TY3PYhB@4eHif+IiQ-NTHPUSU -@Y*Q#M*H%GB@(IRG`IjD@Ji@0IR9kEeTGC99AANjDEi'(Fj!!S(16ZC1AU*QGRC5 --KT'6KRprF'5-QQadS)PMHheBBRTX5$p@8&CeD'q2IiDPTULRTl+SSkf6LUU9JT4 -hCAjmD@PpJ'CMG'"EKhP'9("U8&&ZHR0VJT@+Ql#UV+fRX,+GQTb1NSZ"JPpZQQT -3JAj-6R"U8PPYFfTICAU(HhD3!)K`Mjq)Nk5PTUQZPSURTBk,NReTKj!!FhQ,I'G -QCPK)8'4C4eGYE@0qSiejN!#6Kj!!PTU6MD@VR*@GVk'6SjYlGT'-HSL,H9pQF%P -%9N!i5dC%AfYfRTaqPEHpU)QIcUGhS+k)L*qPQSQ!I)56J(##Hf"ID&P%9&%h8eX -b5RekF)+DQjfkZU5m`*ZNYBCUNCGeH)0kEA12N!#$L)1#LAaF8'Yb99&B5P&SE'e -`EhD+STCrUX5ETEqNN!#AU+GqFCH0CAf4JBf0ISTlA9aIA&&)8%a)@Q9UGRZ(LB+ -8TkZSX-#fX+kYZ+@IU)"KFR9NDR4MBQTIDPp4F@**EAGM@QfFPfb$TT@9QiZGXT* -pU,Z0HTfcRReiJRThHQeaF'CfF&46DAPP@feXCA50LA5#Mi+2PSD6TCQ)PkZ,IUD -RNk+2ET1XKfq$M@YGEPFj5e9&6PC1A'eeHi+6PTDCPk5`UkDdV)f8STk2JT@8F@4 -iLhTYFQjjCdC089"15&C25RQ*H)kKPTqhXk#EZmZ2LVZ4I*Z%H)Z%F'4JEhplC'# -*M&Y8D@PKBQ*DC@CPKiGhM*ULSBbDZUbBRU@SPB5CPifCIf4lN!"qE(*kHA9ZBPP -AA9eG@djDDfTfGR+6PiZ5Mkc(TTfl`kbGTl1lThYhLAjTBfPD6@PP,cCJ5d*H@%e -QH(1)PBQHUTbJU+qaTULhXkH6KkHhMhU$HfjcBdPQHNp%B&!h5'PbBPG`MAjjPU+ -APTq3!)#IVj5,RkkAGSkVN!#%Q*CiDSUII&pfMA&069Y928CG69TVA(Z6KSb1PTf -0PCq9R+qdTU#PQUI#Rhf*LiGkA@0dF@K559)l1&T&19eB6R59NT'RXE1ZS+biTk5 -[ST58Nj!!S+'&IAY`D'ehBeT`DP*6AeP9DQYACR&PITU&JDHLKT1XXCb@UkL9M)' -*Tk@#H)U&HS&pGRGhG9j59e09@9PC@@4SDi+0HBDQLAUPUTkUZ-1eQ*bPRkqEDAb -%B'ehA@f$CePG@PG*8'4E99pSHSU*PUZBK*'JT*kCUELPMk'QPUDJHRGlB&TVC'" -YE'"EC'4GD'TNCQ*TH(k2MS5DRBD-QTQJTCbGRT16RkQILjQ3!'"ZLQaIE@TEA@4 -95daHI'Y3BR&lMB+"QC+'PjD5XEULRUqVN!#5UU58N!"mEhKkG'pVD&pG96j"6eC -LAPYRF(k8RjkHR)Z1TU5DVEQJPU5ENCQ9M)9Y@@TkEQTZDh&hDP"2A9pLBPeMD(Q -8Q*19Pj14NBk6SU5AN!#XVi+,VCL,LfYVKR*PG(ChDfTR58jQB&KHA%CDMijpNTk -0LC@HTDLXY,QRM*5TSTZFI'0fIQ9GGA"FB9*'9Ne%A'TLBQ9PKD1HPSkET*'BTE# -rS*A$XhL"T*KeDQeKB(G`B(&pGA*V8e"X@8PfDdPdPSb)R+D*MUD(HCqYSD#HT+1 --NCfFN@eUGQ9VJAehJRpG9fTJ8eK86Nj4BhL&P*HARTbJSDE%[Tf[`k5+QDLINhe -RBQ0bEeaFBfKB5PKE99eKD@K9DBZ1Qk@9MTkcXjqTblbMXkQ)IBH5JfCDC@CEDR4 -XC'GqDN0EH'eMH(4@EjfDJifPM(D1NS'+Sl@ZRULMLjf[LhU0EPGhHQKbHh4X@e4 -IA8a,B&e"@)H+JT'LQSf5QBq0V,1BUm#PQD1RXU*hERKX@eCRE&"3AdT#B&Sp8R0 -X@'b@R*bdZk@CT+5ESkZRRCZ4IS52M)L&F9pZE'&[FQGA@'"0@h*6AiY`6A'RTCD -JQjLBP*59RjU4SU'3!)Z(Lj''IAPiJ(plKi0aFA&J894@3ceDAe&IGSU*ND58NU5 -CN!#@V-'dVVZbRC1CUTKTARPe8&0jG&KD9NY95d"5A&TC9h'5PUDrX*fTXDDETlH -aUk55QCf2MB&hH&G(B@PK@eCDCfYHA@PSFS*T8A'8NSq6NT@CPSb+Q+DSPBQKUik -*Qjk9KAepF'q)J9P2C@K,3&"BA@"ECA4dG)HBNS50QSU)SV'bV+qpYDHIRD5BKRj -RChp`@eeB9P!h1%Fm39TQB&b$UU5QX+LNUU12QUZJSU@IV+1#MDU0C'ecA9j`Ef& -PF@GE@eCCAfCVBPjZM*U9R+bRQjL)L*fFMSL6R)k*PU#GMBD(IRGlIRTeF'KMAPT -8699NA%G2E(4iKBf5NCbYSk+m`UkNV+kQN!#&SU*fF)Pf@A&rA8YE9$a!88j0AQj -ZCQq-R*D6S+@6Pl+cVEUkUDDZSS0dH(KSA9P6@f0UH@p8EAj36@YMDi+!FR@CUif --Sj'%Jh1#Q*'@TD+JV*k0RD1-FQ*TE@K`HA"PEA9Q6P&XDeGBB'*cJS14QT@8LiU -BS+LGPV@dSDq[U,'SN!"hGS0K3Q4S28G80MeC@9*KH(0ZHBLNTC+GX+kERVU`QUQ -URjZ-JRq-MhKeF'KcE@GaCP06@Nj!8f9THRphKC!!PkHJMC@HN!"pLD@LSUL9R+D -+Jiq-KRTZE'jeL)TXF)0K590*5eY56f0UD)#GQSUFU)Q-UkHNUU#R`,DBP*ZCPS0 -TB&YJEfKHBPpFBee)4ejSA9THDAk)Mj@AV+qCSl+XX+fRX+@CN!#"Q+"jE'jKA'* -RC9a1A(051@"eCfYqIQafP)b!NT@+KSkSTjDXYk+MVD++JTLGIh&`CQb!G9TEAeC -956j9C'"XGA0rNjH1N!#9Nj!!LT5ER+k[SkfZVD+#N!#YK9pUG'jPE'j@AQe33%P -09f&QB@U,Ki5VT)kUU)Z5T+58RDDCT+Q8KiQKRACVD'epEeaPE@KJ6Na@8PC9@(& -XDiD4NTZVUT19YEkJPVHeR*f5JT+LM@CXK'aJF@9LD&TC@Nj'9@GB9R"lFQarPC@ -@RTZAUlURTVLfV+DGK)@BLRCZG(CKB'0THPp*Aee*5e9HEhCXEAk)Kj@HJhUBVDL -AS,qqVEQZND'IJS9mEQaC@A&eB9"GEe-p8eP4Ah&fDR'4QCDHPTQJMj5MRkU[T+U -fVC+2TU5'FhGS8@9b@8jDAPG33N0JCPjSFhPqLCbEQ,#SLD@pQjQ[RCU`TSk1NT5 -HL@GfK'48CQC09@)q-PPH5@5$DQQ,MBUAU+Q-LkkfSTUVVjqRViaiMCZ@K'jhIQ0 -SI@YJB&C83MK8@8KVKf4JLD#AN!#DNBqUTCDFTDkbVU1PRiD6UBGRFhKMBh0S@&j -L9NY%2NPGDA"N@hDHV*Q3!+1VT*qGV+qJUE+MRjk4LSfENfG3CA&E9&j34@&N0$K -TEQCcG(1&PjbBQUHVUDHBSDqEQkUBPTU#IT1CMhjVE(KSAQGD8Q4I1$9GE'&NFA+ -"PS'#U+D9QCU8QkkYSU+RV+H6KT5JPSCZERPNB@eI8e*13$G#590RCQ&fK)HNV*L -LY+HGUl@SSkbVX+q(I+'HKApR9f9K99pI4P"`@$K)@@&VD'TcJT+,PE1RPk5QTD1 -BPk5YR)kEQBH+PT0lBQGYB'CK6QGa8N4'8fGPBh0bCRD+MT+ESCH3!++[Sjkc[DH -IUk54NDLSGPebFPpJAdT-@P!r180-8fK[DA*jLTk@P+DYSTUMX,1ZVlbmU*qKQ*1 -@J@aR@P*BAP9'99a'4%T'A(0UEi0lJU#KSkZFQU#4QD@@S,5LQ+HHKjDSM(&cFQ& -CCfYG99YI8N93BeaCFAPXFBZALBZPSif(RV'GPV+aRk1TRjHQUBjpG'e[DQ&D89" -@8N)j39"MF@GJGiU4QTQATDDBQUHTTE#fU+'LNSLJTRpVF@GGC@aG5P9P@N3k3eY -fGPjMJ*1ER*QETkD4PUQHNk'ZST@HQ)b8N!#&I'4JGh&CAfKcGeY2B&P6C(*aBQC -rLSb4PTUIPBD9Sj1BUU#CSjk0ND@IK(PhF'j[DQCHAA"S4NTFAQGQCh&TGjL6K*b -`P)LNV*qLVkZITDU@Kj+5J(PiDePDD&a5A9P@@9"4BA"pIA&fN!#JQTLPST1BT*f -6QkHNQjD9PBU$MSGaCepJE@YA@h0S@'"C9'acDA@"GhQDTT18QjHANSq8PjkLQTq -PPSqEQSk%FQKVCeT5@@4L9&"C9NpCC@eaF(@(QT59VkqAQDZSR+5TR+1bSif1QTD -)GfKLAP&1@90&9@"-3&CTCQTfH(f0PjDDUV+NR+5RTTkCU+H@PT5+NCD%G(0VCfY -E8Q9M5P4I59*X@&4rLR4mPTQ9TUL0Mk5NQTQLSk@URTbRR*+3!)"cEh&cC&9JC9C -A@8T,@P4)AhabD)#BRD'NR*UVVC@6UUfXVD#MVU@6Nj9qDQ9IB&aGBP&-CQ&&8Q" -6@R"fER',QCfVT*kYSTDRUCHCUDH9NTU9MC!!L(9[F@GAB'e@5faU5e4QCf9REQa -eL)5'PTHAQ*!!PUHMP*DUXk@0KkZjM(5!IhelD@"SCQ&R@%*6Bdp4D'CYJRelMC@ -CR*!!LjbPQCbKRl+hQ*'LSSjlI(9SFQ03E(CD@fYJ@&jGAejQJRY`MTLDU*H1RjU -BRik)RUDFP*5KRSZ%JRYbFfPADhKL@QC[BeTTCPKXIQe`JB51PTLIPj'FSTb4N!# -LU)q*S*b*NT9rF(CjD@PaBPCGBeeB9eaRD'4bJB+#K)fLSj'8SDUVQTQRUU18MBk -)KiCmF'YaH@pG@@&SCeC)@QTDA'e`JBTqLjqGPCDKRjHDRjqBR+ZJMBZ*LB9fDQ0 -XIA"CB(*cC9pNAf&SA&a[HAeiH*1HNC5MS*QHSTH5TV5GLT@KQBTmER*iE9a8CA* -L8eYUE9j9B'jQAh5%JS+(QkQGQULZTjqMTCkMU*H3!*k9JAKiIQa3AR0J4%pQAeT -I@@&[F(0iISH&KT5HQC5HSk+LQTZSUD1DM)qENApiHAKXDA&T99&JC900@&aMDfK -`JB+'N!#2N!#EPj!!R+1CQ*kDRDZQNT5HNS"rJ(CaH(4UBPaSEPC09eTD8PGZFR5 -%KSLASk@CPkHKMSqHSjfCQ*L5NippHhjiF@KSEf9JCQCJ99YXB&0LER*mKBL'QE' -LPkZRP*UJPSk6P)U*MBQ"HAZ!GfjdF@CVD'4XCeeUF&YIHA9[Ji9mMCQ0P+LFN!# -GT*QATD'4M)H*N!#(G(+"J("`FfaLD(4M89pUB&aUFR+$LhL%STH2SU1BQTUFTUD -BNTL6L)CqEfY[Fh*VB'0aF@GIB'Y[Bf9dFA5*MS'0STUDS*@HTSf&N!#8Q)q$KBU -2IfYkJA"`DQ4iDeCdH&aXI'PKERCeIBCmJ*fCKjDSRj'3!*bCL)Z@Li5+MBKkGAq -#H@aaGQCDA@GTB9YFDA&XDRL(JB#6P*DRSTUNUTf6SU54N!#5M)9pJS&[ERTdB9e -UCf&XANjUFeYMER*qIS@8MT5PSCZISD+EPT+1QTq+J)L1M(CTI)0aEA9[B'CbCfC -bC&TSDQ&ZK(T`MD'9N!#FSD@NPT'CS*U+Ljk@K)f,HAf&H@TYFf9KC&eLDQ"9@'9 -PCA4eGj19KCQSS+U`SCDASTq0Nj1+NiYmK)&fH(CUCQeZCPjKCQ0I@Q"UB'9lGB1 -HL)5SVTk@RDZNMj'DNT!!N!#(LSk"GA4mIR"UGA&JCR"UC9jIDQ"8DAYaFAq+Nj5 -5QU1RS*56QjkANj+5MSq3!(ekKAeiGQTVFfPHCQPQCee@C'aRDR9pKBk,LCULQTq -NPBqGSC@-NTQ6LBH'JAPfG'aVE@GPBQ9YC@0TCQP`FRTrIikCMSUFUCU,PCH1PT' -)NC+3!*1,Ihk)Jh*fGfT[E&YQGfjGA@TZD@ehHi#3!*'#LjfFRCZ,KCDIL)'5Mif -AM)+%IiL&E(5%F&jNEh"UCPTDD@YMD(Q&L)k0MTbJRk@6KCQCK)12PBZ(N!#'HSL -*GA0kGA0ZC'T`E@PJA@&JBfPZHi"rN!#EP*UUUCb8QTZ-KiL*N!#+J)D&H(KqHA& -cFfeUD@jjEejQF'TQCfphI)Q)HiqRRjbPRT!!P*q8IiH@Li+)JhKiGRPmF'jbCfa -hFR&`D'YZCfTdGhQ"Ki5&NjLERTHAPTLFNC!!R*H5NBQ%IACjGQeYE'*KEACbB9e -XE&pNFA*kL)5#P*Z9Q++IPj@9PTH@NC1CQC5'HAYpGfeMB@KRAQG[CQYTBQPQDRe -qHi@1P*16RD+KRC+1N!#*LBq-NTZ-JSQ$JBCkE'aYD@KSCfTXBeYJDfGQH(YlKSH -&MTbNQj1BR*f8KBfGNSL0Nib!J)+$JA0bF'4SE'GH@@CR8eTUERb$HS18N!#4T+L -EQD'KPif4QjD5Mi5%JRCeIAeaC'KbF'eXDQjRA@&NCQTdJiH!KTH@P+'JQCkAKik -DNSZ4Q*@)JAq!KAp`E(&aDfY[EfjYDfGJB@0UHRYfHS#3!*b4PDDDQ*k5PC@0PTD -2N!#2K(k*KA9`F'aNC@YRB@PYBPeSDQGiJA9kMBU$PD@DPD+LPC+9Q*UBMS1(MS* -cHB&kF'GQER4XAf*YCPaHCQaeIi'$KBH8R*58QCQ9Lib8NT'4MBq3!)TrHAYqH@p -XE'TbG@KNEh*P@PjUFhCiI)''M*HHPjUNQ)H1NSL0PBf)MT1+I(k+KhPYDR"bD@G -UD@GQBf&KChKlFAU%K*'CQD+JQjU9PTL3!)Z9PB5&M(plKB4pG'peFQaYD'4SD@9 -EA'jcFB#"HBZ4MCZJQCH8QCU1MC18PSq#JSL$HRGjIAKYERGcDfjdE'*KB@0UFhK -eHSD)MTQBP*5FQib+P*H8P*!!LSf2KRekJ)&ZCR"[DA&[C@e[B'9VCA&rGA#$MiD -,PjHFRC52NT11P*U1Kif2LRpiIS9hCQKYDfTSCfPVDQ&QG(*aJSClJ*!!Nj'ARCQ -1MjD6N!#2NT5*Kj!!LhphIiKfDR&[DfpcDf"XEf&NDh&dH)@$HSU9Mj+BQC@0MC+ -3!*!!MT'CNBH,Li4rJAjfGQpSFh&MDA4UA'CTAh&rFhb+Ji5AS*H5Qjq8MBq5Nj@ -3!)f0LSQ$Hhf!GfjYDfT`E'T[D@4NCfjXEhaqHi'+NjD9QjfAP*'6NSk8PSZ'Lib -"IS4lEhGdCfacD'TaDfTZCQ9[G(ChHB+&KT'5NTZDP*58Nik1Pj@(KBq*HAarHRK -cEQeXEQjYDfPPBQK`ER"lHhZ$JBH@N!#4Q*'6PT!!NjD@PC@4M)Z%IS1"H("[E'G -[G@aLBQTSB@4RF(amH(b)N!#6QT@1RD#1LTD9N!#ANi@*NBepH)0qG("UE(&`F'e -SDh"SB@adG(TlH)'2N!#0NjQCQT@(LTf8KT'2KSq-IAk,KAGfFQpfGQjRDh*SB@T -TD@pYG(jpIi@2PT5DRC56QTQ4Mj58M)5*Khf"K(KbGA&`F'eaF@TTD@KXDQPfIAC -pKRk*SC@*QTk6P*11PCQ4KSD*K(q"HA0lG@CYGR"bG'j[EfpbE@CcK(TZH)H0MSb -*MjU@MSb0NCQ@KS55N!#%K)&iIS&[CA"jG'aYF("`D@4[HhCZH)"lJSq+LCLCN!# -1Mj1CPik+Mj!!Mif!IS9pGh9UDh9`C@PaEfPPDh*aGRalIB@)Lj59NTH@NC!!NT! -!MC!!MB@'MBPqIi+!I(4`FR4bF(&XEA4VCA"cF(PqHhk$LC'4MC5DM)D8NiL-N!# -+LBQ'Ki5#KRpeH(G[G(9[F'jTDfYSCfY`GhjlHS54PC'5PT18Pik-PT'+NBb$LSY -qHAjrFfTcGh"XE@eZEQTQCfTaHAPdI)Q0N!#5PC@3!*HFN!#)MT@ALRf&NSThH)0 -qG(0[E(9hE@P[GQeLEA0UFB"kG)#0MSU1PC15PBk-P*10LBH0M)1$J(q"I(4`FhG -cE'e[E'aTC@PbFA&rJ(+#Pib+NT+5P*54P*52NC1+LBZ&JB"qHRGhFfpcFh"VDA& -YBQT`E(9pHRf(Lif2NC58NT!!MT!!N!#0MT'+KSb*K)&pIhTdH(4bHR9TE(9eE'0 -VGA0dGhL!LSH)P*+0Nj'3!*+*Lj@-KBU+LBL!J)4rHh9cHA9[FA*ZE@jSDh4YEAY -jGRk%LSq+LC'9NSb1Nik0LiD)KSH'I(k"HRGkHA4cFR"`EQj[D@abGAKjHi''KSH -2MSZ3!*+2M*!!NSf0MBL'KB4rI(ppHACdGhPfFA"dFQj`E@efHATkIBH*LBk-Lj' -3!)f,Lj!!M)Q-LBL*KB@"IApqH(9iHA0bGR4aFR"[FR4hGhGqJB+(LBQ1NBq,MBf -0MBZ,KiQ+JiH(IB'&Hh4kI("aG@pZF@pZF(*eHRPkJ)1)LBQ3!)f0Nik,MSq1LiL -)Ki1$JhjrJAYhH(PhFR"dF@e`F'e`GA9jJ(k!LBQ*MBZ,N!#,KSb1LBH*LB5"K)1 -"I(TqHhTkG(CiGA9bF(&ZE(&hGR4mJ(k&LSH+MBb0M)U(L)q2KB''L)D#I(f%Ih9 -eHRTdEh9dER"`ER"eGRClIRZ$MSL)N!#2MT!!MiU0NSb(LBH'KB'!IRq"HR9kHhC -bG(CaG(CXF(YhH(pqIB+*LSH*MSf-M)H,N!#0L)H(KS@#Ii'$J(ajHheiGRKhFh0 -eFQpcGRGjHRZ!K)D(KiQ-LSZ+M)f+LiU*LSH&K)1!JB*mHAaiG(4dG(0bEfecH(* -dIReqJi1&LBf1LSZ0LiZ+LSZ)JS+&K)1"IRjqHRKjGhGhFh*dFR&dGRChHRaqJ)' -$LBZ(L)b-LiU*LBU'JS1&JB#&J(U"JRPjHRKjGh4aFh4bG(9eHRajHi##JiL*KBL -0LSH*LSZ*KS5%KS@"Ihq#J(PhHATiGAGdFRGeFR9eGhjpHRk#KBD'LBZ*LBZ+LBb -)KBQ)Ji1&JAq#IhPlIAGeHhGcH(GdGRPiHAjpI)#"JS@*LBL)LBZ+KiQ+KS@&KB@ -$Ji0rI)"qH(PlHRKfGh9hHAGfHRelHi##Ii+)L)D'L)b'JiZ*KBH%JiH(JS##JB& -qH(PmHA9fGR9eGA9hGRKmI(eqJB1%KSH*L)D)LBH)L)@$KSD"JB5"IAq!HhTlH(K -iGAGhGA9eH(TkHherJ)'#KBH)KiH(KiL)KBD'JS5%JS*rIi"mHhalHRKjHRThGRG -fH(PiHRYqJ(k"Ji5(KiH(KSL*KB5(K)+'Ji'#IhepIAakHATjHRKhHAPiH(KiHRe -qI(f#K)5&KSL*L)D'L)L&K)5%K)5!IS&rHhjpHAPkHRPjHRGjI(PjHharJAjqK)@ -$KBH'KSQ(KBH'KBD%Ji1%JAf!JAamI(TlHRKlHhGjH(PkHRaqIAq"J)1(Ji1)Ki5 -&KiD&KS@%K)1%Ji"rIhpmIAjjH(YmHRPjHAPkHhTlJ(pqJB'$KS@%KSD&KB@%K)@ -%JB+%JS'!IhjqIRakHRTkI(PhHhajHRTjIS"rIRq%KB5%JiD*KS5$KBD$JS+"JS0 -qIB#"IAamHhamHhTjHhYkHRPlIRjrIhq"JS+%K)5&KB@%Ji5%Ji'"JS&rIRf!IRT -mIRelHhalHhalHAYmI(eqIhq!JB'%K)5&Ji1&K)1$K)1"JS+!J(jqJ(jkI(emI(a -mI(YmI(YpI(arIhjrJ)'$JS1$Ji@&JS+&K)+#JS'"JAprIhppIAelIAplHhemIAj -mI(f"J(erJB+#JS1$JS1$JS1$Ji1"J)'#JAjrJ(pqIRepIRemIAelIAjmIAjqIhq -!Ii#$JB#$Ji+#Ji1#JS+#JB'#JApqJB"qIRjpIAjqIAapIRamI(eqIRprIi#"JB+ -#JS1#JS+#JB'#JAq"JAprJ(pqIRpqIAjqIRepIRjpIAjqIRprIhq!JB'#JS'#JB' -#JB'"JAq!JB"rIi#!IhprIRjqIRjqIRjqIReqIhjrIhprJB'"JB'"JB'"JB'"J)# -!J)#!Ii"rIhpqIhpqIRjqIhpqIRjrIhprIi#!J)#"JB#"JB#!JB#"JB#!J)"rIi# -!IhprIhprIhprIhprIhprIhprJ(q!J)#!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhp -rIhprIhprIhprIhprJ(prIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J!! -!4US!!3!"!!8!!!#J!!'!83!!!!!!&!!!!!!!!%D!9Zk,S`!!4Ri!!%Cr!$b!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!Ihp -rJ)"rJ)1#JB'!J(prL)k%H(9hIB&jGRb!J(pmI(ajG("aG(9eGACjHAKiHR0VDfj -bG(9iGh*aFAD#L)b2M)Q+MjH9MSf(IRU"N!#CQ*56PTLES+#8LSD#J)@0Nj52LSQ -,KRjkH(GhGRU$KB+%Ki0lG@eUIjUJQT5,JApkGR"SC&jGDA4fE@ahF@9KB@GXCPG -,46`l59KKBPaCA&pHAf&LC@acHS#"J)+&Lj5FT+bdZVQfZ,l"`XM6fplJiq,GeF[ -%`m1rZ+fMQC!!L)0rHA0VBeeD9e&-5%9%36Xf-c)d06Bi1cXh-5m`-M3f0M8d-c- -i3NY49eaME(*fHAYmIS+(M*'9PjUIT+LYXV@fYlHhYV5bXV+bY,HkZlblZVUkZVQ -hY,1bX+qVTk@NSk'JRjqGQTD4MSZ*Ki0rHR9`E@PQBPeC9&"+3MSd,LNQ*#-M)b3 -P*L8Q*bS[0$T!48K+6P*9@9pND@jcHB#&Lj'@QjqMTULVVV+dYVLk[,r$b-c4eGE -@eY64cFR&`EfjYV+[UU@JQjD4MBQ'Ji"pHA9bEfaTCQ4LB&pGA&YC@&KB9e958%j -,58G%3N&"38*$48G)58P*58P+5de18&0CAf9XFRKrK)U3!*@CRU+PU+b[XlDj[Er -"`X2%a-6&a-2#`F#r[VflZ,@bVkfUTk5KRTZANj!!M)L%IhTeF'aRBepE@&968%e -+4N*!2M`l16Ji1$Jj1ce!3dC)5dj499KD@eaHB'*PD'Y[FRCjHhk!K)H+MT'8PTQ -ERD#LTDLXVl5j[X2)c-r3d0(3cmc*aX+qZE1[UU@LRTUAP*'1LSD#IRTfF@eSBep -D99"-4d0"2cir2cmr2cmr2d"!3%d9(5Nj499PHBfKXF(4iHhq#KSU0N!#6PCH -BQTbHS++NTULTUkbXVDfYVDkYVDbVUkUUUUQTU+LTUDLRTD1JRCZCPj55Mif,L)D -$J(ejGA&YD'0H@PG68%a*4N4"2cmr2ciq2Mp!38*$48C(58Y06e*9@&YIC'PZG(T -rKBU2PCUGSD5RUkqbYEHiZEQkZlZm[,blZVLfY,1`VUZST+#GQTH8NBk,L)5"IAP -fFh&ZE'YTD'GQC@9QCfKSD'GRCQ9NBf&IA9YC9eG@99C@9PGA9eKC@PYFAQ"MCQK -VER&dGhYqJB5)Lik3!*+8PjQERCqKSk@RUDUXVDqbYEHjZVZlZlUiYV5aVUURSk# -FQ*53!)b)K)"mH(4[DfKNB&eC9P458%p168e06Nj16dp389089PKEAQ*PD@eaGAP -mIS#"JS+$Ji1$Ji1$K)5&KiL+Lif2N!#4NC+6PCDAQ*QDQTZFR*fHRTkHRTqIRjq -HRCbFQjUCQ*LAPC15N!#2MBZ*KS5"IhajGR*ZDQ9KA9P@8e"05dP(4N9&4NG(5%T -,68p38P9B@PeKC@PXF(0iI)'&LBk6PTUGSD5QUDZYVUq`X,#`VkkXUkQRTD1JRCU -BPT56NC!!MSf,LBL(KB5#JApqIAYkH(CdFR"[EQjYE@aXE@eYE@eYE@eXE'YVDfT -TD@KRCfGRCQCPC@9NC'0MBf0NC@CSDQa[FA4iHhk"KBL-Mj1@QCbHSD5QTkQVVUq -aXl5eYE@eY,1aX+kXUDDLRjZANiq,Ki0rHhKdF@jVD'CMB@"IAPjHAPeGA9eGA9a -FA&eGAPpJBQ0PCfPXER&cGAGjHherJB+$K)@'KSD'KSH(KiL)L)Q*LBQ+LSZ,M)b -0MSq3!*'5Nj@@PjQDQjbFR*bFR*bFQjZEQTUCPjD8NT!!MSb+Ki5#IhajGR0`E@T -RC'&HA&PA99468P&48&&489*699CB@PaIBQ9SDfjaG(GkIB#$KSL,MT!!Nj@@Q*U -FRTqJSD+MSk1LSU'JRjkFQjQBPT@6NT'3!)q1MBb+LBL)KiD&K)1#JB"rIRemHhY -kHAPiGhCeGA4cFR&`EfjYE'TSCf9NBf*KB&pIAejHAepIB'&MC'CRD@YYEh*dGhT -mIi'%KiU0N!#5PCLDRCqKT+DRU+QUUkZXUkZUUDLRTD5LRjfEQ*D6NBk-LBD%JAj -mHAGeFh&[EQeXDfTSCfCPC@9NC@9PC@9QCQCRCfKTDQYXE@j[F(*cG(9fGhKjHAT -lI(epIRq!J)'#K)@'KiL+M)f2NC+6P*@@PjLCQTUER*bFR*fGR*bEQjUCQ*H@P*1 -4N!#1M)U)KB1!IRYjGR4aEfaUD'CNBQ&JAejGA9aFA&eGAPpJB@*NC@GTDQaZF(* -dGRKkHherJB+%KBH)LSb1Mj!!NT16P*59PC@9PC@8P*58Nj15NT'4NC!!N!#3!*! -!Miq2Mik1MBf-LiQ)Ki@%Ji+!IhjmHhTjGhCeGA4cFR&`EQeXDfTTD'GQC@4NBf0 -MC'4NC@CRD'TVE@paG(CjHhf!JS@(LBZ0N!#5Nj@AQ*QEQjbFRCkHRTkHRjkHRCf -FQjQBPj@8NT'2MSb+L)D&Ji&rIAakHAKhGR9dFh0bFA&`F("`F("`F("`F("[Efp -[Efp`F("`F(&aFA*cFh4eGAChH(PkHhYmIAeqIhq!JB+%KBD)LBZ0MT!!NT19PTL -CQTZFR*fGRCbFQjUCQ*H9P*+4Mif,LSL'K)+!IRelHAGeFh&[EQaUD@GQC@4MBf* -LBQ0MC'9PCfKTDfeZF(&cG(ChH(PlI(eqIhq!JB+$K)@'KiH)LBQ*LSU+Lib-MBf -1MSk1Miq1MSk1MSk1MSk1MBf0MBf-M)b-M)Z,LSU+LBL(KB5$JB"qIAYkH(CdFR& -[EQaVDQPTD'KSD'KSD'KSD@PTDQYXE@j[F(*cGAGiHRaqJ)1&KiU-MT!!NT18PCD -AQ*LBQ*LBQ*HAPT@8Nj+4N!#3!)q1MBb,LSQ(KS@%Ji+"J(pqIRemI(YlHRTjHAP -jHAPjHAPjHAPjHAKiH(GhGhCfGA9dG(0cFR*bFR*bFR*bFR0cG(9fGhKjHRYpIRq -"JS1%KSH*LSb0MT!!NC+6P*@@PjHBQ*QCQCLBPjH@PC15NBq0M)U)KS5#J(jmHRK -hGA4bFA"[EQeXDfYUDQTUDQTVDfaYE@j[F(&bFh4fGhKkHhapIi#"JB+$Ji5%KB@ -&KBD'KS@&KB@&KB@'KSD(KiH(L)L)L)Q*LSU+LiZ,LiZ-M)b-M)b-M)b-M)Z,LSU -*L)H'KB5#JApqIAYjH(CeG(*aF'pZE@aVDQTTD@PTD@TUDfaYEQp`FR0dGRGjHRa -qIi'$KBD)LSZ-MSq3!*!!NC+6Nj16Nj16Nj+5NC!!N!#2MSf0M)Z+LBL(KS@%Ji1 -#JB'!IhpqIAemI(amHhYlHhYlHhYlHRTkHRTkHAPjH(KiGhGfGR9eGA4dG(4dFh0 -cG(4dG(9fGRGiHAPkHheqIi##Ji5'KiL+Lib0MSq3!*'5NT16P*58P*56Nj15NC! -!Mik0LiU)Ki@%JS&rIRalHRKhGR9dFh0bFR&aF("`F("`FA&aFA*bFh4dGAChH(P -kHhapIRprJ)#"JB'#JS+$Ji1$Ji1$Ji1$Ji1$Ji5%K)@&KBD'KSH(L)L)LBQ+LSU -+LSU+LSU,LiZ,LiZ+LSU*LBL(KS@%Ji+"IhjpHhTjGhCeG(0bFA"`Efp[EQjZEQp -[Eh"aFR0dGAChH(PlI(eqJ)'#K)@'KiL+Lib-MBk1Miq3!*!!N!#3!*!!Miq1MBf --LiU*LBL(KS@&K)1#JB'!J(prIhjqIRjpIAepIAamI(amI(amI(YlHhYlHhYlHRT -kHRTjHAPjH(KiGhGhGhCfGRCfGRChGhGiHATlHhapIRq"JS1%KBD(L)Q+Lib-MBk -1Miq2N!#3!*!!N!#3!)q2Mik1MBb,LiU)KiD&K)+"IhjmHhTiGhCeG(4cFR*bFA& -aFA&bFR0cG(9eGRGiH(PkHRYmI(eqIRprJ)#"JB+#JS1$Ji1$K)5%K)5%Ji1$Ji5 -%K)5%K)5%K)5%KB@&KSD'KiH)L)L*LBQ*LBQ*LBQ)L)L(KSD&K)5$JS+"J(pqIAa -lHRPiH(GfGA4dFh0bFR*aFA&aFR*bFh4eGRGiHATmIAjrJ)+$K)@(L)Q*LSZ,M)b --MBf0MBf0MBb-LiZ+LSQ)L)H'KS@%Ji+"JB"rIRjpIAamI(YlHhYlHhYlHhYmI(a -pIAepIAepIAjpIAepIAepI(amI(alHhYlHhTkHRTkHRTkHRTlHhYlI(apIAjrIi# -"JS1%KBD'KiL*LSU,M)b0MBf0MSk0MBf-M)Z+LBQ)KiD&Ji+"J(pqIAalHAKhGhC -eGA4dFh0cFR*bFR0cFh4eGAChH(PkHRYmIAjrJ)'#JS1%K)@&KSD'KSD(KiH(KiD -'KS@&KB@%K)5%K)5$Ji1$Ji+#JS+#JS+#JS+#Ji1$Ji1$Ji5%K)5%K)5%Ji1$JS+ -"JB"rIhjqIAamHhTjHAKiGhGfGR9eGA9eGA9eGRChH(KjHRYmIAjrJ)'#Ji5&KSH -)LBU+LiZ-M)f0MBf0MBf-M)b,LSU*L)H'KB5$Ji+"J(pqIAalHRTjHAPiH(KiH(K -iH(KiH(PjHATkHhYmI(apIAeqIRjrIhq!J)#!J)"rIhprIhprIhprIhprIRjqIRp -rIhprIi#!J)'"JS+$Ji5%KB@'KSH(KiL)L)L)L)L)L)L)KiH'KS@%Ji1#JB"rIRj -pI(YkHAKhGhCfGA9eG(4dG(4dGA9fGRGiHAPkHhapIRq!JB+$K)@'KSH(L)L*LBQ -*LBQ*LBQ*LBL)L)H'KS@&K)5$Ji+"JB#!IhpqIRjqIAepIAepIAepIAeqIRjqIhp -rIhq!J)#!J)#!J)#!J)"rIhprIhjqIRjpIAepIAepIAepIAepIAjqIRprJ)#!JB+ -#Ji1%K)@'KSH(KiL)LBQ*LBQ*LBQ)L)L(KiD'KB5$JS'!IhpqIAamHhTkHAKiGhG -fGRCfGRCfGRCfGhGhH(PjHRYlI(eqIRq!JB'#Ji1%K)@&KB@&KSD'KB@&KB@&KB5 -%K)1$Ji+#JS'"JB'"JB#!J)#!J)#!J)#!J)#!J)#!J)#!J)'"JB'"J)#!J)#!Ihp -rIRjqIAepI(alHhYkHRTjHAPjHAPjHATkHRYlHhamIAeqIhq!JB'#JS1%K)@'KSH -(L)L)LBQ*LBQ*L)L)L)H(KSD&K)5$JS'!J(pqIRemI(YlHRTkHAPjHAPjHAPjHRT -kHRYlI(apIAjqIhq!J)'"JS+$Ji1%K)5%K)5%K)5%K)5%Ji1$Ji+#JS+#JB'"JB' -"JB'"JB'"JB'"JB+#JS+#JS+#JS+#JS+#JS+#JS'"JB'"J)#!IhpqIRepI(amHhY -lHhTkHRTkHAPjHRTkHRYlI(apIAjqIhq!JB+#Ji5%KB@'KSD(KiH)L)L)L)L(KiH -(KSD'KB@%K)1#JS'!J(pqIRepI(alHhYkHRTkHRTkHRTkHRTlHhYlI(amIAeqIRj -rIhq!J)#!JB'"JB'"JB'#JS+"JB+"JB'"JB'"JB'"JB'"JB'"JB'"JS+#JS1$Ji1 -$K)5%K)5%K)5%K)5%Ji1$Ji+#JB'"J)"rIhjqIAamHhYkHRTjHAPjHAPiH(KiH(P -jHATkHhYmI(epIRprJ)'#JS1%K)@&KSD(KiH)L)L)L)L)L)H(KiD'KS@&K)5$Ji+ -#JB#!IhprIRjpIAemI(amI(YlHhYlHhYlHhamI(apIAepIAjqIRjqIhprIhprIhp -rIhprIhprIhprIhprIhprIhq!J)#!J)'"JB'#JS+$Ji1%K)5&KB@&KB@&KB@&KB@ -&KB5%Ji1#JS'"J)"rIRjpIAalHhTkHAPiH(KiGhGhGhGhH(KiH(PjHRTlHhapIAj -rIi#"JB+$Ji5&KBD'KiH(L)L)L)L)L)L)L)H(KiH'KS@&KB5%Ji1#JS'"J)"rIhp -qIRjqIAepIAepIAepI(amI(apIAepIAepIAepIAepIAepIAepIAepIAepIAepIAe -qIRjqIRprIi#!JB'#JS1$K)5&KB@'KSH(L)L)L)L*LBQ)L)L)L)H(KSD'KB5%Ji+ -"JB"rIhjpIAalHhTkHAPiH(KiGhGhGhKiH(KiHAPjHRTlHhamIAjqIhq!JB'#JS1 -$Ji5%KB@&KBD'KSD'KSD'KSD&KB@%K)5%Ji1$JS+#JS'"JB#!J)#!IhprIhprIhp -rIRjqIRjqIAepIAepIAamI(alHhYlHhYlHhTkHRTkHRTkHhYlHhamI(epIAjqIi# -!JB'#Ji1%K)@'KSH(KiL)L)Q*LBQ*LBQ*L)L)KiH'KS@%K)1$JS'!J(pqIAemI(Y -kHRPjH(KiGhGhGhGhGhGhH(KiHAPjHRTlHhamIAjqIhq!J)'"JS+$Ji1%K)5%KB@ -&KB@&KB@&KB@&KB@&KB5%K)5%K)5%K)1$Ji1$Ji+#JS+#JS+#JB'"JB#!IhprIRj -qIAepI(alHhYkHRTjHAPjHAPiH(KiHAPjHATkHRYlI(apIAjqIi#!JB+#Ji5%KBD -'KiH)L)L*LBQ*LBQ*LBQ*L)L)KiD'KB@%Ji1#JB'!IhjqIAamHhYkHRPjHAKiH(K -iH(KiH(KjHAPjHRTlHhYmI(epIRjrIi#!JB'#JS+$Ji1%K)5%KB@&KB@&KB@&KB@ -&KB@&KB@&KB@&KB5%K)5%K)1$Ji1#JS+"JB'"J)"rIhpqIRjpIAamHhYlHRTkHAP -jHAPiH(KiH(KiH(PjHATkHRYlI(apIRjrJ)#"JS+$K)5&KBD(KiL)LBQ*LBU+LSU -+LSQ*LBQ)L)H(KS@&K)1$JS'"J(pqIRemI(YkHRTjHAKiH(KiGhGhH(KiH(KjHAP -jHRTkHhYmI(epIAjqIhq!J)#"JB+#JS1$Ji1%K)5%K)@&KB@&KB@&KB@&KB@&KB@ -&KB@&KB@%K)5%Ji1#JS+"JB#!IhpqIRepI(alHhTkHAPjH(KiH(GhGhGhGhGhGhG -iH(KjHATkHhYmIAeqIi#"JB+$K)5&KSD(KiL)LBQ*LSU+LSU+LSU*LBQ*L)L(KSD -&K)5$JS+"J(prIRepI(YlHRTjHAPiH(KiH(KiH(KiH(KiH(PjHATkHRYlHhamI(e -pIRjrIhq!J)'"JS+$Ji1%K)5&KBD'KSD(KiH(KiL)L)L)L)L)L)L(KiH(KSD'KB@ -%K)1$JS+"J)"rIhjpIAalHhTkHAPiH(GhGhCfGRCfGRCfGRCfGhGiH(PjHRYlI(e -pIRq!JB'#Ji5&KBD(KiL*LBU+LSU,LiZ,LSU+LSU*LBL)KiH'KB@%Ji1#JB#!Ihj -qIAamHhYkHRPjHAKiH(KhGhGhGhGhGhGiH(KiHAPjHRTkHhYmI(apIAjqIhq!J)' -"JS+$Ji5%KB@&KSD(KiH(L)L)L)L)LBQ*L)L)L)L(KiH'KS@&K)5$Ji+"J)"rIRe -pI(YlHRPjH(GhGRCeGA9dG(4dG(4dG(9eGACfGhGiHATkHhapIRq!JB+#Ji5&KSH -(L)Q*LSU,Lib-M)b-M)b-LiZ,LSU*L)L(KSD&K)1$JS'!J(pqIAemHhYkHAPiH(K -hGhCfGRCfGRCfGRCfGRGhGhGiH(PjHRTlHhamIAeqIRq!J)'"JS1$K)5&KBD'KiH -)L)Q*LBQ+LSU+LSU+LSU+LSU*LBQ)L)H'KS@%Ji1#JB"rIRepI(YkHAPiGhCfGA4 -dFh0cFh*bFR*cFh0cG(4eGAChH(KjHRYmIAjrJ)'#Ji5&KSH(L)Q+LSZ-M)b0MBf -0MBf0MBf-M)Z,LSU*L)H(KS@%K)1#JB"rIRjpI(YlHRPjH(KhGhCfGR9eGA9eGA9 -eGA9eGACfGRGhH(KjHATkHhamIAjqIi#"JB+$K)5&KSH(L)Q*LSU,Lib-M)b0MBf -0MBf0M)b-LiZ+LBQ)KiD&K)5$JS'!IhjpI(YkHAKhGR9eG(0cFR*bFA&aFA&aFA& -bFR0cG(9eGRGiHATlI(eqIi#"JS1%KBD(L)Q+LiZ-MBf1MSk1MSk1MSk1MBf0M)Z -,LSQ)L)H'KB5$JS'!IhjpI(YkHRPiGhGfGA9dG(4cFh*bFR*bFR*bFR0cFh4dG(9 -fGRGiH(PkHhapIAjrJ)'#Ji5&KSH)LBU+Lib-MBf1MSk2Miq2Miq2MSk0MBb-LiU -*L)H'KB5$JS&rIRemHhPiGhCeG(0bFA&`F'p[EQjZEQjZEQp[Eh"aFR*cG(9fGhK -jHhapIS#"JS5&KSH*LSZ-MBf1Mj!!N!#4NC+5NT+5NC'4N!#3!)q2MSf-LiU*L)H -'KB5$JB"rIRemHhTjH(GfGA4cFh*aFA"`F("[Efp[Eh"`F(&aFR*cG(4eGRGiHAT -lI(erJ)'#Ji@'KiL*LSZ-MBk2N!#4NC+5NT16Nj16Nj+5NC'3!)q2MSf,LSQ)Ki@ -%JS&rIRelHRKhGR9cFR&`EfjZE@aXDfYVDfYVDfaXE@eZEh"aFR0dGAGiHAYmIAq -!JS1&KSL*LSb0MSq3!*'5NT18P*58PC@9P*58Nj+5NC!!Mik0M)Z+L)H'K)1#J(p -pI(YjH(GfGA0bFA"[EfjYE@aXDfYVDfYVDfYXE'eYEQp[F(&bG(9fGhPkI(erJ)+ -$KBD)LBU-MBq3!*'5Nj59PCD@PjHAPjHAPTD9PC56NT'2MSf,LSL'KB1"J(jmHRP -hGR4cFA"[EQeXDfTTD'KSCfGRCfKSD@PUDfYYEQp`FA0dGRGjHhaqJ)'$K)D)LBZ --MBq3!*'5Nj59PTDAPjHAQ*HAPjD@PC@8Nj+4Mik0LiU*Ki@%JS&rIAakHAGfGA0 -bFA"ZE@eXDfTUD@PSD'KSD'KSD@PUDQYXE@j[F(*cG(ChHAYmIS#"Ji@(L)U-MBq -3!*+6P*DAQ*LCQTUDQjZEQTUDQCLAPT@8Nj'2MSb+L)H&Ji&rIAYjGhCdFR&[EQa -VDQPSCfCQC@9PC'4PC@9QCQGSD@TVE@j[FA0dGRKjHherJ)+%KSH*Lib1N!#4NT5 -9PTHBQCQDQjZEQjZEQTUCQ*LAPT56NT!!Mif,LSL'K)1"IhelHAKfG(0aF'pYE'Y -UD@KRCQCPC@9PC@9PC@CRCfKTDQYXEQpaFR4fGhPlIAq"Ji@'L)U-MT!!NC19PTH -CQTZFR*fGRCkGRCfFR*ZDQCL@PC15N!#1M)U)KS5#J(jlHAKfG(*`EfeXDQPSCfC -PC@4NC'0MBf4NC@9QCfKTDQYXEQpaFR4fGhPlIAq!JS5'L)Q,MBk3!*+6P*DAQ*Q -CQTZEQjZEQjZEQTUCQ*H@P*15N!#1MBZ*Ki@$JAppHhTiGR4cF@pZE'YUD@KRCQ9 -NC'4MBf0MBf4NC@CQCfPUDfaZF(&cGACiHRaqJ)+%KSL+M)k3!*+6PCHBQCUER*f -GRTkHRTfGR*bEQTQBPT@6NC!!MSb+L)D%JAppHhPhGA4bF'pYE'YTD'GRCQ9PC'4 -NC'4NC@9QCQGSD@TVE@j[FA0dGRGjHheqJ)+%KBH*Lif1N!#4Nj5@PjLCQTZER*b -FR*bFR*ZEQTQBPjD8Nj'3!)k-LSQ(KB1"IhelHAGeFh*`EfeXDfPSCfGQC@9NC'4 -NC'4PC@CQCfKTDQaYEh"bFh9hHAYpIS##K)D)LSb1N!#4Nj5@PjQDQjZFRCfGRCf -GR*bEQTQBPjD8Nj'2MBZ+L)D%JS"qI(TiGR4bF@pZE@YUD@KRCfCQC@9PC@9PCQC -RCfKTDQYXE@p`FR0eGRKjHherJ)+%KBH*LSb1Mj'5Nj@@PjLCQCUDQTZEQjUDQCQ -BPjD9P*+4N!#1M)Z*Ki@$JAppHhPiGR4cF@pZE@YUD@KSCfCQC@9PC@9QCQCRD'P -TDQaYER"aFR4fGhPlI(k!JS1&KiQ+M)k2NC+8PCDAQ*QDQTZEQjZEQTUCQCLAPT5 -6NT!!MSf,LBH&K)+!IRakH(GeFh*aEfjYE'YUD@PSD'GRCfGRCfGSD'PUDfaYEQp -`FA0dGAGiHRYpIS##Ji@'L)U,MBk3!*'5P*@@PTHBQ*QCQCQCQCLBPjD9P*15NBq -1M)Z*Ki@%JS"qI(YjGhCdFh&`EfeXDfTUD@KSCfGRCfGRCfKSD@TVE'eZEh"bFh9 -fH(PlIAk!JS1&KiL+M)f1N!#4NT59PTDAQ*LBQCQCQ*LAPjD9P*15NC!!MSf-LSL -(KB1#J(jpHhTiGh9dFh&`EfjYE@aVDfTUDQTUDQTUDQYVE'eZEh"aFR0dGAGiHAY -mIRq!JS1&KSL*Lib1Mj!!NC+6P*@@PjHAQ*LBQ*HAPTD9P*15NC!!Mif-LSL(KB1 -"J(jmHhPhGR4cFR"[EQeXE'YUDQPTD@PTD@PUDQYVE'eZEh"aFR4eGRKjHhaqIi' -$K)D(LBU,MBk2NC+6P*59PTDAPjHAPjD@PT@8P*15NBq1MBZ+L)H&K)+!IhelHRP -hGR4cFR&`EfjYE@aXDfYVDQTUDfYVDfaXE@j[F(&bFh4eGRGjHRYpIRq"JS5&KSL -*LSb0MSq3!*'5Nj58PC@@PTD@PT@9P*56NT'3!)q1MBZ+LBH'K)+"IhemHRKhGR4 -cFR"[EQeYE'YVDQTUDQPUDQTUDfaXE@j[F(&bFh9fGhPkHheqJ)'$K)D(L)U,M)k -2N!#4NT16P*@9PCD@PTD9PC58Nj+5NC!!Mif-LiQ)Ki@$JS"rIAakHAKfGA4cFR& -`EfpZE@eYE'aXE'aXE'eYEQj[F("aFR0dGACiHATlI(jrJ)+$K)D(L)U,M)f1Mj! -!NC+5Nj18P*@9PC@8P*56Nj+4N!#2MSf-LiQ)KS@$JS&rIRalHAKhGA4cFR&`Efj -ZE@eXE'aXE'aXE'eYEQj[F("aFR0eGRGiHAYmIAk!JB+%KBD)LBU,M)f1Mj!!NC+ -6Nj18P*58P*58Nj15NC'3!)q1MBb+LBL'KB5#JApqIAYkH(GfGA4cFR&`EfpZEQe -YE@eYE@eYE@jZEfp`FA&bFh4eGRGjHRYmIAq!JB1%KBD)LBU,M)f1Mj!!NC'5NT1 -6Nj58Nj16Nj+5NC!!Mik0M)Z+LBL'KB1#JApqI(YkH(GfGA4cFR&`EfpZEQeYE@e -XE@eYE@jZEfp`FA*cG(9fGhKjHRapIRq"JS1%KSH)LBU,M)f1Miq3!*'4NT+5NT1 -6NT+5NT'4N!#2Mik0M)Z+LBH'KB1#JApqIAYkHAKfGA4cFR&aF'p[EQjYE@eYE@e -YE@jZEfp`FA&bFh4eGRGiHRYmIAk!JB+$KBD(L)Q+M)f1Miq3!*'4NT+6Nj16Nj1 -6Nj+5NC!!N!#2MSf-LSQ)KS@%JS'!IRelHRPhGR9dFh*aF("[EfjZE@eYE@eYE@j -ZEfp`F(&bFh4eGRGiHATlIAjrJ)'#K)@'KiL*LSZ-MBk2Mj!!NC'4NT+5NT+5NT+ -4NC!!N!#2MSf-LiU*L)H'KB1#JApqIAalHAKhGR9dFh0bFA&`F'p[EfpZEQp[Efp -`F(&aFR0cG(9fGhKjHRYmIAq!JB+$K)D(L)Q+Lib0MSq2N!#4NC+5NT+5NT+5NT' -4N!#2Mik0M)Z+LBL'KB5#JB"qIAalHAKhGR9dFh*aFA"`EfpZEQjZEQjZEfp`F(& -aFR0dG(9fGhKjHRYmIRq!JB+$K)@'KiL*LSZ-MBk1Miq3!*!!NC'4NC'4NC'3!*! -!Miq1MBb-LiU*KiD&K)1"J(pqIAYkHAKhGR9dFh*bFA&`F'p[Efp[Efp[Eh"`FA& -bFR0dG(9fGhKjHRYmIAjrJB+$K)@'KiL*LSZ-MBk1Mj!!N!#4NC'4NC'4NC!!N!# -3!)q1MSf-LiU*L)H'K)1#JB"qIAalHRPiGhCeG(0bFR&aF("`Efp[Efp`F("`FA& -bFh0dGACfGhKjHRYmIAjrJ)'#K)@'KiL*LSU,M)f0MSq2N!#3!*!!N!#4NC'3!*! -!N!#3!)q2MSf0M)Z+LBL(KS@%Ji'!IhjpHhTjH(GfGA4dFh*aFA"`F("[Efp[F(" -`F(&aFR0cG(9fGhGiHATlIAjrJ)'#Ji5&KSH)LBU,M)f1MSq2N!#3!*!!NC'4NC' -3!*!!N!#2Mik0MBb,LSQ)KiD&Ji+"J(ppI(YkHAKhGR9dG(0bFR&aFA"`F("`F(" -aFA&bFR0cG(9eGRGiHATlI(eqIi#"JS1%KBD'KiL*LSZ-M)f0MSk2Miq2Miq2Miq -2MSk1MBb-LiU*L)H'KB5$JS'!IhjpHhTjH(GhGR9dFh0bFR&aFA"`F("`F(&aFA* -bFh0dGA9fGhKjHRYlIAjrJ)'#Ji5&KSH)LBQ+Lib0MBk1Miq2Mj!!N!#3!)q2Miq -1MSf-M)Z+LBL(KS@%Ji+"J(jpI(YkHAKhGR9eG(0cFR*aFA&aFA"`FA&aFA*bFR0 -dG(9fGRGiHATlI(eqIi#"JS1%K)@'KiL*LSZ,M)b0MBk1MSq2Miq2Mik1MSf0M)b -,LSQ)KiD&K)1#JB"rIRemHhTjH(GfGA4dFh*bFR&aFA&`F(&aFA&aFR*cG(4eGRC -hH(PkHhapIRq!JB+$K)@'KiH)LBU,Lib0MBk1MSq2Miq2Miq1MSk0MBb-LiU*L)L -(KS@%JS'!IhjpI(YkHAKhGRCeG(4cFh*bFR&aFA&aFA*bFR0cG(4eGAChGhKjHRY -mIAjqIi#"JS1%KBD(L)Q+LSZ-M)f1MSk2Miq2Miq2Miq1MSf0M)Z,LSQ)KiD&K)1 -#JB"qIAalHRPiGhGfGA4dFh*bFR&aFA&aFA&aFR*bFh0dGA9fGhKiHATlI(eqIi# -"JS1%K)@'KiL*LSU,M)b0MBk1MSk2Miq1MSk1MBf-M)Z+LSQ)KiD&K)1#JB"rIRe -mHhTjH(GfGR9dG(0cFR*bFR*aFA&bFR*bFh0dG(9eGRGhH(PkHhamIAjrJ)'#Ji5 -&KSH(L)Q+LSZ-M)f0MBk1MSk1MSk0MBf-M)Z,LSQ)L)H'KB5$JS'!IhjpI(YkHAK -hGhCeGA4cFh0bFR*bFR*bFR*cFh0dG(9eGRGhH(PkHhamIAjrJ)'#Ji5%KBD(L)L -*LSU,Lib-M)f0MBf0MBf0M)b-LiZ+LSQ)KiH'KB5$JS'!IhjqIAalHRPiH(GfGR9 -eG(4dFh0cFh0cFh0dG(4eGACfGhGiHAPkHhamIAjrJ)'"JS1%KB@'KiL)LBU+LiZ --M)b-M)f0MBf-M)b-LiZ+LSQ)L)H'KB5$Ji+"J(pqIAalHRTjH(GhGRCeGA4dG(4 -dFh4dG(4dG(9eGRChGhKjHATlHhapIRprJ)'#JS1%KB@'KiH)LBQ+LSU,LiZ,Lib --M)Z,LiZ+LSU*LBL(KiD&KB5$JS+"J(pqIAemHhTkHAKiGhGfGR9eGA9eG(4eGA9 -eGA9fGRGhH(KjHATlHhapIAjrJ)#"JS1$K)@'KSH(L)L*LBU+LSZ,LiZ,LiZ,LSU -+LBQ*L)L(KSD&K)5$JS'"J(pqIAemHhYkHAPiH(GhGRCfGA9eGA9eGA9eGRCfGhG -iH(PjHRTlI(apIRjrJ)#"JS1$K)@&KSD(KiL)L)Q*LBQ*LSU+LBQ*LBQ*L)L(KiD -'KB@%K)1#JS'!J(pqIRemI(YkHRPjH(KhGhGfGRCfGRCfGRCfGRGhGhKiH(PjHRT -lI(apIAjrIi#"JB+$Ji5%KB@'KSH(L)L)LBQ*LBQ*LBQ*LBQ*L)L)KiH'KS@&K)1 -$JS'"J(prIRemI(YlHRTjHAKiGhGhGhCfGRCfGRGhGhGiH(KjHATkHhYmI(epIRp -rJ)'"JS+$K)5&KBD'KiH(L)L)L)Q*LBQ*LBL)L)L)KiH(KSD&KB5%Ji1#JS'!J(p -rIRjpI(alHhYkHRPjHAKiH(KiH(KiH(KiH(KjHAPkHRYlHhamIAeqIRq!J)'"JS+ -$Ji5%KB@'KSD(KiH(L)L)L)L)L)L)KiH(KiD'KS@&K)5$Ji+#JB'!J(prIRepI(a -lHhYkHRPjHAPiH(KiH(KiH(KiHAPjHATkHRYlI(apIAjqIhq!J)'#JS1$K)5&KB@ -'KSD(KiH(KiH)L)H(KiH(KiD'KS@&KB5%Ji1#JS'"J)"rIhjpIAamHhYlHRTkHAP -jH(KiH(KiH(KiH(KjHAPjHRTkHhYmI(epIRjrIi#!JB'#JS1$K)5&KBD'KSH(KiH -(KiH(KiH(KiH(KSD'KB@&K)5$Ji+#JB'!J(pqIRepI(alHhYkHRPjHAPiH(KiH(K -iH(KiH(PjHAPkHRYlHhamIAeqIRprJ)#"JB+#Ji1%K)@&KSD'KiH(KiH)L)L)L)L -(KiH(KiD'KS@&K)5$Ji+#JB'!J(pqIRepI(alHhYkHRPjHAPiH(KiH(KiH(KiH(K -jHAPkHRTlHhamIAeqIRprJ)#"JB+$Ji5%KB@&KSD(KiH(L)L)L)L)L)L)L)L(KiH -'KSD&KB5%Ji1#JS'"J)"rIRjpIAamHhYlHRTjHAPiH(KiH(KiH(KiH(KjHAPkHRT -lHhamIAeqIRprJ)#"JB+#Ji1%K)5&KBD'KSH(KiH(KiH)KiH(KiH(KiD'KSD&KB5 -%K)1$JS+"JB#!IhpqIRepI(alHhYkHRTjHAPjH(KiH(KiH(KjHAPjHATkHhYlI(a -pIAjqIhq!J)'"JS+$Ji5%KB@&KSD'KiH(KiH)L)L)L)H(KiH(KSD'KB@%K)5$Ji+ -"JB#!IhpqIAemI(YlHhTkHAPjH(KiH(KiH(KiH(KiH(PjHATkHRYlI(apIAjqIhq -!J)'"JS+$Ji5%KB@&KSD'KSH(KiH(KiH(KiH(KiD'KSD&KB5%K)1$JS+"JB#!Ihp -qIRepI(alHhYkHRTjHAPjH(KiH(KiH(KiHAPjHATkHRYlI(amIAeqIRprJ)#"JB+ -#Ji1%K)@&KBD'KSD(KiH(KiH(KiH(KiD'KSD&KB5%K)1$JS+"JB#!IhpqIRepI(a -mHhYkHRTkHAPjHAPjHAPjHAPjHAPkHRTlHhYmI(epIAjqIhq!J)'"JS+$Ji5%KB@ -&KSD'KiH(KiH(KiH(KiH(KiH'KSD&KB@%K)1$JS+"JB#!IhpqIRepI(amHhYkHRT -kHAPjHAPjHAPjHAPjHAPkHRTlHhYmI(apIAjqIhq!J)'"JS+$Ji5%KB@&KSD'KiH -(KiH(L)L(KiH(KiH'KSD'KB@%K)1$JS+"JB#!IhpqIRepI(alHhYkHRTjHAPjHAP -iH(KiHAPjHAPkHRTkHhYlI(apIAjqIhq!J)'"JS+$Ji5%K)@&KSD'KSH(KiH(KiH -(KiH(KSD'KS@&KB5%Ji1$JS+"JB"rIhjqIAepI(alHhTkHRPjHAPjH(KiH(KiH(K -jHAPjHATkHRYlI(amIAeqIRprJ)#"JB+#Ji1%K)@&KBD'KSH(KiH(KiH(KiH(KiD -'KSD&KB@%K)1$JS+"JB#!IhpqIAepI(alHhTkHRPjHAPjHAKiH(KiH(PjHAPjHRT -kHhYmI(apIAjqIhq!J)'"JS+$Ji1%K)@&KBD'KSD(KiH(KiH(KiH(KSD'KS@&KB5 -%K)1$JS+"JB#!IhpqIRepIAamHhYlHRTkHAPjHAPjHAPjHAPjHATkHRTlHhYmI(a -pIAjqIhq!J)'"JS+$Ji5%K)@&KBD'KSH(KiH(KiH(KiH(KiD'KSD&KB5%K)1$JS+ -"JB#!IhpqIRepIAamHhYlHRTkHRTjHAPjHAPjHAPjHRTkHRYlHhYmI(epIAjqIhq -!J)'"JS+$Ji1%K)@&KBD'KSD'KiH(KiH(KiH'KSD'KB@&KB5%Ji1#JS'"JB#!Ihp -qIRepIAamHhYlHhTkHRTkHAPjHAPjHAPkHRTkHRYlHhamI(epIAjqIhq!J)'"JB+ -#Ji1%K)5&KB@'KSD'KSD(KiH'KSD'KSD'KB@&K)5%Ji1#JS'"J)"rIhjqIAepI(a -lHhYkHRTkHAPjHAPjHAPjHAPjHATkHRTlHhYmI(apIAjqIhprJ)#"JB+#Ji1$K)5 -%KB@&KSD'KSD'KSD'KSD'KSD'KB@&K)5%Ji1$JS+"JB#!IhpqIRepIAamHhYlHRT -kHRPjHAPjHAPjHAPjHAPjHRTkHhYlI(amIAeqIRprJ)#"JB+#JS1$K)5%KB@&KSD -'KSD'KSH(KiD'KSD'KSD&KB@%K)5$Ji+#JB'!J)"rIhjqIAemI(alHhYkHRTkHRT -jHAPjHAPjHRTkHRTlHhYlI(apIAeqIRprJ)#!JB'#JS1$Ji5%KB@&KBD'KSD'KSD -'KSD'KSD'KS@&KB@%K)5$Ji+#JB'"J)"rIhjqIRepI(amHhYlHhTkHRTkHRTkHRT -kHRTkHRYlHhYmI(apIAeqIRprJ)#!JB'#JS1$Ji5%K)@&KB@'KSD'KSD'KSD'KSD -'KB@&KB5%K)1$Ji+#JB'"J)"rIhjqIRepIAamI(YlHhTkHRTkHRTkHRTkHRTkHRT -lHhYlI(amIAepIRjrIi#!J)'"JS+#Ji1%K)5%KB@&KB@'KSD'KSD'KB@&KB@&K)5 -%Ji1$JS+"JB'!J(prIhjqIAepI(amHhYlHhTkHRTkHRTkHRTkHRTkHRTlHhYmI(a -pIAeqIRjrIi#!JB'"JS+#Ji1%K)5%KB@&KB@&KBD'KS@&KB@&KB@%K)5%Ji1$JS+ -"JB'!J(prIhjqIRepIAamI(YlHhYlHRTkHRTkHRTkHRTkHhYlHhYmI(apIAeqIRj -rIi#!J)'"JB+#Ji1$K)5%K)@&KB@&KB@&KB@&KB@&KB@%K)5%Ji1$JS+#JB'!J)" -rIhpqIRjpIAemI(amHhYlHhYlHRTkHRTkHhYlHhYlI(amI(epIAjqIRprIi#!JB' -"JS+$Ji1%K)5%KB@&KB@&KB@'KSD&KB@&KB@&K)5%K)1$Ji+#JS'"J)#!IhpqIRj -pIAemI(amHhYlHhYkHRTkHRTkHRYlHhYlHhamI(apIAeqIRjrIhq!J)'"JB+#JS1 -$Ji5%K)5&KB@&KB@&KB@&KB@&KB@&K)5%K)1$Ji+#JS'"JB#!IhprIRjpIAepI(a -mHhYlHhYlHRTkHRTkHRYlHhYlHhYmI(apIAepIRjqIhq!J)#"JB'#JS+$Ji1$K)5 -%K)5&KB@&KB@&KB@&KB5%K)5%Ji1$Ji+#JS'"JB#!IhprIRjqIAepI(amI(YlHhY -lHRTkHRTkHRTkHRTlHhYlHhamI(epIAjqIRprIi#!JB'"JS+$Ji1$K)5%K)@&KB@ -&KB@&KB@&KB@&K)5%K)1$Ji+#JS'"JB#!IhprIRjqIAepI(amHhYlHhYlHRTkHRT -kHRTkHhYlHhYmI(amI(epIAjqIhprJ)#!JB'#JS+$Ji1$K)5%K)@&KB@&KB@&KB@ -&KB@&KB@%K)5%Ji1$JS+#JB'!J)"rIhpqIRepIAemI(amHhYlHhYlHhTkHRTlHhY -lHhYlI(amI(epIAjqIRprIi#!JB'"JS+#Ji1$K)5%K)@&KB@&KB@&KB@&KB@&KB@ -%K)5%Ji1$JS+#JB'"J)#!IhprIRjpIAepI(amI(YlHhYlHhYlHhYlHhYlHhYmI(a -mI(epIAjqIRjrIhq!J)#"JB+#JS+$Ji1%K)5%K)5&KB@&KB@&KB@&KB@%K)5%Ji1 -$Ji+#JS'"J)#!IhprIRjqIAepI(amHhYlHhYlHRTkHRTkHRTkHhYlHhYmI(amIAe -pIRjqIhq!J)#"JB'#JS+$Ji1%K)5%KB@&KB@&KB@&KB@&KB@%K)5%Ji1$Ji+#JS' -"J)#!IhprIRjpIAemI(amHhYlHhTkHRTkHRTkHRTkHRYlHhYlI(amIAepIRjqIhp -rJ)#!JB'"JS+#Ji1$Ji5%K)5&KB@&KB@&KB@&KB@&K)5%K)5$Ji1#JS+"JB'!J(p -rIhjqIRepIAamI(alHhYlHhYlHRTkHRTkHhYlHhYlI(amI(epIAjqIRprIi#!J)' -"JS+#Ji1$Ji5%K)5%KB@&KB@&KB@&KB@&KB5%K)5%Ji1$JS+#JB'"J)#!IhpqIRj -pIAepI(amI(YlHhYlHhYlHhYlHhYlHhYmI(amIAepIAjqIRprIi#!J)'"JB+#JS1 -$Ji5%K)5%KB@&KB@&KB@&KB@&KB5%K)5%Ji1$JS+#JB'"J)#!IhprIRjqIAepI(a -mI(alHhYlHhYlHhYlHhYlHhYmI(amI(epIAjqIRjrIi#!J)'"JB+#JS+$Ji1%K)5 -%K)@&KB@&KB@&KB@%K)5%K)5$Ji1$JS+#JB'"J)#!IhprIRjqIAepIAamI(alHhY -lHhYlHhYlHhYlHhYlI(amI(apIAepIRjqIhprJ)#!JB'"JS+#JS1$Ji1%K)5%K)5 -%K)@&K)5%K)5%K)5%Ji1$Ji+#JS'"JB#!IhprIRjqIAepI(amI(YlHhYlHhYkHRT -kHhYlHhYlHhYmI(amIAepIRjqIhprJ)#!JB'"JS+#JS1$Ji1%K)5%K)@&KB@&KB@ -&KB5%K)5%K)1$Ji1#JS+"JB'!J)"rIhjqIRepIAemI(amHhYlHhYlHhYlHhYlHhY -lHhYmI(amIAepIAjqIRprIi#!J)'"JB+#JS1$Ji1%K)5%K)@&KB@&KB@&KB@&K)5 -%K)5%Ji1$Ji+#JS'"JB#!IhprIRjqIAepIAamI(amHhYlHhYlHhYlHhYlHhamI(a -mIAepIAjqIRprIi#!J)'"JB+#JS1$Ji1%K)5%K)5&KB@&KB@&KB@&K)5%K)5$Ji1 -$JS+#JB'"J)#!IhprIRjqIAepIAamI(alHhYlHhYlHhYlHhYlHhamI(amI(epIAe -qIRjrIhq!J)#"JB'#JS+$Ji1$K)5%K)5%KB@&KB@&KB@&KB5%K)5%K)1$Ji+#JS' -"JB#!J(prIRjqIAepI(amI(YlHhYlHhYkHRTkHhYlHhYlHhYmI(amI(epIAjqIRp -rIhq!J)#"JB'#JS+$Ji1$K)5%K)5%KB@&KB@&KB@&K)5%K)5%Ji1$JS+#JB'"J)# -!IhpqIRjpIAemI(amHhYlHhYlHRTkHRTkHRTlHhYlHhYmI(amIAepIRjqIhprJ)# -!JB'"JS+#Ji1$Ji5%K)5%KB@&KB@&KB@&KB@&K)5%K)5$Ji1#JS+"JB'!J(prIhj -qIRepIAamI(alHhYlHhYlHhYlHhYlHhYlHhYmI(amIAepIAjqIRprIi#!J)'"JB+ -#JS1$Ji5%K)5%KB@&KB@&KB@&KB@&KB@&K)5%K)1$Ji+#JS'"JB#!IhprIRjqIAe -pI(amHhYlHhYlHhTkHRTkHRYlHhYlHhamI(apIAeqIRjrIhq!J)#"JB'#JS+$Ji1 -%K)5%KB@&KB@&KB@&KB@&KB@&KB@&K)5%K)1$Ji+#JB'"J)"rIhpqIRepIAamI(a -lHhYlHhTkHRTkHRTkHRTlHhYlHhamI(epIAeqIRjrIhq!J)'"JB+#JS1$Ji1%K)5 -%K)@&KB@&KB@&KB@&KB@%K)5%K)1$Ji+#JS'"J)#!IhpqIRjpIAemI(alHhYlHhY -kHRTkHRTkHRTkHhYlHhYmI(amIAepIAjqIRprIi#!JB'"JS+#JS1$Ji5%K)5%KB@ -&KB@&KB@&KB@&K)5%K)5$Ji1#JS+"JB'!J(prIhjqIRepIAamI(YlHhYlHRTkHRT -kHRTkHRYlHhYlHhamI(apIAeqIRjrIhq!J)#"JB'#JS+$Ji1$K)5%K)@&KB@&KB@ -&KB@&KB@&K)5%K)5$Ji1#JS+"JB'!J(prIhjqIRepIAamI(alHhYlHhYlHhYlHhY -lHhYlHhYmI(amIAepIAjqIRprJ)#!JB'"JS+#Ji1$Ji5%K)5&KB@&KB@&KB@&KB@ -&KB@&K)5%K)1$Ji+#JS'"JB#!IhprIRjqIAepI(amI(YlHhYlHhYlHhYlHhYlHhY -lI(amI(apIAeqIRjrIhq!J)#"JB'#JS+$Ji1$K)5%K)5&KB@&KB@&KB@&KB@&KB5 -%K)5$Ji1$JS+#JB'!J)"rIhpqIRjpIAemI(amHhYlHhYlHhYlHhYlHhYlHhYlI(a -mI(epIAeqIRjrIhq!J)#"JB'#JS+#Ji1$Ji5%K)5%KB@&KB@&KB@&K)5%K)5%Ji1 -$Ji+#JS'"JB#!IhprIRjqIAepI(amI(YlHhYlHhYlHRTkHRYlHhYlHhYmI(amIAe -pIAjqIRprIi#!J)'"JB+#JS+$Ji1$K)5%K)5%KB@&KB@&KB5%K)5%K)1$Ji1#JS+ -"JB'!J)"rIhpqIRjpIAemI(amHhYlHhYlHhYlHhYlHhYlHhYlI(amI(apIAeqIRj -rIhprJ)#!JB'"JS+#Ji1$Ji5%K)5%K)@&KB@&KB@&KB5%K)5%K)1$Ji1#JS+"JB' -!J)"rIhpqIRjpIAepI(amI(alHhYlHhYlHhYlHhYlI(amI(apIAepIRjqIRprIi# -!J)'"JB'#JS+$Ji1$Ji5%K)5%K)@&KB@&KB@%K)5%K)5%Ji1$Ji+#JS'"JB#!J(p -rIhjqIRjpIAepI(amI(amI(YlHhYlHhYmI(amI(amI(epIAeqIRjqIhprJ)#!J)' -"JB+#JS+$Ji1$Ji5%K)5%K)5%K)5%K)5%K)5%K)5$Ji1$JS+#JB'"J)#!IhprIRj -qIAepIAamI(amI(YlHhYlHhYlHhYlHhamI(amI(epIAeqIRjqIhprJ)#!J)'"JB' -#JS+#Ji1$Ji1%K)5%K)5%K)5%K)5%K)5$Ji1$Ji+#JS'"JB'!J)"rIhpqIRjqIAe -pIAamI(amI(YlHhYlHhYlHhYlI(amI(amIAepIAeqIRjqIhprJ)#!J)'"JB'#JS+ -#Ji1$Ji1%K)5%K)5%K)5%K)5%K)1$Ji1$JS+#JS'"JB'!J)"rIhpqIRjqIAepIAa -mI(amI(amI(amI(amI(amI(amI(epIAepIRjqIRprIhq!J)#"JB'"JS+#JS+$Ji1 -$Ji1$K)5%K)5%K)5%Ji1$Ji1$Ji+#JS+#JB'"JB#!J(prIhpqIRjqIRepIAepIAe -pI(amI(amI(amI(epIAepIAepIRjqIRjrIhprJ)#!J)'"JB'#JS+#JS1$Ji1$Ji1 -%K)5%K)5%K)5%Ji1$Ji1$Ji+#JS+"JB'!J)#!IhprIhjqIRjpIAepIAemI(amI(a -mI(amI(amI(epIAepIAjqIRjqIhprIi#!J)#"JB'"JB+#JS+#Ji1$Ji1$Ji1$Ji1 -$Ji1$Ji1$Ji1#JS+#JS'"JB'"J)#!J(prIhpqIRjqIRepIAepIAepIAepIAamIAe -pIAepIAepIAepIRjqIRjqIhprIi#!J)#!JB'"JB'#JS+#JS+#Ji1$Ji1$Ji1$Ji1 -$Ji1#JS+#JS+"JB'"JB#!J)"rIhprIRjqIRjpIAepIAepIAamI(amI(amI(apIAe -pIAepIAjqIRjqIRprIhprJ)#!J)#"JB'"JB+#JS+#JS+$Ji1$Ji1$Ji1$Ji1$Ji+ -#JS+#JS+"JB'"JB#!J)"rIhprIhjqIRjqIRepIAepIAepIAepIAepIAepIAepIAe -pIRjqIRjqIhprIhq!J)#!J)'"JB'"JS+#JS+#JS1$Ji1$Ji1$Ji1$Ji1$Ji1#JS+ -#JS+"JB'"JB#!J)#!IhprIhpqIRjqIRjqIAepIAepIAepIAepIAepIAeqIRjqIRj -qIhprIhprJ)#!J)#!JB'"JB'"JS+#JS+#JS+$Ji1$Ji1$Ji1$Ji1$JS+#JS+#JS+ -"JB'"JB#!J)#!IhprIhpqIRjqIRjqIAepIAepIAepIAepIAepIAepIAjqIRjqIRj -rIhprIhq!J)#!JB'"JB'"JS+#JS+#JS+$Ji1$Ji1$Ji1$JS+#JS+#JS+"JB'"JB# -!J)#!IhprIhpqIRjqIRjpIAepIAepIAepIAepIAepIAepIAeqIRjqIRjqIRprIhp -rIi#!J)#!JB'"JB'"JB+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JB'"JB'"J)#!J)" -rIhprIhpqIRjqIRjqIAepIAepIAepIAepIAepIAepIAepIRjqIRjqIRprIhprIi# -!J)#!JB'"JB'"JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JB'"JB'"J)#!J)#!Ihp -rIhprIRjqIRjqIRjqIRjqIAepIAepIAepIAjqIRjqIRjqIRjrIhprIhprJ)#!J)# -!JB'"JB'"JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS'"JB'"JB#!J)#!J)"rIhp -rIhprIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIhprIhprIhq!J)#!J)#!JB' -"JB'"JB'#JS+#JS+#JS+#JS+#JS+#JS+#JS'"JB'"JB'"J)#!J)#!J(prIhprIhp -rIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIhprIhprIhprJ)#!J)#!J)'"JB' -"JB'"JS+#JS+#JS+#JS+#JS+#JB'"JB'"JB'"J)#!J)#!J)"rIhprIhprIhjqIRj -qIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRprIhprIhq!J)#!J)#!J)'"JB'"JB' -"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'!J)#!J)#!J)"rIhprIhprIhprIRjqIRj -qIRjqIRjqIRjqIRjqIRjqIRjqIRprIhprIhprIi#!J)#!J)#!JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB'"JB'"JB'"JB'!J)#!J)#!J)#!IhprIhprIhprIhprIRjqIRj -qIRjqIRjqIRjqIRprIhprIhprIhprIi#!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB'"JB'"JB'"J)#!J)#!J)#!J)"rIhprIhprIhprIhprIhpqIRj -qIRjqIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB#!J)#!J)#!J)"rIhprIhprIhprIhprIhprIRjqIRjqIRjqIRj -qIRjrIhprIhprIhprIhprJ)#!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'"JB#!J)#!J)#!J)#!J(prIhprIhprIhprIhjqIRjqIRjqIRjqIRjqIRjqIRj -qIRprIhprIhprIhprIi#!J)#!J)#!J)#!JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhjqIRjqIRjqIRjqIRprIhp -rIhprIhprIhprIi#!J)#!J)#!J)#!J)'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIi#!J)#!J)#!J)#!J)'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"J)#!J)#!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprJ)#!J)#!J)#!J)#!J)#!J)'"JB'"JB'"JB'"JB'"JB'"JB'"JB'!J)#!J)# -!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!JB'"JB'"JB'"JB#"J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!IhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!!!"&3!!"!!%!"3!!!+!!!B"4!!!!!!!8!!!!!!! -!44C@lSZM!!"&&!!!448!2)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!IhprIhprIhprIRTjHRTlHRCfH(*ZEfYSFR9eKBeeAeP28'CeHiU4J(CdCQ&L9PT -fJAZ#J@TME@P[LBaiEfePCh"ZGib,K)Q!E@KI6&Z"M)kGPS"kEPYJEh"eK)@%LRY -TG(piJ*!!KRaqEPeYJ)#*P)q1LR*KD'GPIC+3!*LMMAChDeeVIAk*NB*lJAYdIAj -mNC9lG(PRAhZ,LjZBI(L!F@*NDhf9QC5HPA4QC@"aLiChK)alGhplJ)U(KSq+Hh4 -UB(@0LBqHMA*[Df0cKS'(QTUAP(eSE@jRHSf'KBThES1*IBH@M)D'GR"jFQYrMj+ -FPRPZG'GLHif4S+',KBTiCQGUGiD%J)k4Hh4rJSZFNRYlHfCLFhf'NBU,QT!!G'P -MA(#1P*qcS(TcG@YbHQYVK)U&M)KrL)KqMU+6IhTQ@A5)JBqNPi5!HhGhDQ@"Qk# -YVj*qH@*BHSjpHi4mISk,KT'0JSU1KBKqB'&hHB@VVBPiF@*RHReqLj'EUjprG'e -FB'pdJTH5GA1*PCU@K(CiI(q'HfG[Hi1JVSPTG(GPFSZ+Lj+2NCZBL(GK@h"kH*+ -LK('!KSLIRhPYIRjjHhPlI(4mQk52JQj*8i'-MUZVJ(5(JAGkDePNHBL9PiCiD9q -'ZUk'FQ*CES4pJ*++J)k8LheM69ChNUUiRB"lF'GqMACPFAL"QCQ#HAClNk#AN!" -m8NGUJSQBNR0aKRj`GQjDBRbBX+k6H@KJFik$FhjkBh1FRB@#JRk0PSYmCP4CDhZ -AVTKeF@TIF(jXCS'4MjkQNRjU9Q&qMC',EQ1'PiUBT)CcKBf"IQp,5(@KXk@+I(" -@9(H)ISQ6Ii#BNhYaD&eUJSZ-IfKSHAq1TTerHhTPCRPZ@fZ(PD'MLh4J8Q1!MCb -TPRk*NAYfJ("RHS*kHAGUCfplPkL5IAGJ6f9lFAD4NBfHQAeXBeYNJTZLPi5$L(G -YK)afG)9pGB&lF(k1N!#9Q)q!CNY6DQaiQTq-MC&mEA*VC(Z@TDUGLiCqGiD9MBf -8JR5%Lhf%R*U4PBTdC9G19@*dMj0lGRKG6@0XCRbEQC@GNAjfEQplHhU"GepRI(Q -)VDb9PC&eDQaHARU-Q+@NQ)9N8fH!LD5rUSb2KQeXG'KRJjL5GeP6@epeRVDZT)j -@-d&$3@U9RD+cXU#+E&TKF)fVUTL9L'PdQCL+MB4bFR*F699QJCfZ[Dpa2d"*6R@ -JSCZMNRKlJQjIG*UiZU'0H&G@GibFX+"`BA"N9fYlHB5AQije@%G%8)'aTSf+G90 -AE'9QJBf-QD@HMAk!QV#f[DjmA&e9@)+DIh+'LA9QA&KJEB@NXDZJI8Y*DQjLGSK -rKTqNT+kRQ*kVVCYf@9YF@RUGPBQ+GQ*fMRpbJ)H!K)PrDPGBCfa`K)PZDAY`DSq -SQ*!!Rjb3!*53!)"`C@q"I'pZBdpHJSf9V+D(L*Q0FfKPB&jLFiD)KiKmHjZaSCZ -RPRU!M(YUCPT19@KeEQ&ZLBf5XVfCKT')I)H$Be0EB@PrNTL3!)'*T,#[VTPmJj0 -qDh&P5%CGD'GUE("eHj!!SjkBP(PGC(4N9@0SD)5PX,'iZ+qVVE1aQSZ,Ih*lH9j -@BPP4Di*pGAf+QDHTS)a[APP)3PCF5daPFA@(KR"YIif6Q*b@KA0cJB0qIR4UHC' -2M+HeV,2#ZTjqC&&*6f&dHAf,KhZ0S**qK)Q#ND'9I@aNB@*UFfjA6f9bFiZNUVM -!U)k@Q(09@'PfJBZ4M)5(P*+3!+#HI@jhE&06A9*1@&TEBfTN@@&qQk+MVkD"E'j -VEB'+J)qh`lDYUDQSVXACe,qXM'KYHf04BfYC@'YS99*EFBUGTj&H1$!Y+6jB@9a -`I(f&M(YMFTQcZVDUMA"XIBfDTTjqGj+HNj!!R+'P[Y6)TAeB1cG9Fh9TE(CZEiD -0IRb*P+'aThT65%a39fq$G9eIGBHEXl'RZFQpU*f'B9&PKCZLST9c@fU!KBqNRSZ -4NhPH6$NZ2PPNBPeC8deEJ*LCR*k2JBb0FQ9ZF(')V,QcV+kf[ml@`UDJSjZHXl# -0HRKSA'CX@%KAF)L@NS"F3e4XDPeA35Ne8f4dM*@,LU#eVjCrIBDAXlULK@j00e1 -$P*bZYl[$aE56HA"`F("jFeK1A'PlT,LFJSH0M)k#E'C[HS1&GQ"(-6PBEhk2P*5 -Xcp'qY+5&DfTeHA9cG(D%TVkXNj19LS5)IQjZEQPaJB*N1bJ[394VJSk8QBprHA9 -K6&4[L*bKPSZ&M*@GV,ZmVU+PT*qNTk+LUkQ0EP8r0dCQLkc$al+5IA9P5M`k3&K -bH'PJC'4MES@CRjD'ISZNUSppLBjiC&Y@9f&[LERLk0#YQT&h9e"HCfTeIiD9N@j -9C)#3!*D9Li5#JB&mHi4lA%C5B9aGF)@K`pE4[kCr9%*0CRU0TV+[YEZUMiH)JSQ -GS*D8PiapISf1E6iS,$%j499iTm#hVUU,@cFZ2@'(QCQ9P*1)ISkYY+fe`m5kUSk -"P+HKMAjV45N`8h+&Q+5CMBTf8$Xk0MpRKS*cDQCPFBZLUkqhYk'@S*U%IB@(KB4 -b8dC-ARZVi2(6VCL*F'"KAf"cJ(eqKRC44f1(SUbRNh9MDACqLBprEhb"C%3p4&9 -qX0,JelD*D@CfJB1*PTQARTZ$EfppP,I3`*PkEQpkLT'#E@&9363j1$*,H*HNTjC -U3$4$B)'DSjU5PjD%FR5!MUh5hp6!UC10RDbNMATV@8K-Ah#%R+baXk4i5$!Y190 -bJhpcD@"@9f9cHikSYVQjVjH1Qk5KRjb'Be*GFBQQa-frY+Q0E9e869f"P*!!LAj -P58CFFAZ"KB&pK)GeD'eZB9TE8d9#4e9qZ0hFbELKJ@0FC@4UKCq[[lqIH("mJSL -9SD#ANC'@QjH$CPKB5c-U,M0(GU1j[E#0BNK(694QIik5QU'6I(ChH)QU[EUeX+# -8Q++GLhe`A8e0@'&fRll$a,fED8Y!0ceCFhYjHR9J6&"LFAk9TUU`XCU%LTUBMif -"C8j-@@Q$U-6-bmQaKfpR8dPII)+"Jh&869eNA@0jJRPjLBPiGAelHB1!D&C86e" -[RVUq[EURLhYdDQf'S+Ha`V+&D'T[Ehq5PBk-MB9pJB"XB'KS6MSm1MPDL*bHSja -k9da+4%9HI)Q9UDU5IhKZEj+eYUqj[+@4PTb6LSGiA&"A8NCBISq@V,D@DP!l+64 -FGA9mM)ThFRelFi+IVVI'[TQ'NjqKUlDVMRajFh'#Q*bJZXDRIQ4&)LG5EhH$LRG -B68`q-N&CB'H!LR*EAf4LG)k"@dBr0$aNMk'[bpE&XkZ@GAQK[FVHjX5@K)*mJ*@ -KQjUMQ(edHR&JD(ac8M`S#!)S8QZ(TU@(F@TD5P4bKC'UZ*jlF@eNFjkkYl#YRSU -(N!#2MTLHLfeD4LBF0eYeNUDCG9a21c*'CR9lLj+$EQ9I@@kBXE1eXTQ#KjkZZmV -)VjD+H&a5Ci'@Y-l#QA9E3N"GGAPiI(CM9P923NKJE@ebFeP!5&TQHjDCIQ4@4M) -a4PpfP+k`Sj@!C@@1YF,*d-1TQ)q&KC@PTD+XX*YrHAjqKjH5FeFp'`SL5fKiLjL -6JQpG58GGGi5@UCprDfTXGSkLTU5STjH(L)b(L*56Hf*,+K8P49efN!#9K(0ZD@" -GD(4lK*!!Mi0pHh4lQl5aU+HJNj5LVV5iYkL4Ih&E599hNUM#bE+5H@"5A'PRAf" -PANe%4NG+A(4lH(*K5NPHFAf)MApQ8N-d-%&II*l#d,qRQBYpKk#VVE'bV+Q[XUD -FSkkRPj1-GfpjJ)'+Lh*53$%K)cYCEhb,NSU#Ih4NDS'(J)D0JR4dGRH"M)k*KBZ -5Mj+KTCL6P)"I56BN+%0FDA4rHQPKC@GG@QK`GB@8MiH,MifCVlHVRjZFRkZj[,D -cVjZ!G@Y@6f@#Nk+VRSZ!H'aPD@aPAQ&QBPYFA&CFE("SD@YJ@QCiJB&qG@GE98j -'5Q*hJjHYVTb1L)+&NCLFTV+cUkLbYUqXXV5TSCU+JSZ3!)f2PBGS6d%p2N98C'e -fIha`EQjJ@@b"KBH*JRPpKSfCTkbPRD#QRC!!NTQ6MBk%E9a32MG+BQKPCQPM8NT -06%Y8A&eTJ)4lLD1[Y,r%[V5SR*QKVV@ZUV1cR)D#HR1"PCkSYDk8JAYeE'GTE'T -XGhGXDR*aEhq,HQGK9dP+A@abG(4YBPYG9NK4DR4iLTH1KBD&JBQ8P*!!PU'NRk' -YXkqd[V@NQiPbG)L3!*!!PTU0H@KD6dP-9epVJBq'IS+#H(Z(K(eqHhCkKj@IUE' -dUCH3!)q'K*!!Q*LDPAaM@P&!1dGBAf&PDfeUD@CF@@"B5%T68&4YM++f`EkeV+1 -GR+HlamE*d-HaST@)LTQIRD'PRT@6PjZ8KRPYA9&*2cY,@f0cKiCeDQ4IB'CUE'a -YE@056eC@@'apJ)L3!)Z'MC14NC52K(elIAk#NkH`Ym#mVDLQQ*1HSjZ8MAp`Cf0 -NDA&qJAGdIAjjJBq3!*!!P)TiEQPKAh#,RkLUVDbKPj@4Mj@8Ki#"G@&FB@9QBea -86%G)6P4MFhCaF@T94NG+8'9pMTqZX+UQTUUVUUqiYDfUT*QFTD1JU+QGNSq2N!# -5PTbHPB9b@NY-68pKGRPcGA9XBea@99TKBepFA9pFB'aaEQeVAeeSF(*rNTbKSk# -CMi@%MCZ[`F1q`m1`T+DMPSq2M)Z*I@pVFheqFfGJ8d9)99jXIi@(N!#1H@9F@&P -MGBZFSD+PTD5ST*D4Q*@,Lib$HhCZE'eL6MSb1NP5A(+!I(CbBP*268TAGC!!S+U -aYE5[Vl+aVl+bVVE"[,Dl[,1YTjU+J(b!LjDJTU1ENRYI9&K46&PTER*bDfGSCQ* -NDA"[B9GFB9jIBPeGBea5A'a[F)#ATkfTSTf@NT5CSl5lX+UeYkbQTDDUVDLFNSK -pFfpfIhY[DfGF@@&QEi16PC@@L'jA69*IEAf,Mj+CR*UNXl1ZY,DSPB4aC'*MC'9 -N@d`l18K@B(+'LB0rFPT-5djDGT'FQC@8NT!!PUHeZm'rXUZXT*16SDHPSjf6M)Q -1QUUl`V@IN!"m@8!p3846C@aYEQKH@f0YF@p`FQTE8e06@&pE@@&P@%pBCh@(QkU -[TT1$IB14Q*UQYlQaVkqSSk5MT+QPNRTVD'TVERGlFfTM9e"@A'9qR+LINS&ZB&T -IEAk1QCQ@QTk9N!#DSk@TUCb*I(9`FRPmG@GD88Br3dj@CRk+K(PQ5$-f4&0PHiZ -5PCQFQCLJUDbbYkZAMiZ#JSqGTUQNQBk-NCUMVlfpUjQ,FeY489KTI)&jF'PJ@&G -LF(GfGA"RCQ4E@'9`E@PSAP06@QL!RDk[TCH)H'ehLTDP[FV(`EDJNjQMSk'KQSC -aD@TXEhZ&JAGY9d!k3NTCGT!!Q*1*HQYNC@YbJ*1AL(q"IACqMjfXZE5KPT+*IRk -*NBKhCP-r06Fq8'epGfjVA88k3P0TJ*1FQT5,IRH#NTHEUE+YUULJQCfQUDLJMRC -PCA5&PDZp[E+SPATTAe02A@aVB&G04%&*@'0UFA"PBQKQA@CmKS"iE&Y04dP@F)f -IR*@APSKrKj5LYm5qYV+PN!#+PD'RUDUMNAphFh*lKS&dE@*+1Mj,@R+1SUQQQB0 -UB'9YFi'4NSH#IhKiIi1)PCqEN!#)KiU3!*fZXUD4H9j069"6CAk0MSKmCdp"4&& -PHB@#HRGdEA'%NjZQVkZHNSL#KT1HSCb8KhCYHBqKXmI3cmQjQi"bE'PaJ)L"EeY -04N9,8&GNFA"RD'YTD("hHhacB903@'4cLkHfYE'TQ)4iFhH+T+qZV+LGNBk8R+# -MS*@*Ih4RBfa`D'*J98C!4%jJHC!!Rk5KNhaTCQY[HBU6NT!!M)"dGRf$MTqXUU# -EQjZGT+5CMB&YA&PIBff"PCZ@L'e11$!b2&"RF@pZEfKMDR0mLTbNRCH8N!#2QDQ -dXkUINB0qK)ZCVm$$a-'YMhGUBf*VGhYhF'CD8eTMC@PeHA"SCf4KD("aFhCaBPC -CC(&rNk@TTTk2Hh0dGAL+RkDQTD#CP*+5P*UIQ)GrJS"jISb2L(pbB&436%jHH)b -4MiTrE&eC@&YTHAq$M)q)KSk9Qk+RSTD1M)f5S+fZU+5CJh&YDQ9UH)+)Li&T8de -38PKUI(aeGACbFRGiHiQAPBZ,Miq3!*URVl#TQiZ&KS@%N!#QXV5fXk@5Jh9[GiH -0LB5#HfeQDQeVD'KMAf"I@9YRFACjH@pE58*%6&jcJBQ6QT@3!*'2KiQ@SULVUU5 -HR+'QU+LMPSU-Nj'-M)U&JAKS9dj*3dKEG)+$JAjiFh*aERH)N!#4Q*k@Ki5,NC@ -@NSZ(L)U)MCQEMi4qF&j66%0'@@efHhppG'p`FR"ZFhCcG(TjGRZ#KSqFRjL8Nj! -!LiZ4Q*H9NiTrHhYdF(f3!*fSXV1USCQ3!)k8QCD-KiL#GQjSB@"RE@jeHh&PC'T -VCf&C6d8r2Mp'@@YfKjfST*qCM(ppJiU8RD'LT+QYUkUZXDbUVDUHPSk$HhKaBe9 -04Mir5eaZJ*+DQjQ5JA0cGR*bIB@$JS+#JiU6QCfRX+kNS+#BMSQ$GfaL8dG)8Pe -PF(arGfjQA&069eGIFAajGhk"JSL6Qk#LRjL8PjZCPTUFNiU)K(erLjLT[-M'Zkk -HLAKbF@eSDfjTC'9PBfPbGhU!JReiHRjrIAPcD@&E8NP+9Q"VIC!!Q*@1JR9[Eh0 -jKT@HS+1UVkbUUkbVUkDCN!#1LS&mIhjdD@4JA&eRFAU*P*++Ki&cD@aaG(KmI(P -jH(9fJT+9NTHJSU#KRjQBQC+)JAKQ9P0DBfYeI(K[D&e24dT08&pcI(f!K)D,PCZ -DQ*H5LSH+LB+#MT@9P*'*JS5,PDDh[EH[UCq1J(PiGhKmHRCbE'*KEAGeFh9cE'9 -MCQehJ)"lHA0H5NG3@QChKik4M(jcG(b"K)fESCqJSTqGSkUYXV+PNBD"HA"`GRC -`E'TMAf4UEAH+PjQDQSjqGACjI)"rHA0aEQPVGi1,NjU@MBL%IS#,NSf&J(9QA9Y -E@f&[IB+%IQeIB@TZFAPqHA*ZE'pkKBQ,Mj11JAPeFA5%PCbHQSq%JSD,NTkVXl5 -cX+DBMib+LSZ&GfeSAeKHDh&aF'jVCQ*IA@&YHAalGQG33d0*9'4dJ)Z5Mi9pIB+ -<1AMS0lG(4qLT'ARjq8LB4rHhPlJSZ4NBChF'p[GiQDS+#GPSf'K)+%LBb)JAa -iF@KTGB')Mj+0LB4pH(f)LiH#IA0Q@9*6@fKdHAYlGQPKBf4MBQ&F@&9489PRGAf -$MC10JhpqJ)QASDZeYDQGPj@@Qk1XXE+cXDbUVDZNS*b2I@pK9P4EC@aaFQaL@PK -B@fCeHR4ZCPC'2ce%@'jlJSL+KRjkHRepIS"rI(YjG(L(NT@BR*U4KhjjI)1)Lj+ -EQialGA9bFhf(MC5DR+'TUk5FPik!FfeYE@aaH(q(Mib'K)&lGhGiGh9`D'*G@PT -FBQeeGhf&JRKaDf4KBQ*NDQjXDfphI(jrJB*rIhppJ)Z5PCbMRT+(JS+(MC5FTV# -hZVUlZ+ZJR*H1KRjeFhKpIAYlGfeK@P9158pCAPpG8N8q2$a'@@PbI)L2NBk*K)" -rKBU+LSU%Ii50N!#5QCfDPT!!LSH,NC+3!*'5LhYXC'&MEAL#N!#ISCZCQC@0LBQ -*KAplHRf#KSH*MSb"G@pSBQ&NCfYYD@"B8e059&jXGi'(KS&rI(9bGRPhFh&`FRG -qK)L1PCL5LS4qIBL8Q*ZLSCL2LSD&KSL0NjfNSCZFSkHPT++BMSGrHRTpI(KkIRY -[B9P88&4GC'PXCPK389"08&PMERGjGhKmJ)'"L)b)Ji1#J)@-N!#9RU@QT*qAN!# -0NCHCQCZDNSZ(IhGiI(YkIi+#JiL-MSf+KAjfF'PMC@jcGS#)Ki&qHRGiHhalJ)D -$H'pVCepHBfGXFR4aFAGhFA"dGRCdG(0aFhGlJBZ3!)U"J)"qJBf@R+1VV+LJPSZ -$JB+"J)1+MC+CQjH9NiTrHR9XC@CYGAYrJAafGA9cFRGhFR0dE@&B88Y)5e&BAf9 -SD'ahIRajJ)5$KBH&KSf6PTZKSTfAP*@@Q*fHRD#PSTZAMAPTC'4NCQeeI)1+M)L -$Ih9VDQeUCQP`G(f,Nj15N!#+Ji'"J(apK)@"IRGR9Nj,6&KVG(CkJ)"mHRTjH(K -pJ)@,Li5$Lik+L)U)KB@+NCUKT+'GQ)jlD'&LBfk#NjbLSTD1Mif%I(b!JS+'M)k -1MSb+MT'&FfTTD'TeHhK`CPK+3$Ne0d*5BQeiK)D$K)L,NCLCPTQIS*kJTDDLS+1 -KPSU$Ii12PT55N!#$E@"GA@"RF(Z$L)L#HRCdEfjjJS1#KBL0PjfGR*ZAM)"mIS' -#KSZ,KRaS88C%3802B'aeI)"rHhGdFhGrKSQ1PCD6Q++PSTf8L(ehGRU$MC@BQ*H -2J(9bFR0kKSk9QjU4MBk0LBH)M)f,LSU0P*H5Mj'2JACfHAPjHhThF@9A5dC$2MT -"6eTKD'jcHB'$KBk@Q*DAR++SVE+cVUHHP)f,L)@*P*UDQ*'$FfCHA'"SF(CpK)Q -)KiZ,KS1%JhpqJ)1-PTZFR*bCMi@"IhYkJ)5%JRPQ8dP"1ce*9f*SDfaXDfTUERU -+NC'8Pj@4NTDCRTkCNSf*K)#$M*@DR*b6KAP[CfPdJ)L6R*bANiq-LBH)M*!!Nj5 -3!)f3!*'1MT16Li9rH(4cFR9kI(9R@&"+36T!69GIC@KXFR9eGhq(LBL*Mj5@QCZ -HSkLMPj!!M)5!KT@NUkZNQj+(H@aQDQpcHB#%JAprJBD-M)H$JB#"KSf9QjqKRC1 -(IRCdHS@0P*D0I'TH9P&49f&YGAKhG(*[D@CUEQaRCQT`Ghq*PCkGNSH!HR9bHSf -JV,1dVkLGN!#(LBq6Nj@BQCH6NC+8PT@3!)Z*KAaiISH2PCD3!)GlEQ9NDR"cGAP -jEQ0G@945@@0ZGhakHAYlH(ChHAPkI(jrJiU3!*LLTjq4KhjiHS13!*ZMTUDPSTb -3!)*mIS'$LC!!NT+5NT+8NiU!HhYlHhk&MC1AQTH1JR9TCQadHAk$JATeF@YNAf" -QF(PlGh0cFh&bG(0[DfTSCfY`GAf'M)Q!Gh&VDR1"MTUNU+LSSjU9PCQGSD@RTk@ -LRjfHS*k9MBGrHRTrKSq8NSPrFf4A899FB@G[GA9`D&pC9eKGC@jcFh0fHhq#Ji* -rHhCbFhZ'M*'@Pj+*IR0ZF(9rM*QMTkDLR*5-LSf3!*5APjDCR*fFQjQ6Li@#JS+ -&M*+@QC5+J(GYC'9YGAk%L)U*JhKYCQ4QCQCTDQPTER*eH(GcF'eTC@9UFRZ%MC! -!LAedDfCTF(Q(QUHXVl'ZUD1LTUZ[XE#ZUkQPSD'LR*11LiL&KBD-P*D3!)GqG@T -G999FC'pjIi&pEep@8e*48eTLCfPYGRarI(GeGhGbFRKrKSf9Qjb9KhKaEQpfJT+ -KU+LQSjb@NBf0P*QCQ*UDPT'0LBH&K)1$JB'$L*'BPBb$GQGJBQPcIiQ0MBQ!F@& -B9ePFB@KUDQKQCQY[EQYVE'YQBQ&REhQ&LiU#G@CE@PpTHSqHTDHRTD+HR+#SX,5 -bVUfVTU+LSk#BMSD%K)5)NCZKSCL+H'"*2N06ChKrIRYbC9P66de18PaSEQjVDQe -hIi5'Ki&iFh9pL*+AQCD0J(*PB@9ZHikITD+FPC!!MSf0P*kNTkLQSjkBPCD9MiG -qGA&dHS@6QCD0JhGVB9YFChL(NT@4KhCM@&C@9ePGB'4SDh"hIApqI(TfEQGQDh@ -$N!#9NiYkD9jEA@4aJBqDRTfCPC1@Qk'VXDqVUDQTUUUTTTq9LB"iFh0jKTDDNB0 -`@dY(6&GQFRTqIRGVA9"+58e9B'GSCQ4QEhPqIAYjG(&bGi'1Q*fHQT!!IfTD9Pa -QGB54QTkFPj58NT'9R++QTUDQTkQXV+DHNi4iGA4dH(k"J(YaD'*JB@4VFhk%JRa -eE@PTDQKQC&pHBfGVFRU$L)H#IRKZDQjjLTUHQ)k!EPj88PGMF(b(Mj+4MBZ1NTD -DRU#IRk#PVVDjYl5ZS)YiF("fIBD0MBGkDPjFA&aLEA9jHA9ZCPa99&GGBQ9NC'C -RDh@!KBD%IhYlI(k'NTfLSCb5JQpLB'C`I)D0Nj@5M)Q)L)U-NTZJSD+NU+bXUD@ -KPS9jG(0fHi'&L)4kEf9IAf&SG(q#IA9YCQ*HA'"SE@eYEh*fH(b%LiZ'IR4XDQa -fL*LHR*@+IR*RB'&PDR0lJB1"IAb#LT'DRjqISD+QV,+eYE+USC5)Ji5)N!#DRjf -8JfpL@eTHC@jeH(0YCep96Ne4@&jIAQ"ND'piJ)@'J(KcEfpaHBHCTkZPQSTlF'T -UFhb!JiH)Ki5$KBZ4PjfJS*kEQ*ZPV+fUST@&H(&bHB'(MBk+J(*L@PYJD(4pIRT -`C9pHAPjKCQPTCQ4REA0pLC!!NijrF@YVF(f2RD5LQ)f$GfaPBQC`H(YlHhKdGRk -)NjQBPTHCQjqQVV5fXUZIMi&mISQDTDHKPS9bC&eFB@CVF(&YC9Y46%T,6e9B8dj -16e9IDRD"L)L"HA9jJBbEUDqZTCH'HR&UEAL$Liq4NBf&Ii'(MT+6NT'2LSH0QU5 -RTjq8LB"mIiL5QCbFQ)emDQ"E@Q"QDfp[D@"FA&eF@9KEA9YC@Q*[ISU4P)q#GR* -dIBZDTkqZTCD%FfGLBfajJS@%J(emIS'%LBZ-M)b-MT1ETV#cVkDCMSH&LjLRX,' -VRiaiCPaDAQ0RDQaTB9G48&"28&056NT*6&CPFhq&L)@!HRKmK*'IUUkYSj'!G@p -ZFhf&M)q0LSL&Ji1'Lj!!N!#-LBH&L*!!R+HXUU1DNBU'Kif@QjbDP)KhD@*JC'T -VE'aTB&K999GA9PPGAepHAfGeJSZ5PC'(IhTmKT+GTUQPQieqFQTRCfjhI(jpHA9 -dGAGpJ(pqIRk!KBbAT,#fYDZGNBU)MjbTVl#URj+%Gh"[FRCjHACX@dT"2d**8&0 -88e"08&KLDh4lJ)+!I(f$MTkXY,LeTj5&HhCfHAk'M)q0KRplHAKjI(ppH(4cHB5 -1PCfLS*U6LS&mIB@3!*ZJRjH-JRTfHB#%K)1!HA"QA9C899CCA&jIA9jRFhk%KS* -kG(0dIBZBSUUYUU#4JRKcFR9kIS&rGh"ZEQp`FhCkIRprJSD-NjZLTU5EMiL&L*! -!QCqNTD#CNib'JS'&M*'4Li"bC&aA9eTF@PG98e09@&jQEA&eGR4aFRU+QkL`XUf -JNSH!IS+&LBk3!)f&I(CfHi#'M)q-Ki"lHRf#LT1DQT5+IhGcG(f+PCUBMi9mGA& -hJBf9Q*50K(T`DQGRD'GQC@4JAQ0YH(pqH(&YDfadJT+ITDDPRj1'IAPjI(pqHR0 -UC@CXFhU!K)H)KS1!J)5,NTLFQ)f#HhZ#M*@HTUDHNiH!IS'(NCZHQBk"G@aPB'& -MC'0J@9*-5NY4@f4UDfKPC@K`Ij+KV,#XTCb4Ki5&L)b-LSL%IAYqKBb6PT11KRY -fGRPrKSb2MSGpFfp`GAq)N!#9PBk)K)1)NCUKT+#BMB&fEfaYEh"YCf&F9P4BB'P -`F@jUCQ0NDRD*QkDVUCq4KRjpJSD)Ki@"I(GbF(0kJ)D+M)Z(JAq$LBq6NSb&IhP -iIB@1PCfKSTk@N!#2NCHITDDKPSCkFh"ZE@YSC&j@6dY)5P"AAf*LAejICA'"NCk -QU+@JQT10Lif6PjD6MSCpGhCjJ)L,M)Z)JRelIB+(LBU+Ki&mGhL!LT1DRCZ8M)D -%KiZ1NC58NBZ%IAG`E'YTCf4JA9eKC@PZF'pYDQPUEh@!MTULTU1FPT!!LiU0MBQ -%IhYfEfPRD@abHAaqIRakI)+*MBk,L)H&K)L3!*QJTUHQSjZ5MSf1NC59PT5-JRT -dF'jUCQ0JA&G88P0BA@4VEfjUD'P[H)'*NTUGRCbDQ*H9PC@6MSL"HRCeGAKpIhe -kGA&aFRGrKif2N!#1LSD$JiU6QTkIR*H5M)H'LBZ0MSq1LAphFh&[E@YSC@&F@ep -QDQe`Fh4aE@aZFRL#MTQKT+'IRTkFQTL8N!#+JhaiFfjVDQeaFQpZEh*hI)''LBQ -'KBD)LSf3!*@ERU#KRjU@PCDCQjL4LS0mGh4cG(0`E'KPB9eD@PjND'YYEQaTCQC -YGAZ#LT'@Q*H@Q*QDR*fGQT@-KB1"IhjpHRCdFR*cGRPqK)Q0M)H%JAemIi@+MBq -2NC15Mib)KB1"JS1#IRakGR0ZD'*HA&aJCQaaFh0dGRGhGA0bFh9jJ)L,MBf1NC5 -9P*13!)f)K(pjGA"YEA"bFh9jIS1(LBb1MBZ*L)H'Ji'%LBf5PjQEQjD5Mib)K)+ -#JRpkGR&VCQ&GA&jJAejLD'aZE@eZF(&aFR0dGhb#LBf1N!#5Nj56NBk0LiL'KiH -(KB&qI(YlIB#%L)b3!*5@P*!!M)Q&JApqIi1(Lik2MBU&J(jqIRq#Ji*rH(&VCQ& -GAQ0SEA&eH(TlIS+'Ki0mH(KiH(TpJSD+M)q4N!#0LSL*LSD!I(PcE@TTD@ebH)+ --NT56P*HAP*+3!)b'Ji1<!!NjDERjkCNSU%J(q"K)*lG'aQBf&IAf*PCfYZEh& -bFR4iHAGbEQaXF(CrKiZ1MSZ*L)D$Ji@(L)Q)KB*mGh9hHAk#K)Q1N!#4PCLAPC! -!LiH$IherK)U2NC'3!)U"I(YmJ)@'JhpkFfeSC'4QD@peGRChHRk#KSD&JRYeF'e -XEA*kJSL,LSH$IhjqIS#!I(KeF@eUD@Y`HB#&LSk3!*!!MSq6PTD@Niq,L)@%L)k -6Q*Q@MiL!IAapJ)+"IAPcE'PSCfCSDfjbG(9iHhaqIhjmGfjSCQGTFAb&Liq1LiH -#IATjHhk!J(ppH(9dGRU#L)U0NC58PjQCQ*LAPC'0LBD%Kib3!*!!MSQ"HA9cG(Z -!Ji@%IhK[D'*LC'TaGhb"Ji@)LiZ*LBH"HR0ZE'pfISH-Miq)IhPeFA"aFA"[E'K -PC@KZGS'*Mj'5P*DAQjqKSU#CN!#+K)#$Lj5GSD#ENiQ"IRq$L)U)KB"fDf9KB@C -YG(TpI(PiHAf!IRajFfYPBQ0XH)52Q*U8LS"iFh"[FA4hGhGfG(GjHRf%LSq8Q*U -FRCfIS*kAMB&iFh0hJBZ3!*!!MSH"HhGeHB+*MBq0L)"fF'pbGAGiHAYmHRPpJS@ -&KB0qH'pTD@jhJ)D*LSCpGR*`F(&bFh4bE@GPCQP[Gi'+N!#6PCQFRCfEQTQ5L(p -iG(4iJSkCRTbAN!#,Ki@'Lik-LBH%J(ajGR4dFh*cG(0bFA0hH(GfGA"VD'KYGhq -&M*+6MSGrHAGeGRGiGh4`EA"eHRk%LSk3!*'4NC+5NT+5N!#+J(KcFR4kJSZ3!*+ -2LSH$Ihq%Lj5CQTH6M)4qHhTlHR9bFR*aFRGlIAq!IRYfF'e[GS#)M)k0KhpjGA& -aFR"ZE@YRC@4REA9pKBL*LSU,MC'8PCD8MiH!HRCfHi10PCQCPC!!M)Q(LT'9PjH -@NBU#HA0aFR0eGA4cFA"bGACeFQeRC'0PEAH"LT+APT!!KhjiGA4fGR9dFh&`FA4 -hHi#%L)b-LBD&KSU1N!#5MSCrHhPlIS'&Lik1M)U&JB'&Lj+9PC'-KS1"J)'$Ji' -!IhajGR4dGhTlH(4`Efj[GRq'M)q0L)4qHA9dG(*`Eh"aFA&dGRKjHAKjHhamJ)@ -,N!#9PC13!)U$Ihq#Kib4PTL@Nj+5NC+5N!#1M)H!I(TiH(TpJ)"mGh&YE'aYEh* -cFR&aEfj[G(f*NCDCPT!!KhpkHRalHAYmHRPjHAPkHRKiHAGeG(4hHhq&LBU*L)@ -#JS@(LT!!P*D6MSL(KiL,MBk2M)H$JAppIS'"J(afF@eXEA*jJBD(JhjjFh"bGhk -(M)k2Li0kGA*bG(CiH(9`E'TTDfj[EQp`EfpbGAU"Kib2Mik,LBZ4Q*qQV+fUT*k -ANSq1Mj+6MSCpGR*`Eh&cF'YQBQ0QD@acHRjqHR0XCQ9TFi'1PTL@NBU$Ii##K)D -)Ki&kF@YUE'pcGRGfF@TQCQP[GRYrK)H(KiU1NjLHT+LQSCZ@NBq3!*!!N!#2LB* -mGh*[E@aYEfpXD@KTEA4qL)f,KS&kGA0dH)#)MC!!NBk)J(YlIi5'KB"jFQYNAej -IAPjKBf0MBQ9VGAq*N!#5NBf+M*'ARkL`Y,DcVDHLR*H9PC52KRadE'CMBf0LBQ* -LC@PVEA*hHhjpH(0`Eh0kK)f9PjD8NSf,Lib1Mib'J(P`DQKTEA"`EQTNAeeIC'a -fISD+LSL%JS1+NTfPUUURSTkEQTUDQjU6M)4lFfjVE'pbFR&YDfYYFAL"KSL'JAY -hGA0eIBD0NT56MiU'KBH*LSH!H(&VCQ4PCQKUD'4LB'&PEAL'MT'3!)f(JB#%Lj@ -JTUUXUU@KRCbISk@LQj'&HR"XE'paG(4aE@TSD'Y`GhamH(0YD@TZGAq,NjLCPBk -*KiD)M)q0KhedE@TUEh9kI(TfF'aUDR"kJSL,LiL%J(k$M*DITDHQSCQ5N!#4NT5 -8NSk*J(KeGRKmIi'"Hh&UCfPZGAb"K)&jFh&cGhq*NjUFQ*+,K)"rJ)5)Ki"hF'P -PC@T[GAGdEfaUDQacISH-N!#3!)Z&JB''NCfQV+kVTCb9NC'6PCLCPSk&I(GiHhq -#JhphF'PPC'9TER0eG("VDQjeJ)bAR*bAMiL%JB#$KiL'J(KaE'TYGAk%KB&lGA& -ZF(H!L)f3!*!!MBU'KSZ8RD@STU#@Li5%KBL-MBb*K(pmI(q&LBb+JhKXBejIC@j -hIB'"IATjHRq(N!#AQjU9Li*mHharK)@!GfpRB@&QEA9kHhG`D'4PDR*pL*!!P*5 -4N!#4NjDGTDUVTTb6M)L(Lj!!Nj13!)Z'JRprJSD)LB9pFfPJA&jNEA9iHACbEh" -dHi@2PTQANSb'Ji'#K)0rHA"TBf&PE(9mJS0qGQeSCfefIiL3!*@@PT56PCQGSD' -GQ*11L)D'KSL+Ki5"IRalIB'&Ki@!HA&VD'GXFhTqIhejGA0cHS@4QTqJR*@-KS+ -#JB'!I(9YC&jFAQ&PDQjZDf4IAf*UGS11PTZFQTUCQCZISk5KR*L8NT'5PCHBPT! -!LS4qHRKiH(TkGh0`E@YVER*fH(GdF@p[FhU%MT@BQ*D2LBD'KiQ*Ki*lF@KLAf" -ND@pcG(0aEQYZGS#+NTHCQ*D6NC'5PTQDQCH5MSU)LBU0MSb(JAYhG(4eGRCiH(C -cF'eXER0iIB#!IRemIB+*Mj5@PT53!)U'KBD)L)H#I(9VBPaC@PeKC@KUDQPUERH -"LT+9PC'0LSQ,MT+AR*kGQTH8NSq0Mj'3!)Z'J(ThGA9iHhYkH(0[E'TVF(9jI(e -lHAGfGhb#KSL*L)D&K)1$K)D'JhefE@4IAf9XFhPmIAYjH(Z"Kif5P*53!)Z)KiL -*MT5BQjUAP*!!LS@$JS+"IRakHAPjHhk!JApkGR*[F(9kIi@)Ki@"IRerJiH,MSq -2M)L&JS'"J(jjG'aPAeeICQecH(YlHAGeGAPrKSb2Mif,LSU,MBq6PC@9Niq-LSQ -*LBU*KS*qHhYmIAepHhPeFR"[FA9mJB5'KB&pHRKjIS+&KiH(KB1!IRalHAGbE@P -PBf4TF(KqJS5$J(ajHAf$LBf3!*'3!)k-M)f3!*18P*+2LSD%Ji1$JB'!IRakH(K -iH(PkHA4`E'TVF(9lJ)1$JS'!JS5)MC1AQ*H4LS4qHACfGRCcEfYSC@9SEA*fHAP -hG(&`FRGmJSH*LSU+LBZ0Mj'4NC!!Mik-M)b0Miq1M)L$IAPhGhPkH(CdF@pZEQp -bGhb!JS"pHhYqK)Z3!*15MiU%J(aiGA9hGR4`DQ4JB@K`H(k"JB"rIReqJ)5)M*! -!NC!!MSU(KSQ-MSq1MSf,L)L)KS5#J(jkGA&[Efp`FA&`EfeXER0hHherJB5'KiQ -0NTHDQjZAN!#*JhjlHhYkH(9ZCf*HA9jLD@pdGhKjH(KjIB''LBQ)Ki@%KBD(LSZ --MT!!N!#3!)q1N!#4N!#0LS9rHA9bFA"ZE@jZEQjZER"cGRb"K)@&KSH*Lib-M)Z -*L)H&JRpmHAGeF@TMA9YEAQ9ZGAYrJS5'KB5%KSL+LiZ+L)D%K)5&KSH)Lik2Mif -,L)5"IRTfFQpYE'aXDfYYEQjZF(0iIB#%L)Z,LSU+M)q3!*'6Nj'0L)5"IAPfFQj -TBPY@9PTICQjeHhjrIRepIi'$KB@'KB@%JS"rJ)1)M*!!NT+4NC+4MSb(J(TeFA" -`Efj[FA0dG(0cGAPqK)Q,LSL%JS#"JiH*Lik2M)Q'JAelH(4ZCf"E@&KFBfTbHAq -$KSD'KSH*Lif0M)Q&J(jmHhk#KSQ0Miq1M)L'JhplGh9bEQeZFA0bFh4cFh4fHAk -$KiQ,LiZ*KS5&L)b3!*+5N!#0LBH&JRplGR&VC9pE@&PGCR"iIS#!IhjqIi#!JB1 -%Ji&qI(apIi1(LBQ*LBL*LBQ(JhjkHAPiH(KiHAPjHAPiH(PmJSL,MBk0LSD$JS# -!JB1'L)L)KS1"IRakGR&UBeeD@PjME(CqJiD(KiD%Ji5(LBZ,L)D%K)5&KiL*LBL -)Ki@"IRakHAKhGR9cFR0eGRGiHAYpIi##K)D)LSZ,LBD$Ji5(Lik3!)q1LiQ(K)" -pHhKeF@aQBQ"LCfjfIB+%K)1"IhepIS'&LBb-LBH'KSH(KS@%JS"rIi"rIAYlI(Y -jGR4cFh4hHhq"JS5'LBb1Miq1M)L&JAppIS'&LBZ,LB@"IRakGh4[DQCLB@&MCQY -aHS''KiD&Ji1(LSf3!*'2MSf-LSQ)KiL)L)H%IhYjGhKiGh9cEfeYE@j`G(KpJSD -)L)L)LBZ-M)b+L)D&KBD*Lib0MBf,Ki*pHA9cF@jVD@GRD'a`G(KlIAprIRepIi+ -'Liq5NT!!MBU(KSD&KBD%Ji1#J(ekH(GfGR9cFA&bGRTqJ)+&KiL+M)k1MSk0M)Q -%IhamIB'&LBU*KS0qHRCcEfaUDQTUDfaZF(0iIB'#JS'!JS5(M*!!P*D@P*+1LSH -(L)U+Ki@$JApmHACbF("`F(&aFA*dH(b!Ji@(KiQ-MSq3!*!!MBU(Ji'"JiD+MSq -1LiD"I(GdFh*bFA"ZER"aFh9iHRaqIAYjGhKlJBL1NC+4Mib+LSL(KiH(KiD&Ji" -pHhYkHAKhGhGfGRGkI(f"K)L,MBf1MSk-LS@"IhepJ)5(LBL&JAjmHAGfGA9fGh9 -cFA*bFh4iHRYmI(apIi'$KiZ1Mj!!N!#2MSb-MBk1MSf-LSL'KB5"IRYiG(*aFA& -bFhCkIS#"JB'#Ji5(LBQ)KiD&KBD)LSb0LiQ&JAelHherJ)"rI(TjH(GfGA9fH(K -fG(0dH(f#KSU-M)Z+LSU,M)k3!*!!NC!!Mif,LBQ)KS*rI(PhGhKiH(KjHRYmI(e -qJ)5)M)f,L)@$JS1&KiQ*Ki1"J(jmHhaqJ)'!IATfGA4dGACfGhGhGhPlIB'%KiU -,LiU)KiQ-N!#8PTD9P*+3!)q0M)Q'JhpmHRGdFh4eGRGfGA4bFhCkIi5(L)L(KB5 -%K)D)LSb,LBD%JS'"JB+#JS"pHhPiGhCfGRGhGR9dG(9iIB+&KiH(KB1#JiD+Mj+ -8PC13!)k0MBk1MBZ)K)'!IRakHAPiGR9dG(9hHi'(LSU(K)&rIRq#KBH)L)H&JAj -mIAjrJB"qHhGeGA4eGhGiHATjHATlIS+'LBU)KS1"J)+(M*!!NT15NT'2Miq3!*! -!Mif*K(pkGhChHRamHR9aF(&cGRYrJS1#J(jmI(k"KSU-M)U'Ji"rJ)#!J(pqIAa -kH(KjHheqIAajGR9hHi#%KSD'K)&rIRq#KBL,MBb,LSQ+M)k3!*!!Mib)KB+!Ii# -"JS+!IAPeG(CiI)##JS&rIAamIS#$KBD&Ji"pHhTkHhapIAakH(9cG(CjHheqIRe -lHRYqJB@(L)H&JRprJ)+&LBZ-MBb-LiU+M)k1M)Q&JAjpIS'$K)5"IAKdFA"aFhG -kI(emHRPjHhf!Ji@&K)+"IhjqIRjrIhemHRPjHRarJS1#J(ajH(PlIS'#Ji5#J(j -mI(k"K)H)L)D&K)5'L)Q,LiZ*L)D&KBD(L)Q(JhjjGR4eH(TmIRjqIAepI(eqIi# -!IhekH(GhH(KjHAGeGAChHAYpIi#"J(ppI(aqJ)1'KSD&KB@&KBD(KiH)KiD&KBD -(L)Q+LBH%JS'"JS5'KiD%J(aiGA4dGRKkHhamHhYlI(jrJB'"J(jlHAKhGhGiHAP -jHRTlIB##Ji+"IhjpIAjrJB+%KSD'KSD&K)5&KS@%Ji'"JB'#Ji5&KB@&KB5$Ji1 -&KSD&Ji"qI(apIAepIAeqIRprIi#!J)"rIAThGA9dG(4dFh4eGRGiH(PkHheqIAa -mIAk"K)D)L)L)KiH)L)L)KiD'KSH(KiH(KiD&Ji&qI(YlIAq!JS+"J(ppI(YlI(a -pIAalHhYpIi#"JB#!IhelHRPhGRChH(KhGhGjHhapIAemHhYlI(q"JS1&KSD&Ji' -"JS1%K)1#JS1$K)@&KB5$JS'!IRalIAq"Ji5%K)1#JS+#Ji+#JB#!J(prJ)'#JS' -!IRakH(GfGA9dFh0bFR*cGACiHATkHAKhHAb!Ji5&KSD'KSD(KiH)L)Q*LBL(KiH -)L)L'Ji"pHhTkHhaqIi#!IhjqIRq!JS1$JRppI(amIAk!J)'#JB'!IRalHRTjGhC -dG(9hHRaqIRjmHRKhGhPlIS#$KB@%Ji+#K)@'KiL)KiD&K)1#JS+#JS&rIRemI(a -qIRprIhq!JB1&KB@&KB@%K)1#JS+$Ji1#JApqIAalHAKhGA0bFA&cG(GjHRTjGh9 -cFh9hHhf!Ji@&KS@&KBH)Lif2N!#1M)Z*L)D%Ji'!IhjpIAamIAepIAemI(erJB1 -$Ji1"JB'#Ji1%K)5%K)1"J(pqIAakHAKfGRChHATlI(amHhTiGR9fH(YpIi'"JB# -!JB1&KiQ-MBf-LSH%JS'"JB+!IRemIAk!JB+"J(jpIAeqJ)'%KiQ*L)H'KSD(L)H -'KB1!IRepHhTiGhCfGA9eGA9hH(PjH(CdFh0dGRKkIAq"JS+#Ji@)Lik3!*!!Mif -,LSU+LBH'K)+!IRjqIi##Ji+!IAPhGhKlIi+&KiH&K)+"JB+%KiL)Ki@#J(jpI(Y -kH(KiH(PkHRYmIAepI(TjGhCfGhPlI(apIRq"K)L+LiZ,LBH&K)5&KSD'KB1!IRe -qJ)+%KB@$JAejH(KlJ)@+MBf+Ki5#JS1&KSH)KiD%JRppHhTkHAKhGR9eGRGiHAT -kHRKfG(0cG(GkI(k!JB+$KSL+LiZ+LBQ*LSU-M)b,LBH%JS'"JB+$K)5"IAPhGRG -kIS1'KiD%JS"qIAerJS@(L)H&Ji'!IhjqIAalHRTjHAPlI(eqIAakH(ChH(PlIAj -rJ)'$K)5&KB@&KB@&KBD)LSU*Ki@#J(q!J)+$K)5$JAjlHATpJ)5)LBQ)KS5$JB' -"JS5&KSD&K)+"JB'!IhekH(GfGRGjHRYlHhPhGR4dGAKlIS'#JS+#JS1%KBD'KiH -)LBQ*LSQ*L)H'KB5$JS+$Ji+"IRakHRTmIi'$K)@%Ji&rIReqIi#"JB'"JB+$Ji1 -#J(jmHRKiH(TpIi#!IhelHAPjHAYpIi#"JB#!Ii#"JS1%K)5$Ji+$Ji1$JS+"JB' -#JS+$Ji1$JAppI(erJS@(L)L(KS@%Ji+#JS+"JB'!J)'"JB'!IRYiGR9fH(TpIhp -qIAYjGhCfH(YpIhprIRepIRq"Ji5&KSD&K)5%K)@'KS@&K)1$Ji5%K)1#JApqIAj -qJ)'#Ji1#JB"rIhprIi"rIhprIhprIhjpI(YjH(KjI(q"Ji1#J(jmHhYmIAprIhj -pI(YlI(k!JS1%Ji+"J)#!JS1$JS&rIRjqJ)+$K)@%Ji'!Ihq!JB1%KB@&K)1$JS+ -#Ji1$Ji+"J(pqIRepHhPiH(KjHheqIhpqI(TkHATlIAq!IhelHRPkI(k!JS1%K)5 -$Ji1$K)@&K)5#JB#"JS1%KB@%JS"rIRjqIi'#Ji1$JB#!Ihq!JB'"J)"rIhprIRj -pI(YlHRTlIAjrJ)#!J(prJ)#!J)#!IhemHhYlI(jrJ)'#JS'#JS+$JS+"J(jpIAe -qIi'#Ji5$JS"qIRjrJB1%KB@&K)1$Ji5&KB@%Ji+!J)#!J)"qIAYkHAPjHRYmIAe -qIRepI(apIAjqIRemHhYlHheqIi'#Ji1%K)5&KB5%Ji+"J)#!JB'#JS+"JB"rIhq -!JB+$Ji+"J)#!JB+$Ji1"J(prIhprJ)"rIRemHRTkHhaqJ)'#JS'!IhjpIAeqIRj -qIRepIAepIAjrIi#"JS1$Ji+"J(prIRepIRjrJ)#!IhjqIi#"JS1$Ji+#JB'#K)@ -'KSD%Ji+"J)#!J)#!IhemHhTkHhapIRq!IhemHRTkHhYmIAepIAemI(amIAk!JB+ -$Ji5&KB@&KB5$JS'!IhprIi#!J)"rIhprIhprIhprIhq!JS+$Ji+#JB'!IhjqIRj -qIRepIAepIRq!JB+#JB"qIAamI(amIAepI(alHhYlI(eqJ)'"JS+#JS+"JB'!Ihj -qIRjqIhprIhprIRjqIRjrJ)'#JS1%K)@&KB@%K)1#JB"rIRjpI(apIAjrIi#"JB# -!IhemHhTkHRTkHhYkHRPjHATlIAjrJ)'"JS+$Ji1$K)5%Ji+"JB#!J)#!J(pqIAe -mI(apIRq!JB'#JS+#JS+#JB'"J(prIRjpIAepIRq!JB+#JS+"JB"rIRepI(amI(a -mHhYlHhYmIAjqIi#"JB'#JS+#JS+"JB#!J)#!J)#!IhjpIAamI(eqIhq!JB+$Ji5 -%KB@&K)5$JS'!IhpqIRjrIi#"JB'"JB"rIhjpI(alHhYlHhTkHRTlHhamIAepIRq -!JB+#Ji1$Ji1$Ji+#JS+#JS+"J(pqIAamIAepIRjrIi#!JB+$Ji1$Ji+"J(prIhp -rIhq!J)'"JB#!J)#!J)"rIRjpIAjqIRepIAemI(amI(apIRq!JB'#JS+"JB'!J)# -!J)#!J)#!IhjqIAamI(epIRjqIhq!JB+$K)@&KB5$JS'!J)#!JB'#JS+#JB"rIhp -rIRjqIAemI(amI(amI(YlHhYlI(epIRq!JB'#JS1$Ji1$JS+#JB'#JS+"JB"rIRe -pIAeqIRjqIhprJ)#"JS+#JS+"JB#!J)#!JB+#JS+"J)"rIhprIhprIRjpIAepIRj -qIRemI(amI(epIRq!J)'#JS+#JS+#JB'!J)#!J)#!J(prIRjqIRjqIRprIhprJ)# -"JS1%K)5$Ji+#JS+#JS+$JS+"JB'!J)#!IhpqIAamI(amI(epIAamI(amI(epIRj -rIi#"JS1%K)5$JS'"JB'"JB'"JB'!IhpqIRjqIRjqIRjqIRprJ)'#JS+#JS'"JB' -#JS+"JB#!J)'"JS+"J(pqIAamI(apIRjqIRjqIAepIAepIRprIi#"JS1$Ji+#JB" -rIi#!J)#!J)#!IhjqIRjqIAepIAjqIi#"JS+$Ji1$Ji1$Ji+#JS+#JB'"JB+#JS+ -"J(ppI(YkHRTlHhapIAepIAepIAapIAjqIi##JS1$Ji1#JB'"JB'#JS+#JS'"J(p -qIRjpIAepIRjqIhq!JB'"JB'"JS+#JS+#JS+"JB'"JB+#Ji1#JB"qIAalHhYmI(e -qIRjqIRjqIRjqIhprJ)#"JS+$Ji+#JB#!J)#"JB'#JB'!IhpqIRepIAepIRjqIi# -"JB'#JS+#JS1$Ji1$Ji+#JB'"JS+$Ji1#JB"rIAalHRTlHhYmI(epIAepIRjqIRj -qIhq!JB+$Ji1#JS+"JS+#JS1$JS+"J)"rIRjqIRjqIRjqIhq!J)#!J)'"JB+#JS+ -#JS'"JB'"JB+#Ji+#JB"rIRepI(apIAepIAeqIRjqIhprIhjqIhq!J)'#JS+#JS+ -"JB'"JS+#JS'"J(pqIRjqIRjqIRjrIhq!J)#"JB'"JS+#JS+#JS+"JB'"JB+#JS+ -#JB"rIRjpIAamI(apIAepIAjqIRjqIRjqIRprJ)#"JB+#JS+#JS+$Ji1$JS+"J)" -rIhprIhprIhprIhprIi#!J)#!J)'"JB'"JB#!J)#!J)#"JB'"JB"rIhjqIRjqIRj -qIRjqIRjqIRjqIRjqIhprJ)#!JB'"JB'"JB'#JS+#JB'!J(prIhprIhprIhprIhp -rJ)#!JB'"JB'"JB'"JB#!J)#!J)#"JB'"JB#!IhjqIRjqIRjqIRjqIRjqIRjqIRj -qIRjrIi#!J)'"JB'"JB+#JS+#JS'"J)"rIhprIi#!J)#!J(prIi#!J)'"JB'!J)# -!IhprIhprIhq!J)#!J)#!IhprIRjqIRprIhprIhpqIRjqIRjqIRprIi#!J)#"J)# -!J)'"JB+#JB'!IhprIhprIhprJ)#!J)#!J)#"JB'"JB'"J)#!J)"rIhprIhprJ)# -!J)#!J(pqIRjqIRjrIhprIhjqIRjqIRjqIRprIhprJ)#!J)#!JB'"JS+#JB'!J)" -rIhprIhprJ)#!J)#!J)'"JB#!J)#!J)"rIhprIRjqIRjrIhq!J)#!IhprIhprIhp -rIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)'"J)#!J(prIhprIhprIi#!J)# -"JB'"JB'!J)#!J)#!J(prIhjqIhprIhq!J)#!IhprIhprIhprIhjqIRjqIhprIhp -rIhprIhprIi#!J)#!J)#!J)'"JB#!J)"rIhprIhq!J)#!J)#!JB'"JB#!J)#!J(p -rIhprIhpqIRjqIRprIhprIhprIhprIhprIhprIhprIhq!J)"rIhprIhprJ)#!J)# -!J)#!J)#!J)"rIhprIhprIhprIi#!J)#!JB'"JB'!J)#!J)#!J)"rIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)#!Ihp -rIhprIhq!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprJ)#!J)#!J)#!J)#!IhprIi#!J)#!J(prIhprIhprIhprJ)#!J)# -!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhprIhq -!J)#!J)#!J)#!J(q!J)#!J)#!J(prIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)# -!J)#!J)#!IhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhp -rIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhp -rIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIi# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIi#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!!!!X3!!"!!%!"3!!!+!!!B"4!!! -!!!!8!!!!!!!!,"C@lSZM!!!X&!!!,"8!2)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J(prIhq!J)#!J)# -!J)#!J)#!J)#!J)"rIhprIhprIhprIhprIRjqIRekH(KpJB*rHh"H6%%m2$j!2$% -R,d989dp&26Fd0MY"4de6@&jMCfY[FA4jJ)U@SUqla-[4ephKjHRYlr,cp2AfprI -fp[Eep22cmr,blqV9Rh&pRDHXXE+aVUHJQ*!!L)"e8"3!'c8p4%P*4N!i,bJP*#F -X-cT"4da49PTHB@4QDR"iJBfCT+kf[-,(c0$8f0[Hi1(Mj1AQjqIRk1MRjqIQj0r -8VRjXHBQ8Qk+QUDLPS*Q5LApZ443%%L)X06a!3N!m0M%Y,#da0Ma"4NT18PCCA&j -JBfKYGAq*P*kRVV1i[-$%b-[1dG,8eYMCfY[Fh0hGh0[DeXqlNR&XFRZ%M*1DRk' -JRCL5LAjV3aS,$aBI+#mh1cdm1MFe0$8i1d"%5%Y1894A@9YGAf*RE(9rL*+ESDH -XX,5i[,r#a-I*bXc1cp$4dY26dp(2blqQJfjVEA&iIiD1P*LDQCD4LAjU5#88%K3 -B(L8X-MFk1cXl1c`r3N9)5dj38P9A@9YFA@"MD'phJ)Q4QCqMTkZ[XV@iZll!`X2 -&amM*bXV,bmR'[l'BI@jXE'eaGRf%Lj!!P*@8NBTrE9%b(aXC'4`J*5Xa0MSp2d& -$4NP-6e&69&CA@9YFA9jJBQCVFRU$Lj+BRU+PUDb[XV5hZEZp[X$"`m6%aFA$[lD -RNAa`E@eYEh*hIB1*MT'5N!#,JA&D35dP)L!J)5-S,6-i28&&5%a38P9A@9TDA&e -HAf"JBQ0QDh"hISD0P*UHSD5RUkf[XV5fZ,Ul[Ekr`-(![VQ`SBjpFfp[Eh"aG(P -qK)U1N!#2M)4fC%dk,bSS*bBQ*bX`06Y"4Na39&KEA9jIAf"KB@*LBf4PCfT[G(Z -$LC!!PTUHSD5RUDbZX,+dYVHjZVbp[EbkYDZGMApeFR&aFR*dGRZ!KBU0MSb'HfY -C4cSc-#iX+bXX,M-j2dC-8PGFB'*MC'4NC'9PC@CQCfPVEh4jIiD-NTHERk'NTUL -VVDqaXV5fYlQkZVQfX+HEMB&iG(0cFh4eGRPpJSH,M)Z(IR&L8N8p0c8c-6!`-$- -i284-8PKHBQ9RD'KSD'KSD@PTD@YXEh0iIB1*Mj@CR*qKT+DSUUbZX,+dYEHhYlD -cVD5CMS4mGh9eGRChH(TmJ)@*LiZ)JAGUA&"'2cXj1$Be06Bi280+8PPJC'KVE'a -XE'aXE'aXE'eZF(0hI)+(MC1AQjkJSU5RUDZYVl'bY,@fYV5aUk1CMiCrHRKhH(P -kHRapJ)5)LSZ*K(aaC9P35%0!2Mdm1cSl2N0+89PIC@TYEh"`F("`Efp[Eh"`FR4 -iI)''M*'@QTfJSU5QU+UXVV#bXl@eYE1`UU1DNBQ#IAYkHRYmIAjrJB5(LSZ+KS" -hE@*B8%T'3d*"3$mr384+8&GIC@Y[FA0cFh0cFR*bFR*bG(9iI)#<!!P*LFRk' -MTDHUV+k`XV1dY,5bVUQLQj+,KB"pI(apIi#"JS1&KiQ,LiL$I(0TB&G46%K'489 -%4%9(5P"@A@4UER*dGA9eGA9dG(4dG(9fHAarK)Q1NTHERU#LTDHTUkf[XE+cXl1 -aVDLLQj10Ki*rIRjrJ)'#Ji5&KiQ+LSQ&IhGZCPe@88e+58K)5%K+6&"9A'*SER* -dGRGhGhCfGR9eGAChHAYqJSH-N!#9QCfISU5QU+UXVV#aXV+aVkbRSTZ8MBL%JAp -rJ)'$K)@'KiL*LSU*Ki*lG'YMA9G56Na,5dY-68p59PYKCfaaG(ChH(KiH(GhGhG -hH(PlIS'&LSq6PjZISD1QU+UXVUqaXV'aVkZQSTZ9MiU'Ji'!JB+%KSH)L)Q+LiZ -+L)4rH("TBPaA8e"26Nj28&*89eYKCQY`G(CiHAPjHAPjHAPjHATmIS'&LBf5PTU -HSD1PU+UXVUqaXE'`VUZRSTb@N!#-L)5$JS+%KBH*LSU,Lib-LiU(JRaeEQGK@eG -88P&48P099ePGB@CUEh0fH(PkHRTkHRTkHRTlI(k"K)L-N!#9QCfJSkDSUUbZVl# -aXE#ZUkDKR*H4MBQ'K)1$K)D)LSZ-M)b0MBb,L)4rHA*XCQ"E9e968e499ePEAQ& -PD@eaGAGjHRTlHhYkHRTlHhaqJ)1'LSq6PjZISU@RUDZYVUq`X+qXUDDKR*H5MBQ -(K)1$K)D)LSZ-MBf0MBb,LBD"I(C[D@4I@eG9999@@&TGAf*PD'a`FhChHATkHRY -kHRYlHhapIi+&L)b4PCQGS+1QU+UVVDkZVUfVU+5JQjD5MBQ(KB5$K)D)LSZ0MBk -1MBf-LSH$IRPcE@GLAPTB9eGA@9YHB@0QD@a[FR4fH(PkHRTkHRTlHhapIS'%KiU -1NjHERk+PTkQVV+bYV+ZTTU1IQTD5MSU(KB5%K)D)LSb1Miq2MSf-LSH$IhTeF'T -QBPjE@9PC@eeIBQ9RDQaZF(*dGRGhH(PjHAPkHRYmIB#$KBQ0NC@CRD'NTULTUUZ -VUUQRT+'GQC@4MSU)KS@&KBD)Lif2N!#4N!#3!)k0LiL&JAaiFfjUCQ*IA9YEA&j -KC'GTDfe[FA*cG(9fGhKiH(PjHRYmIAq#KBL-N!#8Q*bJSkDSUDQUUDLRTD+IR*L -9NBk,LBH'KBD(L)Z0Mj'5NT'3!)k-LBD$IhTfF@eTC@*JAPeHAf&NCfTXER"aFR0 -dG(9fGhGiH(PjHRYpIi'%KiZ2NjHERk+NTUHSU+LRTD1KRTUAP*'0LiQ(KS@&KSL -+MBq3!*+5NC!!Mib+Ki5!I(KdEfYSC@*JAepJB@4RDQe[F(&bFh0cG(9eGRGhH(P -jHRaqJ)1'LBf4PCQFS++NTDDQTU@MSCqFQCD6N!#0LSL'KB@&KBH*Lif2NC+4NBq -0LiL%JAjkGR*ZDQCNBQ"JB'*NCQTXER"bFR0cFh0dG(9fGRGiHATlIAq"K)H,Mj+ -@QTkJSU5PTD5MSU#HQjL9NBq-LBH'KB5%KBD)LSf2N!#4NC'3!)k-LBD$IhaiG(" -XD@CNBQ&KBQ4QD@aZF(*cFh0cFh4dG(9fGhGiHRYmIS'%KSQ0NC@BR*kKSk1MSk+ -KRjfDPj54MSZ*Ki@%K)5%KBH*M)k3!*'5NC!!Mif+L)5"IRTfFfpVD@CNBf0MC'C -TE'j`FR0dG(4dG(4dGAChGhKjHhaqJ)+&LBb2NjDCRCqKSU+LSD#HR*QAP*'1LiQ -(KB5$Ji5&KSL,MBq3!*'4NBq1LiQ'Ji"mH(9aE@YSCQ9NC'4QD'YYF(*cG(4dG(4 -dG(9eGRGiHATmIAq#K)H+MT'8PjUGRk#KSD#IRCZBPT13!)f+L)D%Ji+#JS1&KiQ -,MSq3!*'3!*!!MSb+Ki5"IATfFfpXDQKQC@4PCQGTE'paFR0dG(4dG(4dGA9fGhK -jHhaqJ)+&L)Z2NT@BQTbHRjqHRCZCPj54Mib*Ki@$JS'"JB+$KBH*M)k2N!#3!)q -1M)U(K)*qHhKdF@eVD@GQC@9PCfPVE@paFh0dG(0cFh0dG(9fGhKkHherJB1'LBb -2NT@BQTbGRCfFQTL@Nj!!MSZ)KS5#JB#!J)##Ji@)LSb1Miq2MSb+L)D$J(ejGR* -[E'TSCfCPC@CSDQaZF(*cG(4dFh0cG(4eGRGiHAYmIS##KBL+MC!!NjDBQTZEQjU -CPj@5Mif+Ki@$JB"rIhq!JB+%KiQ,MBk2MSk0LiQ(K)&qHhKeF@jXDQKRCQCRD'T -XER"bFh4dG(4dG(4dGAChH(PkI(k!JS5(LSb2NT5@Q*UDQTUBPj@5N!#0LSL&Ji' -!IhjqIi#"Ji@)LSb0MSk1MBb+L)@$J(ejGR0`E@YTD'GRCfKTDfe[FA0dG(4dG(4 -dG(9fGhKjHRYpIi'$KBL,MT!!Nj@@Q*QCQCL@P*+2M)Q(K)+!IhjpIAjrJ)+%KSQ -,M)f1MSf-LSL'K)&qHhKeFQpYDfPSD'GSD@TXER"bFh4dG(4dG(4dGAChH(PlI(k -!JS5'LBb1NC18PTHAPjD9Nj'1LiL'Ji&rIRemI(apIS##KBH*Lib0MBb,LSQ'K)* -rHhPfFR"YDfTTD'KSD'TVE@paFR0dG(4dFh4dG(9fGhKkHherJB1&KiU-MT!!NT5 -9PC@9P*+2MBZ)KB1"IhemHhYlI(erJB1&KiQ,M)b-LiU*Ki@$J(ekGh4aEfeVD@K -SD'KTDfaZF(&cFh4dG(4dG(4eGRGiHAYmIS##K)D)Lif2NC+6P*58Nj'2MBU(KB+ -!IRemHhYlHhaqJ)+%KSL+Lib-LiU*L)D%JApmHACcF'jXDfTTD@PUDfaZEh&bFh4 -dG(4dG(9eGRGiHAYmIS##K)D)LSb1N!#4Nj16Nj+4Mif+L)@$J(jpI(YkHRYmIAq -"JiD)LBZ-M)b,LSQ(KB+!IRYiGA*`EQaVDQTUDQYXE@paFR0dG(9eGA9eGRChH(P -lI(jrJB1&KiQ,MBq3!*'5NT+5N!#2MBU(KB+!IRelHRTkHRYmIS##KBH*LSZ-LiZ -+LBL'K)&rI(PhG(&[E@aVDQTUDfaYER"aFh4dGA9eGA9fGRGiHATmIAq!JS5'L)U --MBq3!*'4NC!!Mik-LSH%JS"qI(YkHAPjHRYpIi'$KBH*LSU,LiU*L)D%JS"pHRG -eFh"ZE@YUDQTVDfaZEh"bFh4dGA9eGA9fGRGiHRYmIRq"Ji@(LBU-MBk2N!#3!)q -1MBZ*KS5#IhelHRPiH(KjHRapIi+%KSH*LSU+LSQ)KS@$J(jmHACdF@pZE'YVDfY -VE'e[F(&bFh4dGA9eGACfGhKjHhapIi'#K)D)LBZ-MBk2Mik0M)Z*KS5#IhelHRP -iH(KjHAYpIS'$KBH)LBU+LSQ)Ki@%JRppHhKeFh&[E@aXDfYXE'e[F(&bFh4eGA9 -fGRChH(KkHhaqIi'#K)D(LBU-MBf1MSk0M)Z*Ki5#J(jmHRPiH(KjHAYmIS##K)D -)LBU+LSU*L)H&Ji&rI(TiGA0aEfjYE@eYE@j[F(&bFh4eGRCfGhGiH(PkHhaqIi' -#K)@(L)U,M)f0MBf0M)U*Ki5#J(jmHhPiH(KiHATmIAq"Ji@(L)Q+LSU*L)H'K)+ -!IRYjGh4bF@pZEQeYE@j[F(&bFh4eGRChGhGiH(PkHhaqIi##Ji@'L)Q+Lib-MBb --LiU)KS5#J(jmHRPiH(KiHATlI(k!JS5'KiL*LBQ*L)H'KB1"IhekH(CdFR"[EQj -YEQj[Eh"aFh4eGAChGhGiH(PkHhapIS#"Ji5&KiL*LSZ,LiZ,LSQ(KS5#J(jmHRP -iGhGhH(PkHherJB1&KSH)LBQ*L)H'KB1#J(elHAGeFh&`EfjZEQj[Eh"aFR0dGAC -fGhGiH(PkHhapIRq"JS1&KSH)LBU+LiZ+LBL(KB5#J(jmHRPiGhGhH(KkHheqJ)+ -%KBH)L)Q*L)L(KS5$JAppHhKfG(0aF'p[Efp[F("aFR0dGAChGhKiHAPkHhapIRq -"JS5&KSH)LBU+LSU+LBL(KB5#J(jmHhPiH(GhH(PkHhaqJ)+%KBH)L)Q*LBL)Ki@ -%JS"qI(TiGR9cFR&`F("`F(&bFh4eGRChH(PjHRTlI(apIi#"JS5&KSH)LBU+LSU -+LBL(KS5#JAppHhTjH(KiH(PkHhaqJ)'$KBD(L)Q*LBQ)KiD&Ji+!IRakH(CdFh* -aFA&aFA&bFh4eGRChH(PjHRYlI(eqIi#"JS5&KSH)LBQ+LSU*LBL(KB5#JAppI(T -jH(KiH(KjHRapIi'#K)@(L)L*LBQ)KiH'K)+"IhelHAGfG(0bFA&aFA&bFh0dGAC -hH(PjHRTlI(apIRq"JS1%KBD(L)L*LBQ)L)H'KB1#J(jpHhTjH(GhGhKjHRYmIS# -"Ji5'KiH)L)L)KiH'K)1"J(jmHRKfGA4cFR&aFA*bFh0dGAChH(KjHRTlI(apIRq -!JB1%KBD(KiL)L)L)KiD'K)1#J(jpHhTjH(KhGhKiHATmIAq"JS5&KSH)L)L)L)H -'KB5#JAppHhPiGR9dFh*bFR*bFh0dGAChH(KjHRYlI(eqIRq!JB1%KBD'KiL)L)L -)KiD&K)1#J(ppI(YkHAKiH(KjHATmIAq!JS1&KSH(L)L)L)L(KS@%JS"rIAYkH(G -eG(4cFh0cG(4eGRChH(PkHhamIAjqIi#"JS1%KBD(KiL)L)L)KiH'KB1#JApqI(Y -kHAPiH(KjHRYmIAq!JS1&KSH(L)L)L)L)KiD&Ji+!IRelHRKhGR9dG(4dG(9eGRG -iH(PkHhapIAjrIi#"JS1%KBD(KiL)L)L)KiH'KB1#JApqIAYlHRPiH(PjHRTmIAk -!JB1%KBD(L)L)L)L)KiD&K)1"IhjmHhPiGhCeGA4dGA9eGRGhH(PkHhamIAjrIi# -"JS1%KB@'KiH)L)L(KiD&K)1#J(pqI(YkHAPiH(KjHATlI(erJ)+$K)@'KiH)L)L -(KiD&K)1#J(jpHhTiGhCfGA9eGA9eGRChH(PjHRYmIAjqIi#"JB+$K)@'KSH(KiH -(KSD&K)1"J(ppI(YkHAPiH(KiHATlI(eqJ)'#K)@&KSH(KiH(KiD'KB5#JApqI(Y -kH(GhGR9eGA9fGRGhH(PkHRYmIAjrIi#"JS+$K)@'KSH(KiH(KSD&K)1"J(pqIAY -lHRPjH(KjHATlI(eqIi'#Ji5&KSH(KiH(KiH'KB5$JS&rIRalHRPiGhGfGRCfGhG -iH(PkHhapIRjrJ)'"JS1%K)@'KSH(KiH(KiD&K)1#JB"qIAalHRTjHAPjHRTlI(e -qIi'#Ji5&KSH(L)L)L)H(KS@%Ji+"IhjmHhTjH(KhGhGhGhKiHATkHhapIRprJ)' -#JS1%KB@'KiH(KiH(KiD&K)1#JB"rIRamHhTkHAPjHRTlI(eqIi##Ji5&KSD(KiL -)L)L(KiD&K)1"J(ppI(YkHAKiH(KiH(KiHATkHhapIRprJ)'#JS1%K)@'KSH(KiH -(KSD&K)1#JB"rIAalHhTkHAPjHRTlHhapIS#"JS1%KB@'KiH(KiH(KSD&K)1#J(p -qIAYkHRPiH(KiH(KiHAPkHhYmIAjrJ)'"JS1$K)@&KSD'KiD'KS@&K)1#J(pqIAa -lHhTjHAPjHATkHhapIRq!JB+$K)@&KSD(KiH(KSD&K)1#JB"rIAalHRPjH(KiH(K -iHAPkHhYmIAjrJ)'"JS1$K)@&KSD'KSD'KS@&K)1#JB"qIAamHhTkHAPjHATkHha -pIRq!JB+$K)5&KSD(KiH(KiD'KB5$JS'!IRemHhTkHAPjHAPjHATkHhamIAjrJ)' -#JS1%K)@'KSD(KiH(KSD&K)1#JB"rIRemHhYkHRTkHRTlHhapIRq!JB+$K)5&KSD -(KiH(KiH'KS@%Ji+"J(pqI(alHRTkHAPkHRTlHhapIRprJ)'#Ji1%KB@'KSH(KiH -(KSD&K)5$JS"rIRjpI(YlHhTkHhYlI(apIRq!JB+$Ji5&KSD'KiH(KiH'KS@&K)1 -#J(pqIAamHhYkHRTkHRYlHhapIRjrJ)'#Ji1%KB@'KSD(KiH(KSD&K)1$JS"rIhj -pI(YlHhTkHRYlHhapIRjrJ)'#Ji5%KB@'KSD(KiD'KS@%K)1#JB"rIRemHhYkHRT -kHRTlHhamIAjrJ)#"JS1$K)@&KSD'KSD'KS@&K)1#JB"rIRemI(YlHRTkHRTlHha -mIAjrIi#"JS1$K)@&KBD'KSD'KS@&K)1#JB"rIRemI(YlHRTkHRTlHhYmIAjqIi# -"JS+$K)5&KBD'KSD'KS@&K)1#JB"rIRjpI(YlHhTkHRTlHhamIAjqIi#"JS+$K)5 -&KBD'KSD'KS@&K)1$JS'!IhjpI(alHhYlHhYlHhamIAjrIi#"JS1$K)5&KBD'KSD -'KS@&K)1$JS'!IhjpIAamHhYlHhYlI(apIAjrIi#"JS+$K)5&KBD'KSD'KSD&KB5 -$Ji+"J(pqIAemI(alHhamI(apIAjrJ)#"JS1%K)@&KSD'KSD'KSD&KB5$JS'!Ihp -qIAamI(YlHhYmI(apIAjrIi#"JS+$K)5&KBD'KSD'KSD'KB@%Ji+"JB"rIRjpI(a -mI(amI(epIRjrJ)#"JS1$K)@&KSD'KSD'KSD&KB5$JS'!J(pqIAemI(alHhamI(a -pIAjrIi#"JB+#Ji5%KB@&KSD'KSD'KB@%Ji1#JB"rIRjpIAamI(amI(apIAjqIi# -"JB+$Ji5&KB@'KSD'KB@&K)1$JS'!IhjqIAamI(YlHhYlI(amIAeqIhq!J)'#JS1 -$K)5&KB@&KB@&KB5%Ji+#JB"rIhjpIAamI(amI(amIAeqIhq!JB+#Ji5%KB@&KB@ -&KB@%K)1$JS'!IhjqIAamI(YlHhYlI(amIAeqIRq!J)'"JS+$Ji5%KB@&KB@&KB@ -%Ji1#JB'!IhjqIAemI(amI(apIAjqIhq!JB'#Ji1%K)@&KB@&KB@%K)1$JS'!J(p -qIAemI(amI(amI(apIAjqIhq!J)'"JS1$K)5%KB@&KBD&KB@&K)5$JS'"J(prIRj -pIAepIAepIRjrIi#!JB+#Ji5%KB@&KSD'KB@&K)5$JS+"J(prIRepIAamI(amI(e -pIAjqIhq!J)'"JS+$Ji5%KB@&KBD'KB@&K)5$Ji+"JB"rIhjqIRepIAeqIRjrIi# -!JB+#Ji5%KB@&KSD'KB@&K)5$Ji+"J)"rIRjpIAemI(amIAepIAjqIhq!J)'"JS+ -$Ji1%K)@&KB@&KB@&KB5%Ji+#JB#!IhjqIRepIAepIRjqIhq!JB'#Ji1%K)5&KB@ -&KB@%K)1$JS'"J(prIRepI(amI(amI(apIAeqIRprJ)#!JB'#JS1$Ji5%K)5&KB@ -%K)5$Ji+"JB#!IhjqIRepIAepIAjqIRprJ)'"JS+$K)5%K)@&K)5%K)1$JS'"J(p -qIRepI(amI(amI(amIAepIRjrIi#!JB'"JS+$Ji1%K)5%K)5%K)5$Ji+#JB'!Ihp -qIRjpIAepIAjqIRprJ)#"JS+$Ji5%K)5&K)5%K)1$JS'"J(prIRjpIAamI(amI(a -pIAeqIRjrIi#!J)'"JS+$Ji1%K)5%KB@%K)5%Ji1#JS'"J)"rIhjqIRjqIRjqIhq -!J)'"JS1$K)5%KB@&KB@%K)5$Ji+"JB"rIhjqIAepIAepIAepIAjqIRprIi#!JB' -#JS+$Ji1%K)5&KB@&KB5%K)1$JS+"JB#!IhprIRjqIRprIhq!J)'"JS1$K)5%KB@ -&KB@%K)5$Ji+"JB#!IhjqIRepIAepIAepIAjqIRprIi#!JB'"JS+#Ji1$K)5%K)@ -&KB5%K)1$Ji+"JB#!J(prIhpqIRjrIhq!J)'"JS+$Ji5%K)5%K)5%K)1$JS+"JB" -rIhjqIAepIAemIAepIAepIRjqIhprJ)#"JB'#JS+$Ji1%K)5%K)5%Ji1$JS+"JB# -!IhprIRjqIRjqIRprJ)#!JB'#JS1$K)5%K)5%Ji1$JS'"J)"rIRjqIAepI(amI(a -pIAepIAjqIRprJ)#!J)'"JS+#Ji1$Ji1%K)5$Ji1$JS+"JB#!IhprIhjqIRjqIhp -rJ)#!JB'#JS1$Ji5%K)5$Ji1#JS'"J)"rIhjqIAepIAamI(epIAepIRjqIRprIi# -!J)'"JB+#JS1$Ji1%K)5%Ji1$JS+#JB'!J)"rIhprIhprIhprJ)#"JB+#JS1$K)5 -%K)5%K)1$JS+"JB#!IhpqIRjpIAepIAepIAeqIRjrIhprJ)#!JB'"JS+#Ji1$Ji5 -%K)5%K)5$Ji1#JS'"JB#!J(prIhprIhq!J)#"JB+#Ji1$K)5%K)5%K)1$Ji+#JB' -!J(prIRjqIAepIAepIRjqIRjrIhprJ)#!JB'"JB+#JS1$Ji1%K)5%K)5$Ji1#JS+ -"JB#!J)"rIhprIhq!J)#"JB'#JS1$Ji5%K)5%K)1$Ji+#JB'!J(prIRjqIAepIAe -pIAjqIRjqIRprIi#!J)#"JB'"JS+#JS1$Ji1$Ji1$Ji+#JS'"JB#!J(prIhprIhp -rIi#!J)'"JS+#Ji1$Ji1$Ji1#JS+"JB#!IhpqIRjpIAepIAepIAepIAjqIRjrIhp -rJ)#!J)'"JB'#JS+#Ji1$Ji1$JS+#JS'"J)#!IhprIhprIhprIhq!J)#"JB+#JS1 -$Ji1$Ji1#JS+"JB#!IhpqIRjpIAepIAepIAepIAjqIRjrIhprIi#!J)#"JB'"JS+ -#JS1$Ji1$Ji+#JS'"JB#!J)"rIhprIhprIi#!J)'"JB+#JS1$Ji1$Ji1$JS+"JB' -!J(prIhjqIRjpIAepIRjqIRjqIRprIhq!J)#!J)'"JB'#JS+#Ji1$Ji1$Ji1$JS+ -#JB'"J)#!J)"rJ)#!J)#!JB'"JS+#Ji1$Ji1$Ji1$Ji+#JB'!J)"rIhpqIRjqIRj -qIRjqIRjqIhprIhq!J)#!J)'"JB'#JS+#Ji1$Ji1$Ji1$JS+#JS'"JB#!J)#!J)# -!J)#!J)'"JS+#JS1$Ji1$Ji1$JS+#JB'!J)"rIhpqIRjqIRjqIRjqIRjqIRprIhp -rJ)#!J)#!JB'"JS+#JS+#Ji1$Ji+#JS+#JB'"J)#!J(prIhprIi#!J)#"JB'"JS+ -#JS1#JS+#JS+"JB#!J(prIhjqIRjpIAepIAepIRjqIRjqIRprIhprJ)#!J)#"JB' -"JB+#JS+#JS+#JS+"JB'!J)#!IhprIhprIhprJ)#!JB'"JB+#JS+#JS+#JS'"JB# -!J(prIRjqIRjpIAepIAeqIRjqIRjqIRprIhprIi#!J)#!JB'"JB+#JS+#JS+#JS+ -"JB'"J)#!J(prIhprIhprJ)#!J)'"JB+#JS+#JS+#JS+"JB'!J(prIhpqIRjqIRj -qIRjqIRjqIRprIhprIhq!J)#!J)'"JB'"JS+#JS+#JS+#JS+#JS'"JB'!J)#!J)# -!J)#!J)#"JB'"JS+#JS+#Ji+#JS+#JB'"J)#!IhprIhjqIRjqIRjqIRjrIhprIhp -rJ)#!J)#!J)'"JB'"JS+#JS+#JS+#JS+#JS+"JB'"JB#!J)#!J)#!J)#"JB'"JS+ -#JS+#JS+#JS+#JB'"J)#!IhprIhjqIRjqIRjqIRjqIhprIhprIi#!J)#!J)#"JB' -"JB+#JS+#JS+#JS+#JS'"JB'"J)#!J)#!J)#!J)#!J)'"JB'"JS+#JS+#JS'"JB' -!J(prIhpqIRjqIRjqIRjqIRjqIRjqIhprIhprIhprJ)#!J)#!JB'"JB'"JS+#JS+ -"JB'"JB#!J)#!IhprIhprIi#!J)#!JB'"JB'"JB'"JB'"JB#!J(prIhjqIRjqIRj -qIRjqIRjqIRjqIRjrIhprIhprIi#!J)#!JB'"JB'"JB'#JS'"JB'"JB#!J)#!J(p -rIhprIi#!J)#!JB'"JB'"JB'"JB'"JB#!J)"rIhpqIRjqIRjqIRjqIRjqIRjqIRp -rIhprIhprJ)#!J)#!JB'"JB'#JS+#JS+#JS+"JB'"JB#!J)#!J)#!J)#!J)'"JB' -"JB+#JS+#JS'"JB'!J)#!IhprIhpqIRjqIRjqIRjrIhprIhprIhq!J)#!J)#!J)# -"JB'"JB+#JS+#JS+#JS+#JS'"JB'"J)#!J)#!J)#!JB'"JB'"JS+#JS+#JS+"JB' -"J)#!J(prIhprIhjqIRjqIRprIhprIhprIhprJ)#!J)#!J)#!JB'"JB'#JS+#JS+ -#JS+#JB'"JB'"J)#!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB'!J)#!IhprIhjqIRj -qIRjqIRjqIRjqIRjrIhprIhprIhq!J)#!J)#!JB'"JB'"JB'"JB'"JB'"JB#!J)# -!J)#!J)#!J)#!J)#!JB'"JB'"JB'!J)#!J(prIhprIRjqIRjqIRjqIRjqIRjqIRj -qIRprIhprIhprIi#!J)#!J)#"JB'"JB'"JB'"JB'"J)#!J)#!J)#!J)#!J)#!J)# -!JB'"JB'"JB'"J)#!J(prIhprIRjqIRjqIRjqIRjqIRjqIRjqIhprIhprIhprIi# -!J)#!J)'"JB'"JB'"JB'"JB'"JB'"J)#!J)#!J)#!J)#!JB'"JB'"JB'"JB'"JB' -!J)#!J(prIhprIhjrIRjqIRjrIhprIhprIhprIhprJ)#!J)#!J)#!JB'"JB'"JB+ -#JS+#JS'"JB'"JB'"J)#!J)#!J)'"JB'"JB'"JB'"JB'"JB'"J)#!J)"rIhprIhp -rIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!JB'"JB'"JB'#JS+"JS'"JB'"JB' -"J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB'!J)#!J(prIhprIhpqIRjqIRjqIRjrIhp -rIhprIhprIhprIhprJ)#!J)#!J)'"JB'"JB'"JB'"JB'"J)#!J)#!J)#!J)#!J)# -!J)#"JB'"JB#!J)#!J)"rIhprIhjqIRjqIRjqIRjqIRjqIRjqIRjqIhprIhprIhp -rIhprJ)#!J)#!J)'"JB'"JB'"JB#!J)#!J)#!J)#!J)#!J)#!J)#!J)#"J)#!J)# -!J)"rIhprIhpqIRjqIRjqIRjqIRjqIRjqIRjrIhprIhprIhprIhprJ)#!J)#!J)' -"JB'"JB'"JB'"JB#!J)#!J)#!J)#!J)#!J)'"JB'"JB'"JB#!J)#!J)"rIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB' -"JB'"J)#!J)#"JB'"JB'"JB'"JB'"JB'"J)#!J)#!IhprIhprIhprIhprIhprIhp -rIhprIhprIhprJ)#!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB'"JB'"J)#!J)#"JB' -"JB'"JB'"JB'"JB'!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIi#!J)#!J)#!J)#!JB'"JB'"JB'"J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!IhprIhprIhprIRjqIRjqIRjqIRjqIRjqIhprIhprIhprIhprIhprJ)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhprIhp -rIRjqIRjqIRjqIRjqIRprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)'"JB'"JB'"JB'"JB'!J)#!J)#!J)# -!JB'"JB'"JB'"JB'!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIi# -!J)#!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB'"JB'!J)#!J)#"JB'"JB'"JB'"JB# -!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)# -!J)#!JB'"JB'"JB'!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIRprIhp -rIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhq!J)#!J)#!J)#!J)#"J)'"JB'"J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!J)#!J)#!J)# -!J)#!JB'"JB'"JB'"JB'"JB'"JB#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!Ihp -rIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!JB'"JB' -"JB#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprJ)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!Ihp -rIhprIhprIhprIhprIhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)'"JB' -"JB'"JB'"JB'"J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhp -rIhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!JB'"JB'"JB'"JB#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhq!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhp -rIhprIhprIhprIhq!J)#!J)#!J)#!J)!!!#K!!!%!!3!&!!!!S!!"J&%!!!!!!"3 -!!!!!!!!S&PEZLk-!!#J8!!!S&3!mJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprJ)#!J)#!J)'"JS1%KBD(LBU,MC@ -KUDLSX,Hl[lfcTk@``YANl2(bm1VJdmHlVk5FPSq)L*h$hqAHi[6rr2VikG5rV*q -BNSb'JAYjHAPkJT[%j[AaiFQhYF(2dmr'YkDR`Y[A`kqCIQPD8P&DFTLrf1$DcVq -aVE5jYl+bYVLeVUDCLA4H6%0-Dj5cZUZ5Gej,5eTUFRPrIhKXC'"HA9pLB9eA9Pp -fP+bbSSZ#MUM#f1AKeY$*[,'XUkZTTk+CMSUDZYILhXqlTC58Skq[Tjb1IAZ5VlH -`Tj4hA%Bi2PCeM*QGR*qLRTD3!)PqFQTTEh0aDf&@890DD)Lkir(Yh-#RRk+VZ-# -rZlZm[,fqZl1QQ)TpF@0@8&GME'aJ5M3a5'9bG(4R8cmV'!i1&L%T,5dX-%9QJik -(G@&45%eHER0aE'094dTCB&4'1#`T,cjFIT1AMRYN9PjfMTbMS*H2LSD#IRGXA8X -h*KiV8AkETk13!(aS9%T2AQppLBPpE@"E@PYHB@0JA&pZJBkARTb3!)*qN!#SX+Z -NQ)PqGQeN@P"-5dT(3$j+BRL#JAGZD'0LCQPN@8j#05db4eaMBee01c!`3ephKib -*K)QCUlHl[EU[RSf"IB#)P*qJPB4hITbjaF@mVCq8LS*qHA&UCfKYG(k(LS9mF'* -@9fZ(QCZ1Gee+3P*pTV@aSB4M56Xk38K19&KC994FEAk&J(4UD@j`FR0aE'CLBQ" -HAfTfIS1(KAppK*Qa`,qbTD+TXEDeXUqVST5'I(CdFR&ZCeT15&9mUEqmUj0pF'j -hKBk2KhTVA9GHDh0`CPK*2Mp3F)Q3!)PmE9j48QU)PT@4LS"jFQTM@e415dY19'0 -hJB*rHA&VC&jB88Jq0#XP)LFqBharG@&(,L-Y5QKjI(CYC&pMFS#&JRefEQ9IA9Y -A8Nj'1c%d8AkLYEDTQjD6N!#1Li*fD@0NCfPYG(K`AdSi-d9PJ)b-KAaeHj1NRBT -jCeP68PGGB&pE9%Y)9'TpKS0eCf&QEhGmIAKYB&YSM,6-dF@TMAf#R,R'`V1LPj+ -6Qk'IQC!!LSH%JAjfD9Y668-m4Q@%N!#,IQeLB@PaFh*bFR4kJB5!HhTmIRemKTb -YVk',Ff9RGjLh`,DPN!"pE&T,4dY16Na)4PClSEHhU)jeBPYJCfedHRGVB'0hM*1 -4JQPA9fKpLiZ!FQYXG(q&Ki@#K)fETDQNPi9hF("qSFRKj0M$V*fCRUDQS*Q9NT! -!MSZ'IhalGQP@4NC9CQYSA%Si-N9RH(CZAdj"0LXU0%416dFr4Q"mLBKrFfTQCfK -QAeC048"!6QYqIR9S9%0$@AZ4PSq#G'peJ)H0NBq(IA*SAPKA@ea84cSf5h+4R*H -(GfpXE'j`F("aEfPJ@P438PTLD(+(RU5CK@jC6NjLK*ZHQBarHheqJBD)KB1"JSb -FU+QMPSGlEf0E@&G988a)3d44CA&eF'CHBA#(QUDSTD+JRk@VUkDJQC'-LSH"H(& -ZE@adN!#mhZRPeEbQQTQPXVLdV+HQTU@MRj@&FPp148PHGB&pEPT*3NeTJB@"G@0 -98&&AA@4VFhCdGAq-N!#0Jh*K@9aPERChG'jVEAQ4TkUGLR*H9PebMk@[X+fTTU@ -NSTkEQ*1*IhC`ER&jIheeF)+R`XR%Xjb0KiH0PTZDNiZ!FQ*86%T089GDA'GpN!# -8LhaVBQL#R+5IPib!HRGiHhYfE'*A6%G5DRf#HfeE56dl3de699&)2$P)@PpG9NN -q1N"9GT+GQBb"I(YqJB+"K)b6P*',JhPZBP4+5Pq&SkZPNRYUBf0SE'aUE(*hH(9 -[D@GUE@TPBQf%PjZ8KA0NCRkARjU,Fej46%pCBfCPC'"GBA@@XlkiU*5%I)+5Rk+ -ENSZ5VmlCdEkMLRKaIk$!cp$+`Vr$aX5lVk#3!)*fF'e[GAKeE@*@8&ekMj+&EPC -)5&0PHBU6PT10KB"rJ(adD&T,3dpVKC'0I'CDCB@KV+ZJM(KUC'9TEA*fG@pRB@G -eIRjiFh0eGR4ZC9a@8e0GFi5$H@pMA&YHDS#BU+fQQT5@R+1TVV+cXl'ZV+fbYDq -KMi52XG,Khp#pX+QSUkq`VUbSSCL2KRpeE'4H9dj*8'"VDf"12$Y5FS&qG'*56%a -4@&aC8%8l-L`U-N4FE("R@8j09f9`F'GC6%TFHiq8PC!!K(CP8NK9GTDRVDQIPBb -%IRK[CPeA88T%3%"#4NG%4&&VLTqMPS*bERH)QD@VU+'FR*qLSk+GPSf$GfTTICZ -XUTU$G)'JXl@YR)9bC'&UGAKhI)+&JAPaF(Z(Li9kEQPYGAb$K(jdCf0`JB4pHR4 -XD'CPDhfCVlQhVkUVXEQr[E1PPiZ$JB1(LB4jD9YDET'daF#`RBYqHi'*MBf*JRK -ZCPpD9&"-58G'4%*&6ePF@&*9Chf,N!#1J(&YF(CpJ(pmHRTkGh9iKk#jaX5hUD1 -PUV#aUTb-JibKVl5hVTb,IA&ZGikSZ,QbUUHRUDfYTTb5LiH)M*'6Mi0bB9PKFSQ -HTk#BNBb1PCUFR*Q6MBD"I(CZCf4LAeT446e%@@TYC9eNHSZ3!*'-IQpL@9CB@&4 -389496d-f0dTKE'aSB9aGC@pfFfGA6eYaHRGaC9G268e19@L"P*ZAMB0mH(KlIi& -rHhPjHRaqIAG`EAH'MC+FRjH3!)b*MTHISU+IQT52LS@!HA"P@%T!1cT"9(#$KRP -TDRZ-Q+'JPiq)JAppH(4cGAGhGA"XFibUZlfeTjL,JAq!IhGXCh#&PCbIQ)CfE@G -PES+JZmV-`V5QRjkMTk5EN!#)KBL-M)CmEf&A@QTpN!#RZ,HXRSamGACqL)q2LB" -iFQeUD'GPBPjC8Ne6CAb,Mif5Sl'`UU#3!)1!JSH1NBq+KS+!IAKaEA"lJi0qGh& -`GS#)M)PqEfPaJ)H*LB0kGA*[ER&pPE,)dmr"XDDLTl6"aX1jVD+@LRpiFQe[JTQ -PVEUpXkQIPj59PjZIS*fBNib$I(4UB&4(2cXj1dCFEh&Q@&&ECfKNB&9,4N4&58Y -+4dC(58T+58K3Chq-LhpZA9&2@'CcHi#-RUDIPBb!FfPH99"8CS@KVUZIN!#%IRk -!JAjhF@aTCQ"D9P*-4dTBDA@&Qk@KQ)TmGRKpKBk9QCZGRCQ4LS4rHR0UB9aIF)k -TYVDbZ-("ZVDZT*b@N!#0LiQ)LBL%IRG[CQ*VJC@FPSGdC&aFC@e[CPaHEhq%K(p -bCQ&KBfKcLkc(dXh!YE#[XVHkYUfNQj+*J(PfGhGkKTDEPCLLT*qDNSU&K)@(Ki9 -rH(0XBeK35dT-6Np168pDDA*`D@4VHS1*Mj!!Miq-Ki"kG(&bG(KmIhprLD#lcG( -*Z+LKSkbbXDQKTV[0cF@jTj5)JAjrJikPZX#jV*f8N!#4NT'1KhjjGR*VC&pHAQ& -ZL*bGQCkJR*Q9MSZ*LBU+L)H+MBf*JhafEQCD5c`Z*Le&C(KlHAf'KS&rI(9XBPC -058K+8&CB9P&)2ca)Ah9pHQpL@9CAA'"H@Q"hNjkDNB"VAeYC@&TNH*1TXl5`UU1 -HR*ZCNib%IhalI(q$K)'"LTHANCDIRTL6M)H'LC!!Q*fDMi&bC&TB@epJA9K346` -m6@KqKiL4SUZRSCZ3!)CrGR"ZEQpbGAKpJB"iEQTfLTHCNSCqIS+)LiL!GRH*Qjf -@Mi4jFh"ZE@adL*qXUk+8KRprL*5GSD+HPBTqG@jRB&eKERU#MTqQU+ZQQj52LiU -+LSQ+Lik3!*!!MBCqG@pYE'TVFhk&KB+(Ql#iZ,5PN!"qEQ9NDA"hIAjpHhCaER1 -%RDkdVk5@LAaaDQCLB'KrQD@MQSPhEh"cGRQ!NDDh[m'r[VbhXUZNRC5-KiD(LSf -1LiD%M*HGSkQRRTH1Ki1#JS5(Ki"hE@0D8Nj+4N4!1c-Y,6K-@PeC@QQ!LiU(IR" -PAPPDAQ0TEA&bF@aK9P0KHSf8Nif(K)+!IRP`DQf"QD#CMi*`B9G36e9QJjkVUTq -5L)*rIi1(KS&jEf095%&$4dP,9'&YHif@P*'0KApmHRPjGh9eGhKhG'pVD@KRC@0 -LDAU4SD+AL)HCV,'`UTf6MSb-MBf-LB0lEf0B8ePYKTQJR*'&Ii#(MT'0KS+0TVZ -pXkD5Ih0YDh@,Um60bEb[Tk@SV+fUT*kEQjZCP)YqF'*B@@Z*UEl"YULCLS'!JB+ -#IRGZD'9NC@4LAeP88%a+8'"cIRpfD@0[KjLGQSTeD@9REhKpJB@)L)0rJ)fQ[m[ -)ZD@9MBf6QCfGPT!!P+Hl[V#ILhCTCQKbKk+bXkZJPBq1N!#4N!#-L)5#JB'$KB@ -!G@CA8PjpRV+iVjk-Hh"[Gi+0P*D8N!#,K(aaD@0H@9026ePZJSQ(Ih0ZHBf@P)b -!F'0F@9KA8de'2cXi1%"9Ehq!H'aI9P&389&25NC&6fL(Q*H1J'aF8e&GGT1QV+L -GNBCrIB+*Mj'1LB4qHAGhH(GcEQKVJCqd[,LUQSf$IAaqK)U0M)U*L)H#Hh*TB&T -A@'4lNCU6J@aJDBHQY,@XQ)4eD@9UF(4fGR4[D@b!RE6"`lbcV+QUUkUQRjL2L)b -HUk@ALRGL@&PPITLSUUDJQTD5Mib)JhjjGR9iIB'$JRecCeaFFjLc[EQUPSCjFhL -!Ji*rHhCcFR0cF@eRB&P89f4kMjQ9Kh9TDhkBTUDFL(0TDA"hHhjqI(PfGS#8U,' -ZSjH0LBZ6RD+JPiTqG(@'RUbaX+12IA0hMDDdYE#RSCkLUV'dXkqTSCL4MBU)KS& -iDepKHCbbY+bFL(KXCfTZFA"ZDfGLAPTB9e414d!m2dpTHhjeC99)5f1#NBf#G@4 -@8%j4@&pLC'CQCh'&PjbCMi*fF(*hI(q"J(jkFfjcJSk0LB"[AeaRIC!!PC')IAC -dH)#)L)&iEfKPBf"H@eP@88Y(6'5-UV1ZS)PeDQYiLC@BPj@5MSU'IR0SBPpGA@G -pPD@SS*+&HA5$SEDiVTk'F@CQE(9lI(GaDQ4UIT@LSjb6MBZ-MSq0LB@!Hh4YF)' -8QTH1IQeSFS@CTUHKRU'RXEc#`VZbU*f5LB5&M*1@P)PpHSbV[,Q[ST!!IR0cHS+ -%JATaD'"B8e"168e06P*EDA0hG'YJ@9CBBRQ4RD'KPiU$J(jqIRelHAZ&Ql2#`lL -SQBf)MCDFRCfFQT@0Ji@ATkQLQBPlJ*@UYE@XS*H6NjDCQjbEQ*51Ki"hEfKNAeY -BA(#4VVLaSj1"FQYVEQp[E'YXF(4hHAThF@GF9PjiNjqHPSPmF'9JDS#2MSCmE&Y -46%a18%j'2$Fr9h'!JAGUB&aFB'*MBf0MBf0JAQClLiU"G@9IEBDAQjD*HR&dIif -5MiCmG'paHB1)L)*hD9P26PalRE#`U*U)H(*cH(k#Ji"lGR"SBPpKC@CREi+CTD5 -CLhpiGhKqMUDeXDHHP)Z(KBD(KAphGB#BXm6&ZkbKQjQES+5PT+'FPSf!F@afKBU -(JAKlM*UHQj1*JB#'MC+6NBf+L)D$IRG`DfGLA&TKF)5GXlQYRBaiD'0ND@eaGAK -mIi'"J(eiF@PND(L1RCq@LAacEfj`HSbDQj@0Ih0YDQKRD@PRDA5&PU+PSTb@Nj5 -BQjL4LiU-N!#5N!#2PUD`UTk6MC@TZEklY+kYXVQr`,beVUHJQC12MBZ*KApeE'P -ZGS+5QC1+Ih&RBepGAPpG@&436%Y08946894MGi+#HQpJ8NK$3N42ChTmG@eL@&4 -69&KFA9ePHBkANS9dCPpKDhH"KSH'JATcDf&B9fCjIhejHB53!*12KhedEh&hHAK -iHAapHhKeFh&[E'CH9e9FDAQ3!+QdX+QINib+L)Q,LiL&K)5$Ji1"I(9bIC+NUD1 -BLAacFAClIiQDTU1DMhpbE@YXEQeUES'HY,fkVCk5LSH(LBQ(K)"lG'jRB@"YKjU -HQTHFTDDFMi&hG(U)Pk#JQC',KAplH(GjHACaDQ9THBfKYX1qVk'6KAjmIB#$Jhp -jGR4cFh*ZCf"GBh&rKB0kEfGPDA*iISfKUkLLPS4fF'paGRTmKCDSX+qRR*@@RDH -[X+ZNRTbDPj++J(b%PCqHRCqPVV'XSTH3!)f4QD#LRjQ4L)"hF'TQC'CSD@GREhb -"K)fCQT@2LB&kF@KLB@4SE("aE'9F99"6BRb3!*H8LAY`D'9NBf"FBR*mI(TdDQ& -D88T&2cY#@("mI(GbEfj`G(KjGA&[F("YD'"A9@*jJhpmJ)@)KS&lHAb"Lj@DQCD -5MBQ(KS@$J(ahFQaQCh@'MjDKUDLKQT!!L)@"IAKcE'4HA@"MC@GSCfCYHSD,L)& -iFQjYEQeUEAk8RCQ4K(0SBQ&ND'eiMU[!b-5hUCqFR*kJS*kFQjZCPBq'JBDATU+ -AP*UMU+DJQT51L)L-N!#0LBD'KiH'KB@$IhGVAPCAB@aeKCbXVUZMPBQ!HA0aFhC -iHRTiGA"UBepMFB@5P)f#GQpXE@p`F(0rLSf-L)5#K)D%IhPdGB5CUV'YT*fCQTq -PTk@IPj!!M)b0LS*mISZ6N!#2QkUdYUkNR*QDRU1RTk+FP)q0MT'6NSq*JA9SB'0 -[GRCjJSH%IhTbDQ4H@PPB9P*48e966NFq1$Y,B'j`CeP26&*EB'&HBR+%L)9qF@9 -H@eTEA&eRIC1IRjQ4M)Z1NjH@NBb(KB1!Hh4XC'9bHhC`Gi5-MSU$I(KiHRq%K(p -hE@4IAPjHAPjH@eC36eTVGRf*R+QRRC5+KSH(LBk8PT54N!#4NT'0KRjpLTZLSCQ -2KS"pIAYcDQPhKSQ&Ih4SB9eGAPjJDRk6SU5GNSU)MCDFR*H4LS@"IATiGRU*S+b -UU+fbYV@aUk@KRjqKSCfANSq0LiQ&IRG`DfCK@eeTGRYpL*UMSjq9KhedE'CNBPj -D@&KC@eeGA&eRH)L4NBTrGR"`G(KmJT1TY,1UR)f%J(epIAf"N!#T`Fh1aVbcVUZ -TTk@MSU'IRTZ6KhTdISf3!)f3!*HER*H1KAjmIB#&L)D"Hh9`E'PRC'*H9de$1ca -,AQafKT14KRY`BejIBfefI(prIhekGQpQ@eTSJ*!!NSU!HRPmIi&qGh0kKiZ)JhG -TB&YA9&09AR+-Rk1EMB&lI)+)LSQ(KS@#I(4VBejNGiU-KiU5QCZANBU'KSL0NT5 -9PC55MiZ%I(0VCQ&F9eCGDh9kK*+CPC'-Ki5$J(epJB5$JAjkGA"UC'"RIjURTCU -,HfaJ@9KDAQZ"NjLBNS4eD&pFA&jMFSbNX,+URC+-LSZ0LiD"JB5(Ki0mFQaaIiL -(KiqET+@HPBf+Lj!!PTbHR*H3!)Q$IRTeEfKLA9PA@fPpM*LQX+fPRjQ8NT!!MSf -,L)@#IhajGR&UB9aJF)10MSL!H(9cFh"VD('#M)f+J(*QAPPDA@&UICHYYV#KNB4 -mHRf!JB"rIi#!IAK`DQk"PTZ@PCULU+DKQC14P*UIS*bAMiCqH(4bF@eSBejD9PG -LEA9rMTLBP*!!LBD'KB&rIRakGh0[DfKNB@"QGikHSCZ4L)+"Ji@%JiZETUDJPSG -jEQCJAPjJDi5JXE@ZSTD2LiZ2NC'1LS@!HR*SA&9EEhjrI)#*P*D3!)PrGh*aGRY -mHAGeFh*`EQPNA94-4N0&6PaUGiLCRjbBNSU'JAYfFh*bGAb#KB*lFQPMCRD*P*5 -0K(ahH(aqIAq0RCq@M(p`Cf0KB@*KBQf!P*qLR*+,L)Q0MSU#HhCeG(0bEQPUGS1 -'JB',RDQTSTZAPjbNVE5bV++AM)0lGA"ZE@eUCQGbKjDDRD1MQT+*IhCdG(9hGh9 -aE@PQBepD9P*5AA'#L)&dD'4QDfpaFRU,PjD4KhKUC'0NCfPVGBZNYVUbT*H1M*+ -DRTqIRCL5Li4lF'TbK)k*JiH6Rk5KQC+0MBq4NT'2M)Q(KiD%IhCXBPP68&0JFS# -)NCbJRCQ@N!#-Ki+!J(pjFh"bGRKfF@TPEB#5QCL4L(pjH(PiFQa`J)f,K(YZC&j -E@9KA@QGrPU+KPiU"J)@-N!#2LB&fE'4IA9YDAQPkJi@-Q+'LRT@-KiH,PCkNTD1 -HQ*'+JhehFQaRBPjHDAb)L)5*NTD5Li"cE@jbGAKiG'eQB&aE@PKBBR@)N!#0JR9 -VD'T[G(9bFi'8QT1+IR"SCfCRDh5'Rl5r`,Q[Tk+JS*kEPj56NBb(J(K[CQ4XGhq -*QD+KRTL4MSq4NT!!MBL$IAG`D@"C99046dj08Q*jMC55NTfQSjZ8LAeeF'eZFR9 -jIS+"Hh0TC'b#PTqGNiL#J)'#J(TbDQalLSk,JhCUBPaB@@*aJSk6Nj+8PjQFRTk -EP)f'J(TdEfTPB@"SHj+RY,1TRTD5PCbKSCkCP*!!MBQ$IRPcE@GLA&KDCA@$L)C -mGi+BT+1HNi9jF@aVE'TPAeaFA&eKEAq3!*H@MiD#JS@)L)*iE@9QH*'JSTf2I'a -MB@f(S+k`UU1GQjZHSD'HQTH8NT!!M)CmF@CG994KI*@JRBprFh"fJ)Q0M)H"HR9 -bF'jUC@&G@999AfpmIhYcD'*VJjbRTCU+H@pUDR"hHRGaE'KREi'6R*b@MB@#JiQ -0M)GrG@PH@Q9fIRjjE9j@9fCpNCH6MBQ)Lj!!P*13!)Q#I(PkIB'%K(jeE'GZKUI -!bF@hT*H4NTHHSD#HQjH4Li@!HhC[CQ"IDRZ*MSU"G@YNBfq'PjU9LhaXB&K89&C -@994@BR@+Q*Z@MBD!I(TiGR0[DfKNB&jNGB5(JACUCQjqMCQIRTZES+DTTk+GQC@ -5MSQ%IRPcE'9LBfTjNUUeXUUJPBk-LiU*Ki5!IRakGh4[DQCMD(H*P*QBP)q*JRY -cFRq8SD1HPBGlF@KMBQ*NE(b0PjQ9N!#-LBQ*L)@$Ji1"IAPbDQ*GBQeeH(f$L)U -,LSU0NC'2M)Q%J(ajH(PkH(0ZD'0H@PaNE'pYERZ5SUDMQiq'IhPkJ)D*LBH$I(9 -XCfYjL)q2LB*qIAq"JAY`BeaNH)L-LS0fD9jA@@9cIB+'L)H&Ji5(LBD!HA0[EQp -aFA"XCf&JE)1CTUQJN!##HRKmKBU0N!#6PTQDQTH5Li4lFh*lLjHDPj',Ki1'P+H -YTjk6KATdEQYVE'TSDA+!M*'5N!#-L)@#J(jlGh*YD@CLA&KGDh9eFR*eHi'%KB@ -'KSL-N!#5N!#-Ki*mGR&YDQKSDR*mKBQ&I(ClM*bLSTb5L)0rIAjrI(KfG(0eISU -6PjD6MSL%Ji5'L)H%IACcHibBQCD3!)Q+NTLER*UAP*18PTLBPT+1LiH"HR0ZDfe -dIB&qGQe[IBU-LS4kFQeTD'PUD@CNB@"LE(f2QCL3!)GqGh&YER*fH(9[DQq!Mj+ --JRKfJBf5Nj'0LSU-N!#8PTH@NSf(J(YeEfaUD@ekKBCrIiU6P*'0KApmI(k!J(j -kGR*`E'GPDhb2Pj5,Ih0VCfP`GhPhFhH'PTU@MAp[BPTEE)15PT50Ki&pI(k#K)1 -!I(KeFh*`E'CJ@9GLHj+GQT'#FfYVFhq)LiZ*KS&mHAKiGA"VERZ,PTU@MiQ$IAP -hIj!!Rk'EP)TrHAGhH(KhISZARCbANBf,LSU,LiL%J(elGh*VBPYA@fTrP*qHPSb -#Gh"XEA"eGhKhGhKiGhCdF@eTDh5"LBb+JhP`ERb4RU'HP)GqHAChHATjH(U#MCH -DQC52LB5#JiH,LiQ&JAadE'CVH)1+NCDCQCD3!)U%IhYkIi1&KSD(LBU*KRphEQG -PE(U'L)0kFRD$MT!!N!#0KS&rIRk!Ji1"IRTiIBQ6Pj@1KhpkH(Z!KSL'JAT`D'G -bIS+!HhKlKBU,LSQ(KB@&KiZ1MSf,Ki*pGh*ZDfP[I)Q1LS5%MTLDQ*50Ki1"J)# -!IRYjGh0ZD@ahJiL(JheiGA4fHRjrHR*TCQjlJAjiEQ&CA@YiIRjkGA&ZEh0kJ)+ -#J(YeF'eVDfTRC@9VFRb,Qk+KRCD4Mj'5NT14MSU'JAppIAb!LjLIRTU6M)4rHhT -jGh0aHBQ9PT'+Ih0UBf*VHiD,M)Q&JRppI(eqI(TiH(KhGA0[DQ9LCR@0Rk@LQBf -#I(TlIi'"IhjqIRq!J)"pHAKmKSf2MBL"HR4`EQjcIik@P)q(IRCaE'TVFAZ%LSk -3!*!!MSZ(K)@(LBQ+LiZ+L)@#IAKdHBUET+@JPj!!MBZ+Lib0MBb,LBL(KS0qH(* -aGS#,NC!!Li*iEfKMD(H,PTH6Li"hEQKNBf0QEhZ&LSZ)KB&pHRKjI)#$JS"pHAC -bE@TXGiD6RCqFPj+1LiQ'K)+#Ji5'KS5"IATfFQjYG(q(L)D"Hh4ZERL'MBb*Jha -hFfpYDfPRCQYfJSb2MSZ)K)'!JB1%K)*qH(0ZDQKTEhCkIS5)L)D$IhTfG(4fHAb -!Ji*rHhCbF("[E@e`GRYpI(PeFR4pKSU-MBZ)KB1!IRakHATlJ)Q3!*58NSq-LSQ -(KiD'KSD&Ji&pHAPrK)5%LBk6Niq*JRYeFR0iIB'$K)+"IRTfFQpYDfYaHS#$J(T -dG(b%L)U*KS1"IhelHAKhGRCfHS+0PTZDPT+0LB@$Ji5%K)0rHRGlK)Z0LiL&KiZ -0MBb*KS+!Ii#$KSL*LBL'Ji"pHA9aF(&hIS+"Ihq'MT'3!)k+K)"pHRPiGhCdG(0 -dGRb'N!#9PC+2LiQ'KB5$JRjkG@pZFhk(LBL$IAYqJi@'KS1!IRk!Ji@&K)1#JB& -rI(TiGR0bG(PmI(TpKT!!Nj!!M)L&K)1"IhemHRKhGhKlIi5*MBk0LiH%JS"rIAY -jGR0`ER&lK)D$IhTfGhf$KiL'Ji&rIAamI(YkHRTkHRPhFQeRBf&KC@Y`FhCpJi@ -"IAYiGhGhHAaqIhjpHhPhGRKpKBf5Nj'-KS*qIAk"Ji1!HhKmKSk4MiU%IRb"L)Z --LiQ'K)1$KBL+Lib,LBD#IhakH(CcFA&dH(TpJiZ1MBU(K)+#Ji1#J(aiG(*cG(4 -dGRPqJB1#JApqIAakGh9dFh0cFh9mJiD%JAejH(YrJS1%Ji1%KB@'KiD'KSD(KiL -(KS@%Ji+"JS@)L)D&LC+APT54MSf,LBD%Ji+!IRakHAPkIB+)LiZ)K)"qIAepJ)1 -%K)*qHRGjJ)D'JRplHATrKBH'JhpmHhf#KSQ+L)D%Ji'!IRajGR0aFA9mJSD(KB5 -(Mj58Nj!!M)Q&JS#!IhjpI(TiGR4eHAk#JS+!IhjqIi#"JB"qI(PfFh&[FRPpHhG -dG(Q!K)@$J(aiGhKlIS#!IhemHhYlHRPhG(&`FAGrKSQ(JRYhHB1,MSq-KS&pHRT -mIAelH(CeG(9jIi1'KS5"Ihq"Ji5$JS"qI(TiGR9dGRZ"JAprJB5(KiD%JB#!JS5 -'L)L(KB1"JB+%K)*rI(PfGRZ#KSH&J(TfGAb'LiZ*KB"mHhTjHAGeFh&aFhQ!KSL -(JhjkGhGkIAprIhjpHhTiGh9cFhClJ)5*MT'5NBf)KB+"JB'#Ji@(L)H(KSD'KiD -$JB#"KBb2N!#1LiD#IRf"Lj+8NSq,Ki1"IhjmHRGdFR0hIiD+LiU)KB1"J)#!J)# -!IhprIRajGh4aFRGmJSQ-LiL&JRppIAeqIRepIAjrIRjpI(amI(YlI(q&Lif,L)5 -#J(ejHS')LiU)KB"mHRPjHRTjHAPmJSH+LiU)KS5#JB#!J)"rIhprIhelH(9cFA* -fJ)Q1Mif*KB+!IhpqI(YjH(GfGRCfG(0bFA&bFhClJ)1$JAppHhTkHAGfGhf%LSZ -*KS*qHhPiHATmIi+&KiH'KB@&KBD(KiD&K)5$JAppHRKfGA9eGACkJSQ1MSb)KB+ -!IRjpIAemHhTiGhCeGACiHRk"K)D)KiD$JB"rIAemI(amI(f!KSQ+Ki5"IRalHha -qJB5&KB@%Ji&rIRjrJ)'"J(ppHhPiH(KjHAPkHRYmIS#$KiU,LiQ'K)1$Ji+"J(p -qIRepI(apIRq#K)H,M)b,L)D%JS'!J(prIRemI(YmIB'&KS5#IhemIS#$KB5$JAj -pI(apIAjqIRjrIi#!IhpqIAepIAepIS#$KB@$JB'$KiQ*KiD%Ji1$Ji1#JB'!J)# -"J)"rIi##K)@&K)1#J(pqIi#!JB'!IRelHAKhGhTqJB+!IRalI)##JS'!IhjpIAj -qIRjqIRjqIhq!J(pqI(YkHAKhGhPmJ)+#JB"pHhPkIS+$Ji+"J(prIRemI(YlHRT -jHAPlIi5(L)L'KB1#JB'#JS1#JS'"J(pqIRjpI(YlIS+%KBD)LBQ)KS5$JB#!J)# -!J(prIhjqIAepIRjqIAalHAKiHhq#Ji1"IhjmHRPhH(b"K)5$JAppI(YkHAPiHAP -kI)#%KSD'K)+"J)#!J)'"JS1%K)1#JB"qIAamI(amIS''LSb-LSH%JS'!J)#"JB' -#Ji1$JS+"J(pqIRjpIAjrJ)'$K)1$JS#!IhprIhjpIAamIi1(KiD%JS"qIAamI(a -qJ)1&KB@%Ji+"J(pqIRjrIi#"JB'"J(pqIAalHhYlHRYlIAq$KSH'K)+!IRjqIRj -qIRjrIhprIhprIRjqIRprJ)+$KB@%K)1#JB"rIhprIRjpI(alHhk"Ji1$JB"qIAe -mI(eqIi#!J)"rIRjpI(amIAepIAjqIRprIRjqIAjqIRjpIAamI(amIS#$KB@&K)1 -#JB'!J)'"JB'"JB'"JB#!IhjqIAeqJ)+%K)5$JS'!J(pqIRemI(YlHRTlI(q"JS+ -"J(jpIAamI(eqJ)+$Ji+!IhjqIRjqIhq!J)#"JB'"JB#!IhprIRjpIAamI(apJ)1 -&KB@%Ji+"J(prIRprJ)#"JB'!J)#!J)#!J(prIRjqIS'$KB@%Ji+"J)"rIhprIhp -rIi#!JB'"JB'"JB#!IhjpIAeqJ)+#JS+"J(prIRjqIRjqIhq!JB'!J(prIhjqIRe -pIAemIAeqJ)+$JS+"JB'#JS'"J)#!J)#"JB'"JB'"J)"rIhjqIRjrJ)'#Ji1$JS+ -"JB#!J(prIRjpIAepIRjrIhprIhjqIRjqIRjqIhq!JB'"J)#!J(prIhprIhprIhq -!J)#!J)"rIhpqIRepIRjqIRprJ)'"J)#!IhpqIRjqIRjrIi#!J)#!J)#!J)#!Ihp -rIhprIhprIi#!JB'"JB'!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprIhprIhq!JB+ -#JB'!J(prIhprIhprIhprIhjrIhprIhprIhjqIRjqIRjqIRprJ)'"JB'!J(prIhp -rIhpqIhprJ)'#JS+"JB#!J)#!J)#!J(prIhq!JB'"JB'!J)"rIhprIi#!J)#!J)# -!IhprIhprIhprIhjqIRjqIRprJ)'#JS'"J)#!IhprIhprJ)#!J)#!J(prIi#!J)# -!J)"rIhprIhprJ)#"JB'"J)#!IhprIhprIhprIhprJ)#!J)#!J)#!IhprIhprIhp -rIhq!J)#!J)#!J(prIhprIhprIi#!J)#!J(prIhprIhprIhprIhprIhprIi#!J)# -!J)"rIhprIhprIhprIhprJ)#!J)#!IhprIhprIhprIhprIi#!J)#!J)#!J)#!J(p -rIhprIhprIhprIi#!J)#!J)#!J)#!IhprJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J!!!0%!!!3!"!!8!!!#J!!'!83!!!!!!&!!!!!!!!$3@9Zk,S`!!0"3!!$3 -9!$b!J)#!J)#!J)#!IhprIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!JB' -!JB'!JB'"JB#!JB'"J)'"JB'"JB'"JB'"JB'"JB'"IhjrJ(prJB'!IhekHAk"JiU -0L)Q0L)1"Ii'$K)@&KS@!I(TkH(4dH(U%M)*hIAphG(CrLSf*JRapIRk$JS"rHiD -DNiD(KB"qJSf9PC+)I(&XF(YlE'CXE@GSDQ9MD'CLEAPlIiU&HAq%ISUDQj52Mj' -2Ki#'M)9iDQKcG'CHC@995e0LE'GLD@TTF(Q-R*++PCD5RUUMN!#2S+LINT+AQT@ -(HA*qMRPNDf*+3%GHCeC9BQ4PFAPcH)Q0Lj@RXDqaYE+XUkkQU,UrXjk8Qj4kDfa -TB'"G6%G46Mmj2NpMEAQ0QCZDQ+'[YE[#`XA-`lV)fY#qZ+fIQj5$Ef&95%4%26d -r,b)S18Y19'KlQ+kGNU@XV,rDhFDqeq$4cXDl[,LMLAU$M(9-,b3M+5mZ,MFj-6) -m4P4KG)Z-M+Hqc0V3ZEI$aXcPlYrEelqPNhpVC'0@2cBf,LBY-5)9'bSj6QCeJBZ -4Nj1DU,V2f0(-cYAHhG2&XU1JRSk!I@e53c8R-6de-63b0$K$@'9XH(q&Nk@i`-A -1bm(%b,klcH6E[,#[Rj55He!k3%3k1%"#1#mQ("BL5@ebEi'APT5Y[lD[Y,r-f1R -jpqI*S)Q4RTH+LAYA3Mij,b3H*#JN,NY46'"`BP9HGBqYcYl5b-@hU+feYm2+`+Z -ISjU'E8`c+5B`3%8q1#mH%ada3e"A@fL#Q+#MU+LJR+@[[Fh6ep1lTD'HLR9cFf" -49&4&1MBZ)a`C'#)k6P9KDf0FDRk3!++ZY-('[-,@e,qaV++ESDfZQhaG46e"1Li -Z-bdQ,$Y$36Y#8PCBDiUMVl@dVV'fXUf`YEc0hYR&Y+LGK@426&0BA@9G3#XR*#% -L,NCIF(aqJjbXRT+CRkM%i16Cdp2*Yl#cVU@HNi0aD'KK6Mij0c%e1M3e4%pACR* -eGhk-R+Q`Ylh$c-['`,+ZYlbdV+qbTT4j9$p'6Ne,4N0)q05ml6&CVMDQl`,1 -HMT+V`F'iZmhEf-ZiRib%J(9MA@PaC9!r063i-#8U3&CLERCcGB@8Q*'*NkLl`EZ -fZ,5SSU'KUkqSST0lF'TG8dBk0cFj2N4$16%c294XHSH3!*DKTD'GRDHcXUqc`Fr -1`,@VRC'*J(&J99YK96id0cJf-Lie3NTBF)')P*Z@N!#-N!#KY,l#`Ebm`m1mXTZ -(Ji5*Mi0S88-h,bi[-$9!46ml5'9fH(YkHBk[[E'UXlLbV+qeZ-25cE@RRj'&Hfj -J88a14$Jl3d-l-bdT-e0dJS5-PC!!M+#iXk+PVDZbbYrGbE1JM)##LB*`Df*,3dK -#05mZ+5Jf8'GVERb"HAq0Nk5rbX6"a-+jXEI'alQXSTQ4LiTmA83k0cJr5Nj$1$3 -a0dPFDR0iHS+G[-@fTU5NR*DSb0E6e-ZcR*+1Jh0VCPpE9Np*4M`V)bNe2NaTKj' -'Ii1)ND'd[lqp[Er%dGR1[EHXQTHHR*!!HPj*16)j3d!f-c-c0d"3Af*TFh1!RDq -h[lkXR+'c`FR2cX@qYUZNQik&FeT-68p26%8h+bFX0%"@DQa`IiU)M+1fXkURVVD -i`Y(3`lL[S*bMS*!!J(&E4N*(5N8m-bSL+$T%5PaQA9aeNCbNVEHeU+Lf[,h"a,b -[UUZUUU15H&p24$j#5dj%0c%U*bp!5djCEhq%MD#VTU'GQUDj`XV1aEffUkHUTTU -5K@G16P4346JZ+bFR-$8h3Ne4@'9iLjHGRjbHUlUq[mA$ZVHdUUQf[Db-FfGG88G -'5d3j1$8`06e%5NY0@@q,RU+IRU#JS+Ud[FA'[lDdZm'lUCL)FfCPB9C-48%q0#X -Y-M3m4%0+BAZ-NjHDQCfUVkklcp$"[VffZ-($ZU@4K(a`@dJr16Fh0$)e1MSi16Y -"8fk'Q+5SU+LRVEHj[-E)bmr+bmQjUCZ&Fh&cDPa02c3a-$%e0MFj0ce-@@CjLC5 -@NjZ[Z,5f[EqlZEUraX@jTT@+Ih9ZDPp+1cJf,bXa16Sd-MT%9@emJBUBSUU`XV@ -r`lfhYX,1c-LpU*@+LB*Y@eG42bmX-$3c,bma-cP$8Q9eIiQ6PTHNYVqpYE1l`mR -1cFI"YD#1IRChEeP)2$)c-bma0$)b06K"8@*`I)1,Pk1[ZVkm[,r"`mR0cp(+XCZ -APiPfD&j226-b-6)c-#iZ-$G(@Q4TGBD8R+@`ZEl!Zl5e[FVAeXQpYDUFLAKaD&K -'1cJh0$%Z+b3N,cT(9epUIiD"MULf[m+l[F6"`F[3d-QmXkqNPSPjCNmq1M`m0c) -[+#3N*Lp"6PPXHhq'P+1YY,Up[-$(cpA4b-M%YUQPRj*rCNp"163d06)Y+#JV,$! -p6&KKD(Q4S+Lf[VHb[FM(ap$Bemh!ZEDZSBpjDPT(2d%p0M3c,5FQ,6a&5P4KEhk -2SV'fZX($[m(2hGh9d0$0a,ZaSj0qCP4+36Sl2cBR)5FY,6%q6&CKEAf6T+LZZm, -!ap6BeGACeXc&`,ZjVT4pE9C"2Mdd,LiZ,#JQ,68k3%eEDRk4SDqeYER"aFM2f0l -DdFh0b-#eTC&pE&a03$Nh-LdT*L8T-$8i2%96D(k4RkL`Yll#`XM8hGV6c-R+b,k -[S)ekDPY24MXb,5NL(L-X-6%f2dC3BR@(QkbeYl["ap$6d-r3dY20aX+fSBjrD8p -'58)c+LFS*b-N,$3f1d98CRU2SDHSX,l(bFc5fYh8bm[1bm@jSSGhF@K@36Bd-LS -M)5BY-M3e1$p1CRU&N!#LYlkk[XV4e0E5dG24dY6)XCf8KQeC6NT(1LNN*5BS+#` -a0Me(8PaXL+'XVE'pbY29dXh0dY68e0,,`Uf+EQCQ@dSq16BZ*#!M*#F[1$a!6@9 -pL)U5Sl1raml9fYM4bFI,dGE4[+HCM(CH6dK!0LmX+LJS+LNS+6%q8@ChJj'GSUU -f`XhCh021dYE6dG(+ZUQEM(jYA8`p-5FN+LiV+#JU,#mi6'"cKC+DTDqlb-r1cY, -8dpADfYA,ZUHAMB*cBP!r-#`Y+5NX+bNU,M3q6&eYISkFTE#qb0$6cF[1dGEIiYR -+ZkZGMRpcCP9$0#`V,#dX*L3R+M"!89jZIiH2RUkpbY(5dFl0dp[IfY$(ZDQKQip -pCNSh-bdQ*Li`+#-P+5ii4PCQFRq8UVLp`FA(aX,&e1$PjGM"XUbKNS9jEPY#-bm -V+LSQ)L)L*M*!59&IERQ%QE2$bml+`X62fGlJi0V1`,#MQ)pqCNiq0LmX,#NL(Ki -J*Ldk5PCGCR5*RV#p`XM4cXE,eGVFhGM)Z,@bSBajBdXl-bm`-LmP(KdH)5`p5%p -FEAb,Qkbl`m2$aFlDi1(Jh-kqYl1XST@!CN`l06!Y+bBL)"iJ+$)l3dY6AA#*TEV -"[m((bXR0fH,KfY,-aEUZT**e@NP#2$Ba-#XI&aBH+$!i4e4BBA5+S,+la-c*bGE -HhGhDdp(,`F'mTipjA%3p1cJf-#BI(4`F*$!k2dPEDRQ4U+q[YX$'d0lPjZAGcm6 -&aX'kV*L!C%p%1M%Y+5)H(b)P+M%e0Me-ARLBYF#lZX$#b0ALk16LiGR2bX5dRST -dB&9-3cXa*4S9&aSJ+c3i1Me*ARD+RV,!aF2(e0lJhY[CeYECeXZkT)edAe"'3$` -d+"dD'4NH*#S[0N*5BA5-SUqbYVr0hqRSj1(Bcmr8e-brVT4eAeG-2#mS*#!G(5% -M*5BR+c9&BS5GU+faYm,+cpcVl16KiGhEemDYQ)PpF'493cBV(4-4&KdP+bST-$K -%@R@+QDZma-R@iH,HfpRFiH2MhXqjSSYeC9a64cSX)"ND'KJG*#-P,cp-AA5'P+1 -a[-[CiqMQhYM@f0cIfp,"Tj!!IQaB5N)h+5)I(4iK)4XC(bNh6@GlLCDLUlA"dGh -LjZINiprGi0M&XD#4L)"[@NBb)a`D'4`I)b8M)LNf3e4TI*!!S+r#dYIBh0cAdpE -Jl1lJc,HMNB"aCea*0b`N(4XH(KNA'b-Y1daBC(U-PUDmcYhQiYE6f0cJjHAIdX# -XQ)GkE&P%0#dU*4mI(aN5&"mU08PKEh9qM+1lbG$Eiq(KiqARj0cBd,fYUD'*E&C -$-bFJ)#3L(aiD'4`M-%"1B(@,RkqmbY,@e06EjZhbm1MFblQYT*1$H'0*1#`N)b! -E'4F8&b-X-Me,9Q9kN!#T`Y$@eY28fq(Ql1cPiGE$YDZFLR"@4MX`+LFL'488&"B -F)c!r5P9MGT+XZXM9e0(DiZAVlZVNfXr([+qNN!"c@dNk,bSP)4iC&439(#J`-ca -2CAkAUl[(c-h0dYrTlr2[j0M4c-#XQj'%DNmp0#XM(KS@%a3F*#NV,cY,@'k1V-, -2d-c-dYVMkHhYlqcHcX'dT)jaAP9-36BV(a83%4)@(LNb16j%6fQ+S,$!cYEEhYr -IiH2PiYVDfp2#USabB9)X*L!A%!m8'b8V,MP+A(#&QDbla-[5eq$Ym1AGh0l -IfmkmUCQ%DP4'1c)U)KS8&4NE("dK+MG$9@f#PUZh[FE3fH$NjqRQj12GeFl$VCD -#EPa-2c8U(4BA&a-9(#8T+c*!8fKmMU@laXV9iH2IiHAMh0cRkYV$VjQ#DPG-3cB -V*L3I'"-6&aXJ+cP'9@PrNCZPYXI6hqVYk1,IiZ6JfG6,Z+#)G'453$3V)aXA'4X -B&4NL+6%p6fCmMTbUZFI9iHAPjZATkqAIh0R0ZU1,GQ993c3T)KdC'4NC'"NG*Li -j5f4lLCDS[XV2eYcIiqISkHMRiY6#XD'1IQj@4$JV)amD&KFA&4JI*M%q59P[KCL -SYmE2eH$Uk1ASkqIKfpA,ZkUAJ'TC5$8Q(a`F("N9&KNH)LSf4eTYK*QUYmE@fpI -Cj[$ZlHhQhYA)Z+UDK@jD56JV*"mF'"8@'"NF*#dh4&GVJ*5PYFM5eYlNjH[Yk1M -Ti0A1`+bBKA4F3c8[*KmF'4B@&48C)5`h4&4PHT'PZFM0e1$RkZcYl1VRh0,,`,+ -LLQpA4$Sa*KX@'"S@%4)E*#S`28eLIT5MXVr0h1(IiqV`mHhPfY21`V+FJR&Q8MN -U*"mE&!i3&KJF)LBY1NPHFSHL[-[3dpMJk1cVjqMVkq63[E+LL'jB58)h+4iA%3i -4%K-A(5Ff2N08FSbIXEr+fqEQjHVam1cTipV5bVkPLRCN8d%[*5%E&4)3%"-C)#B -U-80FF)'AVm24epMKkqlZm2,VjHAHbl1JNS"S88%f,#%C&!m0%"8C(#-X08*5CS' -DVEh,eH(XlZcZlHITlZVHclfRN!"iC&9&1#`I&K-4$`i1%KSM,$G%8@4mMk+ibpR -Nkq[Ul[$VkHAKhpI$V*4pD&9"-LSM("B4$3i6&4JG*6"$9@9iM*kaaGAIjqrdmHM -NjqVSiY+qVjZ"E&K#0#`M'aB2$a35$")G+$9!5epkMk#b`-cFk[,hmZVVm1lLeY( -,ZCU!EPa+1bXG&a89&"!0%"FE)bik6fCfKCU[`02Rl1ETpIMak1ARjGI$XD#2H9p -)0bSL(4F4$Ji6&aF@(bip69aYK*kd`mh8i[,dlZlZl[(UhYE)XTq2H&j*1biN'a3 -4%a)2$"!D*5mk4e9XL*UMYY$MkHRVpIM`l1[MhGI+ZD51H@C61bJI("N@%Jm1%"3 -A(#Be4Pa`I)qV`-cAiZRYm22dp2,UhY2'Xk5@J@T415dS(4-5%K!2%"!A)5Fa39" -QIC+T`-c9iHVZlZrbp[6Xj0E%Z+L4IQe92c8T'a85$`i2$a%@(bXh38PCGT1QYmh -Ik1VUlI,cmI$Xj0I+`V1BI@P@3c%P)"dB%K%2#JdA)5FY1e*QGSLLZX[9h1AZm26 -mqr$Sj0h2ZkLFMh9B3c8V)KX@%3d1%4-6'LJh2N49FBkMYmM5h1IZmrAcmIEdip( -*aEQJK("I5MFT)4`9$3i5%!mB)5BV0NCBESDGYX[Chq6SkZrhqI(TjH2FaDkGLR" -C56S[*amB%JX)$4)@'b)Y1dC8DB'DX,r-fH2XmrAbm1lTjZ(6aEUPLh4H5MX`+#! -A%!i-$3m6'b3X08"4D)#AV-$2eplUpIRfmZhSjGr@cF#TMRTN6$dc+"i@%K%2$K! -8'"dR-d&6CRbAVER'eqETkI(lqZrSk1ADblbZQ(YM8N3e+#%E%`d-$a%8&amT-$a -1CAk6TVV'cGcZprEbmr6[jZ$Hdm#VPB&X9%)h,5!8%K34%")6&KdP-$j0B(b8Skr -!e1,VmIAhpqrSk1AGd-+bQRpV@8Bd+#!E&3m1%438&"FI+MP0CRf2S,6$bG2Nm[E -cmrAdkYlCd,bSQ)PfA8Jm,am8%"!4%K)9'K`I+$9&@h+,S+qqdYrMjZhbmZrYlHV -Kdm5YP)&aB&"",L!D&!i-%")6&4NI+6G'9QZ%QUc!dq(Rl2$bm1hZmI,Tf-DaR)K -aAP&"-5FH&4!2%"!3%KJK+cK*@@TrP+@hcH(Zmr2bmI([l1IPfmLdTC4pCe-q,53 -H'4B9&"%4%a8F*c0$9fYqP+QpcpVJjqrfp[2dp2$RfFLhTC*qDeK&05JG&a-4%4) -4%43D*64%8f0hM+#fc0rTl1cXmr[jm1cUhXUiUjU%EeT%-b8G'aN8$``0%"-B*$) -q6@"bKCkhb0AJkI(blr2hpHrQfFr%XCZ)FeT$-bJI&a8A&K%1$!iA*#mj4ejeLCf -caY2FiqEXp[clq22SfXr"VjZ*Gf001LXL("F4$!N-%43B)bih4&9TIjQdbYIIj1V -Zm[6eprAVhY,(Yk'1H9j(1c)S(KB6%!d,$4)C)bde3P9RI*Lb`p,JkHcXmIIemZl -Uj0R,ZUH5H9p,1LiQ)4mD%3`-$!d5(5Nh4&*SJjQTZmh@fH2br[rlqI2Pemh&[Dq -AI@YA2bmQ("84$a%4$a-D(L3Z1NYPIjLb`XRAiq,Nl[AjqI6VipV+YkHAI@&54cJ -V)a`8$JX-$K%A(LB`2%KEH*+RZXI6hHEZmr6cmr$QiGl4`+qDJ'K84$BY+#%B%!i -1$3m8'b3Z2%pJFibMXX,6hHIcq2RkpqrNhp[3`lHPLfpA46JX)K`A&434$K)@'4i -S0N9EH*+QYF64fH$Rl[6kqrA`kq$6`kkCKA4N8N!c+5%C$`S-$a)A(53X0N09E)1 -FYFM5fZIcp[$YlZlYkH6EblDJL'pC5%!i,"m@%3m1$!X3&b!X1849EiD9TEE-i1h -dpI2cm1[QiprCdm1QM(KK66d`*amE'"84%"%3%4NM-N9CFBHATVM(dYlUm[IjpI$ -Xjpr8alDLNB&Z@%3e*K`B%`m3%4)8&KXN-$e2C(Z@UlR+fq(Mkr,al[$bl1AGcVQ -MMheX@NSl,5)D&K)2$`m2&"`Q-6e3D(U*RE,#eZMZlr([l[$XjZ$Dd-+[QB9cA8B -e,#-E'4N@%!m5%aBI,6j4C(H-SE2"c0IPl[,bmHrVkHIEb,HYSBejC8`j-#FF&a8 -@'"F3$4BL,6T+AA5+RV,%dGVJjHVZpIVflHAFcEZUR)YjD&C$-LBH'KB3$!m5&4` -P,MP%8fL!NkV(fGcKkHhZkqIUlZMHeFLiSielCNir0LdP)"XA%`m,$aJL,6K%9@T -rNkQpbpEMk1RXm22cl12FdF+hV*ClD&C$05dN(4NA%`m0%"FJ+cK$6f0lNDHpcYM -Ei1[am[2bkZ$CdFHkUTD#EPK'0bdS)KS8%3i2&"NK+c-q69jdN!#S[Fr9f1(XmI, -Zk1ERiYI,[+kGJfG54$Xe,53F&a%0$!i9(bXf3%YHH*!!SDqqdH(Skr$epZlNfp2 -0c-QkRS"VA%Xj,LNN(aS8$a!8'4dL+cT2C(H-Rl,%cG(Gl[MjpZlPhGVAc,qdTj* -h@dBk05mM'489&K88&"NL,$P(@AD9U,@m`XlJkr(fpHrXkGh6cF1bS)YdC9G'1#i -M'a84%4)8'"iL+69'@h1(PkLkbpMKlIAhp1cMhGcFeFQjSielDP9%15dM'aB8&KJ -A&KJG*6*%@@k&QUUhapAHk1ramHcQjZMJdF5fTj*kCeY225`M(aX9%a39%a8G+$0 -!9R1*PD#``0$Hk2$emH[Ukq6BcmHfRiq%H'G83#iK'"8@'"JC'aXE)Lp#9QChMU@ -haG,Hk1hYkqMNjHMPf-5bTCQ(FPe036BS'aBA'4SB%a)B*$0"6f0lND+`[F[Hkqh -Sjql[kZAJeXLeSC1)HQTC4M%L(4mI'"-6&4JG*6!r8@0cJC'U`pEIi1,UlHEPk16 -GemLdT*H0JQT22MBX)adD'4J9&4BD*$0"69PTJCb``0$GjZRPiHAUlHlPdF+lVjk -,H@KB5$JY*5%G'aJ4$"-I+6%p5PPXISkM[Y,Fi12Pk1hZkH6EdXQpV*f5KR*F4M8 -Y+#)I("F8&aJF*c!k59GLGjHba-h8h0rKk1cXlHVJeXUkUk1AK@pF6$id,#3J'aB -8&4FH+6-k4&&MHC!!TVh2f0cEhHMcp1hRiGA([E5UQS9bB%`p05mT)KN6%a3A(bJ -a18*2Ah1,TEc)cGIMjqR[m1VJeFr0a,Q`SBTbA%Xr0LmU*KmB&4BA'b)X0N"0Ah@ -+SEI"aXh@jI(clqcNeXh*`VbcRiakB%T#2$)T)a`A&KB@'b3X-MT*AA''RV1paY$ -EjH[Ym1hLep$+b-+`Rj&jB&0*26-Y*KdA%a3D(b)S-ce'9Qq(QDLfa-rDjHcam1E -EeY(-bF@kTSpkCeC)2cJ[*"dD'"SF("mR,69&@h1)Q+@c[mM9iqhdmZMKfY,2blq -cTT5!F'"236JX)KdE'KXI)#!N+M4$9'Z%QD@`[-M9iZRYlHIKhGM4bm1eSj!!IR* -V@NBj,b-F'KSF(b%L*#Ja3&*UJC!!Rl#laYAKjHVXjq(FeGIBa+kLNi4kE&T-2Lm -N(KSC(5%L)L%P-d45BA1*S+feaYVNkHMMi1$Jhpc4`E@SPSCiDf"42biP)4dI)4d -D(53U-Me0C(U*Nk+hbpMGiqMPj1AKfpM8blbQNSQ#GfC226-X*5!H(4mK(b!S-N& -6Afb!Nk5ibp6EiqEPj1,JiGr9a,1RRj1$FQ*33cFT)#!L)KmE(#)T-6j0@farND+ -daYEKjGrEhqITj0[3aVfZQBZ&HQPA4$3Y+58K(4`F(5)U-d"1@@4eKjbeb0AGhG[ -NjprDhYh9bEQTT*Q&G'443MF[+bJM)"iE'KiR-d&-9Q4bKCk`[FrCfGhQjH$JhYE -1aEUZSjL+HfK33$Nb+bFP)KmF'L!U-ca)9Q4aK*kb[XV9fYcFhqEShpA2`l@`VCq -+GfKC56Sa,b`S)"SE(b%S06j#6&jcKCHT[Fh4dYEGiqENhG2,alqcTTb5JfT64N% -k-L`Q)L!H(L-U-$Y+9&TRJ*b`ZX21eYhJi1AShFr,albdXDD4HfKD68)i-LmX*4m -H)#-U-cT"5PYeLT5KXm(*dGMHjZVPh0,(`X'pXU+5KA4H68-m0LmT*#)L*#FU,68 -q5PYZJCDUYVh#bYAIjZRRh0(,aEkjVk+8K'pI9%P!0bdS*5)K*5SX-$8l4PCTJ*H -QVlR'cpAEi1,Kh0I2aX'pXU'3!)"bCPa02cF`*b-N*53Q,M3f1%*AE(f0Rl#k`Xc -@h0rJhYM4bmV+`l'INiCdC9T24MXa+b8K*LXV+LSb2NP9DAk1RDZf`-[6h12Mfp6 -8e-l'Zl#MP)4hEQ*95MXX*LBS+5XX+c!e1%*8D(b+QDQh`mrBfpI9fG[Ad-h1aV+ -IMi&hF'CA56`d,LJN*#JV,5ie3%P4Ah+%NU#ebG(6fYrAcXl3dpM4`VHTNi*iE'& -A6%)h,LdX+58L*#Xe2dYECh&pLTLV[-cEj0r8dpE3bXR([EDZRSk"FPp346Xc-$% -a-#XQ*LNZ0N0@Ch@#MCUY[F60epI@f0RBe-r*`,#LQT1(GfTB4M`f-LiZ,b`R*bX -`1NK6A@amM*fa[mI0dG$3epVBep6(ZV1RR*@'G'TH6$ij06-a,#JR+5ie2NC2@fT -fKCU[[XV5dY(8f0I@e-l(`EQZSTH-IQP64N%q163c-#XS*bNb28C0@QelL*kb[-( -'bp$9ep[IhG,$YUqXTTZ1I@YF6N!k1$8a,5NU,M!d280)8f"cMD1[ZX6(a-M5fGR -Bep(([lHVSCU1H@CD8dY$1M-[+bSU+c!h280*8f"[KTkZYEc'c-h4epRBdmR!Zlb -jV*b1HQ0@8%Y$26Sd,#FT,M%d18"*9Q4eL*UQVlV"a-hCiGr9bXE#ZlHfVk+4I@Y -I9%P!2$Fb-M%[-$)h1MY"6Q&iMTfTXlLl`FV3eYVEemc![m#iUCL*I("N@e90363 -Z,#SU-6Sp1Ma'8PeVJ*DSXEDrcG6@ep,+amE*cFDjX+'+GfPI@eC,3M`b,$!`,#m -h1cj$6f*jL)kATV5la06Ef0A4b,qq`mE"Xjq-IR9U@8p+36Se-#md0cFd-64"8&p -dLT5ETl#h`Fc4dp65cmR(b-+dU*f3!(pbEfPD5Mme,5da-c8f0$Bm3dYBEB#-Pk@ -c`-V3dmr*aXE*cmr)[l'HLheeEQ4E6d)k068d-c)a-$-l490PFRZ&MjQSZFR@ep, -,b-M(aF6$[,'NPiYqEf*95$ik2$dj0MFf,b`c3&"MGB5,MjUTYX$&bp2Adml-bmL -rX+@KQT'0JQY@5Mme-63k2Mdj0$-h2NK@CA1(RUZ[ZF2&aF2#aXrAf-r%Z+QCN!# -,JhY`BP4'1MFj0c8c-M-j3%4-@@C[HSQCUlh+c-I$`X2,dFh*`lZbTjL2L(eV@8Y -&4%%m1MJa,5md1804A'0ZIBLAU,E!aFE(bXc0cFc&[V@UT+5FMhaS@e&&3$mm1MX -j0$-f18*-8PPSIC'KUl5l[lkp`X[2d020[l+YUU'8KhYaCPK-4d-q0c-a-cBl3NK -+6PTSFi'AV,V"a-#k[m[0bmM"[X#kUjkBMAYUAPK568P%1c3a-M8i2NK39&YSGS5 -8T,'i[-,(bFV+bFE!YV5fXDULNRpZ@e&5680!3cdc-cFl26p%6eYPH)qJU+Q[YlQ -pbG$5cmHqZVDaUkLJNB&aC&a@6N9!1M3h2$Xl3%4(6&9MGSHATl'`Xlh%aXV,b-@ -rZVLfY+bGM)"bBeaD88G"2$Nh0$P!3%"%5e9MGiUBSD@UXl[#b-[1cF1jZEQcX+b -JMS&fD@&E88Fr1cXj18"#3$p#4e*PHSQAS+DYX,@ramc1bF,![ELdVD@FN!#&I(* -RA94)16%e2d0$38༃Afq#PU@XVDqkaF6!`F,$a-1rZl+PQ)YmFh0bCP9*2cS -k1$Fp3N*$4NY4B(@%LT+KX,V!`m$#b-DmZEfr[VLTQ)b"IAKUA9C13cdk1$a"36p -!3NKCD("kL*5KVE+mb-M$`,kp[Efq[,#MRC@'HR0XCea*26Sl2d*"2Mj"48Y8Afe -qLjDIU,6$b-6![EQp`m+q[EDSQSq&I(CaC9C,4N%q2Mik16a"4djACR9jI)LFV,D -paXV([VLm`VqiYE+UR*+2Kh4PAeP13cj!3d%m1c`q3NaFDh"dJ)fATEE!aXR%[Vf -mZ,UpYkfSTTU)IRPZB&&*5%C%4%!l1MXq48eABQpkJBQAU,Lr`,qr`FE$[,ZkXl# -UR*12L(e[Ae&-5dP%2MXp2M`p5&4CB'TeIiZATV5q`X,$aF+k[-1mVDHQSTf@LRa -ZB&G24N0(4d0!1cY#4NT@BQGaJiqCTV#j`,fi[FM,aEbfVk5ISk1@LS*eBe9-5dT -&3$mr2Mp#48T5A'KaHSLEV,1bXlV!`X,%aVqdXDfIPjfINS"bC9a96dK#3%!p2%* -'58p9@PpQG)UHUUqdZEbq`-(#[lLeX+LSUU5DM(KUCPp@8e403MXl26a"58p9@f" -ZJ)b5R+QbYV["a-A*aEU`UD@SUU+CNB9eDQ"A8Ne'3d!p2%"(69"289jZHS@6TE+ -bVlM$aFE)`EL[UDbYTU#FNB*cD@*F@%p'36Xk3dY*5%a499KKH*!!QU+XXV+f[X6 -%[VUlZE'UUUZMP)CmG@pUCep45%)l1$P"6&*46e0GCh@%N!#ESkQf`F(#b-DkXDZ -RV,+YSTU3!)&cE@TN@%e)3M`m38K,4N0-9&YRH)L9QCZRXlDmb-V#ZE1`VUUQTk@ -BKi#!HQeNAP*$1MY!4NY-5dY*5eGRGB'1Qk+RVVDr`lqlZ,1ZX,+bV*f-Ki4lGAC -bCP9%16Np3NK,6%a-89aREhZ(MjLQY-(,bEqhX+b`YE@cVU5@L(pkHACXB9C,3cp -!3N9'4%9,8Pp[H(b!L*5LVlc*cX5jYE'XV+q[Uk5AMBH#IA9TAe4(3dC'4NK'38* -(8Q&VFRq(KBkJVV[*bF'lYV+cY+qTT*fCNSH#K)&[@8T)5NC&58P%38*(8PjSGB# -!JSqKXm(%`VqlYE'dYDqXUCZ-MC12K(CTAP9-4N9'5%4!380)9'4XEh*iK*DLVEh -)aVkhXlDkYUqQRTZDP*12JhKX@P&25NT15d%p2d&*9f"QF(GkJ)kLYEr![EHf[X# -jXDfSS*D6Q*U5KhYU@P&388j*4%*#3N"&9'*SDQecK*UQV,DmZlZq[,c![E#LQ*5 -@QCZALhj[AP0368Y,48%46@9CFC@TdKC5NZ,UdY,@i[X(![+qLQTDAQCQ6M(j -VB9eA8de#28"!3%YB@PCBA'*[KCUTXV@dZEUfZX6#YUbNRCbFQjZ6Jh9XD'4E99* -(2$Jk38T39PYF@Q*bJC!!T,+cVl#i`FA#[E@TRTQCSD+DNSYjD'0NC&a13$`m2N0 -,89999PTKF)DCSD5UXEDl`-A&[E'QRTbISU+GN!#!HAC`C9a@8%3j1N&)6e048P0 -6A(D,P*kTVDfaZm6'`VQ`UD5ISkLNPSU"HA4[EQjK5MXj16j+8P*58%j@BR#$Njb -LTkfi`XE)`lDUSk+QUkZNQBTpGR4eG@aE5Mmk1N&*68p16P*CCA1#NCHBRl#raXR -*`E@TSU1QUDQQR)k"H(9fF@4A683p2dG-6%P&48PBEAU$MC59QULi`m[-`E5XTD' -RVkUEN!#0LB&mHR9T9N3p2N"&69&,4%*+@'GdJSU0N!#FX,r(b-+mYUbSU+LXVD+ -8Khk!KB"aC9C'3%"$5%Y)4N9#4PCYHAk%KSfFVV[)cmHjXDURUDfZUD#4L)Z*IRP -dCe9'3N9+6NT%26Sr6&eYGhk%KBUAU,V(bmLrYl1cXUUKRCbAMik8PBCY@8a$3%C -28dj(3d%q3P"MG(k!Jj+NXEZq[EZhYVQiYVLbSSq(Lj1@NSGiCP4*38"'5dT*4Mm -r6PpMBfYeJ*+SZ-(%[l@ZXE@j[EZ`STD4Miq1LS0jDeP058Y-4$Xk2N**8PeNC@G -[HBHFYXE'[lHcYVLfXV#VSjbBPjQ9Mi0Z@e058P&15%!l1$P%8PaJC@PVHC'LX,Q -jZ,ZkZ,Zr[E@QPT!!PCfLR)jqEf4D8Ne16%Br2$a#5e*A@9KGE(q5T,'j[,UcX,I -#`lQ`UU'ER*bDQC!!I@aPBPa@9%`r1$Fl3dY4@&eHB'4bLU1aZ,UiYlh![EbkVk+ -ERDHUSjU1H@KLAepJ@8Y!1cFf2dY589*DBQerNCZMVV1bY,r*bm5fTTbDRk1QTjk -0I(*UB9TC98Nl1$j#4NY06Nj29fCrPU1SV+qZXEl'aEqjXUDFRUHTSC5(IAGaDf9 -H8$mh16Sq59*56%G*9fTlM*bPUl#cZF,&[lLaTk@SV+fSRjH(GR"`F@aK8N8p16T -!48G(58j@A@KmN!#APjbTYm('bFR"X++LT++QV+UFLRjmGfaJ9dp)2cY$5dT(4$m -r5PadL)f5RU+MVEV$bmQpYDkMTV#VRjZAMiH"I(GZ@dBl2$j!5P013d&&5P4SIBZ -6QTqSYm6&[lfiX+fXVDq[UU#2JS'%IA4YB%e"2d&$4%9#384*89eZI)+&MTfUY-, -1bVbcVkQPUDfYUTk5MSb&H@pQ@%P%48G*5%C#1cJr6@&dIAq(NCQNXll"`F#kXDf -[XDbMRC@3!)q2MBGpD99(2MT!4da04Mip49&BB@jjKT5KVlc#`,QaUUbcZ,LaUD5 -EM)5(LS9lEf&3480%3Mik2%C,6&*HD'eZFi@HXEr,blfdX+ZRUDkbXDZJPC+3!)C -lF'0C9PG35%G$1cFi28GAC@Y[GAZ$NU@f`F2![VUcVl+aUU'FQjkIQSq"Ff9@6dj --6%Y(3M`k2%96A'*TFAk3!*fQXVkqZ,1cZEqlXUbPQC5ERCD4LRTTB&C+5%P&36i -q3%908eGFBfYeK*ba[F#jXlHjY,1cVDLSTU5KQj@4JfjLA&TG@%T$3cdh1%"*8&K -MD@YfM*bMUl1h[F#pZlfjVD'DR+'PTU'6J(0XB9C26Np+3Mml2%9,5Ne9BA'%Mj5 -IVV@dYEQp[m#kVk@IRTqIRTbBLRCXCee56%K!28"$48G'59"A@@&hMTfTXVDhY,1 -k[lL`XE'QSD5RT*Q(I(TaC@*L@%Fm1cXj2NK,6&"6@fThJC!!SkZ[YVUm`-'jXDb -NSDUXT+#FNSClF'PM@9",3cXk389&4%9+89PQGSD9Rk@ZZ,Ui[,kiXkqXV+HLTkL -DLiCrFfjVAe0)2$Np2d&%48P-699PFhf1R+@YYE[!`,ZfXDZXVDQUVkLEMi*jGR9 -YBP4)3Mmk1Mj"4%G*8&YRFhZ%NTqVZ-,%`EkkVU#GUE5cVDHKPiPqGQYKA&T85$i -p3d3m0MY&6eYTGi1*NCULU,6%bF+jXUfZVD1LUUQHPj''HR9`Ada%4%C&3cmm3%9 -%4e4MFRk)MCDMXm$$ZlLlZ,#YUkUYV+DLQBf)KhYS@P0-5%-r389!1ce$6&9KF(U -!LTZSVlM!a-1jVUbYVl'`V+HLR*1*Ih0VBP91584%48%l16Nq5ePNEhU%Lj+HV,H -r`lkiYV@bXE#TSU'KRjU3!)CrFPa058T)3d&$36`j28P@A@4aISL5Sl@kYV@l[VL -`Vl+bVD@LSCb@Nik!E&jA6dG%3d0#3$`l2d90@fPZGiQESkLa[,qiXE5jYV5aUkH -NSU+GNS9mFfC@68a058!k1$Jm3dG0@'*[ISD-QUUdZ,LfZ,Zp[,5RSDDSSCqLRSp -qF@4C88P&4%0!2Mp!26e+@f&NFSDBT+Z[XV5fZ,HfYlLeVkDJSD5HPSq#G'YL98a -&3%%r16Nr4da,6&CMEi'@SkUbYE@eXl@kZVDaV+UXUk+BNSZ$H@YJ@e9,36Nf16j -"3dG-6eKSFRH*SDf[XVDiZVbjY,'`VUQTUkDKQSk#GfYMA94)3$dl2%"!2d*&5eG -JEB59R+@XV,'jZEHkZlLbV+USTD@KPSk(IA4VANp$2MXl2N&!3NC&5&&GDhk1QU5 -XXEDjYlDjYV5dXDqXUDDKQ)U"IhPVA9*04MSd1$e!3d9'5e&GERU$NCqUXlQl[Eb -jY,#XU+kiYkZLR*+%G@aYCeP358!m1cXm2$Y"6&PNERZ'MC@IUE1raX5jXl@cV+D -QVV5YRj1+Ih9XBPC048&&3cSj3%&!4NpEERf#LCHMUV+l[lbiYV@aVUk`XUfJQ*D -2K(Y[BeY24%%q16e$3$Y!59*GCfpmLT5HV,Hp[m#kX+QVX,5eY+fQRj@,JhGXC&j -85N4"2Mil1$Sr49"HDR9rK)ZDTkkh`-+qYkq[XDkYVUURSTL4M)&bC&C-5%9$4%3 -q16Nl3NpECR0pK)ZATE+jZEUmZE@cXl'ZUkDMSCb@NBGdB9905%4"3NG&2$Sp38G -6BQefK*1HTUbcZ,HeXl1iZE@bVD5IRTkENB&fF9p+4NK'48-p16Sq48j@A'CfK)k -9RUbk[E@[XVbrYl#ZU+HQSCZCPBarDe9-68Y(4$mq2ciq3NT5A@YbGB5EV,+aX,1 -iZE@bY,HdUU5MSU'KPS0dD9pE9%P$4%-r1MFm4e&A@&aUISZ9SkQ[ZE@ZY,UjYlD -[TD5SU+DJNiClEf&98&*346`i0ce(58G-@@9YG)#9TDQXVl#cZEfmYkkRTkQQSD' -LRBplD'"KA8j$3N%q3dC#48e48ePMG)LBSUHVVUq[XlDfYV1YUkHJTUbJMS4pG@j -P@P424$dq3%9+6&"68eGNFi@5QU'VVkkaXl5hY+UQU+DRVkbEMB9lFfpVBeG04N* -"384+8&"-89eVGi#,Q+#KT+beYlDhXkLLT+LUUD1GPSYrGh"RB&Y546p$6&"15NY -399TLFiD2NTZLSUD`YlLbU+5SUDDPTU@GNSGrHAGbC94+58T*5%Y48Np08&PQGB' -*N!#8QDDaXDfYVkfPS+@VVUQHPC'*IhamFf4E98a'5%j588e+6ePKD(4qJB@3!*Z -LUDqfYkbIRD+PU+UQS*U4LB4pH(0TA9*-6&*58%p06%pAB'YeIB'%LT5JUl1dVkL -MSk1KT+LQRjQ9MSH"Hh0R@P0499G889&368pABQadHS#(Lj1HTkfYUDHRTD+PU+@ -JQT12MSk+Ih*SAP959&CA9e436e0CB'aeGRD!MjLGT+QVUD+ISkDQTU1HQC54NSq -'IA9VB&P@@9YC99*38eKHBQG[GATrKT+JTkHNSk'JSU@QT*qEQCH5MSf-JR4RB&e -GA&TD@&069PGEBfY`FhKlKjHGRU'LSU#JT+DPSjkANT'6PC++IhGZCPpE@eaE@PK -@9ejNCQ4PEAGrLC@HSU'FQCbHS+@SSTZAPTD6Mib)JAP`D@CPB9aB9PCCA@"MCQT -XE'pjL*5ERTqFQTfJRjfGRTbDQ*@9PBq$HR4`EQeUC@"F@9GBA@&QDQYVER4mKSf -4PCUHS*qHRk'HPT'8PjLAPBq(IRGaE@PSCf4JA9aHB@0MC'CVF(CqKif4PTD8Pjk -KSCqEPj@6NT19P)k'J(PdFR"UCQ*HAQ&MBf9QCQGTE(0rL)f2NC1@QCZER*bCPC5 -9PCD9NBU$IATjGh*XCf0KB@&LC@KRCQKXF(GqJSH-MSq6QCbFQjU@NT!!NT5@P*! -!M)D"I(KeFfjSC@4NC@KSCQGRD'T`HB#%KSQ0MT'9Q*ZEQ*55Nj15Nj+0L)@$J(e -jG'eTCQ9PCfTVDQPSD@ebGhZ"KBL,MT1@PTD@P*'2NT@9Nj!!M)L%J(jpHhKbE'P -SD'PVE'TTDfe[FRKpIi#$L)f6PCD9P*'2MT!!NC'5NBf)Ji'"IRTfFQjYE'aYEQa -UDQYYFRCkIAk!JiD+MT'8P*+3!)q3!)q2Mif,LBL(KB*qI(PbE@aYEh"`EfpZE@j -bGAGkIS+%KiZ2N!#2MBf1MSk2NC!!MBU(KB1$JS&pH(9cF'p[F("`EfpaFh4hHRP -kIS+'LSf1Mik-LiZ0MBb0MBU(KiD$JAppHACdFh0cFh&aFA&bG(CiHRYpIi#$KiU -,Lib-LiZ-LiU*L)H(KiD&JS"pHAGeGA9eGACdFh0dGACiHRYpIi'%KSL)L)L*LBZ -,LiQ)KiD&K)5$Ji&qHhPiGhCfGR9fGRChGhPkHRYmIB#%KSH(L)H(KiH(L)H(KS@ -&K)5$JAppI(YlHRPjH(KhGhGiHRYlHhapIi#"Ji5&KBD'KSD'KB@%Ji5%K)1#JB" -qIAamI(YlHhTkHRTkHRYmIAeqIi#"JS+#Ji1$K)5%Ji1$JS+#JS+"JB"rIRjpIAe -mI(amIAepIAepIAjqIi#!JB'"JB'"JB'"JB'"JB'"JB#!J(prIhprIhprIhprIhp -rIhprIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J!!!,d!!!3! -"!!8!!!#J!!'!83!!!!!!&!!!!!!!!#m@9Zk,S`!!,a3!!#m9!$b!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhq!J)#!J)#!J)#!J(prIhq!J)#!J)#!J)#!J)#!J)#!J)"rIhp -rIhprIhprIhprIhprIhprIi#!J)#!J(prIi##JS&qHRf!JB&pJ)D$IRPdGAPkHAb -%L)&fEh1!KB#!M*QJR)PeER*dFR4hK)TlHhpqJ(KdIT!!Rjk6JfeXGfaNERU#J(4 -XCf9UC'b2S+HSMB')MSekI*HMXVDJQ)jlHhk$PDZcSSb#GfPRCQGqN!#,M)GiE'C -dI)1HTT4rHRpbE(0cKD'MQjQ(GAk!Gi5CU++&F'CJBP*(@QCVHRGQ@946@fjbE@K -PAe4HB8!m@'9VF@eSD'p`F)16NBL!KBGqIA4XG(q"HR&ZEQpfJ(q0QS&fIR9iIhC -mMU'[U*H+NU#JUV+VY,#CSE#HLiL(ND'IJf&99&KRFhf)KRjZ8$Xi28eHEi18PRe -NCh+)RkHia,fQM(jaFB'2R+qcT*&e@P4RE@TrNj+%FQ&-3%01D)@9PSKfD@TlMU# -bbY1kSC'$Hhk0SDfaXCq!DQYcER&jI)*iANe&1$%j9)#CPik!I)++RVE+fH(C[jf -2N!#-M*@TZVQaQ(C[F@GKER4iJAPR8N!q1$eJHi4qC9025P"IEAQ&N!#8Mi0ZA9T -THRk"J'C05da2@'&LChCS56Nc-M!lA(*kH@PRE'4NFB#(M*+%FQYMDRL&QUUSRT1 -0KAYfGAD"QU+2G@CHA&e@9faiE&Y699TJDAH4UUqEJhGeJ)f+Mk#SSj*pEQ4MCfY -rP*ZCKQjKCh9fIjDIRjf5KS"qJBbKVkqJJh0pLT5FV-("Zl1FMSGqI)QIV+bTPRC -PCQplLj1)Hh"MA&aICAZHVUqeTSZ#JS5(NkHLNB9pHA*aGi@NYDZ9F94+6&pcHi1 -(L(aVD@TVFAH%NBpqBP&39QGqNTkNSCQ0JACeJC'Zc-kiQATPBhQ3!*fTS)PjBdT -!5PT[Mk@HMATQA&jSG(k)LS0lEf"45P0ZLjbHNhpI4d4*9fq%MC'0HfaZE9jNJBq -1Mi0VDRQ#N!#HU,'iYU#(HA"XHTHQTU@DKRTeG(*YER5"KQpJC'0FCAf,S,bTKB1 -#H(GhEfT`E9P18Ne+BS1+JRGKAh4kEfKYFA1)P)&bFh4aFhq&IR0M@QGjIAb#KBH -&HA0pK)5)QUb`U*H0P+QcRSb5PC1DS*k@MApjMUHTRC!!Lj!!RDQQRUUdTCD+H'Y -M98eFEQeL@PCDF)*lHSU1KiH+MC!!M)kBVF#hTCqALiL1N!#@U+qMQjD&F@"-49T -UBeTMD@*[JRTpM)b+NjZ5I@jG9'Q(SVUhQAYfIATiIS##LiTkEQGE9&TLC@KVC'* -bGfYTEh0pMBPZBfefGh*bH)+*I@jcI(b#M*+DS*H*IRC[Eh9iGR*U@8e38e9PF(D -,PBKmGh0fIifDTUkRQC!!LAq#Q++LT**aAeY348Y26P464Mp$46Xq9@*[J(YVCQY -`GAeqIRe`C@G`HAZ"PDDYUj4eDQCJCh"bFfjTD'jdFA1$NjbEP)PiEfGLG*@STUQ -[Rj@@Mif4RVI$Yk56L)@0Rl'bT**rGR0UE(Z(NTfLR)YkE@Z!TlZ`STL(IS#'M*Q -[ZVbpXCCkD'9`KTkMPi*cD@*IBA#%NjQ@Mi0eDfPiPDQbXk@8L)')Q*qKUE5hXCk -$EQ9XGhf+MB"cCf*ND(+"M*'1JQjPC'b'QCUBNBL#JiL4T+kQSk5IQ*+,KBb@QC+ -"EPeAB'jlKSb(Hh0Q8dp26PPVGh0L99CHB@9ZIj16K(9F4NY99&aZH(Y[984"5&Y -XFhZ"JhpfEfCJ@PpqQCQ#D9C2D(ahHi1#H'jcGQYNB@0aH@pA4%0'6&0BAfPYCPe -CA@9UF(0eGfT34P4VJj5AN!#-L(acF@jRDAL!IAGS9%T5B'ajJATXBQ&RFi1'L*1 -FQSk!G@eVF)5HUU@GR*bFSkbRUEHbRiYiCQ"UFRH0STU*JhppJib3!*@QXUD2I@Y -LFAf'QUDDJA9`D'CSFBUJT+#CN!"qC9KMJ++QMi@0MAq"MTUfb,HXVUHGLh0cMD5 -TUDqiZ+LHRU@eZ+QJSkDLPSfAUkDANSb8RCUGT,E)`lblYD10LSkKZE+NSjqBN!# -+KBH8Piq"FQeJ5d0$@A0XAeYD9d8a0&&`J)q4HQ"126%qBR9eIB4rH("M@QCkL*@ -4FeP168j3@'KaFh*Q9%T08&CVKU'TNA9UFhpeFB+9R*'!GA*XCh5*R+kQKA&cFQK -XJ*HUUCH*JA9R@epeQEl%TReQAP9CFiqJQiQ%KApbBQ9qRD50F&eD9%P@DAkFQB" -lIR9TC@f"QU@9I(4lGh*rL*'GPiGkI(efHB+1QC!!E8-[,MC,BA&kIAGQ@Np$8@b -"PTqIQ(YB-LC(GC'AMi9rH&j'8h50P*@6H%mf-6eCITHHSU5CKA0dKjkjb-DlU)9 -H@S@[ZELhTj+#DeYED)+IXlblRh&58'Z,QCbKUkQ1Efk&R,(#bX[)Vi"HBAZAVEL -dU*Q)H(L%L*5XVTQ"B8Bl3eY[IBD'K(CI@QGkLjZ``EUJL(TjN!#`bGA1ZjKdDhQ -1QjD1NTQ)B$`L+6j-B'aYD&!k-MY8C'f"Q*b*GQ4+4&4UKk'QNA*UGi50N!#3!*Q -PRi4U@8p,8QQ"MSf!GA&hHh4aFS'3!)k)KSZ6NBkLcH$#Nh4fMTH1KAq'Li&[D(C -jDQYZDQT[EfPbIAaqJhaVEAKYEAejEA@,MSZBMS5MZlQaTjk@NBTlGAPlFh&hE&P -9C)+8Niq)JAejIB+(ND#UT*bIS++PRjqTYVUZQS"XFAefEhZ)J@aE5ca$@h5%KS0 -dAP96AA"lIAabA%3k0M9-E)QLVl'MM(abGB+-NBf,M(aT@%P8FTDdVj4pE'&FDAk -*PU#8Ji+-JfpcJCHbXjq2J(4eIBD8RjZ9PBakE'YdKkQkVTU*K(P`L+1bZkQ*G'T -G8Q"cJD'dUjqCMS11S*kCPB&VC'*94%YPJTZ9IR&UC9pLITbKPSYkDfPSC'0bMjq -GQ)PdEh*iKSq,L)GiCf"KD'GSG)'(Hf**3PCZKTbKQiYa@%K%5e4NHC@[XTZ'Kj@ -LVV1SR*U6JhCeH(9lM*HFM@T9@QeeG)19P)Z"JT1@I9P-C(b$Gf&GE(PiEA@0PC' -*JB1)IfPMFSD9KQPVK*U@L*LbZkkCQ*kENAeeLk@`U*LGY,Z`STLEQRpcJSq0Ih* -eKT!!M)4jHSD,NTbMUU#+LCQFNB4jGi12LS+"JiD%JB1,PBjqHRepGfTSGS'%Hh9 -`B@*[HSb8NiYlF@eL88G0BAL(MB9X@9j[HhK`F'CE@dp&89eKBPeQH'j858K9E(b -"Ji0kE@jfG@p[GAb+N!"qCeP@C(*dGB+0KB*rDQk*NC'ETULJQCHHTUHXYF'rTjZ -GPSb-M)U6RT4qGRk*NCD5NC@+GQeVEhU+P*!!Li4mHh4aKC!!ND#URj!!MSKpISH -AVEQ[RT@+IhTmJ)@,M)4fE(*YA9KIFi&hE@GIA&TNIBD(MBGmGA4ZAf"fMTD5MSQ -0NBq@QT@*HR4SAfCPDAL)MRjTB&GA@fU+RCL+K)5%MC15RDkcUD'BL(GRBh'+Q)" -NA9PFDQaUGSH1MB&eI)*[CRH3!*b8Ki+#LT52JAq&LC5DQk#GNC@XYDD8LAPTC'a -YCh4jEA9iC9YKAeYZJACPBQCMCRL%Ki@!JBL-LiL$HS5GSjL$E'4H9epQB'4VB&4 -96%0-8%P3CfpPAPj@8&aN@9T[J*'EPj+1LBZGVDHEQT!!IhYqHA&hKT+DRjD!G@j -RG)@%IhppHAPhHS*lI)f9Q*Q6J'GQJT@1MU1RRjk1Ghk6QU5i[V1NNB+)RU#-L*D -IRC*i@eaSDhqBS+1DJAH(T,'MR*f5KRj[A@9hGRZ8TCb+IR*fLiYlIB&fFhppCPp -RFibQUk#ISTqNVULFRD1@Ji1#FQemKSZ8PiGbFS',P*b6JRKXAf0XA8P4ChQ+Pj! -!Ihk'LTbZT)k"GQPUCe"2DRf$IAGjGR&hIiZEQS0YBQ0pP(pNDhKlHACcGAf'MCD -QTjD-LT'ENhacISk4MBQ-MSH8XE+INB*ZDAQ'KAaeHB53!*H3!)f)KT@LRTLCKep -9BfCNB9aEAQ"D9f9`FiQHLR*jH'&FERq%IA"ZHhaXChD'PUDFIR9qG&K4DRaaA8S -j1Mia,djYHSZ5IQpYA%"(ESGrCPPJEATdDS#NVD'1GA&qFeGAHjQ-EQPXDfTC5fU -5Q*QNNRKaB8eHLkH9G@TRC'&JBR#'NTUGN!#!H'eTITH@I(0qJACaG(@$PjfU`,q -KKR9`JTHELRk1QBf4SkLRUDkeX+'0IAamHhpdA@"jKiL1PB&aIiUCVD11MBjpFSL -@KRq,N!#@TkfHRkba[,UPPjD9LB@8P(YbI(GeKiG`DRq-NCbDLRaY@e0EC9a@C'e -bI)*rKTUJPT!!KR"C6%YCDfT@8QGcDQ0F6e&SGAqASSebBPeeQ*4lHSq6J(9hIBq -QY,'XVTYmG(1!QCQ(IiH-K(KYC@9iMBf4RT4lFAQ#K(piHBL4NBf*LBH3!+U`PRG -N@P&299TRD@CT@e9SEepFHT+5NipmFR*aGAq'IR9mG'CZHRQ$R+LUU*0iEA*hH(K -dCfGeE9PG@d9)BfaZKTU'EQGIAf"B9@&lM*1APC@ES++[a-+TQT''JR9JC(k8SkQ -KMRCLA&pXLCf@Mj54J&p*69KLEAU%I@489@"fLSk(P+'3!(CG3cG&Ah1,RT4jBPa -MBhD4Lj!!SC9lC9ePEhL)RVHpUC!!K)QEU+'9NiaqGQYJC'ekM*LBMSH%HhGiJT1 -1H@pdIRafGhk0PT'4R+QZVDHXbp#YPBk$IAeeDh&rJh0UFfpZIhpjNjpi9dj"3P" -@C(b-KhCqP*kQTjqQ`Ef*D@0A9PTDFSb&GRKiFhPkHB+)MSYrK(PIA'0XJj*qDi# -,J)D9RD@fZTq8RT5!HA4cLU#4Jj+EPj15N!#6PSU'PT!!F9a36fkBS)f*Q*@%KBU -2PT!!Mj@CN!"[9PGHAf&cKj15K)'%J)4kBQL*RS4C69455e0[Lk1TPik6PT!!Ji@ -FYm1cNhGTA%)e4fCmGfGUF@GA589HL*PpAe4%,4iU9(U,PTqUXTjqERH4SkLLQC! -!F8Nk2e&SIj'DR*4pC&TIBhHFSSTY55dS0%K56fH0NSClD@&dKBD4TD+,F&0%8QY -`F*@hUTD@Li#)JRkEShaE8NpFG)'"LUL[P*5YVkHUTDHiU)0hHR&ZH(KdIBZ'D9e -RD'YYCB+MJP42AfYfKj+PYkqMSU@ZYVQjaH2IVj!!KhYiH@TRIiYmHS1&Mj@6R+f -kVSPS9NY6BfTrQCDATkHHQjUIUDQDKhpjE&eDDR9eDQ"UG("ZD'*fPT'%Pj!!D%m -j+N*PD9K5BAH'LB'#SVkZRk+JPB"J8(#4KR9hK)KiER0mMk#IR+HRL'K69RU*JSH -,NjU5KAq)R+DVV*k0J("GAA9kEfphKBCmH(erJ)H2Q+LSNheZCf*TIiU,Nj+(KSZ -(KTHUUjf8MS0c@Nj058Y06&"CBejFE(TmFQ9LAe%k,$0"8QCTE(k(GfYdJjU`TSk -,NSKbE(U(L)*eD'PYCPjIFBb+IB'#G93i0$e1@94GDQjU@eadMU1TTk'9LA*EBAU -'Hh*mIQaKCA+"QlDdTk#BLhTjLjQGSkHUTk#CNj1CSE#mYU#0JAPqLj15LiQ*I@p -UERU'KBQ9MAZ"LSD(Mj!!NCDAMiL'JS56RkfkYkD8Mik-M)D$L)*ZAPpSDfedJ*5 -HN!"cB'*I9ejUH)D%HRb)N!#,IB'9SU1EM)Q4M)'#L)k5KfaJD@TG@fGbJ)CfEAq -,Gf9ZGh4aFA"lNjZ4Mj'CT*q@NjkKN!#1RCf6KhGeJSQ'Kif3!)Z"K)CfITL@PUD -LNB&dFRClKj5IQS"cG@j[JT!!MTLRMQeUBPTSG(KlHfpF9&KE9Q&pL)Q&Ef&QAeG -NHiU4M)"pJiL"HBqVU+#8FeT@5$P2GAafEPC(58p,4eCQCQ"54Ne99Pk!R*H2LiH -3!*''JBfZb-+RP)TqF'"NK*b5Gf4JA9GBA@k2Nfj86%%q2N&FK*5%FQj[FR9kJT5 -SRiU,MB&rHh'!Q*H-L)0mG@ebJBU3!)q-Li&hHhKhP,'QNj1,LjQBSDqRSkHZYUQ -FS*f8QCQ*KSPiG)5)NU'8JS5+J@j`KC'5PCL9Pj@0Q+UdbY+jVl5RQ)q*Nk+DM)9 -lGR4aFR@$NB0R@eYF@e05EB"lKT+(H'eSFS16QjL6NBk0MBQ+N!#!Fi10H@a[GS+ -)K)Z@LRPlI@jND@aG9@YiD@akIik@M*!!QC+*Ji+*NTQCM)bHR)4pKjLSSj@HUT9 -mHRf"J'pH99CQF'GKES"qGS@EQiKpIS54LRKmIAQ&JQpYGR4RChf5PBamFi'%AdP -BBfGZE'GZIRpZEBUQTT+"K)TZ4d*+8Q&SBQ0ZDPG*8'YlG'TTEfY20$G)89YRFRe -pF@PKE*1RQj1AQT*jCh&kFAD&MC@4JR*RG)qBPCH6KA4F4%&$3P"LE@TCA'GVJCZ -KSU+2IRP[DhZ#IBbPT)YhHS+&ND+UZF'MN!#6Jh9lI)'JXTf$I)+'JjDme1(5T)f --JRq(JB+DR)4bDfp`DALDYXV'VD@QNhedFRq4MBQ0MC13!)+5[pR6Zk1GR)TcD@e -eH(9dGAb)J'akPj10NiZ,NS9aD'GQC@0ND@jiGQYqPCLLS)q9Q)L&LAp`DQYVEhG -kG(D)LAb#Ki#"JB@0Hf"A@PeMD@YZFhZ0QTLJS)b*L)1+KAPhG(4fFhD(PjbIRjL -GRj@9NT55G'CaG(9jFR+"KRb%QUDdZD@8MSGhC@0MB9p@6eYZCPYYJ)LETCkLTCH -!C&TA6eGSG)&mC@"hNTkTVULNPAPJ6e"86dp6A@jU8deDC@KXGR9XD@KH6dj258a -FDh*VB@9bK*LRYEf`PSGlD@amJ)5*JR&K@PpXHS5)M(jE4NpD@f0N@9TJA&YB8ep -fN!#QZXHcNB&lEQCiKB+&H'9XF'GZKU1b[XD`NB1%LSkCT++3!(PhJS&pJj@acGI -5[Tk-LS1$NjqBJ@PKC@CXHiQIXUfZUC!!IR0`HSL-GeY6A'YcH)QFYFI"am5MMSk -2N!#CNh&E@&eSFAPqKC51IiD'GA"cFA0qF&*'3djPG)#,Mj@ARV@iUD+JSD+FLhC -TBQGeISD2Li&cFS+$Hhf#Ji1(K("M@Q&iJSL&Ghb%M+#NQ*58MB*pG@YUFSQNXDq -BKBb0MjqCM*+8JQTSDQ*MC@f&NSThERZ'MD+USU@JJfpaDPP@@&edL)"ZDR9hJU' -USD+@HfGC5%*29QD%LRYdGS#(PkbaVkD2H'jU@8T6A@TpH@&15NY)9R"rJAKXC9Y -02$jBDRH+LAGYEAH$P+qhUk'@LRpbCf4YHB+0MhpZCQ0JD(arH(9[E'GJ9%Y8BQk -"JfjNC@KeMCkDMiPrI(aU@&pVEAqFSC@6NT5KTkZZUD1FPBf!G@pUF)'DSBk)MTQ -XX,#dUCkIS*q1H'eUF)5DQSf0NC1BNjQQQBH(LSGkCe91B(qGTjkGTUbVUEDqV*@ -2PCQ3!(9A8Q4iLipqGhTaCfahIhCVFRYhBdJp49"PKTD@RCU'K*DSU*D+N!#EPi" -UAQChJj1IR*4qDQjmLBZ#IifEM'jE9PYRGT1PSCH#Eh@0Rk+BP*U@KQjMFi#%NkQ -XS*Q*Eh5)NC5,JRpdC&*$5PpVHTUUQSf$FRkHXEZkU*Q+G9p08'4dKjb8IATY@Qb -+PU1NLR*RA%Fj3PKaMk#@Lj55KT+RVlDYLh*YC&KCBQjmJAaaCf"44&9eL*!!JQ4 -A9%Bk2dpNHi0hERH(L)16VE1SP(efI(PXFBLCSTL#HATdC@*hMj+(G&a28%a'9Qp -[D@YPAf9[FRZDTj@*IQGIAPKIFSD-L)9eFB'-MTLXVTL4L@jQC&pRHiZ-NC5+LT' -8RlE0cEfdU*1(J(Z#LiL&MT''JSD0PD'YUTZDQSGkFQYVDQY`J)Q&M*@DUVV'aE1 -TST@2LiD$KBL+N!#,JBH)KS4rLC'!GA0R@eG33N&4AQPVDAU,LSU3!+'TQSPmH)# -!H(CmKSQ,KRk(MB*jIBU*IRYhH(PU@eKID@j`Dh#(M)+$ND1UT*U4M)4mHS#(KBD -(J)DANB1'Pk+CLi@#H@YE99YMDA&lIB'1N!#-P*qSTD5XU**fCQCVFR4dHAGfJ(p -lIibDPiq6MAGM@P*39PKID'CSH)1"KjDJSD#PTjCpF'YZH)#%IQKAC'jRCfebGA0 -YAdir1cp&8Q&SC&PHGiL)MCbPTCq@NSPfE("qP+HPMhKVEAKlIiL3!*!!Ki"lE&P -389CQH(&F894MG(b*Qjq6KBH1Kh"EA(52PSPiEfpjKT'QZ,@LNj+4Kh9MCAf9QBP -iEfq$PTQTZ,#KQjZIS*4rHB58SCq4JAL#M)fETTU0KiD&JRYXB'"XHheaC@ClPk5 -PT*kCPCHGS*k6Jhq+Q*D(I(9pLS&mKiGjD@*QD@052Me9DfYNBfb%Pj12PTL3!)4 -kJj15JR0bKCQEKhGfIS&dDhD#KS*pK)k%DeYDC(0hF'pcGhTjISL0NT!!NkDVPAp -iHB#*N!#1M)k-LB4rJSU1M)H(JR"F8PKTHB5(LBQ)MBf+NjZMUD5FP)b!Ghk,PU+ -MR*'*KhpiISQET*D$IAGR@@"ZGi+(IhZ%LS0qKj1MVD@BNSepFAf0N!#-JAGjHR* -M@Q*XFA&N9PK84804C'eSB@&UGAYiGS@5N!#'IATkGA0jM*kGMRehI(YmHR@!KhT -aFQeK@&&IHi0cAe48@PjSGAU"K(TcGAGdEfq$QCb9LAjkIB+1PT!!N!#5L)5(KRT -ZFAb(MBQ"HA0fISqKRC@BQTUBPT11MT+AQCbJQ)f(L*UJKhQ"JAPiH(9fGhClKBU -,KhYfJT+5J(Z$JS50NTUKPiH(PCbIRBq(LSf!E'T`E'9MD(0hC9PKEAGqJ(YlKiY -rFhU!GfpcHi1*JRKkKC'CR*@+J(PcER9rFf4SE@eXC'0[I)5$J(KTBf9SDhk8NB@ -)L)'!IRTpLjQJUUH1HA4bGSbKP(ppH'YRCQ*VJC'CS*Q$GRGiHj+ZUjL3!)Q'M)Q -(MCDMXVL`RBPmFh+&S*TqF@GJC'KYHSqIS+#BL(jcEhL4Uk'#Gh9fIAjpLCLDP*1 -4KhPN9PakNS*I6da-6dp@E(eqGhKlGQjL@@U*PS*RB@*QE@abLCL8Lik3!)U"F@T -fLT1!BP048e98BRf#H(*[E@PJ9&0SK)eqD@*LAf4`IC!!QjQ3!)Z1M)*iH)@5Qj0 -lF'jVE@pfLTUCNC'5Mib)L)kGVUD2LBZ)Ki@'NCfMSCUDQC!!KS5*MSq$F@a[FA4 -bG)@9Pj'4PC+-IhKrKSb'G(#!LSCqIiU1Mik0Mj'*HAL"IRKYAPpZG'TLCQjiJAp -pKSKhEhf*KAaaC@Z!KRaiJBU,N!#@PCD4IR@&NiGhDPGACfaTEA4kIS1,LiGqFA5 -2Tk+5KhPaGRTpJS1%M*HGQBepGB#BU+19LACTE(0lJAalKj1DP)0cEhqATD5CLhT -XDA*rLBD&MCQIQSepG)'BTk@BJfC269PXHhf"Lj!!MiTqF'YeLTZHPi9XAf0[HiD -)K)L0M)ClEQGYHiL,JQp826T,A'GUDQeZFA0`DfKXHiL(IA0P@Pp[I)D*Ki+#KiD -%KSH,P*H-I'pF4dKHFRjrH'pVE'TREAL"Liq%G@pP8eGbKj!!Mi9pHRejF(Q-PTq -KNS*rG&jGFB#*LB&mH(9ZD(Q1PTbJQ)Z)JR0eLTH@N!#2N!#2LiD'PULVT*k5Ki* -fD('#KB@(Kif1Ki+#LjL6LSZ%Hhq$JB@3!*!!Ki&qJ)*qIB')Mj'-JhK[F(9hHAe -eE'PSDR"cGAZ$KS0rGfPKDhZ%LSb)IhCcFR0hI)#*NT@4JfaGB'piHRprGQaRDA* -rKiD+NC+2KR0QEAf$KSZ+L)0rJSH0Nj'9RD#LRSjrKC'1LBf-JRGaFhU$L)+"KSD -'KAYhJj16Mik)J(ajHi13!*D5P*D1LSTpFRf+K(k!I(4[D@TfKSq2LB"eFR0YDRb -1N!#1MB9pHA*YG)#%JRjeEfeVCQ9bIhPaF'jVCPYBDATqIRPYC'"C99eaIhadFR9 -jG@p`HS1'KS5!J(ecFhq-Mi9hF(*dF'a[Ghk#JAadE'4IDS'3!*5+I(CiHRKlKBb -0M)U*KAjfFS+FUDD@JRKiFh0rKiZ3!*+4NBf"Fh'#Q+5QQiU$IhPlKSq6P*@AQ*1 -$GRH%PU@PNAefFR4rMT53!*!!Mib0KhYbG)'2QTb2JATcFi',L)5$HhTqHA"YG)+ --P*H+HA&UE(f-N!#1KhekHh9[EA"jKBf-K(KaEh&rLSD$JRYhGh*[FR0jIhpqH@P -IAQ9kK(plGh&ZE@Y[GA9iIRaqIR4bH)54P)f(KB0rJ)#$LBQ0P*!!MBU!IB')NjD -+K)9mFhL"M*D9MiZ"I(aiHB+-PTL2LBH"IB##K)L'Ji9qFfpZFAL%N!#5M)b1JhC -hI)#)LiU-KhaiGhU!K)L&IAq#HA4eF@pdG(4kH("`GRYpIS5$I(f"I(PiFQpcG(9 -jEfCZGhq%K)H&HhZ$K)H0LB5&JRjkDf0YHSD0LiL$G@jaGRYqHRQ"KB&pEf4YHiH -2MSf-J(CiIS'$KBD,LiH"F'GcIBH8Nj!!MiGqJBH1NBb,NT52KhP[G(U%MSb*L)& -mJSb5N!#-M*!!MiCpG'pkJSD3!*!!M)KmGS#0NT++Ji5"Gh0bFAU"K)L$HA*SDhU -'MSk'JS9rE@KVEAL&LSb,KAT[F(Z(MSq+KB&kE@ecGS'+Lif*IR*UF(f*NC10LSP -pDQ*JA'CdHRelG@pUEAL#KS5"IRPaE'pcG)'0Li9pFfj[G)#,MBU'J(jmGhPpIB5 -2MSCpHS#$K)kES*b9M)D!HRb"JBH1KA9UCfjeI)L@Qj5-JhjrIRerISH3!)9hF(* -qL)Z8RTqBMS@$JAf"KiD,Mi*aC@0XGAb'Mj!!L(pjGRChI)&qJB9jDfCQF(q)MBq -,JhekHhajIiU*LSf!F'TTF(b#L)q4Li1!JAjpJiCpHRaZB@4SFB+0MSf,Ki1"J)# -"Ji4rIRjbD@PSEAb"JB1$JB#"Ji5&L)Q%JS*jFA0hJBk8PC53!)k3!*'2N!#4M)@ -"IhYbE'ebHiD,M)b+LSf0MT'4MSk*JAY`CQK[HB1+NT50LBQ+M)k-KB*rI(KYAea -LDR"iIRjrJB"rJB&pH(GhGRPcDQYaGAZ!JiD)Lib0Nj@3!)Q&IRTpHR&[Eh"cFQp -[GRq$L)f,KAacEQe[EfeaFh0iHhCjJSH+MT5ANSKqGR0eGACkHhPpI(9fIB5-PCq -NS*D-KS@&JS1*LSH+LSD(NCQFSUHTST5(JAafFR0iHhPlI(GiIi1'MC5DPiPrHRG -fGA9iHRYqJi@'M*HHRjqIQif"I(GbF("`F'jZFR*[FRb&LSb0M)0fF'j`G(9dFA" -aG(4bGi@5PjQCPBYrH(0`FA0bF'jZEh"[FAk*Mj'5N!#(H'jVEA&hH(CfHAamHhk -(NjQCQTH-J(KdFh4fFh&aFh9dFhD!LSq3!*19N!#&IRTjHhppHRKjIAq!KT!!QCf -FQC5,J(TeF("cGAGkHRYlHi'*Mj+6NSk(IRPiGRGkHRPkHhalHB14PjZGQ*5,I(4 -`DfYYDQPYF(*bFAL'M)k2LS4rHAGhGRKkH(CeFR4iHAq-NjHDPT!!L(jkI(KdGA0 -`F("cGhKrLSq5Niq)J(GeH(4aFh0bFR"bG(4kK)Z4PC'-L(jhGhCeHhpmHRTrJAq -$Lj'@QjZCPBb&KB1"KSL&Ji5(L)H,NjQHRjUANiCkH(CfHhekHAf&Ki&qKBU0MBb -0M)*jH(KjI(YiHS'*LiH+NC@9Nik1N!#'H(0bFh0aE'acHRemIB1&JS"pIS&kFR9 -kHhYhF'j`GATlJBU-LiU(KiGqGA9fGh9[D@T[FRCjI)+&KB@#J(jfFR9jHhalGhC -fH(apIi@(KSH(KS*mGhGfGACdFA&aFRKpIS##KBQ,LSL$J)+"J)#"IhelIS@*L)U --M)k1LiD!IRjpHhYlHRYqJSH+LBQ)KSD(L)H%JB+"Ii#"IherJiQ1Miq3!)q1M)L -$IRPfG(*bG(9dG(ClIRerJB'$KB1#IhalHhTlIAelH(GlJB5&KSH,MBU&J(TiGhC -fHAepI(TmJ)'#KBH+LiL'JRYfG(*cGhYkGh9iI(q#K)H,M)U)JhahGA0cGAKkHRY -qJB'$L)f4NC!!N!#2Li@#Ii##KBH'KSU-Lif3!*!!NC'2MSb&IRThGRGjI(elIB' -#Ji@'KSD&KSH#IATiH(KkIAprJiH(KiU+LBH$Ji0pG("[ER"cGA4cGAPmIAq"Ji5 -"IhppHAGeFR*hI(YjHhq#KBL+MBk-LB9rH(0bFR0hHhYjHAYpJ)1%KSD%Ji1"I(P -iH(PmIRjqJB1$JSD+MSk-LSH$IAKeG(9iHRPjHhk!JiL,MBq3!)k+KS+!J(jlI(q -"JB1'KiL,M)Z,LBD$IhThGhCfH(TjH(f#K)5(LBQ*Ki5#J(akHhYjHRYiGRZ#KBD -(LBQ)KAjlHA9cFh0cGACcF(4lIAk"K)L,L)*rIATiH(PjHhjkH(f$KSD(LSf2M)D -"IAKeFh*bGRTjHAk$KB1$KBL+L)@%JhplHRPiGhGhHAk$Ji'"Ji@%JS'!J(eiGA4 -bF(*bG(Z%KiH(LBZ-LiQ)LBQ)Ki@$JB'!J)@0N!#3!)k0M)Q&Ji'"JS'"JAjlHRK -kIiD+LiZ+LBL&J(epIRjqIRapIhemJBL-MBb,LSH#I(KhH(KiH(KhGR4cGRarJB+ -#K)1"IRTjHAGfGhKjHhYlIi@)L)L*LiU'J(akH(4`F(&cGA9hIB'#JS'#Ji5$JB" -qHhKhGR9fHAYqJiH'K)5%Ji+!IhjqIAKeFh0dGRPpJiQ,LSL*LiU)L)Q*L)D#IRY -lIS'$KBQ,LiU*L)H&KB5$Ji&rIAamIRq#KBL*Ki@&Ki@!I(aqIAakHAKjI(apJSH -)KS1$K)0qHAGfGR9cFA"bGRGfH(erIheqJS1"IhemHhPhGhKjI(q"Ji@%JS'$KiD -"IRajGR*[F(0fHReqIi'"IRk!K)D%Ji+!IAPeG(4fHRjrJ)+#J)"rJ)'!J)"qHRC -dFh0eHRq$KBD&KB5%K)D&KBD'K)5$JS+$KBL*LSb,LSQ*LSU*L)H$JApmHRTmIi1 -'KB1$K)5$K)5$Ji0rIAepI(eqJB5'KSD'KiH'K)1"J(plH(CeGAKjHhq"JB"rIhq -"Ji5%K)0rHhTjHATmJ)1&KB1#JS'!J(prJ(pmHAGdFR0eH(f!J)#!JB#!IhjqIi" -qI(TjH(GhH(YpIRq"JS+#IhemIAemHhTjH(GhH(YqJ)'%KB@&KB5$JB#!J)#"JB' -#JS1$JS+%KSH)KiD$JB"rIRemHhYpIRq"JB#"JS1$JS+!IRepHhTkI(k!JB+$JRp -qIRprIRepHhYlHRKfGRGjHhf!J(jqIhpqI(erIRjqIRemI(aqIi'%K)+"JS1#J(j -qIAamI(YkHAPkHharIhjrJB+"IhprIRjpIAjqIhq"JS+$Ji1%KBD'K)1$JRpqIRj -qIAerJ)'#JS'#K)@&Ji1$Ji+#JS+#Ji5(LBQ+LBH'KB5$Ji+$Ji+"JB&rIAapIi# -#Ji+$KB@%JAprIhprIhpqIRjqJ)'$Ji5&KS@$J(emIAalI(eqIRemI(amHhYqJB1 -$JAjmHhTjHATmIRjrJ)'"J(jrJB'"JB#!JAppI(TkI(apIi"rIAapIRprIRjrJ(p -pIAalHhYpIi'#J)#!JB&rIAk!JB&rIRalHRTmIi'#JS#!J(pqI(apIi'#Ji+"J)# -!JB+%KB@&K)1!IRepIRq"JS'!IhjrJ)#"JB'#Ji1"IRamI(epIAjrIhjqIhprIhp -rJ)'!IRalI(epI(amI(aqJ)#!IhjpIAjpI(amI(eqIRprIhq!Ji1$JS'"JS'!IRe -pIi#!J)"rIAapIi#!J(jpIRjmHhYmIS'#JS+#JAq!JS1%KBD'KS@#IhepIi'#JS1 -#J(jqJ)'#Ji5%K)5"IhepIi+%KBD(Ki@%Ji1$K)5%KSD$JApqIS#$K)5%K)1#JS+ -$Ji1$Ji1"IhemI(eqIi#"JB#!J)#!JB#!JS+!IRemI(eqIRjqIhjpIAjqIRemI(Y -jH(GhH(TmIRjqIRjqIRjqIRjqIRelHRPjHATmIRjqIAepIAjqIRjqIRjlHRTlIAj -rJ)"rIi#!J)#"JB'"J)"qIAamIS#"JB'!Ii#"JS+%KB@%Ji&qIAeqIi+%KB@%JS' -#Ji1$Ji1$JS&rIAeqJ)'#Ji1$JS'"JS+$Ji1%Ji&qI(YlI(erJ)#!J(prJ)#!Ihq -!IhjpI(YlHhapIRjrIhprIhpqIRjrIhppI(alHhapIi#"Ji1%K)1#J)#!J(prIRj -qIRepIAepIi#"JB'!IhjrIhpqIRjqIRq!J)#!JB+$Ji1#JB'!J)"rIRjrJ)'"J(p -rJ)'#JS1$Ji+"JB"rIhjqIS##JS'"JB'#JS'"JB'"JB"rIRepIRq!J)'"J)#!J)# -!J)#!JB'!IRepIAjrJ)#!JB'#Ji1$JS+"JB'"JB#!J)#"J)"rIhq!JB#!J)"rIhp -qIRjqIRjqIRjqIRq!JB'!IhpqIRjpIAeqIRpqIRjqIAjrJ)'"J)"rIRjqIRjqIi" -rIhprIRq!JB'"JB+"J(prIhprIi#!J(prIReqJ)#!J)'"J(pqIRepIRprJ)'"J)# -!J)#!J)'#JS'"J(prIRq!JB+$JS'!J)#!Ii#"JB+#JB"rIRjqIi#"JB'"JB'!Ihp -rJ)#"JB"rIRemI(epIAjqIhjpIAepIAepIRq!IhprIhpqIRq!JS+"JB'"J(pqIRq -!J)#!J)#!IhjqIRq!J)'!J)"rIhprIi#!J)#!IhprJ(q!JB'"JB#!J)#!J)#"JB' -"J(prIhprJ)'"JB'!IhjqIhq!JB+#JB#!Ihq!J)#"JB'"J)"rIhprJ)#"JB'!J)" -rJ)#!J)#!IhprIhprJ)#!J)#!JB'"JB'"J)#!J)#!JB'"J)#!IhjqIhprIhq!J(p -rIhprIhq!IhprIhjqIi#!J)#!IhpqIRprJ)#!J)#!IhjqIRq!J)#!J(prIRprIi# -"JB#!J(prIi#"JB'"JB#!J)#!J)#"JB'"JB"rIhq!J)#!JB#!J)"rIhq!J)#!J)# -!J)#!J)#!J(prIhq!J)#!J)#"JB#!J)#!JB#!J(prIhprIhprIhprIhprIhq!J(p -rIhjqIRjqIRjqIhprIRjpIAjqIRprIRjqIRjqIhjqIhprIhjqIRjrIi#!IhprIhp -rIi#!J)#!J(prIhjrIhq!J(prJ)#!J)#!J)#!J)#!J)#!JB'!J)#!J)#!J)#!J)# -!J)#!J)#!JB#!J)#!J)#"JB'"JB#!J(prIi#!J)#!J(prIhq!J)#!J)#!J)#!J)# -!J)#!J(prIi#!J)#!J)#!J)#!J)'"JB#!J(prIi#!J)"rIhprIhprIi#!J)#!Ihp -rIi#!J(prIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIi#!J(p -rIhprIhq!J)#!J)"rIhprJ)#!J(prIhprIi#!J)#!J(prIhprJ)#!J(prIhprIhq -!J)#!J(prIhq!J)#!J)"rIhq!J)#!J)#!J)#!J)#!J)#!J)"rIi#!J)#!J)#!J)# -!J)#!J)"rIhprIhprIhprIhprIhprIhprIhprIhprIhprJ(prIhprIhprJ)#!J)# -!IhprIhprIhprIhprIhprIi#!J)#!IhprIhprIhq!J)#!J)#!J)#!J)#!J(prIhp -rIhprIi#!J)#!J)#!J)#!J)#!J)"rIhprJ)#!J)#!J)#!J)#!J)#!J)#!J(prIi# -!J)#!J)#!J)#!J(q!J)#!J)#!J)#!J)#!J)#!J)#!J(prIhprIhprIi#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J!!!NLS!!3!"!!8!!!#J!!'!83!!!!!!&!! -!!!!!!*)!9Zk,S`!!NIi!!*(r!$b!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhjqIAamHhTjH(GfG(0aF'pZE'YUD'CNBf& -HA9YC9e988e&36Na+5%C&4%*!2cip2$`m1cSk16Nj16Sk1cXl1cXl2$dr3%""3N0 -%48C(5%P,6%e16e&699GC@PaHB'0PD'YYEh"bG(CiHRaqJ)+$KBL,MBk1N!#6PTH -APTLFSUDRTU5PUDkaVkURU+keZlZhXDkbZm2'`lZcXEE!bp28cF#aTD1V[-hCfY( -!V*U0KSbHZp[amr$Ud+f9NTDAPjD8MiZ(KSqSb0[FdXDmXULIPSq)JAafF@aRB9a -A8Na(3Mik0c8d06Bj28&(6PGKDhH$N!#FUE6!bY6FjHc[lr$`lqlZlZhZlHlYl1h -YlZlZlqr`m1rYkZINhp[Ae026eGEBfYcGiHEXmI6dm[$YkZMSkHVXl[$bp2AcmHr -[lZlXk1,Gf0E6d-c*aX2![VZkZ,HeYE5dY,@eYEDfYVDeY,1aVUZSTD+HQTD5MSQ -&J(aiGhGfGA9eGA9eGA9eGA4dFh*bFA"`EfpZEQeYE'aVDQPSCfCPBf*JAeeF@eT -C9e9689&48%j*3d!q1cNi0cFh0cFh0cFh0cBf06-`,#JP)KmG'aSD'aXE'4F@&KJ -E(L%L)4mH("`E("iK*#FT+LSV,6!c0MJj1MSl28"$4NK+5NP(4%*#3d9)5Na06%T -&2MF`+5-H'aSF)#BX-MJm26dp2N"$48K,6P*@@f&QE'pbFh9fGhKiHAKhGA0cG(G -mJ)5(LSZ,LiZ,LiZ,M)b,LBD#IhelI)#(MjQLUl1j[Er#aXh5d-c3fH$KhZ$Pj0I -'Z,@iYkfGNSk2MBGrI(q'MC!!N!#,JA4UCQGXFRGmJBH0NTDCRD#MU,#mc0[PkZl -`lq[NemDeUkLNQj!!LB@#IAKfFQYK9NT!1cT!5%e-4d)p0LiU+LXT*L3L(4-)!!! -!!381'LJd284(5%K*58P+68j)2M8c1$p#3Ndj69PGBA@G`G'pQA&0,48*"38& -"3$mq26dm1cSj1MXh-5SN)"`B'"JA%!F"!!3*$K8G)bBL'3m)#K8N-6Y$5e&58eC -HC'GPBfCZHSD3!*HHT+UVTk'FQCQAP*+4NjHDQTbJSkLZXl@eYV[$b-V0dYMDep2 -3cp,9e066cF5jVkQRUDbYUk@IPj!!LSD'LBb2NC5BQCD2KS"lGR"ZEh4iHRTlI(a -kGhClJSL*K(ekISL6RD@VVV#`X+qYTjk6LiL+MBq0LB5%L*'GTkkbYEQp`F,$`m6 -%a-'r[Vr&cYRPm2MqrrrrrrrrrrhflHAJh0M5cFR)bFR)amM,cp2@f0E2aVfjZEZ -q[lkkXULGP)k+L)H)LBZ0N!#5P*HDR*ZCQCZIT+DPRjL3!)Q"HhGfGRGiGhCcEfP -PC'9SDfaXDfecHS#$K)5$JAprJSD+MSq0LB@#JS5)MC!!Nj14MBU(KB5%K)1"Ihe -kG@pSC'*LC@TbHS51QD'MS*U6M)H%Ji+$KBQ0NTHERTqIRTfCP*!!M)Q)LSk8QTk -JRTL4LiD$IhTdDf&B8%K#2M`l1MSj1cj#5%e69eTGAf"IA&P86dY*5%T3@@9bI)1 -(LSU+LSQ'IR*M9%K!2$Xm1cJe-5mZ,5i[-63f16`r48a9B'YfIB"rHhGdFQjVD'9 -MBQ&KB@&KBQ0NC'4J@P49AQKTC'"IA&PDB'9PBf0NBeeA8P9C@P0*3Mp"5PKQEh" -UB&C9BR@!Ji*rIRamHhTkHACcEfaTCQ0KAPYB9P014cmh-#`V,M%d0MFi16`r3dG --6e09@&YKDA&fGhC`CPaEB'4KAPYA99499PGB@&PEB'KcIB5&Ji1+P*fKSU@SUkZ -UU+1CM)"fFR*hIi@,N!#6PCD@PC55N!#2MSk1Mj!!Mik,Ki0qH(4`EQe[G(f*PU' -SUkQPSTkEQCQCQjbFQjQ@P*58PC@@PTD9PC56NC!!MSb,LiZ-MBk2Mj!!NC+6NBb -$H'aNB'"JB@4RE(0qLjURX,5dXDkYVUq[VUbTTkDPTUHUV+k`X+q[VkkUTCk@Mif -9S+LSSk#JSkHVVUkUSC1&IS+2RDHTSjQ-Ih4YC9jA9&CFC'PZFRGpJ)&rIAYkI(q -$L)k9RDHb[XVBjHh`l12@bEkfXDqZX,1fZEHbUD'EQCQDPSf"GQpXD@TXER"[E'G -KAPjLDR0mJiL+LB@"IAf$MjUHQT53!)k3!*'3!)Z'JRpmHA9aD9p@8P*9@f0`JC! -!QjkBMAjbE'aZF'pVC&jD@9PGC'jkK)U-M)Z+L)L,N!#8P*'1LB@#JS+"IRamI(e -pIS''Lj+BR*kGQjH4M)L*M)q1LiL$IRTlIi5'K)&qHhGaD@0HA9eHA9aB9%p06P* -BAQ*MB&aB9909A'4RBeY@9PTKDR0mK)Q+Ki0qHA0YE("dGR9dGRTrJB'!JS5%J(a -jGA*`FA9lJBH,MBb)JRYdEQTTDfjZF(H$MT16PTfNUUbXV+qfZVQfZ,l#`,bk[,f -fU*U2KhpjH(YmH'pRCQYdIS5"H(*dHATjHi#%JhefEQCF8%G%5P"2580$4NT-69" -@AQ4SDQjeISH5R+@TV+kZVDQLPif*LSZ'IACaDf9LA94+4%9+6Nj*36j$5NY$16F -r58j+4dY@BQTYFACjGQpP@8`q-#3F&aJF)5BT,6-l4%a16Ne39ejLBQ0PD'PTD@T -YFA9lJ)@+M)k2Miq2N!#6PT@3!)Z2Q++SUUZYXEHlZE1`YX64eY2*ZkqQSk1QUUb -XUU@JQjQBQ*QCPjD6NBq2Mj!!N!#3!)q1MSq5PTUGRCbHT+QUUD@LRjZBPC56Nj+ -3!)k-LSL'K)1!IATiGR4aDPj44$dj-bSK'aSG)L8P*#3P+#SR(aB6&KXH(K`D'K` -H)53T,cBl2$Sm38G)48!q26`f,5BQ,$%f1d&'5e*FCQeaFh4fI)51PjkJRCD2Ki" -jGR9cE@0D999CB'PdJ)Q1MBZ-N!#4MSD!Ii&rHR4`FACrLT5CQTUDQCH@PC54MSZ -*L)U0MBZ)KB+!IhjqJ)+$JhplGh9eGRGjHRYjG'pXE'jaFR"TAeC6@Q9ZG(KkGfp -SC@KYF("VC&pIC'PYEh"eIB@,MT'9R+5TUUHKQjZJU+fYUD1HQjQBQCQBPT'+Jha -fFR&bFh0bF'j[FR9kIi@-P*kUZFA,bX5qZlUiY,#ZVl'`V++9LS5'MCDISk5QV,+ -cVU+9LiL*M)k4N!#0LSU2Pk'TVDZRSk1QUUbVT*U0JRGZCf9XHikHUDfVSjQ3!)k -3!*+8NBb&IRYlIRppHAChH(CYB9P@@&YHAeaEA@4[H(k"Ji5$JRpkG(*fIiU6PT5 -3!)k2NjHCQTbHRjfFQjbGRCbDPT!!KhecE'CNC'CVFA9hGhGiHRk#KSZ4PTUFRD' -TYF((aVfaTU'LTkfcZEh"aFM+bXM'aFE%`EfmZVHeYVh&bm['`X2'aF'q`FI+b-+ -lXUfZXlDdVkbZY,h$aXE'aFE*cYIJj1,FeXl'[VLbVUbUUUfcYV5XTUDUX,Dl[lk -lYlDfYE5bX,#bYEHhYlHeVU@GQCLBNB4fE@KSDh*mL*1ES+#FPC!!N!#5P*11L)& -lHheqI(TlIi5*M)f1MBb+LBH%JAjkH(GhGR*[E@YVE'j`G(KlHhTjGh9dH(q%Jhp -iF'TRCQGQC@*IA9YE@PG98e058%a&2ce!48P+5%9#26Jd-M)b-6!b06Sr3N9'3ci -j0MBi1Ma!489"2$e'9@*XG(U!KBQ1P*LDQCQGTDfcYE@cVULLRTZFR*ZCPjZLTk5 -EN!#*KSH-NTQHRTL1KB#!JB&rHhPiHATjGhGiHhq$L*!!QD+RUDUVUU@HQ*DBR*q -MTULSTU1JRTZCPBk%I(KhH(YqJ)"mGR*dGhGcDQ"C9eKHD(*iHRYmJBU9Rk5LQBq -(KBD(KB"lGR0cGhq,Pk'TV+ZPR*'&HhCiJ)bAS+DSU+DKQjH8MiKqG@jTCQ*JB'4 -UER"aFR0eGhGfGhTrK)L+M)b,M)k6QCfGQjD4MBZ,M)q4Nj+4Mj'ARCkDNif*KS@ -'L)Z1NC16Nj@CS+HXVDZRT+1NTUHQSTfBNSf)KB*rI(PeFR"ZE'YVE'eXDfPQBPe -A88a(2cF`,#NP)L)Q,M-a+#%J*bia,LNR,$3k2d&$3d*$48G)4dC%3N*$4NY28P0 -68e0899CA9eC99&966NC!2Mdl1$8e0cSj05mX,M3l3NC*6%j389"16%a28eKE@P9 -25%0"3dP39PTFAQ&ND@jdHS#$JRaeEQKNC@TbHi+(Lik4NT'1LS9rH(*XD'CPC'4 -NCQT[GRf%LBb1MBU'JS"pHA0UB&C14d%m1MNj1$Nj0c3[,5md16e!3NC-8PC98Ne --6%e-5NP+6%j48e*-4$Xc,bma0$8e-c!Y+LFM)L-Q+bmb06Sr4Na49&CBA&pI@e* -)3$dq4%a6@&TD@9TGB@9UF(KrKBZ8RkUcZEl&cG,8dF[%Zl5ZUD5IR*UAN!#(I(0 -[F(4jHRGdFhClJ)"qHhPlI(TdDf0G@ejQFAb)NjZGQT53!*'9Qk'QUDZVUD5FNBH -!IB#(M)b)K)1$K)5(MjQMU+HLRCZFS+'IQjH6MSL#I(YqJS4rGh"VDQa[FRCjHRY -pJifCTUqcY,1cXl@eYE5bXDkVTk5KRjfEPBb$IAapIATfGAGmJB@'K)&qI(f"L)k -6Q*bJSk1MSk+MSU#ENS9hDQ&GAQ&QD@PQB9jF@eYHC'ehJ)H,LSH"IAf#L)k3!)q -0M)b0M)Q&JAjlHhk"KBH)KS"hEQTXFRGiGhCiHhq"KBZ8RkHXVUqaYELk[,l"`m6 -%`lqkYE#XUDLUVl5j[-,+dGEAdml*aX2![lr#aXV-bmM&aXR1cml+aF'pZV[!aX[ --b-1r[X$#`EkjYVHpaFc2cFM"ZV1VSjfEQTQANj!!Miq4NT5AQjkJS*kEQ*@6NBq --LSH&K)*rI(PiH(TlI(eqJiZ6QCfJSCqCP*1@Qk#LTDLVVV#`VkbRSTqJSU1NTDH -UV+bUTk@PTD@NSCfCP)q)J(PeF@eSC'*KAeeE@9KA@&TGBQCTDfpeIiZBSUQYVUf -YVDfYV+QMRCL9PCDAR+1XXV+YTU'IRjkFPj+0L)5!IAakHAKiGhCfGRKkIApqHA& -UC'*LB9pGA&aE@eaIC@TUD'CSEhU'NCQFQj@1KS"pHhTlHRTiGR*ZE'YVDQKRD'T -YFRGlI(YiGA9fHAk%LSf3!*+8PjD6MSQ&JS"rIi#"JS@*MC'8PjUFRk5SVDqaXV1 -eYVDeY,1f[-60e0VIiZ,Jh0I5cFI!YUbMR*LAQ*bIS*qGQjQCR++SV+ZSTD1NTUL -XX,Dm`FA(b-R+bXR&`,bl[EfjX+@GQTbJT+1HPiq+LBQ*KS1"JS1&KB1"IheqIRj -lG'aNAeYC@9YKD'e`EfaSCQ9NC'0MC'GVE@eVDh"iJB@&JAYeFh0iIS@,Mj1AQjk -KSU1PTUHSU+DLQj+)IhPeFh&[E@aZFACmJ)+$K)L-MSf)JAPcFR4iI(q!IRPdFA" -bFh0`DQ*C8Nj,5NP)4dK,6e4CA9pIAPY@9&9FC@aYD@&F@epND'PUDfe[EfYPAPK -98Na$1MFi28C4A'0NAeK589GICfaaGRTpIRprIRTdE@PSCfCNC'CQBPK03MXh0MJ -k26p"3N%r26`m2$Xh-#NP*5FU,#i[-$!`-6-f1Mdr3N4&489&4NT39PaLCQY`G(9 -dFR&eI)1%IR9[FAGqIhTbDfKTDfYRAeC48PGJDA"cFR*dGhTmIAjrJS1#IA9XCQ4 -NBPjD9eC@9P988Np06&"AAfCTDQTXEh&aEfjXE'e`Fh9eFfjTC@*JA&9+26%S)Kd -E'KXG(amI)LXe1MNd-$)i2d0$3%"$59"9@Q&TF(*`E@jdHi#"IRPdF'j`FhKmIi' -#K)Q1N!#0Ki&kFfeSC'"G@9946Na,6%Y(36p"4NT,589#38N4*8PYLD'abHAk -"Ji1$J(elHAGfGA4bEfTPB&pIB'&KB&pG@eK99&GGC'PZFRCiHAPiH(TqJi@#HR0 -`FRCjHRf"L)b0LiQ*LSU*KS5#JiL4QU#KR*@1LSD$IRThGRKkI(jrJ)'"JB+#IhP -`CejA8eCGCfjbFR&[E'KQCfTXEQpZE@j[FA*cFh0cFh0cGA9bE@GLAPeHA9K66Na -,5dP(4N9'5%Y28eGDA&jKC'KXEQjYDQKRD'YZEfjXD@GNBQ&KBQ4PCfTYFA9iHhk -!JB'$KSQ-N!#6PCHESUU`Y,1aXVDkZVHdXl@k[X#r[El#am[1cp(5dY$-b-E)bXc -,alqhXE'jaG,GjHVXl1RMhYR9e065cmc+cG6Hk1rbm[$Vk1ISkqh`mI,alqcTjH$ -DeG,3cXl1c-M#ZUqPR*HARD@YXE'[VDUUV+k`Xl@fYE1`VDUSTU1KRjkHRk#IRCL -9PCDAPjLCQjbEQ*11LSH'KSD%J(TbDQ4IA9aE@PG888j068e2894A@ejMD@jeIiU -8Q*H8NC'6QCqQUUZST*qDPC'3!*18Nj!!MBb0MSk-LBQ-NC55MSZ+MBf+K)"rIhj -lHi+2RDHXVV'dYV1URj@3!)q1M)L'L)f6QCbDPT'0LSH'Ji"pHRPiH(GiI)#%KiQ -0NTDBPjLESDL[YEUmZV@`VDbYVDbXUkZTTkDSUUbYV+USTD5RVEM$c0$8f0cJiZ( -Ihq$Liq(JiZETjq2Gf061b-'mZVQfXDUMR*1,KB5(LSZ*KS@'KiL'JRjlHRTmIi5 -*M)b+L)H'K)&qIAk!J)+&Lj1DRk'JR*L@PjZJSk@NSk1MT+5MSD#JRjqIRjkFQC@ -5N!#2N!#3!*'5Nj59PjQDR*bDQ*@5N!#0LBD$JAjmHhTkHRYqJiU3!*@APjH@PT@ -6MiL"H("UC@"GA&eHAPjIBfTZFA0fHi##JAajHRf!Ji*rIAYmIAepHhKfGA4dG(G -lJBH0Mif'IRGbEQTTDQe`FR*`EQeXER&eHAaqJ)5)M*!!Nj@CRD#LSU'IQjH4LiD -#IhYfF'PMB@0SER0hHAaqJB5(LBZ-MBb*K(eiG(&[EQp[EfjXDfPSCfGRCQ4MBf0 -KA&G88e4@@9eJB9jB8Nj-5dY08PKFA&C258C(58P(4%0%58j599TKCfPSC@*JB&p -HA&YHB@0LAeY@88T$2MSh0MFl2d*%48C'4N9!2$Sl2Mmq1cSk1cj#4NY39PeMD@j -aG(GkIS'#JAjpIS+%JhplH(CeFQeQAPG899TJCQPUCf0JA9eHB'0RDQPRBf"G@99 -468a,5NK'3d&!2d"#48T49eYFA9eGA9eFA9jKBf4MB&jE@PPEAQ0RCf4KB@*KAPT -C@ejJAeT99&CDA&eGAQ*QD'GPC'4NC'*JAejHA9eF@eTD@eeJBQ&JAejHAPjHAQ" -MCfTZFR9fGA0dGRTpIhjpHhKiHAf"KBQ-Miq2Mik2Miq4NC'1LiL'KB@'KSD&K)+ -!IAPhGA0`E'9I9e"+4N)q1$%V+#BP*5FV0$p0@@"LB@"LCQPSBeeB9P998e089eP -C9eCA@PpMCfPXF(0fGhGeG(0cFh*`E@TTDQaZEQeVDQTXE@eXE'eYE@eVD@GNBPp -G@eTD@eYE@9G@9ePEAPpKBfCSD@PUE@paFR0dGA9bEQaXF(9kIi1&Ji&qI(YjG@p -SB&P888e*4N9(5Np8@9pND@jaFh*`EQjZF(*dH(b!Ji5$JAjlHRPjHAKhGR9eGRG -hGR9fHAf"KSZ4PjbJSU+KRTU@NSq1MBb*KB"pI(k#KBH&JRjmHhf!KBZ5QU#LS*f -BPC'1LBD%JS"mH(4bFR4hHRYmIi+&KB*pGh4bG(GlIAajGhGjHRPhGA4cF@eSC'0 -MBf*I@eG999KFB@P`Ghb!JS@(L)L(KSD*MBq2MBU*Lj!!Q*fIRTfGS++MSU'LTDZ -`Y,DfYV@cXDkXV+faYVc#aXR)aF#kY+kVUUQRSjkEQjfJSD'LT+LVVUq`XE1hZVb -mZVHcX+ZRSCZ@NT'5PCLDRU+PU+LRTD5LSD#IRk#IRCQ8Mib*KS@&KSL)L)L*LSU -*LBU+L)*kFQj[FhPrJi5$JS'#Ji@(Lj!!PCLBPT14NC+8Q*fLTUUZYEc#b-c0bmI -%`X#r[EZkZEUm[m6)bmc*aF#mZVZp`-,$a-E'`lbdVDQSUDUSSjfCQCkQVlDm[Vk -p[,UhYE1eZ,c!a-R2dpIAe-r*`VZfXl+cXl1aX+k[XVHm[Vqq[Vr$amc5f0lKi0h -CeG25dY(2bmM'aFA%`EfkZ,HhYlHiZEQjZlr'cG2@eG,-aX'r[lklYl1bY,Lm[lq -q[,bm[,ZkYl5aVUZUUDLRTD+KSD5SUkfYV+UUUkbYVDbUUDLQSjf8Li@"IhajH(T -qJiL-Mj'5Nj@BRD'NTD5JQj@2LB@"IhajH(PlI(epHhPiH(KjHRTlI(eqIRq#KSU -0Miq2Mj'5NT+5Nj15N!#-L)5!HhCcF("`FA&aFA"aFR4jIS+'LBb1N!#3!*'3!)k -+KB&pHhPiGh4aE@PQBQ"HAPjHAPjHAf&NCQ9MB&eGA9pKC'CQCQ9QCQGRCQ4KB'" -KC'KUE'aVDQPVEA"cGACfGhKkHhalHACbEfaUD'GQBf"G@ePA9949@&TE@PK@9&* -58e49994589"26Nj38eKEAPpHAPpKC@acH(apIRq"K)U4PjfJSU5PTUDPSTkEQ*H -@Nik(J(TfFh0dGhYpIRYiGA0cG(KqKBb3!)q-Ki+!IhjrJB1&KiD$J(akHRarJB+ -#JS+#JS"mGh&VC@"F@9K@99499eTFA9YA8e&48e056de1894A@9YGAf&KAeeF@eT -C9P036%P(4dK,6e0@9eC68%e06e*@9e9468T+69&89&",4d0!26Sh06-a,bdX,#d -a0$Fi0cFh16e#4dT-6%e39PjQER9lIi&qGh"UCfGTDQKPB9jGAf0SER4iHRTjH(K -kHhalHRKeF@aSC'*KB&pHAPpJAejE9Np*4dP089488e*588p069"@@PeE@&0368T -(484$38!r2Mip2$Xm2N"#4%9'4dP,5dT*5%K*58G$2$8Y*L%I(amI(4N@%a)3$J` -+#3J)#!N,$!m5&adN+c%e0cJk1cj"48Y5@9pNCQCMB&aC@&PD@9C35dK)58e49ea -JB@&KBQCUEh0iI(q!IhajHATpIi#"JB'"JB1&L)Z0MSf-LiU+Ki*mGA&`FhGmJ)+ -%KSU2PCUHSUHXXE@iZELhY,'ZUkQRT+'GQCLBQjkIRjfBNik+Ki@$JB"rIi#!J(p -pI(amI(amI(alHACeH(k'MT5BQjfIS++NTULTUDLRTkHPSTkFR*kKT+HTUUQTU+D -MRTH4M)L&JAekH(GhH(TmIi1'KiH'K)+"JB+"J(jmHRKfFfpXDfa[Fh9eFh&aFA0 -fHRq&Lik2MSk1Miq2Mif-LSH#IAKeFh0cG(CjHhamHRTlIAq!J(pmHRGeG(9hHi' -(MC+8PC56Nj18PCD@PT@8PCHCQTQAPC@@PTD8NT'4NC+8PjQCQ*D9P*15Mib*KiD -'KSH(L)L,N!#ASDUcZVr#`m'q[,UiYV+ZUD5HPj+2Mj'9Q*UER*qLT+DRTU@LRjk -ISkHXXEDjZVQfXUkVUUHNS*fDQTZEQjUBPT56NT'3!)q1MSb,LBL(L)Q-NC@CQCH -9Nj19PjUEQjL6Mif-MSq2N!#2MBU'Ji1%KSL*LBQ(KiH(L)Q)KS@&KSH)L)H&Ji& -rIRk!JB+#JS'!J)#"J(prJ)1(LSf0MT!!Nj@AQ*LCQjkMU+faY,DhZ,HfYE5cXV+ -bXDkTSTU5M)H%JApqJ)+'LBZ-MBk1Mj!!NC5AQTbEQTH@PC@9PCDAPjHAQ*QERU# -MTDDSU+LSTU@MSCqHRCfHS++NT+5NTDDTUUZVUkbXUULNSCkGR*bISU5PSk#GQjb -ISkHTTk5IQjQCQTbISD1NSk#EPT'3!*5DS+@SUDQTUl#i`-I,cFr2cmh*aF,"`F' -rZlDbVUbTTD'GQTL8N!#0LSQ*LSb2NT15Mib*L)U0N!#8PTLBQ*H9PCDCR*fGRCf -ISD1PTUHTUkf`XV5eYE@bVUUNRjZAPC56NT+8PjZGR*UAPC56Nj5@Qk#NTkLSU+L -STkHRTU5IQC11LSQ*Lif2Miq2Mj'9QCqNU+bZVUUPRTQ9Nj+4NC+8PT@8Nj5BRU1 -RUkk`XE'bY,Ll[EfmZlZlZlZlZVLdXE#[VkfTT*f@N!#0M)f0MSf-LSQ(KiL(KB& -lGR*[E@aXE'eYE@j[FA0cG(9hHhq#K)5#IhaiFfaPAPPA9PC88e"05NG&4NG+6P& -99eKC@9KB@&PD@PPB9PCB@9PC@9TGB@0NBf&JB@*NC'0KAPYC9e956de-6%a-68e -28%p15dT+5da05dK%36im1cNi0cBe06Bj1c`m1cXm2N&&5%Y-68e16e"69eaJBf4 -MBQ*MC'9PC'0LB@"HA&P@8e"26P"599KEA9jIAepIAPY@8%T'3d*#3N0%489&4%* -"389,8PPIC'KVER&eHAf!JS&qHhGfGRChGhGhGhCeFh&[E@aVDQTXER"ZDQ4H@PK -B@PYE@PG568K&4%C*69*@@&G66NT)5Nj69eKA9&&3890A@f"NCfGPBQ"IAepIB'& -JA9K3580!3%*&4dG&3N"!38*&5%e6@&YE9e*15dT,5dY+58G&4%0&5%e48e068P" -15dP(4dP-8&0999469&9@@&KC@9K@8Ne*4N9&4NG)58P)58T089088e&168j49&G -A9eGA@&PDA9pKBQ0MC'4MB9pG@eK988j,5NP*5Ne39&GDA&eKCQaaFh4eGhTmHhP -dEfYTD'PUE'paFh4dG(CjIB'$KSL+LSQ'K)1$JS"qHhPhGA4dGRKlIRprIRYiGR9 -fGA4cFh4hHReqIhprJB1'LSf0M)U)KiH(L)Q*LSU*L)H'KB@&K)1"IRTfFh*cGAG -iGh9bFA&cGhb!K)D(KB5$K)D*M)q4P*@9P*!!MBZ*L)D%Ji5'LBb1NC19PjQEQjU -BPjHAPjH@P*'1LiL'KB1!IAPeF'aUDQYXEQjYE'YUDfe`FhCjIS1+NTUKTULQSjq -EQTQDR*kHRCQ8MBCrHhYpJ)1%K)1%K)@&Ji+!J)#"JS1#JAplH(CiI)##JS"mGR& -`FA0fI)+)Lib-LB0mGh4`E'YZGAf&M*+8NSf(JhpmHhk"K)D)M*5ERjf@LRpjHAf -"Ji1"Ii##KBL-N!#9Q*UDQTQBQTkNUUqeZVl![VZhXl'[Vl#aXE+bXl5fZ,c"amh -4dp,1aVkfXDkXUkUTUUkcYlLdV+1DNiq0MC!!P*UKTDQUUDDKR*H9P*@BRkLbZm$ -"[VZjZ,Um[EfmZlbp[m$"`XA*c-[(`,DYTk1LSD'KSD'KRjbBNiq+KS1$KBL0P*Z -NUl'f[-$%aXI(aXA$`F$"a-I+cFr3dG(3cml-bFM*bml4dpA@eG(*[lD[UkHMRjb -DQjqNUDbXUkQQSk#GQTQES+DYXlLq`mR3eGRCeY(-bFM)b-I'amV0d0$1bF+lYE# -YV+f[XE+cXV'ZV+ZYX,@iZVZm[EqrZl@ZU+@PTUHPSTfBNiq*JhjlIB''Lj!!NT5 -9PC13!)Z'JAajGR4fHS')MT'5NBk-LSQ*L)L)L)Q,MBq3!)q0L)*kFfjUD'CNBf* -MC@KUEA"bFh0`E@aXER&eHAf!JS1#J(ejGR9fHRq&LSf2N!#4NC!!Mj!!NTDERU# -IRTkIS*qFPSk'IRKeFh4fH(PiGA&ZER"cGA9dFR*bG(GlIAjpIAerJSD*LSU,M)q -5PCQFRTqHRCbFRCqMTkZXUkUSU+LSTU1HQC@5NC+8PC53!)Z'Ji'"JB'"J)"rJB5 -)Liq6PTQER*bCPT+1M)b0MBf,LBL*Lik4Nj58P*@AQCZEQCH8Nj'3!)f+Ki5"IhY -hF@aSC'&HA&K66NY*58K)4dG(5%P+58G&3Mmq2$Nf-c%b0$Bh1$Nm2N$mq2Mi -p2$Si0cFi1$Fe0$8i1MXl2$`m2d4+8&*588p26e"38%p05dT*58Y28P068Np,5%9 -#38""3N4&4NG'4%%r26j!4%K08PCCA'&QEA&cFR&aFR0cEfTPB@"JBQ4QD@YZF(0 -eGhPjH(GeFh0cGA9eFh"[EQpaFR*bFA&aFA"[F(&bG(4cFh0cFh0aF'pZEfp[F(" -aFR0dG(0aEQYUD'CPC'CRD@TUDQTUCf0H@&968e4@9P946NY,69"699956dY+5Ne -49&998e"16P"69eTFA9eHBQGXF(&bFA*bG(9hHAYlHhKfFh*bFh9fGhPlIS'&L)U --MBk3!*+8PTHCQTUCPT+2M)U)L)D$IAGaE'KPB9jE@&C688j06%j59eeLC'*I@eP -DAQ4SDQPRC@4NBf*KAeeC8dj*4dG)5%G%3N!r380%4%0%4NP,6P&8@9aHAPeF@PK -@88a'36dk1$Fh1$Sm2$Xj0#mV+LSY,c%b-c-d0MJi0cBd0$8i2%"%5%a28P4A@Pj -LC@CMA9G468a18&*899KEAQ"LBf0MC'9QCQGTDfpcGhPkHRKhGRKjHhYlHRKiH(K -kHhepHhTiGhGiHRf!Ji5$JS+#JS5&KiL(KS5#JS1&KSH(KiH*M*'@R++RV+qaXE# -XTk'EPBq+KiD'KB1"J(pqIAYjH(KiHAKhGA4eGA0aEfpaG(ChGh9eGhTqJSD*LSU -,MT1AQCQDQjfFQTH9Nj+4Mif-M)k3!*'4NC+8PjLBPC'1LiH#IAapJB5&Ji'#KBU -4PjQBPT58PCD@PT@@QCkLSk1IQjH8NT+8QD#QUDHMRjfHRjqGQjQCQ*LBQ*H9NSk -,L)D'KB@'KSD'KSD(LBb2NC'2MSq5PTZJT+QZXV@fYVDiZVh!`,fiXUfXVE+fZlr -#aXM,c-h0cFl2cX[%ZV#SSU'LTDQVUkQRTkQYXlV"b-r6e024cFR'a-2"[VbjZ,Q -l[Vqr[,HaUU5IRCfIT+Q[Y,Hk[,fpZlQiYV5aVDZTUDLSTkHRTU5LS+#KSk1LS*k -HSUHZYEc#b-[-c-V*bFR*amA"[ELdVUHIPj14NT+4Mik2NTHFS+1PU+Z[XV1aVUU -QSTkDPC+3!*'6PCD6MBD!IRk#L)q8PjH@P*16P*DBQTbIS+#FPT!!LiL)L)Q+LSU -*LSb1NC@CRD'PTkQTU+DNSk'KRjfEQ*D@PjLCQ*52LB5$Ji@*M)k1LiH"IATkHhq -%LBk5P*56Nj+5NC'6PCHBQ*H9NT!!MBb,LSZ-M)Z*KS1!IhjrJ)'$KBH)L)D&KSL --Mj!!N!#2Mj!!NT5AQCUBPC'1LiU,M)q5PTLCQCQCQjbGR*UAP*'1M)Q(KSD)Lj' -@R+#MTUHSUUfaY,HiZELfY,'ZV+QRTU@PT+1LSU'LSkDTVDq`VUQNS*qKTDQYVkq -YV+UTUDLRT*qCPC19Q*bISD'JSD'LSk5PT+1MT+DQTD'FPT+3!)q1MBU'JAemIAq -"Ji@&KSD(L)L)KS@&KSL,MT!!NT5AQCUEQTQBPT53!)b)KiD%JRjjGA"YDQPUDQY -UD'9LB@"KB@&JA9TA9PGA9eC@9eG@9P99@&eNE(*fGhGfGR9dFh"VC9j@8%Y)5%K -)4N0!26Xm2N&%4dP,6%e-5dP*5Na16Na*4%!p26ir3%!r2Mdp26dp2N"$4NP-8&4 -B@9TC@&KB@&KB@&KB@&PC@ejKCQTYEh"`Efp`FA*dGA9eG(9fGhKjH(GdF@pZE@j -`FR*aEQTQBf*MC@PXEQp`FA4iIB'$K)1#JB+%KiQ,LiQ'JAjkGh4aEfj[F(*cG(9 -eGRGhGR0YCPpC9&&15dK&3d*$48G+5da068a-6%Y+4d4#38""3dC)5de068e,58G -%3N!r2MXi06)[,#JN)4iF'a`H)L8S+LSV,#ia0$8d-c%[,Li`0$P!4NY289*48%e -*4N)r2$Sj1$Jf0$%Z,#`X,5mc1$j%58a28&"26dj068e168a-6%j49&GDA&eF@eT -D@eeIB&pHA&YD@eaHB'&LBQ0MBf0MC'CRD'KSD@TVDfYVDQPSCfGSDQjcH(YpIRq -!JB'"J(pqIAYkH(GfGA4cF'aSC&pE9eC999489&9A@&PEA9pLC@KUE'jaGAKmIS# -!JB+$KSQ0N!#5P*@@PjLCQTUER*fHS+1QUDUVUDHNSU#IS+'LT+5NSk+JRTbER*b -FQC++J(KcF'jZE@YUD'KTDfe[FA0eGhKiHATlIAjqI(ThGA0aF'pZE@aXDfYVDfY -UD'KSDfe`FR0cF@pXD@KSD@YYF(0eGA4bF'p`FR0cF'jXE'jaGAPpJSD*LSZ,LSU -*L)L(KS5"IRYjGhCfGhKjHAPjH(KiHAYmI(YiFfjUCQ0KB'&MCQGSD'PYFRPqJ)" -rIhjmGh*YDQKSDfpcGRGhGRGjHhf!K)Z5QCfJSk@SUUUSTU5LS*qKTUfcYlQiYE+ -ZU+#CP*+9QU#NTkLSUDQUUkf[XE1eZ,c"amh4e0E9dmr,aX2![VZjYl@eYlUr`mM -,cFl2d0,8eYIBfYlLjq[Zm2$[l1MMhYM6cml0cFc+am+mYV#XUDQTUDUVVV1k`FA -)b-R+c-r4dG$2cmr4dY,3cFR&`VkkYl5cXl1dYEDfY,+[VDURTD@TVl@jZVZkZ,D -cXDqYV+USTU5MT+@QTkDPSk+MT+5KR*@2M)f3!*5BQTbGRk#JRjkFQCD6N!#1MBb -+L)@#IhemI(apIRpqI(ThG(*`EfjZE@eYE@YUD'KSDQe`FhCjI(k!JB1%KB@$J(j -mI(apIRepIRq"JS+"IhajGR*ZE'YVE'jZEQp`FA0eGRCbE@CKAPeHAf"KBQ0MBQ& -KBfGXFRL!KiqARU5TV+k`X,#[V+QRTULTUDHMS*bDQCL@P*'1M)b-MBq3!*+8PTH -APjD@PjLDQjbFR*bFR*bGRCfGRTqIS++PUDb[XE+cXl5cXE#ZV+USU+UYX,+bXE# -[Vl#aXE'[V+LNS*kEQCLAQCZFRCbEQTZHSUDUVDqZV+LNSCkFQTLAPjD@PC@9PC@ -9PCDCRU1QTkDNSU#JS+'JRTZ@NSk-MBk1MBQ$IAPhGA0`E@YUDQPRC@0LBQ0PCfT -XEh&bFR&aFA*dGRPlIAjpHRGcF'eVDQYZFR9hGR9eGACiHAYpIi'%KSQ,LiU)KB& -rI(ThFfpVCf9MBQ"IAejHAPjHAPpIAejHAQ"KBf4NBf&JB@4SER0fGhGfGA4dFh* -`Efj[F(&bFR*aEfeTCQ4MBf0MBf0LB&pGA9aD9e036Na*4dG+8&GEA9eF@eYE@PK -@9&*489*89&456dY'3Mim16Fd-M!`-$%c0MNl1cXl2$dr384)5dj38&"48P058%e -+58T18PCC@eaIB@9SDfeZEQj[F(&aFR0dGACfG(&YDQGQC@4MB9pGA&aHB'*MBQ& -IA&TB9PC@9eGB@&KB@&TGB'*KAPT988p38eGEA9pKC'GVE@j`FR9fGR4cFh9iHAG -cEQPPBPpGA&aGA9eGB'4SDfaZEfp[Eh&fI)1*MT'5NBq1MSq1M)H"HR*UBPT66NY -*4N)p1MNl28"#3N&!2Miq3%*&4dP-6e&58P&36dj068j499THB&pF@9968e4@9eK -A9PC@9PKC@eaF@PG66de06Np38%p26dp48P*699GEAf*QD@a`FhChGR4cFR&bFR0 -cG(9fGRCfGA4cFR"ZDfGNBQ&MCQKSCf9LAPTB9PGDA@"LC'9RD@eaGhf$L)b1MBZ -+LSU,MBk2MSZ(Ji"qIi'$K)5%Ji&qHA9bFA&aF'jUCQ0KB&pIAf"LC'CPB9aA999 -AA'&PCfGRCQGSDfeZE@YTD'PXFAGmIi'!IRYjGh9dFQpYE'e[FhGlIAq!JS5'KiL -)LSb4PTUGRCbER*kJS*kEQCLCQTUCQ*LCQCUCQCLAPT@4MBL%JS1'LSk4Nj58Nj1 -6NT'4NC'5NT+4NC19PjD4M)L(L)Z-M)U)KiL)Ki@$JS1&KiL(KS@'L)b3!*@DRU+ -PTkLSU+LTUDUUUUQSTkHRTkDPSk#GQjL@P*+3!)q3!*'5P*58Nj15Nj59PT@8NBq --LiZ0N!#5Nj+3!)k0MBb-LiZ-MBk2NC1@Q*QDQCHAQ*UGRk#MTUZ[Xl5dXl1cY,D -iZVbq[m#r[lr!`X6(b-M(a-,![Vfp[Vr![lfjYE'ZVDfZVl+eZ,UlZlZlZlZm[Ek -q[EZjYV@eYVHj[,kr[VUfXDfVUUZXVV#aXV+aX+kXUD@KRCUCQTfJSkDSUDQTTk@ -MS*fEQTUDQjbHRk'MTDHSU+LSU+QUV+fZVUkYVDbXUkUST+'IRTkJSU5QTkLSTk5 -JR*UERD#LSk+KSD+NTkZ[XV5eYE5bX+qZVUq`XV'`VDZSTkDNSU#GQjQCQTUEQjZ -EQTUEQjZCPj@6NT!!Mif-M)Z+LBL'Ji"pHhTlIS'$Ji&rI(YlIAq#KBQ1NjLFRk# -JRTZBPT@8PC@9P*14MSb+LBQ*LSZ0MSq2Miq2MSk2N!#6PCHAPT55N!#2MSf,LBQ -+MBq4NC!!MSf,LSL(KS@&KBD(L)L(KS@&K)5%K)5%K)5$Ji1%KBD(KiD&K)5&KSL -*LSU+LSZ0MSq2MSf0MT!!NjHERU'NUDkbYVLjZEQiYlHhYVDeY,1aVkbSTD1LSk1 -LSD#JSU@RUUZXV+ZVUkURT+'HR*ZDPj11LBD&K)1"IRTfFh&aF'eSBPaC@9YHB@* -KB'&MCQPVE'aYE@j[F("[EQeYE'YTCQ0JAPYC9e99999@9PC98e&36Na+4d4#3$m -p2$Sj16Sm2NN%r26`m26p"3N*#3N0&5%a38P*58P09@9YGA9aD9e988e489&4 -56dY(3cml1$Ji16Sk16Fe-c)b-M3f16e!4%C)58T-6P"699GC@PTD@9G@9eTGB'* -KAeaD@9KA9eG@99048%p38P9B@ejIB'"JB'"IAPaE@eYE@PK98e&26%P&36dk16J -i1$Fe-LmX+LNT+L`[-M3f16`r3dC*5da-6%e16e&58e9@@9aJC'KXF(4fGR4bF'p -`FR0dFh*aF'pZE@aUD'CMB@"IAPeFA&aHAf&MC'4PC@9QCQGSDfjbGRTqJSD*M)k -3!*'6PTQERCbCPC!!M)Q)KiD&Ji&qHhKeFR&aFA&[DfGNBQ&JB'"IAepHA&YD@PY -FA9jHAPjGA&TB99*48&&48P089&9@9ePEA9pJAeeD@&GA@9YGAPpIAf"JB&pHA9a -FA&jJBQ4PC'0LBQ0NCQPVE@jZEQeYEh&dGRKjHAGeG(4fHAaqIRjqIAjrJ)+%KSH -)LBQ)KS5#JB#!JB1%KB@#J(ekHRYpIi"rI(TiGhGhH(PkHhapIAepIRq!JB"rI(P -hGR9fGRCfGA0aEfaTCfCRD'PUE'jbGhZ!JiD*LBL'K)*rI(PfG(0bFh0dGA9hHAb -!KBL+LiZ*Ki5#JS1'L)Z1N!#4NT18PCHAQ*LDR*kKSU+LSD#IRTbDQ*D8NT'4NC1 -@QTfIS+'MSk1LRjfEQjbISU@PT+'IRCZER*bGRCkHS++NTUHRTUDQTkLTUUZXV+f -[XE'`VkfXV+bYV+ZSTU1KRjkHRjqIRTfFRCkKSU+KRTZCQ*LCQTUCPj54MSb0MT' -5Nj16P*DCRU+QU+QTUDUVVDk[X,'bY,DiZ,DcX+fVU+DMS*fFR*fHRjqHRCZDQCQ -CQCQDQjbFQjbGRU#KSCqHR*ZEQjbFRCfHRTkHRCbFQjZFR*fHS+'LSk1LS*kGRCf -HRTbCPT14NC1AQTbGRU#MTUUYVkq[VUfYVl#aXV1dXl+`VDZVUkZUTk+GQ*@8PCD -AQ*UFRCqKSU1NT+5NSU'HR*UBPT54MSb+LBQ+Lib0Mj'6PTQERCkIS+#JS+#IRTb -EQTUDQCLAQ*QERCqKSU+JRCU@NT!!Miq3!*'5P*@@PjLBPjD@PTHBQTbHS++MT+@ -PTD5LRjbCPjD@PTD9P*+3!)k-LSL&Ji+"J)"rIhjqJ)+%KB@$J(elHhaqJB@*MBq -3!*!!Miq2MSf,LBH'KSH(L)L(KiD(KiL*LSU+LiZ-MBk1MBZ(JRjkGhCfGhKjHRT -kHRTkHherJ)'#Ji1&KiL+LSU+LBQ*LBL'K)*rIAYlHhYmI(epIS##KBH*LiZ,LSU -+LSb0N!#6PTLERCfGR*bER*fGRTkIS++NTD@PSk#GQ*54MSb+LBL(KB5#JB"qI(T -hGA4dG(9eGA9fGRCeGRGjI(k!J)#!J)'"Ji5&KiU-Mj+8P*55NC!!N!#3!)q1M)U -*L)L)L)L(KS5"IRYiGhChHATlHhTjGh9bEfeVDQPSCfCPC'4NC@9RD@aZF("[E@Y -UD@TVE'aXE'YVE'j`FhCiHATlHhapIAakHAPjHRYkH(CcFR"`F(&bFh4dFh&`Efj -ZE@TSC'"G@PC88P&38&"36Ne-6P&9@f"NCfKRCQCPC@CRD@YYEQp`F("`F("aFhC -iHRPiGA0aFA0hI)'&KSD%JS#!J)"rIAYiGA0bF'jVD'CQCQCRD@TVE'aXDfPSCQ9 -MBQ*KB@&KB@&LBQ*MBQ&IAPeFA9jJB'"IA9TA9&*48%p168Y)480#38&"3N4'58Y --68j26e"489&58e999P999&069&499PGB@9TD@eYGB'4SDfj[EfpYDfPRC@*I@eK -@994688p168e06%Y*5%K*5Na16Nj068e-5NP)58e499PEA&eIBQ9SDfeZEQeVD@G -QCQGTDQTTCf4KB'"LC'CSDQYVDQPRC@*IA&P@8e"05NK(4NC'4NC'4NC'4dG)58a -28eGD@eYE@eeHB'*MBf4NC'4PCQGSD'KRCQ4LAeaC9P989&4999CA@9YIBfKXF(4 -fGRCeFh*`EfjYE@aUD'9LAejIB@4QCfKSD@TVE'j[FA4eGRCeFh&`Efp`FA*cFh4 -eGRGiHATlIAeqIAalHhapIRjpHRCcEfeVDQPSCf9LB&pIAepHA9YC@&KB@PjLCQP -YF(0fHAYmI(apIi'%KiU0Mj'4NT+6Nj15NC!!N!#3!)q0LiL&JS"rIRemHhapIi' -#K)@(LBb1N!#4N!#1M)Q'Ji&rIRjqIRprJ)#"JB+%KSU1NT@@PT@6NBq1MBb,LBD -#IhepI(apIAerJB5(L)L(KSD(LSf2Mik-LSQ*Lik3!*'3!)k,LBH'KiQ+LiU)KS5 -#JS1&KiL*LSZ-MT!!NC+6Nj15N!#2MSk2NC+8P*58PCHDRU+NTUHSUkkbYEHjZEL -iYlDfYVLk[F$"`F(!`-(#`m2#`,kq[m,&aXE%`F#r`F6(b-R*b-I(b-R*bFM)b-M -*bXV,bmV*amA$`F$!`-$!`,qr[lqr[lflZ,@bXE'bXl1bX+kYV+fZX,+cY,@dY,1 -bXE'aXV1eYVLk[F(%aXE&a-'r[Vfq[Vqr[VblZVUl[,blZ,1ZUUHPSk+KS*kHRTk -HRk#KSU+LSU+MT+@RUUbYVDbVUDHPSk+KSD'JS*qHRTfHRk#LSk1LRjZBPC16Nj+ -4N!#2MSf0MSk3!*+@QCbHRTkGR*ZDQ*H@PC15NC!!N!#2Mik1MSk2NC5@Q*UEQjZ -FRCqKSU+LSD#IR*Q@Nj!!Mik2N!#4NC'3!)q3!*+@QTkLTDHRU+LTUkbXUULPSk' -KSD'KSD#IRCbDQCQBQ*D6Mib+LSZ-MBk0M)b-MBq5PCHDQjZDQCLCQTZGRjqHRCZ -CPjD9PC@AQCZGRTfFQTQBPjD9P*15NT+5NC'3!)q1M)U)KB*qHhKfGR9dFh&`EQa -UD@PTD@YXE@j[F("aFR*cFh*bFR4fHAarJS@(L)Q*L)H'KB@&KSD'KB5%Ji+#JB# -!J)'#K)@&KB5&KSL+M)b,L)D&KBD)LBU+LBL)LBZ0Mj'6PCHDR*kIRTbCPj55Mik --LSL'KB@'KiH(KS5#J(q!JB+$K)5%K)1#JB#!J)+$K)5#J(ajGA*`E@TRC'&IA9a -E@PPB@&PEAQ*PCfGRCfCQC@9PCQ9PC'0LBQ*KB@"IA9eFA&aE@PK@99999PGA9PC -99&*36dj06Np389*58P*48P*699GB@9TD@9PC@9PD@9KA9PCB@PYFA&aD@9KA9P9 -68P&38%p26Nj168e,5NP(4NC%3d&!2cip26dm2$Xj1$Fh1$Xq380$3d0#3N*#3N* -!2M`k16Nj1M`q2d"!38d0$3N&!2cmr2d""3N4&4NG)5%G(4NC(5%P+6%j389& -46dj06%Y-69"69PKD@eaGA9aGA9jHAPeE@PKA9PCA@&TEA9pJBQ4PCfKTDQYXE'Y -VDQPSD'KRCQ4MBf4PCQKSD'GPBQ"HA&TB9P988P*58e9B@ejKBf4PC'4NC'4NBf* -KB'"IAPjHA9eGA9eHAQ"LC@KUDfYVDQTUDQYVDfYUDQPTD'KSD@PUDQTTCfCQCfK -TDfaXE'aXE'eYEQjZEQp`FA*cGACiHRerJB5'LBb1N!#4N!#1LiQ)KS@%K)1$Ji+ -#JAppHRKfGRCfGhKiGhCfGRGjI(k!JB'!IhjqIRjqIi##K)@(LBU,M)f1MSk-LSH -$IhelHRPiGA0aF'p`F(&aFA&aFA&aF'pZE'YTCf9NBf*JAeeFA&eHAf&LC'9QCfG -SD@YYEh"bFh4eGRCfGRChHAYpIRjpI(YkHAKhGR9eGACfGR9eGAChH(PjHRYmIAp -rJ(prIRepIAamI(alHRPiH(TpJSD+M)b,LBL)L)L)KS@#JB"rJ)#"Ji@(LBU+LSU -+Lik4Nj@9PC15NT16Nj+3!)k-LiZ-M)f-LiZ+LSU,Lib-MBk3!*1BRD'NTUDPTD5 -PTULUV+fYVDfYVDfYV+bXV+fZVkq`X,'bXl5dXl+bXV+dYEDfYV5cXV+bXl5eYVH -iZVZlZlZlZlbm[Er"`m6%aFA%`m,![VZjZ,HiZEUm[Vr!`,qpZlQiYlLiZ,DdXDk -VUDHQT+'HQTH8NT!!N!#3!*!!NC'5P*@AQCUER*bFR*bFR*bEQTQCQCUER*bDQCL -APTD@PTHAQ*LBQ*LBPjHAPT@8Nj+4N!#1MSk2N!#5Nj56NT'3!)q1MSq3!*+8PjQ -FRk'KSD#IRk'NU+b[XV5fYlHhYV@cX+bRSTfCPC+3!)k0M)Z,M)k2NT5AQTkKTDL -UV+fYVDbXUkQSTkDPSk+KSD'MT+DRU+LTUUbYVl#aXE'`VUkZVl#aXV#ZUULQTUD -SUDUTTk5KRTbFR*fGRTqJSU@SV+qbY,DiZEZp[m$![lflZELfYE1aVkfYVUq`XE' -bXV'[VUfVUUQSTk@MSCkEPj54MSf0M)Z*L)D&KBD(LBZ-M)b-MBk2N!#5Nj58P*5 -8PCDAQ*QCQCQDQTZFR*bEQTQBPjD@PTD9P*+3!)k0M)U)KS5"IhjpI(YkHAKiGhG -hGhGiH(KiGhGiHAYpIRq!JB'!IhelHRTkHhYmHhYkHRTlHhYkHAPiHATmIS'$K)@ -%K)5%KBH*LSb-MBf-LiU+LSU,M)f1MSk0LiQ)KiH)LBU,LSL'Ji+#K)D*M)f1MSf -0MBf0M)b0MBk0LiQ(KB1#J(jmHACaE@TRC@4NC@9QCfKTDfaYEQj[Efp`FA0dGA9 -eGA9dFh&ZDQGNBf0MC'4NBf*KB@"KB@&KB@*LBQ*LBQ*LBQ*MBf4NC'4MBf0NC@C -PC'&IAPjIB'*MBf*LB@*MC@KUE'eYDfTTD'GRCfCQC@9QCQGRD'KRCfGRCQ4MBQ& -KB&pG@eK98Np-5NK(4N9&4NG)58T08&4B@PaFA&eHB'"KB@&LBf9QCfGQC@4MBQ" -IA9YD@&G@9P9999998e&16%P(484#3$mp26`p2Miq26dp2N""3N0&4NG(4dG&3d% -q2$Nh063c-M)d0MJl2N"$4%C(58Y-68e06%a-68j389*48%j-5dY-6%e-5dP)4dC -&480"2cdm2$dq2Mp!3%&"3N*#3N*#3d0%48C'4N9&489&4NC(58a28PCDAQ&PD'T -YER"`FA&aF@pZE'TSC@0KAejGA&aFAQ"LBf4PCQGRD'PTDQYXEQp`F(&aFA*cFh0 -aEfaUD@PTDfaZF(&bFR0dG(9fGR9dFR&aFA*dGRKjHAPhGA0aEfaTCf9NC'0KB&j -GA9eHB'*MC@CQCfPUE'jaFh9hGhGfGR9fGhPlIAprJ(prIRjrIhprIRjqIRjrIhp -rIRakH(CdFh*aFR*cG(9dFh"XD'4KAepIB'*MC'4MBf0NCQKVE@paFhCkIS+'LSb -0MBf-LiU*L)H'K)1#JB"rIRepI(alHhTkHAPjHRTjHAKiHAPjH(GfGACfGRChH(P -lIAq"Ji1$JAppI(YlHhYkHAKhGR4bFR*bFh4fGhTpJB5'L)U+LiZ,LSQ*L)Q+M)k -2N!#4NC'3!*!!Mik0MBf0MSk1Miq3!*'6P*DAQ*QCQCQCQCQCQCUEQjUBPjD@PjH -BQ*LBQCZGRTqJSU5RUUbZVkq`XV5fZ,QkZELfY,1bXE'aX+qYV+ZUUkbZX,#`Vkk -XUkZVUkbXV+bXV+bZVl'bXV+aX+qZVUkYV+USTkHRU+QUUUQSU+LTUkk`XV5eYlQ -l[X(%amV-cFl2cmr3d0(4dG(3d-r1cXh0cFc+amA$`F,$a-E'aF2![EUiYV@eYE5 -dY,1cXl5dXl+aVkfUUDQTUDQSTU5MSD#JRjqJSU5QU+UXVl'cYEDiZEQjZELfXl# -YUUHNSCkEQCH8NT!!Mik2N!#5P*@@PjD8NSk+Ki5#J(jpIAeqJ)1&KSH(KiH)LBU --MBk1MSk1MBf0MBf-LiU+LiZ-MBk1MSk2N!#3!*'5Nj18P*15NC!!MSf-LiU*L)L -)LBU-MBk1MBf-M)b-M)f0MSk1MSf-LiQ)KiD&Ji"pHRKfGRChHAYpIi#"JB+%KSQ -0N!#5PCHDR*kJSD'KSU+MT+@PTD5MSk1NT+@PTD5NSk1MSk+LSk5PTUHRTkLSU+L -SU+LTUUZYVUq[X,'aXV+aX,#[VUfVUDDNSk+LSk5NTD@PTUDQTUDPT++KRjbDPT1 -2LiH%JS'!J)'"JS1%KBD(L)Q+Lib0MBk0MBb-LiU+LSQ)Ki@%JS"rIRakH(9cFR* -bFA"ZDQCMBQ*MC'9NBf*KBQ0PCfKTDQPTCfCNBQ"HA&TC9eC999489&489&499PG -C@PYFA&eHB'&MC@9PC@4NC'CSDQaZEQjZE@jZEfp`FA*cG(4cFR&`F("aFR*cFh0 -dG(9eGA9fGhPlIS'%KSL+M)k3!*'5Nj+4Mik-LSL(KS@%Ji'!IhjqIAalH(4aE@Y -UD@PTDQTUDQTUDfYXE@eXDQKPBf*KB@*NC@9QC@9NC'4PCfTYEh&cGAGjHheqIRj -pI(PhFfpVCf0KAPaE@PKA990589"389&48P0899CA@&KC@9PC@9PD@PYFA9jIB@0 -PCfKTD'CNB9jF@eTC@&G@9&468P&36dj-5dT*5%K*58P+5da06Np38&"38&"48P4 -99PGB@&PC@PYFA9jIAf"KBQ0NC@4NBf0LB@&JAepIB'"JB&jF@eTD@eYE@eYD@9K -A9eGB@9PD@9K@9&&05NG&3d&!2cmr3%&"38&"3N0%4NG)5Na28PCDA@"KBf9QD'P -UDfe[FR0cFh0cFh0bFA"ZE@aVDfYUD@KQBf&HA9aFA&YE@PKA9eGB@9TE@eaGA9j -HA9aD@9KB@&KC@PYE@eTC@9PEA@"MCfTZFA0eGRGiH(KiGhCdFh&`EfjYE'aXDfT -UD@KSD@TVE'eYEQj[F(&bFA&`Efp[EQeVD@KQC@9PC@4NBf0MC'9QD@YZF(*dGRG -jHhapIAepIAepIAjqIhq!J)"rIi#!JB+$Ji5%K)@'KiL+M)f0MBb,LSQ)KiD&K)1 -"J(jpI(YkHAKiH(PlI(eqIRjpIAamHRPfG(0bFR0dGRGjHRYmIAeqIi#"JS+$Ji1 -$K)5%Ji'!IRalHAKhGhGiHAYmIi'%KSL+Lib-M)Z+LSQ+LSb0N!#5PCLERD'NTkZ -ZXE1eYlLiYl@cX+fUTD#EPT+2MSf1N!#5P*DCQjbGRTfGRTqJSU1NSk1LSD#JSD' -KS+#IRjqIRjqIRTZBP*!!M)H%JAprIi#!IhjpHhYlI(k!Ji@(L)Q)KiD&K)1$K)@ -'KiL)L)H(KS@&KBD(L)L*LSb1N!#4NT'4N!#3!)q2Mj!!NC'4N!#1M)Q(KSD'KiL -+Lib0MSk2NC19PjQERCkJSD1PTkQVVV#dYlQl[,kr`F2&amM)amA#[lbkZVUl[,b -mZlUjZEUl[Ekq[VfmZlZkZELhYE5bX+fVUDLRTU@MSU'KSU5QTkLTU+LSU+LSTk@ -MSCqHRCfFR*bGRCkIS+'LSk5NTD@PTULSUDQSU+DPSk+JRjfEQTLBPjH@PT@9PC@ -@PjLBQCLBQCQER*kJSD+MT+DRU+UVVDk[X,'aX+qYV+bVUkZXV+bVUkQTU+HRTU@ -NSU'JS+'LSk5PT+1JRTbEQjbHRk#IRjqISD1PTkHRTk@NT+@QTkLSTk@NSCqGQjL -@P*'1LiL'K)1#JApmHACcFA"`FA*bFh0bF@pYDfKQC'0MBf4QD'TYEQpZEQeXE'Y -VD@KRCfPUE@p`FA&bFR0eGhKkI(q!JS1%KSL*Lif1Mik1M)Z+LSU+LSQ*L)H'KB5 -#JAprIhjqIAakHAKhGhKjHherJB1&KSH)LSZ-MBf0MBf0MBk2Mj!!NC'5NT59PjL -CQ*H9Nj!!MSb,LiU+LSU,LiZ,M)b-M)Z+Ki@#IhemHhamIAeqIi##KBL,MBq4Nj5 -9PTHAQ*HAPC55N!#1MBb-M)b0MBk2NC1@Q*UER*fGRCbEQCLAPjDAPjHBQ*QCQjb -GRk#JSD+LSk1MSk1KRjbCPT13!)k-LiU*L)H&Ji+"J)#!IhpqIAepIRjqIRjpI(T -iGhCeGA4cFR"YDQCMB&pHAf"KB@*LBQ&KB'"HA9aE@PPB9eC88P"05dP(4N9'4NG -)5%P*58P*58K)4dG(4dG(4dG'489%4%0$3d*"3%!r2cip2$Xj0cBe0MFj1M`p2Mp -!3N0%48G)5Na06Np28&&489&36de068e16Nj168e16e&699GB@9PB@&KB@&PD@ea -GAQ"KBQ*MC'CRD@TXE'eYEQj[F(*cG(4dFh&`Efp[EQeXDfYUDQPTCfCNBQ"G@eP -A99046Na*4d9$3N*$4%C(58T-68p38P0899C@9eKC@eaFA&YD@9G@99468e*488p -16%Y+5NP+5NY,6%a-6%a06P"48P089&9999CA@&PD@PTC@9PC@PYHB'*NC@GSD@Y -XE@eZEQjYE@aXE'aXE@jZEfpZEQjZEQp[F("`F("`EfjYE@eYEQp`FA*bFh0cG(9 -fH(TlI(epIAemHhTiGR9dG(4dG(0aEfaTCf9NBf4PCQGSD@PTD@PTD@PUDfe[FR9 -hHATkHRTkHRPjH(GfGA4cFA"ZE'YUD@PTD@TUDfaXE'aXDfTTD'KTD@TVDfaXDfY -XE@pbGAKlIB##K)@'KiH(KiH'KS@&K)5%KB@&KB@&KB5%K)1$Ji5&KSL*LBU,M)f -2NC18PCDAPjLBQ*H@PTDAQTfKT+DQTUDPTD@QTkQUUkUTTk@MSU'JRjkGR*ZDQCL -@PC14Mif,LBH&Ji'!Ihq!JB1%KBD(KiH)LBZ1N!#6PCHCR*kKSk5PTD@NT+5NTDD -SUDZXV+bVUUUTUDQTU+HQT+1LS+#JS+#JS*qIRTfFQjUBPj@8Nj+4NC'4NC'5P*@ -@PTD@PTHCQjqLTDLTUUUUUDQTU+LSTkHQTUDQTUDQTU@PT+5NSk1LSU'JRTfEQTL -APjD@PjLCQTZER*fGRTqIS+'MT+@RU+LRTU@NSU'KS*qIRTkGRCbEQjZFRCkGR*Z -EQTUDQTUCQ*H9Nj!!Mif-M)b-M)f0MBk1Mj'5Nj@@PjQERU#MT+DRU+QUV+f[Vkq -ZVUk[X,+dY,5dXl+aX,#[VUbTU+HRU+QUUUUTU+DPT++KS*qGR*ZDQCLAPC13!)k -,L)D&K)1$K)D(LBZ0Mj'6P*@9PC@@PjQDQjZEQTLAPTD@PTD@PTD9PC@9PC@9PC5 -6NT'4NT19PTLCQTUDQTUDQTUDQTUDQCQBQ*LBQ*LBPjD9P*16NT+5NT+6P*59PjL -CQTUCQ*HAPjHBQ*LCQCUEQjbFQjZEQjbGRU#LSk1LSCqHRCfGR*ZCPj55N!#2Miq -2Mik1MBf0MBf0MBk1Miq2MSf-LiQ(KB1"J(jmHRKfG(0bFA"[EQjYE@eYE'aUD@G -PBf*KB@&LBf0MBf*LBQ0PCQKUDfaYEQj[F(*cG(0cFR&aFR0fH(TlI(epIRq!J)' -"JB'"J)#!J)#!IhprIRjpIAamI(aqJ)+%KBD(L)L*LSU,LSU*L)D'KSD'KSD'KS@ -%Ji&rIRepIAemHhPhGR4dG(9fGhKiHAPjHAPiH(KiGhCdF@jVCf0JAPaE@PPB9eC -@99468P*58e499PKC@PYFA9jIB@*MC'9RD'TVE'eYE@aXDQPSCfCQCQCQC@4MBf0 -MBf*LBQ&KBQ*MC'9QD'PUDfYVDfYVE'j`FR4fGhKiHATmIAjqIhpqIRjpIAamHhT -jH(GhGhKjHRYlI(amHhYjH(CdFR&[E@YTCf4KAeaE@PTEA&jIB'"JB'&KB@*MBf0 -MBf0LB&eD9P*25dP'3d!q2$Xl1MSj0cBe068f0cJk2$dq2dd4'4dG(4N4$3d0 -%48G)58Y,6%a-6%Y,5dY-68j389&58e9@9eKD@eaHAf"JB@*LBQ&JAepHAf"KBQ0 -NC'9RD@YYEh"aFR0dGAChH(KiGhCeFh&[EQaXDfTTD'GQC@4MBf*LBQ*LBf9RD@Y -YEQp[F(&bFR0cFh0bFA"[EQeXE'YUD@KQC@9PC@9PCQGSD@TVE@j[F(&bFh0cFh0 -dG(9eGA9dFh*aFA&bFR0cFh*bFR0eH(TpIi#"JS1%KBH)LBU*L)D&Ji+"JB'!Ihj -pI(YkHRTkHRPjHAPkHhamIAepIRjqIRepI(YjGhCeG(4dGA9eGAChGhKjHATjHAP -jHRTlHhYkHAPiH(KiHATkHRTjHAKiH(KiHATlHhYlHRTkHAPjHATkHhaqIhq!J)# -"JB+%KBD'KSD'KiH)LBU,LiU)KS@%Ji1%KBD(L)L)L)L)L)L*LiZ-MBf1Mj'6P*D -BQCUEQjZEQjZER*bGRCfGR*ZDQCH@PC56Nj16Nj15NC!!Mik-LiU*L)L)L)Q*LBQ -*LSU,Lib-MBk3!*'5P*@@PTHAPjH@PTD@PC@9PC@9PC58P*59PCD@PC56NT'4NC' -3!*!!Mik0M)b-MBk1Mj!!N!#3!*'4NC'4NC'3!*!!Mik0LiU*L)L(KiD&KB@'KiL -+M)f1Miq1MBf-M)f1Mj'5Nj59PTHBQ*LAPjD9P*58P*58P*58P*58P*58PC@AQ*Q -CQCLAPC15N!#2Mj!!N!#4NC!!Mik-LiU+Lib0Mj!!NC+5P*@AQ*UFRCfGRTqJSU5 -PTUDPT+5NT+5PTUHSU+HPSk'JRjqIS+#KSD'LSk5QU+UXVDq`X,'bXl5eYVDfYE5 -cXV'`X+qZVUfYV+bXVDf[X,'aXV1cXl1cXl1cXl+bXV+bXl1cXV+aVkkXUULQTD5 -NT+5MSk1MSk5PTD@QTUDQTUDQTU@NSk'JRjqHRTkGR*ZDQ*D9P*58P*58P*58Nj1 -6NT+5NC+5NT16Nj59PjLDQjZEQjUCQCLAPT@8P*59PC@9PC55N!#1MBf0MSq3!*+ -6P*@9PC58P*15NC!!Mif-M)Z,LiZ,M)b-LiZ+LSQ*LSU,M)b-MBb-MBf0MSk2Miq -2MSk0M)Z+LSQ*L)L(KSD'KiH(L)H(KS@&KB@'KSD&K)1#JB#!J)"rIhpqIRjrIi# -!J)#!IhjpHhYkHRYmIAjrIhprIAalHhYlI(YlHRPjH(KiH(GfGA4dG(4dG(4dG(4 -dG(4dG(4dFh0bFA"[EQeXDfTTD'GQCQCQCQGRCfCPC@9PC@CQCQCRD'PVE@paFR* -cFh4eGhKjHRTjH(GfGA0bF@pZE@aXDfTTD'GRCfGRCfKSD'PTDQYXE'eZEQp[Efj -XDfTTD@PTD@KSCfCPC'0MBQ*KB@&KB@&LBQ0MC'4MBQ&HA&YC9eC88e&38&"38P0 -8999@9PGB@9TFAQ"KBQ*MBf4PCQGRCfGRCQCQCQCRD'PTD@KSCfCQCQCQC@9NC'* -KAejGA&eHAf&LBQ*LBQ&KB@&KB@&KB@"JB&pIAepIB'"JB'&KBQ0PCQGSD'PTD@P -TD'KSCfCQCQCQCQCPC@4LB@"IAPpIB'&LBf0MBQ*MBf4QCfKTDQTTD@KQC@4MBQ* -LB@&KB'&KBQ*MBf4NC'9QCfKTDQTUDQTUDQTUDQTTD'GQC@4MBQ&JB&pIAepIB'& -LBf0MC'4MBf4NCQGSD@PSCfGQCQGSD'PUDQYVDfYXE'eYE@aXE@eZEQjYE'TTD'G -RCfGRCfCQCQCQCQ9PC'4MC'4NC@9PC@CQCQ9PC'0LBQ*LBQ*MBf0NC'4NC'4MBf0 -MC'4PC@9QC@9QCfKUE'paFh4eGRCfGRGhGhGiH(KiGhCeG(*aF("`F("`EfjYE'Y -VDQTUDQPSCQ9PCQKUE'pbG(GjHhk!JS1%Ji1#JB#!JB'"JB"rIRepI(apI(amHhT -kHAPjHAPiH(KiH(KiH(PjHATkHhYlHRTkHRTlI(erJ)'#Ji5&KSH)LSf2NC18P*5 -8PC@9PC@9PC@@PTDAPjD@PjLCQTZFR*bFR*fIS+'KSD#IRjkHRCfFQjUBPT55NC! -!Miq2Miq2Miq3!*!!NC'6P*@AQCZGRk'LSk1MSk+KS*qGQjUBPjH@PC@8NT'3!)k -0MBf0MSq2N!#3!*!!Miq2N!#3!*!!N!#3!*'4NC'5NT16P*59PTD@PT@9PCD@PjL -CQTUDQTZFR*fHRTqJSD'LSU+LSU+LSU'KSD#IRjkGR*UCQ*H@PC@9PC@@PTH@PT@ -9P*16P*58PC58Nj16Nj58PC@9PC@9PCD@PjLBQCQDQjbGRTqJSD#JRjkGR*ZDQTU -CQCLAPjD@PTD@PjHBQCUER*fGRCfFQTQAPT56Nj+4N!#2Mik1MSk2Miq2N!#3!*! -!N!#2Mj!!N!#3!*'5Nj18P*16NT+6Nj58PC@9PC@8P*56NT'4N!#3!*!!N!#4Nj5 -9PTHAPjHBQ*QDQjZER*bGRCkHRTkIS+#KSU1MSk1MSk1NT+5MSk+LSCqGQjQ@PC1 -5NC!!MSb,LSQ*LSU,MBk2N!#4Nj59PTHBQ*LBPjHAPTD@PTD@PT@9PCD@PjQERCk -JSD+MSk1MSk1MSk1NT+@PTUDQTD@PT+1MSU+KSD'KSU1MSk1MSU'JS*qHRCZDQCH -9P*15NT18PTLDR*fISD1PTkQTUDHPSk'JRTfEQTLAPT56NT'4NC+6P*58P*15NC! -!N!#2Mik0M)Z+L)D&K)5$Ji1$JS'!IhjpI(alHhYkHRPiGhCeGA9eGA9eGA9dFh0 -cFh*bFR&`EfjZEQj[Efp[Efp[F(&cG(ChH(PjHATlHhYlHhYlHhYlHRTjHAPjH(K -iH(KjHRYpIRq!JB'!J(pqIRjpIAjqIRq!J)'"JS1$K)5%Ji1$Ji+"IhjmHRKfGA0 -bFR&aF(&aFR*cFh4eGACfGRGhH(PjHAPiH(GfGA9eGAChGhKjHATlI(amI(YlHha -pIAepIAalHhYlHhYmI(apIRjrJ)#!J)#"JS+#JS'!J)#!J)#!IhpqIAamHhTjH(G -eG(0bFA"`Efp[Efp[EfpZEQj[Efp[Efp[EQj[Eh"aFR*bFR*bFR0cG(4dFR"ZE'T -TD'GQCQCPC@0LB&pGA9eGAPjGA&TB9P989&488e068P*58e068e068e068e*589& -48P*68e058P*489&489&489&489&489*68e068P&36dp26dp26dp26e&59&GB@PY -FA&jIB@*MC'4MBf*LB@"JAeeFA&aFA9eHA9aF@eYEA&eHAf&LC'CRD'PUE'eZEh& -aFR0dGAGiH(KiGhGfGRCfGRCfGRCfGRCfGA9eGA4cFh&`EfjYE'aXE'YUD@KRCfG -RCfGQC@9NBf0MBQ*KB&pHAPeFA&aFA9eGA9eGA9eGAPpJB@&KB&pHA9eGAPpJB@& -LBQ0MC'9QCQCQCQCQC@9QCQGRD'KRCfCPC@9PCQGRCfGRCfGRD'KSD'KRCfCQC@9 -PC@9QCQGRCfGRCfKSD'PTD@KRCQ9MBQ"HA9aE@PTC@9PD@eaGAPpJB@&LBf4PCQG -SD'KSD'KRCfKSD@TVE'j[F(&bFh0cFh0bFR*aFA&aFA*bFh4eGRGjHRaqJ)'$KBD -(L)L)L)H(KiH(L)L)L)L)L)L*LBQ*LBL(KiD&KB5%K)1$JS'"J)#!JB'"JS+#Ji1 -$JS+#JS1$K)@&KS@&KB@&KB@&KBD(KiL*LSZ,M)b-MBk2NC18PTHBQCUDQTUCQCQ -BQ*LBPjHAPjLCQTbHRk#KSD'KSD#JRjkFQjQAPT@8Nj+4N!#2MSk0MBf1Mj!!NT1 -8PCDAPjHAQ*LBQ*QCQCLBQ*LAPjD9P*15NT+4NC'3!*!!N!#3!*'5Nj@AQCZGRk# -LSk5PTUHSUDUVUkZUUUQSU+QTUDUUUDQSU+LSUDUUUkZXV+fZX,+cY,@fYE@dXV' -[VUfXUkUSTk@MSD#HRCbFR*bGRCfGRCkHRjqJS*qJS+'KSU1MSU+KSD'KSU+LSD# -IRTfEQjUDQTUER*fHRTqJS+'LSk5QTkQUUUZUUUQSTkDPT+1KRjfDQ*D9Nj'3!)k --LiU*LBQ*LSb0MT!!NC+5Nj58PCDBQCUER*bGRCfGR*bGRCfGRCfGR*fGRCkHRTk -GR*bEQTUCQ*LAPT@9P*58PC58P*16Nj16P*59PC@9P*15NC'4NC'5NT16Nj59PTH -BQ*LCQCQDQjZEQjUCQ*H@PT@8P*14N!#3!)q1MSf0MBf0MBf-M)b-M)b-M)b,LSL -(KS@%Ji+"J(pqIAeqIRjrIhq!J)+$KBH*Lib0MSq3!*!!NC'4NC'3!*!!Mik0M)b -,LSQ*L)Q*LSZ-MBk2Mj!!N!#4NC+5Nj@@PjHAPTD9P*15NT+4NC!!Mik0MBf1Mj! -!N!#4N!#3!)q2Miq2N!#3!*!!N!#3!)q1MSf0M)b-M)f0MBk1MSk1MSk0M)Z,LSU -+LBQ)L)H'KB@%K)5&KSH)L)L)KiH'KSH(L)L)L)L(KiD&KB@%K)1#JB"rIhq!J)" -rIhprIhprIhpqIRemHhTkHAKhGR9dG(4dFh0bFR*aFA&aFA&bFR*bFR0cFh0cG(4 -eGRGiH(PjH(KiGhCfGA4cFR&`F'pZE@aXE'aXE'YVDfTUD@KSCQ9PC'0MBf4NC'9 -QCQCQCQ9NBf*KB@&LBQ*LBQ*KB@*LBf4NC@9PC@CQCfGSD'KSCfCPC@9PC@9PC'4 -NBf0MBf0MBf*LBQ&KB&pHA9aFA&aGA9eHAPjHAf"KBQ0MBf0LB@"HA9aE@eYFA9j -HAf"KBf9RD@TXE@jZEfp`F("`F(&aFA&aFA&`F'p[EfjZE@eYE'aVDfTUD@PTD'K -RCfGRD'KTD@PTD@KRCQ9MBQ&KB'"JB'"JB'"JB&pIAepIAepIAepIAepIAepIAf" -JB'&KBQ*LBQ*KB@&KBQ0MBf0MBf*LBf0PCQGSD@PTD@TUDQTUD@KQC@4NBf0MC'4 -MBf0MBf0NC'9QCQGSD'PTDQYXEQpaFh4fH(TlI(epIAemI(alHhTjH(GhGR9dFh* -aF("`F("aFA&`EfpZE@YVDQPRCQ9NBf*LB@&KB@"JB'"JB'"JB@&KB'"JB&pIAep -IAepJB'"JB@&LBf0MBf0MBf*LBQ*MBf0MBf0MBf0NC'9PC@9PCQCQCQCQCQ9PC@9 -PCQCRCfKRCfGQCQCQCfKTDQYXE'eZEh"`FA*bFh4dGA9eG(4dFh0bFR*bFR0dGAC -iHATlIAk!JB1&KSH)L)Q*LBL)KiH(KiH(KiH(KSD'KiH(L)L*LSU,M)b-M)Z,LiZ -,LiU+LBQ*LBQ+LiZ-LiZ,LiZ-MBf1Mj!!N!#3!*!!N!#2Miq1MBf0MBf-M)Z+LSU -+LSU,LiU+LSQ*L)L)L)L*LSZ-MBk2Mj!!N!#4NC'4NC'4NC'4N!#2MBb-M)f1Mj' -5Nj@@Q*QDQjZFR*bFRCfGR*bFQjZDQCQCQCQCQCQCQ*LBPjD@PC56NT'3!*!!N!# -3!)q2Mik1MBf-M)Z,LiZ,LSU+LBQ*L)L)L)L*LBU,Lib0MBk2Mj!!N!#4NC+5NT+ -5NC'4N!#3!*!!N!#3!*!!N!#3!*!!N!#3!*'4NT19PTHBQCQCQCQCQ*LBPjHAPjH -APjHAPjLBQCQDQjZFR*fGRTqKSU1NTD@QTUDPTD@PTD@PTUDQTkHRU+LSTkHQTU@ -NT+1LSU'KS*qHRTfGRTkHRTfGRCbEQjZER*bGRTkIS+#JSD'KSU1NT+@PTD5NSk1 -LS*qHRCbEQjZEQTUDQTUDQTQBPjD9P*56Nj+5NC!!MSf-LiU*L)H(KiH(KiH'KSD -(L)L*LBU+LiZ,M)b-MBf0MSk1MSk1MSk2Mj!!N!#4NC'3!*!!N!#3!*!!N!#3!*! -!N!#3!*!!N!#3!*!!N!#3!*!!N!#3!*'4NC!!Miq1MBb-M)b0MBf0MBb,LiU+LSU -,Lib-M)f0MBk1Miq3!*'5Nj18P*@9PC@9PC@8P*16Nj18P*58PC@8P*16NC!!Mif --LSQ*L)H'KB5#JB#!J)#!J)'"JB'"JB'#JS1%KB@'KiL*LBU,M)f2N!#4NT16Nj5 -8P*58Nj16NT'3!)q1MSf0MBf-M)b-M)f0MBk1Miq2Miq2MSf0M)Z+LBL)L)L*LBU -+LSQ*L)L)L)L(KiH'KS@&KB@&KBD'KS@&KB@%K)5%Ji1$Ji1#JS+#JB'!IhjpIAa -mHhTjH(GfG(0cFR*aFA"`Efp[Eh"`FA*bFh0dGAChGhKiHAPjHAPjH(GhGRCeGA9 -eG(4dFh0cG(4eGA9eG(9eGA9eGA9eGA4dFh0bFR&aF'pZEQeZEQjZEQp[Eh"`FA* -cGAChHAYmIRjrIhprIRjpIAalHhTjGhCeGA4cFh*bFA&`F("`F("`F("`F'p[EQe -YE'aVDfYUDQPSCfCQC@9NC'4MBf*LBQ0MC'9QCfKTD@TUDfaYEQp[EQjYE'YVDQT -UDQPTD'GRCQ9PC'4MB@"IAPeGA9eGA9eHAPjHA9eGA9eHAPpIAejGA9aFA&aGAPp -JB@*LBQ*LB@&JB'"IAepIB'"JB'&KB@&JB'"IAepJB'"JB'&KBQ0NC@9QCQCQCQ9 -PC@9PC@4NBf0LB9pIAPjGA9eGA9aFA&aFA&aFA9eHAepJB@&KBQ*LBf0NC@CRCfK -SD@PUDfaYEQj[Efp`F(&aFA&aFA&aFA*bFR&aF'p[EQjZEQeYE'aXE'aXE@eZEQp -`F(&bFh0cG(4eGAChGhKiH(KjHAPkHRYlHhYlHhYmI(apIAepIAamI(amI(apIAa -mI(YlHhYlI(apIRjrJ)'#JS1$Ji1$JS+#JB'"JS+#JB'"J)#"JB'"J(pqIAalHhY -lHhTkHRTkHAPkHRTkHRPjHAKiGhCeGA4dFh0bFR*bFR*bFh4eGRGiH(KiH(KhGRC -eFh0bFA"`F("`FA&aFR*cFh4dGA9eGA4dFh0cFh0cFh0dG(4eGACfGhKiHAPkHRP -jHAPjHATkHRYlI(apIRjqIhprIhpqIRjqIRjpIAepIAepIAepIAjqJ)'#Ji5%KB@ -%K)5$Ji+"JB#!J(prIhprJ)#!JB'"JS+#JS+#JS+#JS+#JS+$K)@'KiL*LSU,M)f -1Miq3!*!!N!#3!*!!N!#3!*!!N!#4NT+6P*@@PTHCQTZGRU#KSD+LSU+KSD'JS*q -IRTkHRTkHRTfGRCfGRCkHRTkGRCfGRCfHRjqJSD'KSD'KS+#IRjqHRTkHRCfFQjZ -DQTUDQTZER*bGRCfHRTkHRjqIRTkGRCbFR*bFQjZDQTQBQ*LBPjHAPjHAPjD@PC@ -9PC@@PTDAPjHAPjHBQ*LBQCQCQCQBQ*LBPjD@PT@@PjHBQ*QBQ*LBPjHAPjHAPTD -@PC56Nj+4NC!!N!#3!*!!N!#3!)q2N!#3!*'5Nj16P*58PCD@PjHAPjD9P*56Nj+ -5NT+5NT+5Nj18P*@@PTHAPjD@PC@9PC@9P*58Nj16Nj15NT+4N!#2MSk0MBf0MBk -1Miq3!*!!NC+6Nj59PC@9PC@@PTD@PC@9P*56Nj16Nj16Nj16Nj16NT+4N!#2MSk -0M)Z,LSU+LSZ,Lib0MBk1Miq2Miq2Mik1MBf-M)b-LiZ+LSQ*LBQ+LSQ*LBL)LBQ -+LSU,LiZ,M)b0MBk2N!#3!*!!Mik0M)Z+LBL(KSD&K)1$JS+#JB'!J)'"JB+#JS+ -#JS+#JS+#JS'"J)#!J)'"JB'!J)#!J)'"JS+#JS1$Ji1$JS+"J(pqIAalHRPjH(G -hGhCfGR9eGACfGhGiHAPkHRYmI(eqIhq!JB+#JS1$Ji1$Ji1$JS+#JB'"J)#!J(p -rIhjqIRepIAamHhYlI(apIAeqIRjqIRprJ)#!J)"rIRemHRTjH(GhGR9eG(4dGA9 -eGRCfGR9eGA4dFh0cFR*aF'pZEQeYE'aVDfYVDfYVDfYVDfYVDfTTD@KSD'KSD@P -UDfaYE@jZEQeYE@eZEQp`FA*cG(ChH(PkHhamI(amI(amI(amHhYkHAPiGhCeG(0 -cFR*bFh0dG(4eGA9eGA9fGRCfGR9eG(4cFh0cFh4dGA9eGA9eGA9fGhKjHAPjHAK -iGhCfGA4cFR&`F'p[Efp[EQjYE@aXDfYUDQTTD@KSCfCQC@9PC@4NBf0LBQ*KB@& -JB&pHAPeGA9eGA9jHAf"KB@&LBQ*LBQ0MC'4NC'4NC'4MBf*LBQ*LBf4PCQGRCfG -RCfGRCfKTD@TUDQTUDQYVDfaXE'aVDfYVDfYVDfaXE'aYE@jZEh"`FA*bFh0dG(9 -eGA9eGRCfGRCfGA9eGA9eGA4dG(4dFh0cFh0cG(4cFh0bFA"[EfjYE@eYE@eYEQj -ZEQjZEQjZEQp[EQjZEQj[Eh"`F("[Efp[Eh"`FA*bFR*bFR&aFA&aFA"`F("`FA* -cG(9fGhKiHATlI(epIRq!J)#"J)"rIhjpI(YlHhYmI(eqIi#!JB+#Ji1$Ji1$Ji1 -$Ji+#JB'!IhprIhprIhpqIRjqIRjqIRepIAamI(amI(apIAepIRjqIRprIhq!J)" -rIhjqIAamHhYkHRTjHAPjHRTlHheqIi'#Ji5&KSD'KiD'KS@%K)1$JS+"J(pqIAa -mI(YlHhYmI(epIRjqIhprIhq!J)#!J(prIhq!J)'#Ji5%KB@'KSD(KiH(L)L*LBU -,M)b0MSk2Miq3!*!!N!#3!*!!Miq1MSf-M)Z,LiZ,M)b0MBk1MSk1MSk2N!#4NT1 -8PCD@PTH@PT@9P*16NT'4N!#2MSb,LBH'K)1#JB#!J)#!J)'"JS+#Ji1$K)5%K)5 -%K)5&KBD'KSH(KiH(KSD&KB@&K)5&KB@'KSH)LBQ+LiZ-M)b0M)b-LiU*LBL)KiH -(KSD'KSD(L)Q+LSZ,LiZ-M)f1Miq3!*'4NC'4NC'4NT+6P*@9PTHAPjH@PT@9P*1 -6Nj+5NT+5NT16P*@9PTD@PjHAQ*LBQ*HAPjD9P*15NT'4NC'5NT+5NT+5NT+5Nj1 -8P*59PC@9PC@9PC@9PC@9P*58P*56Nj16Nj58P*58P*58P*56Nj15NT+5NT+5Nj1 -6Nj16P*@9PTHBQCUER*bGRTqIS+'KSD#JS*qIRTkGR*bEQTQCQ*H@PC56NT'4N!# -3!)q2MSf-M)b-M)f0MSk2Miq3!*!!N!#3!)q2MSf-LiU*LBL(KiH'KSD'KSD'KSH -(KiH(KiH'KSD'KSD'KS@&K)5$Ji1#JS'"J)"rIhprJ)#"JS1%K)@&KB@&KB@%K)1 -#JB"rIhprIhprIi#!J)#!JB'"JS+$K)5%K)1$Ji1$Ji1$Ji1#JS+#JS+#JS1$Ji1 -$Ji1$K)5&KB@&KB@&KB5%K)1$JS+#Ji5%KBD(L)L)L)Q*LSZ-M)f0MSk1MSf0MBb --LiZ+LSQ*L)L)L)L(KiH(KSD'KSH(KiH(L)L)L)Q*L)L)KiD&K)5$JS+"J(pqIAe -qIRprJ)'"JS1%K)@&KB@&K)1$JS'"JB#!J(prIhpqIRjqIRjqIRjqIRprIhq!J)# -"JB'"JB'!J(prIhprIhjpIAalHRPiGR9dFR&aF("`F("`F("aFA&aFR*cG(4eGRC -fGRCfGA9dFh*aF'pZEQeYE@aXE'aXDfYVE'aXE'aYE@eYE@eXE'aVDfTUD@KSCfG -RCfGRCfGQC@9NC'4PC@CQCQGRCfKSD'PTDQYXE'eZEQp[F("aFA&bFR*cFh0cFh0 -bFR&aF("[F("`F(&aFA&aFA&bFR0dG(9eGRCfGRCfGhKiHAPkHRPjHAKiGhGfGRC -eGA9eGA9eGA4dG(0cFh0bFR*bFR*cFh0cFh0cG(4cFh0cFR*aFA"[EfjYE'YUDQP -SD'GRCfKSD'PTD@TUD@PTD'GRCQ9PC@9PC'4NC'4PC@CQCfGSD'PTDQTUDQTTD@P -SD'KSD'GRCfCQCQ9PC'0MBQ*LBQ*LBQ*LBQ*LBf0NC@9QCfKTDQYXE@eZEQp[F(& -aFR*bFR&aF'pZEQeYE@eYE'aXDfYUDQPTD@PSD'KSD'KSD'GRCfGRCfGRCfKSD'K -TD@PTDQTUDQTUDQPTD@PTDQTUDfYXE'eZEQj[Efp`F(&aFR*cG(4eGACfGRChGhG -iH(PjHATkHRPjHAKiGhGhGhKiH(PjHATkHhYlHhamI(amHhYlHhYlHhYmI(amIAe -qIhq!J)'"JB'"JS+#Ji1$Ji1%K)5&KB@'KSD'KSH(KiD'KB@%K)5%K)5%K)5&KBD -(KiL*LBQ*LSU+LSU*LBQ)L)H(KiH(KiD'KSD(KiL)LBQ*LSU+LBQ*LBQ*L)L(KiD -'KB@%K)5%K)5%K)@&KB@&KSD'KSD'KS@&KBD'KSH(KiH)L)Q+Lib-M)b-LiZ,LSU -+LSU+LSU+LSU+LSU+LiZ,LiZ,LiZ,LiZ,LiZ,LiZ,LiZ,M)b0MBf1MSk2Mj!!N!# -3!*'4NC+5Nj16P*58PC@9PC@9PC@@PTD@PTD@PjHAPjHAPjHAPTD9PC56Nj15Nj1 -6Nj16Nj16Nj16P*58P*@9PC@9PC58P*58Nj15NT+4NC'4NC+5NT+5NT+5NT16Nj1 -6Nj18P*59PC@9PC@9PC@9PC58P*16NT+4NC!!N!#3!)q3!*!!N!#3!*!!N!#3!*! -!NC'4NT+5Nj16Nj58P*58PC@9PC@@PTDAPjHAQ*LAPjHAPjHAPTD@PC@9PCD@PjH -AQ*LBQ*LAPjHAPTD@PTD9PC@9PC58P*58PC@8P*16NT'3!)q1MBb-LiU*L)H'KB5 -%Ji1#JS+#JS+#JS+$Ji5%K)5%K)5%Ji1$Ji1$Ji1$Ji1$K)5&KBD(L)Q*LSU,Lib -0MBk1MSk1MSk1MBf0MBf0MBf0MBf0MBf0MBk1MSq2Mj!!N!#4NC'5NT+6NT+5NC' -4NC!!N!#4NC'4NT+5NT+5NT+4NC'3!*!!N!#3!*!!N!#3!)q2Miq2Miq2Miq2MSk -0MBb-M)b-LiZ,LSU*LBL)KiH'KSD'KSD'KiH(L)L*LBU,LiZ,M)Z,LiZ+LSU+LBQ -)L)H'KB5$JB"rIRepI(YlHRPjH(KhGhGhGhGhGhGhGhGhGhGfGRChGhGhGhGhGhG -hGhGfGRCfGA9eGA9dG(4dG(9eGA9eGA9eGA9eGA9dG(4cFh*bFR*bFR*cFh0dG(9 -eGACfGhKiH(KiH(GhGhCfGR9eGA4eGA9eGA9eG(4cFh0cFh0cFh0cFh4dG(9eGAC -fGhKiHAPkHRTkHRTjHAKiGhGhGhGhGhGiH(KjHAPjHAPjHAPjHAPjHAKiH(KiH(K -iH(KjHATkHRTkHRTkHRTkHRPjHAPjHAKiGhGfGR9eGA9eGA9dG(4dG(4dGA9eGA9 -eGA9eGA9eGA4dFh0bFR*aFA&aFA&aFA*bFR*bFR&aF'p[EQjYE@eYE'aXE'YVDfY -VDfYXE'aXE'eYE@eYE@eYE'aXE'YVDfYVDQTTD'GRCQCPC@9PC@9QCQCRCfGSD'K -SD'KSD'KSD'GRCfGQCQ9PC'4NBf4NC@9QCQGRCfKSD'PTD@TUDQTUDQTUDfYVDfY -VDfYVDQTVDfYVE'aYEQp`F(&bFR0cFh0cFh0cFh0cFh0bFR*bFR*cFh0cG(4dGA9 -eGRChGhKjHATkHRTkHAPiH(KhGhCfGRCfGRCeGA9dG(4dG(4dG(0cFh0bFR*bFA& -aF("`F(&aFA&aFA&bFR*cFh4dG(4cFh0dG(4dG(4dG(9eGAChGhKiHATlHhamI(e -pIAepIAamHhYlHRTkHRTkHRTkHRTkHRYlHhYlHhamI(alHhYlHhTkHRPjHAKiH(K -iH(KiGhGhGhCfGhGhGhGhGhGhGhGhGhKiH(PjHAPjH(KiH(KiH(KiH(KiH(KjHAP -kHRTlHhapIAjrIi#!JB'"JB'#JS+$Ji1$Ji1%K)5%K)1$Ji5%K)@&KSD'KiH(KiH -(KSD&KB@&KB@&KB@&KB@&KSD'KSD&KB5%K)1$Ji1$Ji1$Ji5%KBD(L)L*LBU+LSZ -,LiZ,LiZ,LiZ,LiU+LSQ*LBQ)L)L)L)L)L)L(KiH(KiH(KiD'KSD&KB@&KBD'KiH -(KiL)L)Q*LSZ,LiZ,LiZ,LiU+LSU+LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBU -+LiZ,Lib-M)b-M)b,LiU+LBQ)L)L)KiH(KiD(KiL)LBQ+LSZ,Lib-MBf1MSq2N!# -3!*!!N!#3!*!!Miq2Miq2Miq2Mik1MSq2Mj!!N!#3!*!!N!#3!*!!N!#4NC'4NC' -4NC!!N!#3!)q2Miq1MSk1MBf-M)b-M)b0MBk1Mj!!NC'5Nj58PC@9PC@9PC@9PC@ -@PTD@PTD@PTD@PTD@PjHAPjLBQCUDQTZER*bGRCfHRTkHRTkGRCfFR*bFR*bFR*b -FR*ZEQjZDQTUCQCLBPjHAPTD@PT@9PC@9PC@9PC@@PTDAPjHBQ*LBQ*LBQ*HAPjH -@PT@8P*15NT'4N!#3!*!!Miq2Mj!!N!#3!*!!NC'3!*!!N!#3!)q2Miq2Miq2Mik -1MSf-M)Z,LiZ,LSU+LSQ*L)L)L)L(KiH(KSD'KS@&KB@&K)5%K)5$Ji1$Ji1$Ji1 -#JS+"JB'!J)#!J)#"JB'"JB'"JB'"JB#!J(prIhpqIRprIhprIi#!JB'#Ji1%K)5 -%K)5%Ji+#JB#!IhpqIRjqIRjqIRjqIRprIi#!J)#"JB'"JB#!IhprIRjqIRjqIRj -qIRjqIRjrIhq!J)#"JB'#JS+#Ji1$K)5$Ji1#JS+"J)"rIhpqIRjqIRjqIRjrIhp -rIhprIhprIhq!J)#!J)#!J)#!J(prIRjqIRjqIRjqIRjqIRjqIRjqIhprIRjqIAe -mI(amHhYkHRPjHAKiH(GhGRCfGRCfGR9eGA9eGA9eG(4dFh0bFR&aFA&aFA&aFA* -bFA&aFR*bFh0cG(4dFh0cFh0cFh0cFh0cFh0cFh0dG(4dG(4cFh0cFh0cFh0bFR* -bFR*aFA&`F'p[EfjZEQeYE@aXE'YVDfYVDfYVDfYVDfYUDQTUDQTUDfYVDfaVDfY -UDQTUD@PTDQTUDQYVDfaXE@eZEQp[F("`FA&aFA&aFA&`F("`F("`FA&aFA*bFR* -bFR*bFR*bFR*bFR*bFR*bFR*bFR*bFh0cFh4dG(4cFh0cFh0dG(9eGRChGhKiHAT -kHRTkHAPjH(KiGhGhGhCfGA9dG(4dG(9eGA9eGRChGhKiH(KiH(KhGhGhGRCfGA9 -dG(4dG(4dG(9eGAChGhKjHRTlI(apIAeqIRjqIAepIAamHhYkHRPiH(KiH(GhGhG -fGRCfGRCfGRCfGR9eGA9eGA9eGA4dG(0cFh*bFR*bFR*aFA&aFA&aFA&aFA&aFA& -bFR*bFh0dG(9eGA9eGA9eGA9eGA9dG(0cFR*bFA&aF("`F("aFA*bFh4dGA9fGRC -hGhGhGhGhGhCfGA9eGA9eGRCfGRChGhGiH(KiH(KiH(KiHAPjHAPjHRTkHhamIAe -qIRjrIhprJ)#!JB'"JB'"JB'#JS+$Ji1$K)5%K)5%K)5%K)5%K)5$Ji1$Ji1$Ji1 -$K)5%K)5&KB@&KB@&KB@&KB5%K)5%Ji1$Ji1$JS+#JS+$Ji1$K)5&KB@'KSD(KiH -)L)L)L)L)L)L)L)L)L)L)KiH(KiH(KSD'KS@&KB@&KB@&KB@&KB@&KB@&KB@%K)5 -$Ji+#JS'"JB'"JB'"JB+$Ji5%K)5&KB@&KB@&KB@&KB5%K)1$Ji1$Ji5%Ji1$Ji1 -$JS1$Ji1%K)5&KB@'KSD(KiH(KSD'KSD'KS@&KB@&KB@&KB@&KSD'KiH)L)Q*LBU -+LSZ,LiZ,LiZ,M)b-MBf0MBk1MSk1MSk2Miq1MSk2Miq2Mj!!N!#3!*!!NC'4NT+ -5NT+5Nj+5NT'4NC!!N!#3!)q2Miq1MSk1MSk1Miq2Miq2Mj!!N!#3!*'4NC'4NC' -4N!#3!*!!N!#3!)q2Miq1MSk1MBf0MBf-M)b-M)b0MBf0MBf0MBf0MSk1MSk1MSf -0MBf0M)b-M)b-LiZ,LiZ,Lib-M)b0MBf1MSk1MSk1MBf0M)b,LiU+LSQ*LBQ)L)L -)L)L)LBQ*LBU+LSU,Lib-M)f0MBf0M)b-M)b,LiZ,LiZ+LSU+LSU*LBQ*LBQ*LBQ -)L)L)L)H(KSD&KB@&KB5%K)5%K)5%K)5%K)5%K)5%K)5%KB@&KB@'KSH(KiH)L)L -(KiH'KSD'KB@&KB@&KB5%K)5%K)5%KB@&KB@'KSD'KSD'KS@&KB@%K)5$Ji1#JS' -"JB'!J)#"JB'"JS+#Ji1%K)@&KBD'KS@&KB@&KB@&KB@&KB@&KB@'KS@&KB@'KSD -'KSD'KiH(KiL)L)L)L)L)L)L)L)H(KiH(KSD'KSD'KSD'KB@&KB@&KB@&KB@&KB@ -%K)5$Ji+"JB#!IhpqIRjpIAemI(amI(amI(YlHhYlHhYlHhYmI(amHhYkHRTjHAP -jHAKiGhGfGR9eGA4dFh0cFR*bFR*bFR0cFh0dG(9eGRCfGRCfGRCfGRChGhGhH(K -iHAPjHAPjHAPiH(KiH(KiH(KiH(KiH(KiH(PjHAPjHAPjHAPjH(KhGhCfGRCfGRC -hGhGhH(KiH(PjHAPjHAPjHRTkHhYmI(epIAepIRjqIAepI(YlHRPiH(KhGhGfGRC -fGRGhGhKiH(KiH(KiH(KiGhGfGR9eG(4dG(0cFh0cG(4dGA9eGRCfGhGhGhGhGhC -fGRCfGA9eG(4dG(4dG(4dG(4dG(4dFh0cFh0bFR*bFR*cFh0cFh4dG(4dGA9eGA9 -fGRCfGRCfGRCfGRCfGR9eGA9dG(4dG(4cFh0dG(4dG(4dFh0cFh*bFA&`F("`F(" -`F("`F("`FA&bFR*cFh0dG(4dG(4dFh0cFh0cFh0cFh0cFh0dG(4dG(4dG(0cFh0 -cFR*bFR*cFh0cFh0cFh0cG(4dG(9eGA9eGA9eGRCfGRCfGRGhGhGhH(KiH(KjHAP -kHRTlHhYmI(amI(epIAepIAepIAemI(YlHRTkHAPjHAPjHAPkHRTkHRTkHRPjHAP -iH(GhGRCfGRCfGRChGhGiH(KjHATkHhYmI(apIAeqIRjqIRjpIAepIAepI(amI(a -lHhYlHhYkHRTkHRTkHRTkHRTkHRYlHhYlHhYmI(amI(YlHhTkHRPjHAPiH(KjHAP -kHRYlI(amIAeqIRprIi#!J)#!J)#!JB'"JB+#JS+#JS+#JS+#JB'"JB'#JS+$Ji1 -%K)5%K)@&KBD'KSD'KSH(KiH(KiH(KiH(KiH(KiH(KSD'KSD'KSD'KSD'KSD(KiH -(KiH(KiH(KiH(KiL)L)L)LBQ*LBQ+LSU,LiZ,LiZ+LSU+LBQ*LBL)L)L)L)L)LBQ -*L)L)L)L)L)L)L)L*LBQ*LBU+LSU+LSU*LBQ*L)L)L)H(KiH(KiL)L)L)LBQ*LBQ -+LSU+LSU+LSQ*L)L(KiD'KS@'KSD'KSD(KiH(KiH(KiH(KiH)L)L)L)L(KiH(KiH -(KiL)L)L)L)L)L)Q*LBU*LBQ)L)L(KiH'KSD'KSD'KSD'KS@&KB@&KB@%K)5%K)5 -%Ji1$Ji1%K)5&KB@'KSH(L)L)L)L)L)L)L)L)L)H(KiH(KiD'KSD'KSD'KiH(KiH -(L)L)L)L)LBQ*LBQ*LBQ*LSU+LiZ,M)b0MBf0MSk1MSk1MSf0MBb-M)b-M)b-M)b -0MBf0MBk1MSk2Miq3!*!!N!#3!*!!N!#3!*!!N!#2Miq2Miq2Miq2MSk1MSk0MBf -0MBf0MBb-M)b-M)b-M)b-M)Z,LiU+LSQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBL)L)L -(KiH'KSD'KB@&KB@&KB@&K)5%K)5%K)5%K)5%K)5%K)1$Ji1#JS+#JB'"JB'"JS+ -#JS+$Ji1%K)5%K)5%K)1$JS+#JB'"JB'!J)#!J)#!J)#!J)#!J)"rIhprIhprIhj -qIRjqIRjpIAepIAemI(amI(amI(amI(amI(amIAepIAjqIRjqIhprIhprIhprIhp -rIhjqIRjqIRjpIAepIAepIAepIAepIRjqIRjqIRprIhprIRjqIRjqIRjqIRjqIRj -qIhprJ)#!J)#"JB'#JS+#Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$JS+#JS'"JB'!J)#!J)# -!J)#!IhprIhjqIRjpIAepIAepI(amHhYlHRTkHAPkHRTkHRTkHRYlHhTkHRTjHAP -jH(KiH(KhGhGhGRCfGR9eGA9eGA9eGA9eGA9eGA9eGA9eGA9eGA9eGA9eGA4dG(4 -dG(4cFh0cFh0dG(4dG(4dG(4dG(4dG(4dGA9eGACfGRCfGRCfGRCfGA9eG(4dFh0 -cFh0cG(4dGA9fGRChGhGhGhGhGRCfGRCfGRCfGA9fGRCfGRCfGRGhGhGhGhGiH(K -iH(KhGhGhGhGhGRCfGRCfGR9eG(4dG(0cFh0cFh*bFR*bFR*cFh0cFh0cFh4dG(4 -dG(4cFh0cFh0cFh0cG(4eGA9fGRChGhGhGhKiH(KiH(KiH(PjHAPjHAPjH(KiH(K -iH(GhGhGhGhGhGhGhGhGhH(KiH(KiH(KiHAPjHAPjHAPiH(KiGhGhGRCfGRChGhG -hH(KiH(PjHAPkHAPjHAKiH(KhGhGhGhCfGRChGhGhGhGhH(KiH(KiH(KiH(KiH(P -jHRTlHhamI(epIAepIAepIAepI(amI(amIAepIAepIRjqIhprIhprIhprIi#!J)" -rIhprIhprIhprIhpqIRjqIRprIhprJ)#!JB'#JS1$Ji1$Ji1%K)5%K)5%K)1$Ji+ -#JS+#JS+#JS+#JS+#JS+$Ji1$Ji1$Ji1$K)5%K)5%K)5%K)5%K)5$K)5%K)5%KB@ -&KB@&KB@&KBD'KSD(KiH(KSD'KS@&KB@&KB@%K)5%K)5%K)5%K)5%K)5%K)5%K)5 -%K)5$Ji1$Ji1$Ji1$Ji1%K)5%K)5%K)5%K)@&KBD(KiL)L)Q*LBU+LSU+LSU+LSU -+LBQ*L)L)L)L)L)L)L)L)L)L)L)L)L)L(KiH'KSD'KB@&K)5%K)5$Ji1$Ji1$Ji1 -$Ji1$K)5%K)5%K)5&KB@&KB@&KB@%K)5%K)5%K)1$Ji1$Ji1$Ji1$K)5%K)5%K)@ -&KB@&KB@&KB@%K)5%K)5$Ji1$Ji1%K)5%K)@&KBD'KSD(KiH(L)L)L)H(KiH(KiH -(KSD'KSD'KSD(KiH(L)L)L)L)L)L)L)L(KiH(KiH(KiH)L)L)LBQ*LBQ*LBQ*LBQ -*LBQ*LBQ)L)L(KiH(KiD'KSD'KB@&KB@&KB@&KB@&KBD'KSD(KiH)L)L*LBQ*LBQ -*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LSU+LBQ*LBL)L)L)KiH(KiD'KSD'KiH(KiL)L)L -)L)H(KiH(KiH(KSD'KSD'KSD'KSH(KiH(KiH(L)L)KiH(KiH(KSD'KSD'KSD&KB@ -&K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5$Ji1#JS+#JS'"JB'"JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB'"JB'"JB'"JB'"J)#!J)#!IhprIhprIhq!J)#!J)#!J)#"JB' -"JB'"JB'"JB'"JB+#JS+#JS+#JS+#JS+#JB'"JB#!J)#!IhprIhprIhq!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)'"JB'"J)#!J)"rIhpqIRjpIAepIAepI(a -mI(amI(amI(amI(amI(amI(amHhYlHhYlHRTkHRTkHAPjHAPjHAPjHRTkHRTkHRT -jHRTkHRTkHAPjHAPiH(KiH(KhGhGhGhGiH(KiH(KiH(KiH(KiH(KiH(KiGhGhGhG -hGhGhGhGhGhKiH(KiHAPjHAPjHAPjHAKiH(GhGhGfGRCfGA9eGA9fGRCfGhGhGhG -hH(KiH(PjHAPjHAPkHRTkHRTjHAPjHAPjHAPiH(KiH(PjHAPjHAPjHAPkHRTkHRT -kHhYlHhYlHhYlHhYkHRTkHRTjHAPjH(KiH(KiH(KiH(KiH(PjHAPjHAPjHAPjHAP -jH(KiH(KiH(KhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhKiH(K -iH(KiH(KiHAPjHATkHRYlHhYmI(amHhYlHhYlHhYlHhYlHRTkHRTkHRTkHRTkHRY -lHhYkHRTkHRTlHhYlHhYlHhamI(amI(amI(amI(amI(amHhamI(amI(alHhamI(a -mI(alHhYlHhTkHRTkHRPjHAPjHATkHRTkHRTkHhYlHhYmI(amI(amI(amI(amI(a -mI(amI(amI(amIAepIAepIAeqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIAepIAe -pIAepIAepIAepIAeqIRjqIRjqIRprIhprIhprIhprIhprIRjqIRjpIAepI(amI(Y -lHhYlHhTkHRTkHRTlHhYlHhYlHhYlI(amI(amI(apIAepIRjqIRjqIRjqIhprIhp -qIRjqIRjqIRjqIhprIhq!J)#!J)#"JB'"JB'"JB'"JS+#JS+#JS+#JS+#JS+#JS+ -#JS+#JS+#JS+$Ji1$Ji5%K)5%K)@&KB@&KB@'KSD'KS@&KB@&KB@&KB@&KB@&KBD -'KSD'KSD'KB@&KB@&KSD'KSD'KSH(KiH(L)L)L)L)L)L)LBQ*LBQ*LBU+LSU+LSU -+LSU+LiZ+LSU+LSU+LSU*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBQ*LBL)L)L -)L)H(KiH(KSD'KSH(KiH(L)L)L)L*LBQ*LBQ*LBQ*LBQ*LBL)L)H(KiH(KSD'KSD -'KB@&KB@&KBD'KSD'KSD(KiH(KiH(KiH(KiH'KSD'KS@&KB@%K)5%K)5%K)5%K)5 -%K)5%K)5%K)1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji5%K)5 -%K)5%KB@&KB@&KB@'KSD'KSD'KiH(KiH(KiH(KiH(KiH(L)L)L)L)L)L)L)L)L)L -)L)L)L)L)L)L)L)L)L)H(L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L)L -)L)L)KiH(KiH(KiH(KSD'KSD'KS@&KB@&KB@&K)5%K)5%K)1$Ji1$JS+#JS+"JB' -"JB#!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhpqIRjqIRjqIRe -pIAepIAepIAepIAepIAepIAepIAepIAepIAepIAjqIRepIAepIAepIAepIAepIAe -pIAepIAepIAepIAepIAepI(amI(amI(YlHhYlHhYlHhYlHhYlHhYlHhYlHhYlHhY -lHhYlHhYlHhYkHRTkHRTkHAPjHAPjHAPjHATkHRTkHRYlHhYlHhYlHhYlHhYlHhY -lHhamI(amI(amI(amI(amI(amI(amHhYlHhYlHhamI(amI(amIAepIAepIAepIAe -pI(amI(amI(amI(amI(amI(YlHhYlHhYlHhYlHhYlHhYlHhYlHhamI(amI(amI(a -mI(amHhYlHhYlHRTkHRTkHRPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPiH(K -iH(KiH(KiH(KiHAPjHAPjHAPjHAPjH(KiH(KiH(KiH(KiH(KiH(PjHAPjHAPjHAP -jHRTkHRTkHRTkHRTkHRPjHAPjHAKiH(KiH(KiH(KiH(KiH(PjHAPkHRTlHhYlHhY -lHhYlHhYlHhYlHhYlHhYlHhYmI(amI(amI(amI(alHhYlHhYlHhamI(amI(amI(a -mI(amI(epIAamI(amI(amI(amI(amI(amI(amIAepIAepIAepIAepIAepIRjqIRj -qIRjqIhprIhprIhprIhq!J)#!J)#"JB'"JB'"JB'"JB'"JB'"JB#!J)#!J)#!J)# -!IhprIhprIhprIhprIhprIhprIhprIRjqIRjqIRjqIRjqIRjpIAepIAepIAepIAe -mI(amI(amI(amI(amI(amI(epIAepIAepIAepIAepIAepIAepIRjqIRjqIRjqIRj -qIRjqIRjqIRjqIRprIhprIhprIhprJ)#!J)#"JB'"JB'"JB'"JB+#JS+#JS+"JB' -"JB'"JB'"JB'!J)#"JB'"JB'"JB'"JS+#JS+#JS+#JS+#JS+"JB'"JB'"JB+#JS+ -#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JB'"JB'"JB'"JB'"JB'"JB' -"JS+#JS+#JS1$Ji1$K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5 -%K)5%K)5%K)5%K)5%K)5%K)@&KB@&KB@&KB@&KB@%K)5%K)5%K)5%K)5%K)5%K)5 -%K)5%K)5%K)5%K)5%K)5%K)5%K)1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1 -$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1#JS+#JS+#JS+#JS+#Ji1$Ji1$Ji1 -$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$JS+#JS+#JS+ -#JS+"JB'"JB'"JB'#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+ -#JS+#Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1$Ji1#JS+#JS+#JS+#JS+#JS+#JS+ -#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS1$Ji1$Ji1$Ji1$Ji1$Ji+ -#JS+#JS+#JS+#JS+"JB+"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB'"JB#!J)#!J)#!J)#!J)#!J(prIhprIhprIhprIhprIhprJ)# -!J)#!J)#!IhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)#!J(p -rIhprIhprIhprIhprIhprIhprIhprIhprIhprJ(prIhprIhprIhprIhpqIRjqIRj -qIRepIAepIAepIAepIAepIAepI(amI(amI(amI(amI(amI(amI(alHhYlHhYlHhY -lHhamI(amI(amI(amI(amI(amI(amI(amI(amI(amI(amI(epIAepIAepIAepIAe -pIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAamI(a -mI(amI(amI(amI(amI(apIAepIAepIAepIAepIAepIAepIAemI(amI(amI(amI(a -mI(amI(epIAepIAepIAepIAepIAemI(amI(amI(amI(amI(amI(amI(amI(amI(a -lHhYlHhYlHhYlHhYlHhYlHhYlHhYlHhYmI(amI(amI(amI(apIAamI(amI(amI(e -pIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAepIAe -pIAepIAepIAepIAepIAepIAepIAepIAepIAepIAeqIRjqIRjqIRjqIRjqIRjqIRj -qIRjqIRjqIRjqIRjqIhprIhprIhprIhprIhprIhprIhprIhprIhprIhq!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#"JB'"JB'"JB'"JB'"JB'"J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!JB'"JB' -"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB'"JB'#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+ -#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+#JS+ -#JS+#JS+#JS+#JS+#JS+#JS+"JB'"JB'"JB'#JS+#JS+#JS+#JS+#JS+#JS+#JS+ -#JS+#JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"JB'"JB'"JB'"JB'"JB'"JB'!J)#!J)#!J)#"JB'!J)#!J)#!J)#!J)#!J)#!JB' -"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB'"JB' -"J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIRjqIRjqIRjqIRjqIRjqIRj -qIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRj -qIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRj -qIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIRj -qIRjqIRjrIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhprIhp -rIhprIhprIhprIhprIhprIhprIhq!J)#!IhprIhprIhprIhprIhprIhprIhq!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J!!!0%!!!3!"!!8 -!!!#J!!'!83!!!!!!&!!!!!!!!$3@9Zk,S`!!0"3!!$39!$b!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!IhprIi#!JB+#JS+#JS+#JS+"JS+"J)#!IhjqIi#!JB+#Ji1$K)5 -'LBf2N!#3!)Z$H@eLA&YEA@*UFhb"K)5$J(elHRPiH(PmIi'#JB#!JB'!IhprIi# -"Ji5$JS'"JB+#JS+#JS1$JS'!IhjqIAepIS##K)D)LSk8Q*UDQC@3!)Z%Hh"M9e* -59epSFAKmIAPaD@0KBQG`Ghb!JS1&KiH&K)5%Ji+!J)'$KSH(KS@%Ji1&KiL(KS@ -%JS'"J(pqIRjqIi##Ji5(LSb-LiZ-Mj+9Q*UCPj@6N!#-K(KS9$md0$8j490MFRb -"J(elHRKfGRKlJ)@,M)U'K)+!J)#!JS5&KiQ+LSU*L)D%Ji1$Ji+#JB'"IhprIhq -"Ji@(LBZ0MSk-LiU+MC'9QTfIS++HNAjM5$-S*b`e2dG199aQFAKmIRelHAGjJSf -8PT52LBD'KSH*LSQ)Ki@&KiL)KS5$JS+#K)D)L)D&K)1#JB'"JS1%KBD(KiH)LSb -1MT!!NjQJTULSTCq4Hf&)0#NP*#3V1%C2@@GfI(eqJS1"Ii'*NTH9MiZ,LSL(KSD -(L)D%K)D)LBL(KiD&Ji5(LSb,LSL'Ji"pHRTmIS'$KBL+LiZ+LSU,MBk3!*1AR+' -RUkQDJ@4*-b)A$J`B+cpAFB5-N!#3!)k*JRamJSb8Pj+1LiH"Ii##JS'"J)''LSk -2MSb*Ki@#JiD)KiH(Ki@%JRppIAamIAq$KiU-M)Z+LBL)Lj'ARD1RV+kSPATC04S -1$K3L08GCEi1,M)U(KB*lGRL!M*@AP)q+K(epIi'#JS1%L)b1MSk1M)Q&JB#"KBH -)LBQ)KB*pHAKhH(PmJB@*Lib-LiU)L)Q-NTUKTkkbVU+,ENmc(J`!"4Nd9hQ2QCH --JAalH(9fIBD1NC!!Mib(JhprJ)"qIAq%Lj!!NT+3!)f*KS5$Ji@)LBL(KS5#IRT -iGhCfHAq&Liq4NC!!M)Q(KSH,NCHESUQXTT9pAd)S&!S2)$TCH)kAPSf#HRCdFA& -iJSZ4PC53!)Z%IhepIAapJ)@+MT+8PC12LSD#J)'%KiL)L)H&JRjlGh9dGRZ!KBQ -0N!#4Mib*KiH+Mj5DSDHUU*k,F&8p*a!###0(EBUCR*1(I(GeFh&cHi5,MT!!Mif -,Ki*rIRjpIS+(M*!!Nj@@Nik*KB'!JB5'KiH(KS1!HhKfG(4hI)+)MC!!NC!!MSU -)KiQ0NTLGSUDNQiPa@%!V&``9-&"[KjDBN!#%HhCdF@pbHS1,Mj'5NBk*Ji#!Ihe -qJBD-N!#8PTD8MiU'JS#!JS5'KSD&Ji"pHACdFh9kJ)D-NC16NBk-LiZ1NC@DRU' -IPiG`9$SX+#FR,N*KIC!!PT''IAKfG(*bH)+0P*@5M)L&K)1#J(jrJBD,Mj1@Q*H -6M)D"IRq#K)@&KB5$JAjlH(GhH(TrK)U1NC'3!)k,LBQ,Mj1BRD#KQieiB8Xe)43 -4(MjQKCLGPSU!HRGdFR4jJ)H0NC+4N!#1LSD$IhamIi@+Mj1@PjD6MSQ&JB#!JS+ -#Ji5&Ji&qHRGfGhTrK)Q1NC+5Mif,LSZ-N!#@QjkIQiplBdXf*KX9(6TKJTDFQ)k -&IAPeFh0iJ)L1NC'2MBf-LSD#IheqJiL0NC@@PT11LB@#JB+#JS+$K)5$JAjkGh9 -eGhb$LSk4Nj+2MBb-MBq4P*QGRjZ1HQ0+0#FH'#!kAS#@RTU3!)CrHhGeG(GqKSb -2Miq1MSf,Ki*qHhb"KSZ2NjDAP)q+KS1#Ji1#JS+#JS+"IhajGhGjIB'(MC!!NT+ -2M)Z,MBq5PTZHRjb4IfP41bJB$"3hBS1BRjQ2Ki&pHACfHAq'LSf0MBk2MSZ(JAe -mIB#&LSk5P*55MSU(KB1#JB#!J)+$Ji+!IATiGhKlJBH,MT!!Mik-Lib0MT!!Nj@ -CQjL2J'a@3#iI&4`mC)@CRjQ2KRpkH(9eH(q'LSb-M)f1MBU'JAemIB'&LBf4Nj1 -5MSU(KB1#J(prJ)'#JS&rI(ThGhPmJBH-MT!!Mik-LSQ,MC'6PCLCPSk!E9G#-5) -A(cpQKjUHQ)k'J(ekGh9iIS5*M)f0MBk0LS@"IReqJ)5)M*!!NT14MSU(KB1#JB# -!J)'#JS&rIAYjHAPmJBH,MSk1MBZ*LBU0NC@AQCQAMi&Z@83b)48I3'L*QTfAMSD -!I(KfGRPrKBU0MBf0MSf+KB&pHharK)L-N!#6Nj'1LSH&Ji'!Ihq!JB+$JS"qHhP -iHAb"KSU0MSf-LiQ*LSb2NjDAQ*H2JR&F4c)I&L4)EifERCD0KS"mHAKiHRk$KiU -,M)f2MSU&J(emIB#%L)Z2NC+3!)f+Ki@$JB"rIi##JS+#J(elHAKjI)+'LSb0MBZ -+LBL*M)q6PTHAPBq%Fej*-ad6*NphNCZDNiZ&IhYkHATmIi1(LBU-MSq1LB0qI(a -pJ)5)M)q4NBq0LSL'Ji"qIRq!JS1$JB"pHRKhHAb"KSU,M)b,LBL)LBZ0NC5@PT5 -2K(9K5M)G&La@Hj'EQC+,KAplHAPjHhk"KBL+M)k2MSQ%IhYkI)#$KSU1NC'2MBU -)KS1!IReqJ)'#JS+!IATiGhPmJBD*Lib-LiQ)L)Q+MC!!Nj59P)q%G'"*-"`C-Pf -!P*UAN!#+K(jlHRTkI(k"K)H*Lik3!)k*K(pmI(f!JiD+MT'4Mif,LBD$J(jqIS# -"JB+"IhekH(KjIB+'LSb-M)Z*L)L*Lik4Nj@9NSb"F9a&,4XG2'D&PTU8MSL#IAY -kHRYmIS'%KSL,MT!!MSQ%IhepIS#$KSU1NC!!MSf,LBH$IhepIRq!JB'"IhakH(K -jIB+'LBZ,LiU*LBQ+M)q4NT58Nib!EPK!+"JK4h#,PjL6MBH"IAYlHhapIi'$KSL -,Mj!!MSQ%J(jqIi#$KiZ1N!#2MSf-LSH$J(jqIRq!JB'"IhekH(PlIS1(LBU,LiU -*LBQ+M)q4Nj56N!#)HfK51L-A,&GlNCQ@MiU&IhYkHhapIRq"Ji@(Lik2MBL$J(p -rJ)'$KiZ1Miq0M)b+Ki1!IRjqIhq!J)"rIATiHAZ!K)H*LSU+LBL)LBb1N!#4NT+ -4MS9hC8ie(KNhBi18Q*50L)0pHRYmIAjrJ)'#K)D+MBk-L)1"J)#!JB5)M)f1MBb --LiQ'Ji"rIRjrIi#!J(pmHRPkIB'&KiL*LSQ*L)L+M)q5NT'4MiTrEeP#+KNQ6hD -0Q*H3!)U&J(akHhaqIi#!JB+%KiZ0M)U'Ji+"JB'#KBQ-MBf-M)b,LBD#J(pqIRj -qIRprIAYjHAb!K)D)LBQ*LBL)LBZ1NC+5NBq-KAPS8MSN($9IJ*+BP)f(JRekHha -qJ)#!JB'#JiD+M)U(KB1$Ji1#JiD+M)f-M)b-LiQ&JS"rIRjqIRjqIRekHAYqJSD -(L)L)L)L)L)U-Mj'5NT+3!)Z#G&p(,"JK5A',Q*L4LS@!HhTmIRq"JB'"JB+&L)U -,LBD%Ji1$Ji1&L)Z-M)Z,M)Z+Ki5#J(prIhprIRjpI(PjI)#%KiL*LBL)L)L*LSf -2N!#4NC'0KhYU8cSM(6GKJC5CNib'JAekHRarJB+#JS'"JS@)LSQ(KB5%K)5$K)D -*M)b-LiZ-LiQ'K)+"IhprIRepIAakHATqJiH)LBQ)L)H(L)Q-Mj'4NT'2LS"aA88 -X'LC1GBkCPiq)JhjkHAYpJB1$JS+"JB+&KiL(KB5%KB@%K)@)Lif-LiZ,LiZ*KS5 -$JAprIRepI(YkHAPmJB@)LBU*L)H(KiL+MC!!NC+4MiZ%HQP814dB1'@'PjU6Li9 -rHRKjI(q#K)5$JB'"Ji@(KS@%K)5&KB5%KSQ-M)U+LiZ,LSH&K)1"IhjqIAemHhP -jHRq$KiQ+LSQ(KiH'L)U1N!#4N!#3!)k)Ih&G45F9+eTqP*Z@MBH"I(PiHRf"K)@ -%JS'"JS5'KS5$Ji5&KB@&KSL+LiU*LSZ,LSL'KB5#J(jqIAamHhPiHAb"KBL+LiU -)KiD'KiQ0N!#4N!#2MBU$GfC40"SK5R11QjQ3!)Q$I(KhHAYrJiD'Ji'"JB1&KB5 -$Ji5&KSD'KSH*LiZ+LBU,LiQ(KSD&Ji"qIRemHhPhH(Z!K)H*LiZ*KiD'KSL,MT! -!N!#3!)k,KRaX9MNH(d*XLCLDNSU%IAKfH(TqJS@'K)+"JS1%K)1#JS+%KSD'KSD -)LSZ+LBU+LSQ(KB@'KB&rIRemHhPiH(TqJSD)LSZ,LBH'KSH+MT!!NC'2M)GrF&a -"*4`hBB+@Qj@0KRpjGRGjI)#%KSD%JS+#Ji1#JB'#K)D(KiH'L)U,LiU*LSU*L)H -'KiH%JAjpI(YjGhCjIB'&KiQ,LiQ(KSD'LBb3!*'3!)q-L)*hC%XU&LP@Hj+FQ)q -)JATfGRKlIi1&KS@$JS+#Ji+"J)'$KBH(KiD(LBZ+LBQ*LBQ)KiD(L)D$J(ppHhP -hGRGlJ)5'L)Z-LiL(KS@(Lik3!*'3!)k*JRPT9$8C)%TcMTbENiZ%I(CeGhTqJS@ -(KS5#JB'#JS#!JB+&KiH(KSH*LSZ+L)L*L)L(KSH*L)@"IhemHRKfGhTrJi@(LSb --LSL'KSH+MBq2Mik+JhYY@MmL'caTLCUGPSf'IAGdGRPpJB@(L)D%JS'"JB"rIi+ -%KiL(KiH)LSZ+LBQ*L)H'KSH*LSH$J(jpHhKfGAKpJB@(LBb-LSL'KBD*M)k2N!# -2M)CrFf*++aJY@i#@RTQ2L)&jG(9iI(q%KiL(KB1"JB'!Ihq"Ji@(KiH(L)U-LiQ -*L)L(KS@'LBZ+KS&rIRakGR4fHi#%KSL+M)b,LBH'KiZ0Mj!!MSb)J(9N6M!A*&& -lNjkFNiU$HR4cGRTqJSD)L)D%JS'"J(jqJ)+&KiH(KiL+M)b+L)L)KS@&KBL,LiH -$J(jpHRGdGAPqJS@(LSb0M)U)KSD*M)k2Mif*JhPV9c`J($pYLjZHPBb&IA9bG(K -pJB@)LBL&JS#!J(pqIi'%KSH(KiH*Lib,LBL)KiD%K)H,M)U%J(pqI(PeG(GmJB5 -'LBZ-M)Z*L)H*M)k2Mik+K(YY@6iK'$CQLCZIQ)q)IhGcFhGlJ)5)LBQ'Ji'!J(p -qIS#%KSH(KiH)Lib,LBL)Ki@%K)@*M)Z'JRpqI(TfG(ClJ)1&L)U-M)Z*L)H)LSk -3!)q1LS9qFQ&+,4ST9Ab9RjZ5LS*jFh*eHRq$KiQ*Ki@#J)"rIRk!JiD)L)H(L)Z -0M)U)L)H'KB5&LBb-LB5!IhekGh9eHAk#KBH+M)b,LSQ)L)U0Mj!!Mib)JAGP6M! -@(8ThNTqHPBb&I(9cG(KpJSD)LBL'Ji'!IhjqIi+&KiH(KiL*M)b+L)L)KS@%K)H -,MBU&JApqI(PfGAKpJB5'LBZ,LiU*KiH*MBq3!)q0L)&iDPBq*"ilD)QERTL2Khp -fFR0fHi#&L)U*Ki5"J(pqIRq"K)D(KiH(LBb0LiQ)L)H&Ji1'LSf-Ki1!IhekGh9 -hI)#$KBL+LiZ+LSQ)LSb2NC!!MSU$HQaB3#BD-@#&QU#DNBQ"H(0cGAPqJiH+LSL -&JS"rIReqJ)1'KiH'KiQ,MBb+L)L(KB1$KBQ0MBL$J(jpHhKfGRYrJS5'LBZ,LSQ -*L)Q,MT!!NC!!M)9pF&j),KSP6hU8Rjf8Li4lGA*dH(f"KSQ+LBD$JB"rIAk!JS@ -(KiD(L)U-M)U)KiH'KB5%Kib0LS@"IhjmHAChHRk#K)D)LSU+LSQ*LBZ1NC'3!)f -)J(9N6M8F(%*aMjkIPSk(IRCbFhGlJ)@*LiQ(Ji'!IhjpIi+%KiH'KSH+M)b,LBL -(KS@%K)D+MBZ'JS"qIAThGRKpJB1&L)U,LSQ*LBQ+MC!!NC!!MiZ%HQY@2#%@-Q+ -(R+'CN!#*J(KcFhCkIi1(LSZ)K)+!J(jpIS#$KSH'KSH*M)f-LBH(KS@&K)@*MBf -)Ji"rIAYhGRKpJB1%KiQ,LiU*L)Q+M*!!NC'2Li4lEPY%+4JT9hqAS*b5LS0kG(0 -eHAf#KSU,LB@$JB"rIRk!Ji@(KiD(L)Z0M)U)KiH'KB5&L)b0LS5!IhjmH(ChHi# -$KBD)LSU+LBQ+LSb2NC'3!)f'IR&J5M%E)%KfNTqIPBb&I(9bG(KmJ)@*LiQ(Ji' -!IhepIi+&KiH'KSL,MBf+L)H'KB@%KBL,M)U&JApqI(PhGhTrJS1&L)U,LSQ*LBQ -,Mj'4N!#0L)"dBdie("Y!EifGS*H1KhphFh0fHRk%L)U+L)@#J)"qIAk"K)H(KiD -(LBb0LiQ(KiD&K)@(LSb,Ki*rIRekGhGkIS+%KBH*LSU*LBQ*Lik3!*'3!)k*JRK -T96`K&c0MKjZKQT!!LB&jG(0fHAk#KSQ+L)D$JB"rIAk!JiD(KiD'L)Z-LiQ(KiD -&K)@'LBb-L)1!IRelH(CjIS+%KBH*LSU+LBQ*LSb1N!#3!)q+JhPX@%!P'#jGJjQ -JQj+,JhTdFh9iIB'&LBU*KS1"J(ppIAq#KBL)KiH)LSb-LSL(KS@%K)D)M)f+KB& -qIAYiGhKpJB5&KSL+LSQ*LBQ+M)k3!*!!Mib'I'pF45SB*P0mPD#GP)b&I(CcG(K -mJ)@*LSU(K)+!IhemIS+&L)L)KiL+M)f,L)H'KB5%KBH,MBZ'JRpqI(PhH(b"Ji5 -&KiQ+LBQ*LBU-MT!!NC!!MBGpF&j),KJK6(L6S*k9MSGqGR0dGhYrK)L+LSL&JS" -rIAeqJB5(L)L(L)U-M)U)KiD&K)5&KiZ0M)L$IhjmHAGhHi#$K)@(LBU+LBQ*LSZ -0MT!!N!#1L)"cBN`b'Ke%FSqIS*D1L(phFh0fHRk#KSQ+L)D$JAppI(f!JiD)KiH -(LBZ-LiQ(KS@%K)5'LSf-L)5!IRakH(GkIi1&KBD)LBQ*LBQ*Lif2N!#3!)k+JRG -R86BD&ceYMCfJQ*!!LB&iFh0eHAk#KSQ+LBH$JAppI(erJSD(KiH(LBZ-LiQ)Ki@ -%Ji1&LBb0LS@"IRelH(GjIS+&KB@(LBQ*LBQ*Lib1Mj!!MSQ#GfP925)E1@H*Qk# -CN!#+JRPdFR4iIB'&L)U*Ki5"IhemI(q#KBH)KiH)Lib-LSL(KS5$Ji@)M)f,KS* -rIAYiGhPqJi@&KSL+LSQ*LBQ+Lif2N!#2M)9kE&P"*4J`B)@DSCU5Li4kG(*dH(b -"KBL+LBL&JS"qI(aqJS@(L)H(L)Z-M)U)KiD%Ji1%KiZ0M)L$IhjmHAGiIB'%KB@ -(LBU*LBQ*Lib1Miq1Li4jE&Y&+aXX@(q@S*b6MBCpGR0cGRZ!K)H*LSL&JS"qI(a -qJB@(L)L(L)U-MBZ*KiD%Ji1$KSU0M)Q%J(jmHAGhHi#%KB@(LBQ*LBQ*LSb0MT! -!Mib(IA"I55dB*&"kP+#GP)k(IRCbFR9kIi1(LBU)KS1!IRalIB'%KiL)KiL+M)b -,LBH'KB1$Ji@+MBf*KB&rIAThGhU!Ji@&KiL*LBQ*LBU,MBk3!*!!MSKrFf*0-KS -I4h54Rjq@MiKrGh*bGAPqJSD*LSQ(K)&qI(YpJ)1'L)L(KiQ-MBb*KiD&Ji+#KBQ -0MBU'JRppHhKfHAk$KSD'L)Q*L)L)LBU-MT!!NBk*JACR8cNG'$YVM*fJQ*!!LS* -jG(0eHAk#KSL*LBH%JApmHhf!JiD(KiH(LBZ0M)Q(KS@$JS+%L)b0LiD#IhelH(C -iIB+&KSD)LSU*L)L*LSb1N!#4MiU#H'P@25)C0Q5(Qk#CNBZ$HR4bG(KpJB@)LBQ -)KB*rIAYpIi+&KiL(KiQ,MBf,L)D&K)1#JiL-MSZ(Ji"qHhKfGhb#KBD'L)Q*LBL -)L)Q,MBq4N!#-KRaZA%3Q&#TDJCLKR*+-KAaeFh4hI)'&KiQ*Ki5#J(emI(q#KBH -(KiH)LSb0LiL(KS5$JS+'Lif-L)5"IhajGRGmJB5'KSH*LBQ)L)L*Lif2NC!!MBC -qFQ"+,aNM6RQ6Rjf8MSGqGR0cGRYrJiH*LBL&JS"qI(aqJB5'KiH(L)U-MBZ)KiD -%Ji+#KBU0M)L%JAppHRCfHAq%KSD(LBU*L)L)LBU-Mj'4MSQ"G'01-KNF4A13!*k -IPSk*J(KdFh9jIi1(LBQ)KB1!IRemIS'%KSH(KiH*M)f-LBH'K)1#JS@*MBf*KB& -rIAThGRKqK)D'KiL+LBL)L)L+M)k3!*!!MSU$H@T@2"mA1'H*R+#BMiU#HA4cGAP -qJSD)LBL&Ji&rIAeqJ)1&KiH'KiQ,MBb*KiD&K)1#K)L-MBU'JS"qHhGeH(f$KSD -'L)Q*L)L(L)Q,MT!!N!#2M)CpF&e%*43X@i+BS*U4Li9lGA0dH(f"KBH*LBD$JB" -qIAerJS@'KiH(L)Z0MBU(KS@$JS+$L)b0LiH$JApmH(ChI)'&KSH)LSU*L)L)L)U --Mj'3!)f'IA&J5LmD*P&kP*qFNif'IACcG(GmJ)5(LBQ(K)+!IRepIi+&KSH(KSH -+M)f,L)D&K)1#JiD,MBZ(K)&qI(PfGhZ!KBD'L)U+LBL)KiH*M)q4N!#0L)"fCe- -j(Ka"ESfHRjD1L(piG(4hHi#%KSL*Ki5#J(pqIAq"JiD(KiH(LBb0LiL'KB5$JS+ -'LSf-L)5"IhekGhCjIS1'KSH*LSQ*L)L*LSf2N!#3!)k*JACR86BG(%"VLTbIPiq -*JRTeFh9kIi1'L)Q)KB+!IhjpIi'%KSH(KiH*Lif,L)D&K)1$JS@+MBf*KB&rIAY -hGRKqJiD'KiL+LSQ)KiH)Lik3!*!!MiZ%I'pG45F@+eU!Pk#ENBZ%Hh9cGAPqJSD -)LBL&JS"rIRjqJ)+&KiH'KSL,MBb*KiD&Ji1$K)Q0MBU'JS"qHhKfGhb"KBD'L)U -+LBL(KiL+MT!!NC!!MBGrFPp'*a)P9Ak@S*b5M)9pGh4eH(f"KBH*LBD$JB"qIAk -!JS@(KiH(L)U-M)Q(KB@%Ji+%L)b1LiH$J(jmHACfHi'&KSH)LSU*LBL)L)U0Mj! -!Mif)J(4M66-G)dYeN!#HRC5-KhjhG(9hI)#%KiQ*Ki5"IhjpIAq"K)D(KiD(LBb -0LSH&KB5$Ji5(Lik-Ki1!IRajGRCkJ)5'KiL*LSQ)KiH'L)b2NC'2M)9lE9Jp(K8 -hCiLERjH2LB*kGA4hHhq$KSL*Ki5#J(pqIAk!Ji@(KiH(LBZ0LiH&KB5$JS1'LSf -0LB@"IhekGhCiIB+&KSH)LSQ*L)H(L)Z1N!#3!)q-KAa[@d!M&c0JK*QJQBq+JhY -eFh9jIS+&L)Q)KB+!IhjpIS##KBH(KiH)Lif-L)@%Ji1$Ji@*MBf+KB+!IRYhGAG -mJB5'KiQ,LiQ)KSD(LBf3!*'3!)f)J(9P6M%C)8TfNTqFNiZ'IACcG(KpJB@(LBQ -'Ji&rIRepIi'%KSH(KiL,MBb*KS@%Ji1$K)L-MSZ(Ji"qI(KeGAU!Ji@'L)U+LBL -(KiH*M)q3!*!!MSU%HQY@14N@2Qk-R*k9MBL!HA9eGhYrJiH*LBH$JB"rIRjrJB5 -'KiH(L)Q-MBU'KB5$Ji1%KiZ0M)L%JAppHRCeHAk#KBD)Lib,LBL(KiL,MSq3!)k -,KAYY@6mN($KPKjUIPiq*JRTeG(CkIi1'LBU)K)'!IhjqIS#$KSH(KiH*M)f,Ki@ -%K)1$JiD+MSf*KB&rIAPfGAKpJS5'KiU,LSQ(KB@'LBf3!*'3!)f)JhPT8c3A(%P -hNTkFNiZ&IACdGAPpJB@(LBL&JS"rIhjqIi'%KSH'KiL,MBb)KB5$JS+$KBQ0MBU -'JS"rI(KeGRU!Ji@'L)U+LBL(KSH*M)q2Mif+K(aY9MJC&d&aMjfHP)b(J(KdG(G -lJ)5(LBL'JS#!IhjqIi'%KSH(KiH+M)b*KB5$JS+$K)L-MBZ(Ji"qI(KeGAPqJS5 -'LBZ,LSQ(KSD(LSf2Mif+KRpcB%FS'$"IJjLIQ)q*JRTdFhClJ)5(LBQ'Ji'!Ihp -qIS##KBH(KSD)M)f,Ki@%Ji1$K)H,MBb)K)&rIATfGAGmJ)1&KiQ,LSQ(KiD(LBb -1Miq0L)0jD9)b&Kp1HC1IQj'+KAehG(CjIS+&L)Q(K)+!J)"rIS##K)D(KSH)LSf --L)@%Ji1$K)@*MBb*KB'!IRajGAClJ)1%KSQ,LiU)KiD'L)Z0MBf0LiCqEPJk'KT -#F)kHRT5-Ki"iG(9iI)#%KiQ)KB+!J)"rIRq"K)H)KiH)LSb-LBD%Ji1$K)@)M)f -+KS+!IhajGA9jIS+$KBL,LiU*L)H(L)Z0MBf0LiH!Fep&)a8cC)DDRjL1LB*jG(4 -hHi#%KiQ)KB1"J)"rIRq!JiD(KiD'L)Z-LSH&K)1$K)@)M)k-Ki1!IhekGR9iIB' -$KBH*LiU)KiH'KiU-MSk1M)L$H'C0+K-Q9Rq@RjU4LS0mGR4fHRk#KSL)KS5"J)" -rIRk!Ji@(KiD'KiU-LSH&K)1$K)5'LBf-L)5"IhelGh9hI)#$K)@)LSU*L)H(KiQ -0MSk0LiL$HQY80KXJ5A53!*fFNib'IRGdGAKpJB@)LBL&JS#!IhepIi'&KiH(KSH -+M)b*KB5$JS1%KBQ-MBU&JS"qI(KfGRTrJB1&L)U,LSL(KSH)M)k1MSf+KRpcAd- -L&MGRL*ZIPSk)JAPdG(GlIi1(LBL'Ji'!J(jpIS#%KSH(KSH*Lib*KS5%Ji1%KBL --MSZ(Ji"rIAThGRPqJB1&KiQ+LSL(KSD(LSk3!*!!MSZ'JACP65`@+PPrPTqENBQ -$Hh9cGRTqJSD*LBH%JB#!IheqJ)1'KiH(KiL+M)U(KB5$Ji1%KSU1MBL%JAppHhG -eGhb!JS5'LBZ+LBH'KBD*MBq2Mif+KAe[@6SD'8*aMTkHP)b&IAGdGAKpJB@)LBL -'JS#!IhepIi'&KiH'KSH+M)b*KS5$JS1%KBQ0MSZ'JS"rI(KeGRTqJS1&L)U,LBL -(KSD)Lik2MSf,L)&eB83K%c4PKjUIPik)JAPdG(GlIi1(LBQ'Ji'!J(jpIS'$KSH -(KiH*Lib+KS5$Ji1$K)H-MSZ'JS"rIAPfGAKpJB1%KiU,LSL(KSD(LSf2Mif,Ki* -jD9%`&b96I*5IQj++JhYeFR9jIS+'LBQ(K)'!J(ppIS#$KBH(KSD)Lib,Ki@%Ji1 -%K)D+MBb)Ji"rIAYhGAGlIi+%KSQ+LSQ(KiD(LBf1MSk0LSGrF&Sm("JrESbGRj@ --KAjhFh4iI)'&L)Q)KB+!J)"qIRq"K)D(KSD(LBb-LB@%Ji1$K)D*M)f+KB+!IRa -jGRCjIS'$KBL+LSQ)KiD'L)Z1MSk0LiQ$GQ*')a-[BS@CS*Q2L)&kG(4hHhq$KiQ -*Ki1"J)"rIRq"JiD(KiD(L)Z-LSD%K)1$K)@(Lif,KS+!IhajGR9iIB##K)L+LiU -*KiD'KiZ1Mif-LSL%HfT4-"8N8RZ6Rjb4LS0lGA0eHRk#KSQ*Ki5"J)"rIRk!JS@ -(KiD'L)U-LSH&K)1$K)@(Lif-L)1!IhelH(ChHhq"JiD*LiZ*L)H'KiQ-MSf0MBZ -(Ih"D2KmC2@b,RCq@MBCrH(0dGhb"KBL*L)D#J)"rIRjrJS5'KiH'KiQ-M)Q'K)1 -$K)@'LBb0LS@"J(jmHAGhHRk"Ji@)LSU+LBL(KSL-MSk0MBZ)JA4J4588,f'&QD# -CMiL"HR4dGRTrK)H*L)D%JB#!IReqJB1'KiH'KSL,M)Q'KB5$Ji5&KiZ0LiD#J(j -mHRGfH(b!JS5(LSZ+LBL(KSH+MBk1MSb+KATT86%@)8piNU#GNSU$I(9cGAPqJSD -*LBH&JB#!IheqJ)1&KiH'KSH+M)Z(KB5$Ji5&KiU0MBL%J(jpHhKfGhYrJB1'L)U -+LBL(KSD*M)k1MSk,KRjZ@$XE'%"[MTqJPSb'IhKcG(KmJ)@)LBL'JS#!J(jqIi' -%KSH'KSH*LiZ)KS@%Ji5&KSL-MBU&JApqI(PhGhTqJB1&L)U,LSQ)KiD*MBq1MBb -+Ki&cAN)K&6CQKjbKQ)k)JAPdFhClIi5)LBQ(Ji'!IhjpIS#%KSH(KSH)Lib*KS@ -%Ji1%KBL-MSZ'JS"qI(ThGRPpJ)+&KiQ,LSQ)KiD(Lik2MSk-LB4iC8XU&#GAIjH -JQj'+JhYeFh9jIB+'LBQ)K)'!IhjpIB#$KBH(KSD)LSZ+Ki@%Ji1%KBD+MSf)Ji" -rIAYiGRKmJ)+$KSL+LSQ)KiH)Lik2MSk-L)0jD9!`&5&3Hj5JRC1-KAeeFR4iI)' -&L)Q)KS+!J(ppIAq#KBH(KiD(LBZ,L)@%Ji1%K)D)M)f+K)"qIAYiGRGlIi+$KBL -+LSU*L)H(LBf1MSf-LB4mEPJk("e&FBfHRj@0KRphFR0hHi#%L)Q*Ki5"IhppI(k -!JiD)KiD(LBZ-LBD&K)1%K)@(Lif,KS*rIRajGhGkIS'$K)H*LSU*KiH(LBb1MSk -1LiD!FPe")4FiD)LES*L2LB*jFh0fHRk$KiQ*L)@"IhppI(f!JiD)L)H(L)U-LSH -&K)1$K)5'LSf0LB5!IhekH(CjIB'$K)D*LSU*L)H'KiU0Miq2M)H"GQ4+*a-XAS+ -BSCb4LS0kG(*eHAf#KSQ+L)D#J(pqI(erJSD)L)H'L)U-LiH&K)1$Ji5&LBf1LS@ -"IhelGhCiI)##Ji@)LSU*L)L(KiU1N!#2MSZ'JRTV9$-B)NpjNjqGP)b&IA9bG(K -mJB@)LSQ(Ji"rIRamIS'%KiL(KiH*Lib*KS@%Ji1%KBL-MSZ'JRppI(PfGhTqJB1 -&KiQ*LBQ)L)L+MBk1MSf+KAeY968@'dPeN!#IRT@0KhphFR0hHi#%KiQ+L)5"Ihj -mI(k"K)H)KiD'L)Z-LBH&K)1$Ji1'LSk0Ki*rIRajGRCkIS'$K)H*LSQ*L)L(L)Z -0MSk0LSCqF9`r(KNqE)ZGS*H2L)"hFR*eHRq$KiQ+L)D#IhjmHherJiD)KiD(L)Z --LSH&K)1$Ji1&LSf0LB5!IRekGR9iIS'$K)H*LSU*L)L)LBZ1MSk0LiCqF9`q(4F -lDSUFS*L3!)U#HA0bG(PqJSD)LSQ'JS"qI(YmIS+'L)L(KiL+LiU)KS@%Ji1$KBQ -0MSU&JAjpHhGeH(f"Ji5'LBU+LBQ)L)L+M)f1MSZ'Ih4L5#JC-f#$Q+#DNSZ%HR4 -bG(KqJS@)LSQ(K)"rIAYmIS'&L)L(KSL+M)Z)KS@%Ji1$K)L-MSZ'JRpqHhKfH(f -"Ji5&KiQ*LBQ)L)Q,M)f1MSb)JA4L4bFD-f#$Q*qDNSb&I(9bG(KmJB@(LBQ(K)& -rIAYlIB#%KiL(KSH*LiZ*Ki@%Ji+#JiD-MSb)Ji"qI(PhH(b!Ji5&KiQ*LBQ)L)L -*M)k1MSb(J(9P6#dF-&YrPCqENib&IA9bG(GmJ)5(LBQ(KB&rIAYlIB#$KiL(KSH -*LSZ*Ki@%Ji+#JS@+MBb)K)"qI(PfGhb!Ji5%KSL)L)L)KiL*Lif2Mib(JAGT8c- -E+PCmNTkENSb(IRGdG(GlJ)5'L)Q)KB+!IAYlI(q$KSL(KSD)LSZ*Ki@%Ji+"JS5 -)M)b*KB&rIATiGhTrJS5%KBH)L)L(KiH)LBZ-MBb)JhTY@MdN+NpfMTbFNif(J(K -dG(ClIi1&KiL)KS+!IAYlI(q#KSH(KSD)LSZ*Ki@&Ji+"JB1(Lib+KS+!IRYiGhT -qJS5%KBH)L)L)KiH)LBZ0MSf*JRTY@d%R+8edM*ZFNif)JAPdG(CkIS+&KiQ)KS1 -!IRalI(k"KBH(KSD(LSZ+L)D&Ji+"J)+'LSb+Ki1!IRYiGhPqJS5%KBD)L)H(KiH -)LBU-MBb*KAjbBNNX*dCZLCLFPBf)JRTeG(CkIS+%KSL)Ki1"IhalI(k!K)D'KSD -(LBZ+L)D&Ji+"J)'&LSb+Ki1"IhajGhKpJB5%K)D(KiH(KiH(L)Q,M)b+KApeC8d -[*N0VKTHDNif*JhafG(CjIB'%KSL)KS1"IhelI(k!JiD'KB@'L)U+L)D%Ji'!J)' -&LBZ*Ki5"IhekGhKmJ)1%K)@(KiH(KiD(L)Q+LiZ*KApeCP%h,80SK*5CP)f*K(a -fGACjIB'$KBD(KS1"IhelI(f!Ji@'KB@'L)U+L)D&K)+"J)#$L)U*Ki5"IhekH(P -mJ)1%K)@'KiH(KiD'L)U+M)b*K(phDPBp,MpNJC+CPBk+KAehGACjI)#$KBD(KS5 -"IhemI(erJi@&KB@'KiQ+L)D%K)+"J)#$KiU+Ki5#J(jlHAKlIi1%K)@'KiH'KSD -'L)Q+LiZ+Ki&jE&P!,ceJIT!!Q*@1LS9rHACfH(b!Ji@'KiD%JS"qI(apJ)+%KS@ -&KBH*LBL'K)5#JB#!JSD*LBH&JS"qI(PiHhq#K)5&KSD'KSD'KSH)LBU,LSL$Hfp -I4c)i@RU0PTD2LSD!HRCfH(YrJi5'KiD%JS"qI(apIi+%KB@%KBD)LBL'K)5$JAp -rJB@*LBH&JS"qI(PiHRk#K)5%KSH(KSD&KBD)LBU+LBD"HR"L6$Fl@RL,PTD2LBD -!HRGfH(arJS5&KSD&JS"qIAapIi'$KB@%K)D)LBL'K)5$JB"rJB5)LBH&Ji&rI(T -jHRk#Ji5%KBD'KSD&KBD(L)Q+LSL$IA0Q86`k9(1(Nj@2LSH"HhGhH(YrJS5&KSD -&JS"rIAapIS'$K)5%K)@(LBL'K)1$JB"rJ)1(LBL&Ji&rIATjHRf"Ji1%KBD'KSD -&KBD(L)Q*LBH$IRCT9Mmk8R'&NT52LSH$I(KhHAYqJB1%KBD&JS&rIAapIS##K)5 -%K)@(L)L'K)1#JB"rJ)1(L)H&Ji'!IRYjHRf"Ji1%K)@'KS@&KB@'KiL*LBH%IhG -X@dFq8'f$Mj53!)U(JhjjGhKlIS'$K)@'KB+!IhjpIAk!JS5%K)5&KSL)KS5$Ji+ -"J)##KSL(KB1"J(jmHRTpJ)+$Ji5&KS@&KB5&KSH)LBQ(K)&kF@*02NTSIif6NBZ -(JhjkH(KlIB'$K)@&KB1"IhjpIAk!JS1%K)5%KSH)KS5$Ji+"Ihq"KBL(KB1#JAp -mHRTmJ)+$Ji5%KBD&KB@&KBD(L)L(K)"jF'033NeSISb5N!#,Ki4rHRKiHRf!JS5 -%KB@$JApqIAeqJ)'$K)5$K)@(L)H&Ji1#J(prJB5(Ki@$JB&rIATkI(q"Ji1%KB@ -&KB@&K)@'KiH)Ki@#IA4R984+BhU*NC!!LiH%IhYiH(TpJ)+$K)@&Ji&rIRepIRq -"JS1$Ji1&KSH'KB1#JS'!Ii#$KSH&Ji+"IhelHRYqJB1$Ji5&KB@&K)5%KBD(L)H -&JReeDPK(5Q*jL*!!N!#,Ki@!I(PjHRf!JS1%K)5$JB"rIReqIi'#Ji1$Ji5'KiD -&Ji+#JB"rJ)1'Ki@$JB'!IRakHhq"JS1$K)@&KB5%K)5&KSD(Ki@"IACVA%e1BAH -'MSq,Ki@"I(PjHRerJB1%K)5$JB"rIReqIi'#Ji1$Ji5&KSD&Ji+#JB"rJ)+&Ki@ -$JB#!IRalI(k"JS1$K)5&KB@%K)5&KBD'KS5#IRP`BP*0AA1$M)q-L)@"IATkHha -rJB+$K)5$JS"rIRjqIi##Ji1$Ji5&KSD&Ji1#JB"rIi+&KSD%JS#!IhelHhf!JS+ -#Ji5%K)5%K)5%KBD(KS@#IRK`Be42Ah5$M)k,Ki@#IRYkHRaqJB+$K)5$JS"rIRj -qIi#"JS1$Ji1%KBD&Ji+#JB"rIi'%KS@%JS'!IhelI(k!JB+#Ji5%K)5%Ji1%KB@ -'KS@#IhYcD&T4@h"rLBf,Ki@#IhYkHRaqJ)+$Ji5$JS"rIReqIi#"JS1$JS1%KBD -&Ji+#JB"rIi'%KS@%JS'!IhemHherJB+#JS1%K)5%K)5%K)5&KS@$J(adD9Y6A(" -rL)f,Ki@#IhakHhaqJ)'#Ji1$JS"rIRjqIi#"JS1$JS1$K)@&Ji+#JB"rIi'$KB@ -%JS'!IhjmI(erJB+#JS1%K)5$Ji1$Ji5&KB@$JAehEf&9@QemKSb,Ki@$IhalHha -qJ)'#Ji1$JS&rIRjqIhq"JS+#JS+$K)@%Ji+#JB#!Ii##K)@%JS'!IhjpI(erJB+ -#JS1$Ji1$Ji1$K)5&KB5$JAjjF@9EA'YkKBU,Ki@$J(elHhaqIi'#Ji1$JS'!Ihj -qIhq!JB+#JS+$K)@%Ji+#JB#!Ii##K)@%JS'!J(ppI(eqJ)'#JS+$Ji1$Ji+#Ji5 -%KB@$JAplG'TH@fKiJiQ,L)@$J(emHhapIi'#JS1$JS'!IhjqIhq!JB+#JS+#Ji5 -%Ji+"JB#!Ii#"Ji5$JS'!J(ppI(aqJ)'"JS+$Ji1$JS+#Ji1%K)5$JApmGQjLA@G -fJBH+L)@$JAjmI(apIi#"JS+$JS'!IhjqIRq!JB'#JS+#Ji5%Ji+"JB#!Ihq"Ji5 -$JS'!J(pqI(aqJ)'"JB+#Ji1#JS+#Ji1$K)5$JS"pH("QB'CdIiD*L)@$JAppI(a -pIi#"JS+#JS'!IhpqIhq!J)'#JS'#JS1%Ji+"JB#!Ihq"JS1$JS'!J(pqIAeqIi' -"JB+#JS+#JS+#JS1$Ji1$JS"pHA*UBfGdIi@)Ki@$JAppI(apIS#"JB+#JS'!Ihp -qIhq!J)'"JB'"JS1$Ji+"JB#!Ihq!JS1$JS'!J(pqIAeqIi#"JB'#JS+#JS+#JS+ -$Ji1$JS&rHh9ZCQGbIB1(Ki@$JS"qIAepIS#"JB+#JS'!J(prIhq!J)'"JB'"JS+ -$Ji+"JB'!J(q!JB1$JS'!J(prIReqIi#"JB'"JS+#JS'"JS+#JS1$JS&rIAKaD@K -`Hi+'Ki@$JS"qIAepIRq!JB'#JB'!J(prIhprJ)'"JB'"JB+$JS'"JB#!J(q!JB+ -#JS'!J)"rIReqIi#!JB'"JS+#JS'"JB+#JS+#JB&rIATeEQY`HB#%KS@$JS"qIAe -pIRq!JB'"JB'!J(prIhprJ)#"JB'"JB'#JS+"JB#!J(q!JB+#JS'!J)"rIRjqIi# -!J)'"JB'"JB'"JB'#JS+#JS'!IRYhF@e`HAq$KB5$JS"rIReqIRq!J)'"JB'!J(p -rIhprJ)#!JB'"JB'#JS'"JB#!J)#!J)'#JS'!J)"rIhjqIi#!J)#"JB'"JB'"JB' -"JB+#JB'!IhejG("bH(k#K)5$JS&rIRjqIRq!J)'"JB'!J(prIhprJ)#!JB'!J)' -"JB'"J)#!J)#!J)'"JB'!J)"rIhjqIhq!J)#!JB'"JB'"JB'"JB'"JB'!IhjlGh0 -bGhf"Ji5#JB'!IhjqIRprJ)#"JB'!J(prIhprJ)#!J)#!J)'"JB'"J)#!J)#!J)# -"JB'!J)"rIhpqIi#!J)#!J)'"JB'!J)#"JB'"JB'!J(jpHRCdGhb!JS1#JB'!Ihj -qIRprJ)#!J)#!J)"rIhprIi#!J)#!J)#"JB'!J)#!J)#!J)#"JB'!J)#!IhprIhq -!J)#!J)#!J)#!J)#!JB'"JB'!J(pqI(KhH(arJB+#JB#!IhprIhprJ)#!J)#!J)" -rIhprIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhq!J)#!J)#!J)#!J)# -!J)#!J)#!J(pqIAakHRarJ)'"JB#!IhprIhprJ)#!J)#!J)"rIhprIhq!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!IhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)"rIhj -mI(erJ)#"J)#!J(prIhprIi#!J)#!J)#!IhprIhq!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!IhprIhprJ)#!J)#!J)#!J)#!J)#!J)#!J)"rIhprIhprJ)#!J)#!J(p -rIhprIi#!J)#!J)#!J(prJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J!!!3N!!!3!"!!8!!!#J!!'!83!!!!!!&!!!!!!!!%) -@9Zk,S`!!3K3!!%)9!$b!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)"rJ)#!J(q!J(prIRk!JB1 -$IAeqHAZ'Li9pGh0lJ)#(MhKXIhaqJ)D(IhjZH)PjGiU8H'D'I@b,P)CaFReiJAp -qL(YiL)0hG(&jLi9rPS49Ci9rMU5(DhCP9)LXMhf!J'44GTfFLSk'B9eNF+LJH*@ -(6df'Qi+AM(Pk8'LEJAqJLeTdM'&lRAKqPh"VMRPSL)afLSYUIi*XJ)4mLiPSGTP -ZAjD5HB"pIS"TC*DPFA10G'KYJjU1IRehCA#6IhZFI'TmH(5'M(Q#Lh&cL(KfL)C -qG)#%HhacLSTVHSq&DhLAGQQ1NAGaI(PjLi#)Q(&LGhadLD5-FATRB(q)NjL5F9p -lD@HDU)CeK(G@DBkCPhjlJ'aLGSq9MRpaGi"SG*Z4I(GrHfalLB&qKiTZFT0eCiq -5FAH4Hh'#Gh@4Kfk(PR0JIC&mH)11LfPNKT4eFj@2FR"lHB1(GS19G@H(K@f"Qh9 -VNS*RIBZ!I(jqIBYcE*Q'DRD0KfYqKS'(Fh@0I'f)NATbMApMIi9rMS&mIAP`F)f -*J)epG(0aJS@!KC!!JQG`K)"pKSH&H@eiKB&rLB4hH(CjLiKdJ)j`CiQ)ISGqG(k -$EhUCJACpFhjpH)Z3!(KXL)"IM*KkK)&aFS*kHj@*F(erGAKiNj*VH*4mARkBGhL -1HRjmGB*rIi+%HRZ'Ehb3!'akRRjNM*!!ARLAHAZ-I(GkFB#1I(Q4I'q*IQk'L(5 -!KRPmL(GeM(phJB@'H(D%Ih0hMBKkL(abJhTZLTjrChq)FA*mNjTeDAq0G'Q1QS9 -[DBU'D(UIQ@9UMRYZJj+1GA'$Gh5*P)"`KhY[KRb(PhKXJiKMHk4qHBKfFhYeL*Y -pF*+!9iLBDhbAJ@prKB4mCS5NF'5IQ'*MKSZ'GAUSL8Y`S(pUM*U#FfGiQ(0YSTC -UEBGqFi1(MB0ZJB4YIC@$GS1&Hh9hJT!!G@qCKQb'J('!KRU,P'TaMR&ZNj*rJhC -YJS4mM*&hGAe[I)f%KBTlFB"mFiZ5K(TcH(ahHjH@FAL!Eh5)Mj!!L'jTKRjPMUQ -(E('!GR+)NBq"F(*fIRq'PiCfH(9hJS@'LiC[GBK[HjYqDiU-Eh51JhU+H(H-G@b -%P)TfHB0jGRZ-MhGaKB9eH)q-ChH9IhL'IR&lKhZ,Q@pZJh0dMj4lHBCeE(k*N!# -#G)@(F@D&Q)"cL)paE(Z%MSCeJBpdBBZ8Ehb4IR1(Ih1$JRKpMS9rHA"qJ(b+N!# -"H(GjFi+2I)Q-DfL(M'k$TATSKAjQG*f4ISChFh"VLkD0FhU%G'"pMiq9FhQ*BfD -3!+*mG*Cm@A+@L(4kMSCiJRYlGQf$R)pVHiGKCSqIM(elFhCXGCf4JAamDfL)JB@ -3!)KmE(YlDifBI(U-H9pqM(D'Q(PYLRYXJi4jK*&rGS&bGB*cN!#LG'+%K@*hSj9 -lI(0YHRCpPT0lI)pQ6BbLKB14J&PHHT5QJRD@G%PXQjZ&JiGlCe9rVSPiPiGL@hU -2LBk4MA*EERjqN!#DMi4VAh@"ISfJM("fFQGiL*56J(f"D9Q$RB1#NSK`BQb#Ni1 -(RAPPER@"LjD&Ki4BD)H&MiU-JR"UD)Z4KSZ!JAaNEBq6J)',H'0fLiQ$J*D)9@k -3!)KdJ*U#EQGqQAGYP*jZA*+3!'&ePjP[CiQ(H'Z(QhKTJj4kBi5LJPKpURP*KV* -eA)1FKf"[NjG`DTL0D@ppN!#'DhqAIef&S@jUP)aQG*1+FAL'HRTkJT5*Fh#'IPq -#Uj*ZD(ppDhDKVh49I)9LH+5@KAPDF)jcGkfMB'U%D@b,Pj+%EA4iDS'INR*jJQT -hJSQIJ@"VMS4QMD1'C@D'K(k-KRjlGQppN!#&Ji*kFAb"KC*jHhjUFSfBISL-APU -!PSb2PAaT@&k-T*q1Jh459B'SSiQ$G'*5EE'QFS18CNeqRj!!Ji*rG@CYN!#BK)1 -*F&plPSapIB9lBRUHNA*eJ(&lLjUDBe*rMhH&UT&R@QL0Nhb5Uh*)GBYcK+H2Fh0 -VE(q8PBf+FPKRMiq(RC0K@R0pMD#4Ii"KA)51NTk%BACl@SZlKQf#FQ+!MSUPLP9 -MJAU$TTf"F'"GFCLSQiK`CeCRM*keP@YPDQ"TTkZ,JA*ZF'CdVUCPH*jZ8AZ-LCU -"E)b%@'kJM(L*KA4hGh@1KhL,K@phKAGrPi9eJRe[H(q'PB9bH(YqIS"qMBpUG)D -#HhL#LiTeI)abEBQ'I*!!KA"qH'f)PRGkPAKbJRKmKB#+QA&DLi9HK+Q5GfpZIRp -ZMkTqCReiDi#*M*0mGS"YDj!!PRD,MQ*aI(D2QAaePA*4LjQ$Ji'"G@YYN!#DH)D -+Dff&JRf2NAKUHSCfGT51F)+*D(H2HhfCI@@+If5)PAL%L'YqL'plRRYTPhTQM)Y -bHj9jG)edHiaiGiL*FhZ-HR1#MAjcKBPcHC!!IAH%JhKkL(f#Jh9rIRq#JS#%L@a -aMS4fL**`G)*`GC5DH(b(E'0mP)U-MhCQE(arLU#6H'KZGh5'R+#!A@YrHAHAT)a -YBA##K(kES'jMHh4VM+10KS"MD(KjMUk2EhaQ9(UNQj',G@pHB*'QMS@+FPYbIS@ -ENi*iGfpYJj'4JRZ'G@TmL)b(IAH(K@YlNi4kIAU#LRYfM)4XJ)YqKSaiGRpiI)Z -+Ii9jDB1,HBD@KfTbJh@'MS+(JACPICD%LB&rJfpVIjk(FSZ#GRGhJ)q0GB#2H@P -kLiTqHj!!L@PaKS5!LS9jKhP[JB5'KhemLRaSJC0kJT!!Fh@*G@f5QhPcKRjdGi1 -@L(9hJ)"iHSZAJQelM(YdJ)Q2Hff&MA*ePS9cL)*dJ)GiJBT[IT*fGCQ*AS#6FhL -8NAKdER13!)9rPC!!EQ'$JRq2L)TrE@GpPAQ%S)"PFB4pIj@*J)0XD)@5J)#3!)" -XG(k'N!#"I)PiDAf4IhZ8Iff#I(5$N!#+J)&aGS4jJC!!LhTaHB#$Ii'5J@jkIi5 -#IB'$Ih9rKAf)IhL-K'jjM(eiMS&lKh4`M)ChM*!!Fh#"HAU*LBq&E(Z!ERUBNAU -'H@CjIS5CNAjpFQ4kMBQ8NR"eGPb&VSCbQiK)DC')NSf!J(CGFCf2KC*kDRGeGC5 -EI(KqEfk-MSU3!)"VCS+*ISq9IQGXHi15NSH+GeTVLBZ5PB&dGfeNNU#)KhafG(9 -[LUPmDBU(E@q1MB5%GAk'I(D#N!"rG(Z#KBH!Hi0rGRQ(MSL!FhL(H(H2N!"rGi" -jGSH%KBjrGRGmIhZ-NSKjEAYqJBD+PiCTChq'GifILA*YGh@$N!#2NReUF(jmJCL --HS0lE(L-L)Q(GB5)BfLLR@CrRhPRGS+'Li1!P(GEJSpiIjL4Hh4[G)*rKTZ2H(9 -bEAH4QBZ&JhGNDiL2LiU%JhjXDiQ2JSb2HA&iEhb8MB@+J@abIRq0NS&lIh4`JSk -&JSZ%GR0qJAk,M)9lDRU&JB#+PRGcIAf+Gh++PB4aKAjXH)D6MS4mH@jUKj!!Mib -#HA*`DBkLJiL*F&pbMSQ2MiL&@eZ1Q(q)SB"MDQf0R)'!N!"k@ALBJAq*K(YeJ)5 -*IA5'J(H'LhplK(jbHSb,JRjmJhTZHiZ8J(f*G("mKi@%MhCaKRTjMiYjI)"cJT* -hI*9fBAq2KSZ-G(KrCAbIM(b(IQ&kMhk)N!#"GhPhH)b+J)4jHB&pJSZ*HA*jJS1 -"NSpcD(Q"J*+1Ki4NAB1BKikJF9P[H)'AUC&aC@"dKiqKSB"G@hD!JCfVMQGMEfe -pPk1FGfK`D@b4VSelK@jFH*+5Mi4hGh9aKD'*EAZ$H(+,S)K[FS"hG*19L(jbGhG -hKTL0H(pkES5+I)f,F(1,JhQ@K'KqIA5-RBChJh"LIj!!PT@%HR0QC)UPN!#)Nh4 -9CiH5NC@+J(&AF*DCLBQ3!(0GFBL2MBk,GfKbJiL(N!#3!(9YGhZ$LC1)HhYYGi@ -*LBD,HA&kIBU'JiH%HR"mK)D'J)@'GA#)LR9rPi9VHiKqG(b8NAYdJ)4`HBq2MAa -kI@j[KjU)JT&qAQU,Mi@-Pi"ICB#,K)kDJfeXH)+$Mj!!KRTXGS1!JC59EQU*J@k -&Ri4`HhpkH)@6Lh4hKhP`Lj0qI)4mHATmLSemHBZ!ChL5LRQ%PAeLGSq!HT16GQp -jGhk)M*5*Eh1!Fh+1R)ejFhYlD(LNS(TcJ(&PIj56LRpfFA4jKjQ4HR*pG@f'Qj! -!GhPhERQ&Pj@$GQpaEi1CQ)TiEQaeISUMPA9[G'j`Njf)JAP`Ehb)NC'"G(4fHSL -6M(efGh*mN!#8M(ebEA*qM*k4HRKXBRUIPBH2HQ&QH)QJQhTlH&jVNTf2LhpXE'P -pS*U#J)"KCSL1N!#9L@eTH(Z(NC!!Lh9XFi5*Jif,I'YbL)Q(L)*rFferNSq#L(a -SGiD!LjU&Eh&eHSQ,LC*rCR'&Ji@5MAacF(D(LBQ3!)CcEAQ$K)f0L(j[F(Q)LS@ -4LhCTGSKrIiq8KA"cIhakJC'6JAGjHh4eMTL+K(pfCff)NT'1MRYHDB@+LCLFHQ& -SGS+1NjH2EejYKBD(STTfBfTiGibHNi4eE@PfMjD3!)@"H'4VMCD'K)GpF(*qMjG -qGiPrDADBLhD(JA0fKSb#KS+!HR#%M)"kKSTdGiQ'IhaqKi9fI*'(ERL-I(D,Li' -!JAKcIi5)Li5#HR&cIiU&Lj*rF(0mIRq+Mj&rCR5$GhQAQhjiHQjfJSD6NRjbGh0 -cLj'0N!"mDR0mHiLCMRjjD@b$Lif5LRP[ERD&NC'+HfpiGR54QSChHRTZH)bANA9 -dIA0eKC@8Jh&VIi"eMTf(FA*fFi13!*!!LAjfE(1*MiH*LR&NHBU-MSTmGQpYJjH -@KhYbEA0mN!#EM)"hD'@#PSZ4Q(CDE(k"NCk0HR&MESk3!)b6LQjNGRb*PBZ&I'j -XIiZ,NSPbFRPaICQ6I(jpEA+'Lif4IA&jH(+$QBYlJhaZGiH0L)@!HRKcIiZ(Ji* -qHAerIib,Hhb"HRH&Khq&KAajJB+!Ji5"Ii+!HAq(IhL"LS*qJi*rHAU$L)5"KAp -fHAq$KSD)KAYfI)"jKC!!LRjhHATlJ)U8Kh9iHhjrKBb'IAGpIRk)K(q&K(TmK(a -pMBKlIRpfHS@&LBeqGRYlHB@1LB@"H(*dHiZ9LB+'GfCbL)Z2PB&cG@a[LjU0L)T -`CAL!Kj'6KR9dF(@$M*H+I(PeGhU)N!#,JhCdGRq+KBU*Gh*qJRf3!**dGS0cGC+ -5IiD"DRD&JT!!P(YdI'paLBq8P(GRH(aaLk'1JhPQChk)LCZ@I'YUG(b-PC5&Fh& -ZG)@1P)arFh&iHBQ3!)U'H(4iI(f)Ni4hIAekIS5+L(adIB4qIiD$JAjmIi+!IB+ -#IS+#IRjrJ(epKB9pIB@$FhZ0KRf!KAjfH(b+MhapKApcH)H'LBKlHAPfHB+0NBT -lEhPiGBbAM(pkF@PfK)qEMRGfH'YUNU1)IBGeA(#,MC59JRC`ChD4NBL3!)"QEAQ -!P*D%KATFFCL'I*k1A'L#Hi5BNi4lCfH&LS@8PhYKD(f&L)qDLfYPFRq)NC1'H(0 -[F)+BNS#"HfpdJ)D2NRYcIhKbL*H%IB*iG(U)LBD,I(9fIS9qLSU%I'jmKS5!K*! -!IR*hIS9rJSk)Gh@"J(U%MSGqHhYiHB@*KSQ$HhGdHBL6Ji+2H'*eLB@+NiPkG'Y -fMSL*NiG`DhKjKT1,LS"bF(5&Lj!!LAPpGR*lLTD(IApfGAf&Lif'FhQ#FAbAMAZ -#JA"iKi#*NhjbH(f!JB'+NRjYIBClIi1'LS"bH)U#Fi15KhGkKhehJ)+(LB4eHiG -hGiU-L)4kFRf"H)H8L(piFRKrJiZ9KR4jGA#$Mif1L(0THhpmMjH*HA*YFSH2LBk --G@C[JBZ-N!#0HQeXH)'-QBq#FQPaHSH4PieiEfGcKBU6QBKXEA4`K*H8MS4[ChC -lJjU8JRpaBh@,LSq9JA&bERH0P)k'HA"bGB#4N!#(JAKYGB+%MieqI(CdH)10LiG -hHB&cI)f*JB"lFhq)IB1)IRYpIAk(LApkJ)"hHiU+IRf!HRZ!JBU+IAPpHhL%KB1 -*IhKrI(Q(LRZ#MAKbJS*lJiPrJS4fHB+!JBD*I(U"H(H"LSU!JRahI(Z$LiQ$I(K -bHSD$LBk"HAKdHBZ2JS1'FfjqJS12MRYfIRCdLC1)J(afG(TpLTQ(FhTpGRQ,MSb -&F(9rHAf-P)&qIR"jJSH+Ki*iI(KeKik&IB5"F(Q-Khb&KRPiIAq&LRYkMS&bISL -$J)1!Ji*eISPmI)f)H(q&HAb'IB'1JR9pKRKjL)D+KRPiJ)"hK)k%JRjiHS##JBZ -'IAepHhk%K)1$IhalIi@%IS+'I(KpKSYrHB+%GRH*Ki1)IAD#IAD'N!##IBGjF)# -#KBb'JRekGAQ(L)Z&HRekHAf$MSb#HhGiHS@'JSf'F(5"Ii5-Ji#'G@b%M(f'MAa -iHRU"Li9qKhjcHS''L)9rHhjkHS'*MRjjI(b!IB'+MAeZJS4cJiZ$JB0iGSClHj' -'GS'$GAQ'JS1)Ihf"HAQ)JAb(L(afIhpqKB'%KRjiH)+%IS@%I(arIRZ'LhprIAP -rJB+#Ki"hIRYqLBD!JS*cGSL#JBQ'HA4kISQ*J)@'G@YrM)H&KB&jG(1!NBL$L(e -ZF)D(JSb+Ih*bIi'&LBL$GRGrIRq%M)9fHhppJB##Ki&hH)L$HSQ'GhL!JB#'KS' -!H(9rKiL'JAprH(9pLiZ!IB&rGRL)L)+#JhjiHRk(KRU%LhPeJiQ!I(q!K(jlKS0 -iHiL%H)5+I(GrL(pqKB+"IRepJB&pKiKlHS'"I)'&KS9kH(q!I)5+J)D$FRD'KAb -)MAejH(H!KSH*LAjcH(prKBb*Ih9hI(k(LiU"HhPiI)12LhakI(KiKBU,LhYdHha -mLj5"IAp`ES+5LiL'HA9dI)H-LB*rG(0qK)H)KS0mGR@$LS+$L(e`HBD&J)H*I(0 -lKS5%KAYqIhCpM)TqJ(edISU#JSb!FhKqJ)D+KB0pFAU'JS5-KhTeH(b%Ki@*JRG -iIAaqMiekH)5"F(Z2L(f!JAYmIRZ+MATmKhaYJT'#I)1%HR0jL)f!JBPmFRQ"JBH -,JAjlFRH&LS5*M(GXHS&pKT1'HAacFS@0KSb-G@efHS+1M)D%G@YhJiQ0M)*pFfY -lLBD*Mi&`G(arJSU1KhGbHRerK)@-KA&bL)KdK*&rG(Q!J)+"JiTmFAk'Ji#)KRY -eGS1(Ji1)J(CfI)1$L)H#I(GmIi+$JiH!GhTrJS'&Jhq"HAL#LAppK(pjI)1!KBK -pHhprI)''JS+#H(Q!K)#!KS9rG(Q*KAU$LheeIAq!L)0mKB0cGiZ'I)@$GhL#JS+ -&JApqHhq%K)+"IRZ!IRq'KhpjIherKS5"JB0kGB''Ji+&IhCpIhb)MS*kJAPcJSQ -#KiYiFRjqIib0K)"iF(Q%KBf1I(KjF(b5Li1+JQPaKB1'MiPlHA4dJiU+LB4lFh9 -qKiQ*Li"bFRf$JiU-K(9bIRq"LSq&H(CeIB1%LBk&FRGpHi'+Mi9kGRKlHSH5LRp -hHATlIiL3!)4mH(GlIiH)M)9lH(0kKSQ(KS*eGRamL*!!KhepHA4qJiH-JhTlI(P -rLSQ(J(GpI(H#MiTlIhefHRf+NS0jI(jcHSU,LAaiJ(jeIT+(HhppHhYpJif&GS+ -$F(L,LAf"K(ekGhk,L(YrLAedHS@(JAq#JhTfKBGmIiD#H(b(JRPqK)0pIB#"Jhe -pL)&eIBKrGBD*HAU&K(epIS#(IRU%K(PlJhq$KRerJhTfK)0pL)ChHS0iHif(Hi# -#GhH#K)L&I(emHAL#M)Q#HhajGS#,LB1$Hh9eHSQ-L)@"H@ekJS+1Li*lGR"hMBD -%Mi9aF(epJib*K(jiFRQ$Kik(IhTeH(k$KSZ)GR*mJB+&LB9qHA9iK)Q%JS9qG(C -qKBZ-KAKfGAU$L)f'IAGeI)+,L)'"IAKiJiD%JReqIReqKSGqJ(jpJ(b"Ki4mHB& -pJ)H"Ji4jGS5%IiD'GhU&HS'+JB#$HR@)LAQ%KhemIAf$LAepKhejJBH"J)&rJRY -pL)GqHRprIAk&MS*jIhYhJSb$KS9bH)*iIjL0G(jrF(U*KiZ,H(*pHRZ1MB##Hh0 -mIB'1MRTdJRPfKBb,J(PhHi"qK)b*Hh*mJhU!NSPiHRajIiL'K)CkHB"kIiU&IS' -#HRf!ISL(HB#(HRH%JRL#LB'!JRjmI(U$MB4pIRahH)#(MBPqHh9fIiD)LiPjEh9 -pJSU-L(pdFhZ"Kib+Ih4cH)1'Kik(FQjpJi+(MB9eFRL!K)D,K(aeG(q'K)H*IR* -hIRq'LB5!HR4qK(k(M(jdIApjKBL"JRYfJSClIif"Fhk#J)&rHi+%HAk+K(YmIRb -"KB1$J(TiHi''Ki@"HRKlIi5(KApqH(H"KB@$JRjjI(f$Li*mIRaeIif%JB9kFAf -%J)Z-IRChH(b*LS@)Hh*fI)+)Li0rHh*mKS'$M)0cH)#!JS1$JAakI)''L)"kIRj -lJiH!J)0jGi@'J)5"HRarJS1$J)&mFhk+Ki+#IAClHhq2MhpiHAGhK)f+KS&fEAD -'LiZ,KA9YGS'*MBQ&Hfj[J)Z*MBPlG(&fKC!!LS@%FQapKS1,Ni&dG(L#KBH*L(T -ZIB&pL)k)HACmJB&lKT!!JA&eJS5!KBf%GR9rJi++KRKeHS5(K)5%I("kLSZ'K(j -cG(Z'MiH!JAYaGSL1LS4lHRCbISq3!)9rGR4jIiQ3!)YpG(0fK)L(Mi9`E(b'KBU -+KAaXEi11LSD&IR4`HSb0KB5!Fh5"KSQ&JB"jGhf(KS'#HhTrJ)5&JheqI(5#Mi* -mJAjlHhq)M)&iIAjiJ)Q)JATiI(pmKT'#FhL"Hhf+L)0pGAD!KS1)L(efH(f"KiL -%IRGfHi+&L)PqGhTlISH0J(TqG(@%LSH&J(CfIhk$MBGkH(TiIB@'LB0hGRb"JS@ -&IhjjH)+)JRb!IRPrKi5!JRjjHi#'Ki&kIAphHiQ,Ji"pH(TmJBQ*IRarG(D*MB0 -qJhYeHB+1L(YlJATbKBf%J(pmH(jqJiZ"HReqH(b,KS#!IhTjJB1'K(ppH(b$KS+ -!KAadISH%Ii1"H(YqJSQ%HRk"HAH*MRpmIhjjGi@-K(f"JA9hKSL$K)&lHhTqLSK -qIS*jGB1+KAq!J(GhK)Z&JB*lGRU!KSQ'IhYkHAk&L)KqI(eiHS1+K)5"FhQ%Ii' -0LhGdI(k$KBD)J(4fJB+&LiClH(TkJSH(LB"eGS1&I)H,IRGkJ)'%K(q"J(Z"K(e -rKRpkJS4pIi5"J(jpJB*rJSL"GAZ"Ii+(Ki&mGAQ(KS'&KRKbIS+#L)4qJ(aeISb -(Ii+!HATmJSb*IAYrHhZ%KSL(HR4mJ(k'MS*kI(KiKBq'J)&iFRb&L)Q$I(YlGhf -1M(ppI(akHS1-LATjJRekJ)D'JRelJRpiJBU"HAk$IRf"K)9rGhZ'K(q"K(eiI)' -'K)'"HAQ"Ji'#KRjfHhq%KS*qIhpfHBQ+J(b!IRCjKBU%IRjmH(b"KBU'IAPjHhf -&LB+#Ih9fJ)U$JBCpGAL#KB+'JRYkHAq'KRprK(TfIiH'JRjqIhGpKi4rJi0cHBQ -!I)D(HhTqHi1'IS#$IAQ"KB'"J(amIRq&K(q!IhTlK)5"KB4lGAf%Ii#(KRYhIRq -#JS+'JAGjKB*pK)9mH(jrKSGmJB4iGi5(IS5%H(k"IAq&KRppI(q$I(k)JRPmJS# -#KB'!IRKpKSD"K)&iGRk'KB5'JRGeIi+"LSPqGhTlIBD(KB0lHAZ"JS1(K(jfHi@ -"Ii5'J(PpIS5'IRq%JAYmJiD"I)#'IAL*LAPmJhppIi5+Kh0bL)0iKC+%F(@#Jhk -$Mi9cGB'"IS@*KRadIB0qIiZ,HA4pJRalMT*lEhk%G(f5M)"hGRarIB+8Lh*hJ(Y -kKSb(IhClJRZ!MB9kIi&jIi4rJi*mJ)9mHSH$Hhq&KAemJB&kHBQ,IRerIRPmK)U --I(CqI(KrMBf"HhGlIAq)LSL!GR4jJi@&LBClFhD!KiH(KAeeGAZ%LBU'IhGcHi' -&LSZ"GRCkI)'(MBKkGAerGi'4LAakI(eiHB@2KhPqJhPdISZ*Ii#%I("iLBD#Ki9 -jFhQ!K)H(KAecGAk%K)H,K(0ZIS9qK*!!LA4aHRf"KSZ,IR*cIB1"KiZ'H'plK(q -"LiPlH(PlJ)D'JS5"HACmK)5$Ji&qHAPqKBH#Ii&qGRQ&Ki#!K(piHRq%KS*qJAp -kHS#'JhpqJS"iIS1$JRk!J(pjHiL&IB#&JRKhJ)H$IB+%I(KmJSD%J)&rHRTrJS5 -&JAf!IRYrJi5$Ihk!JATkKSD!IS+$HRU!KS4qK)&jI(q#JS@$IRpkHi'%KB1"IRa -mIB+'KS0kHB#!Hi51KAGiIAerKBQ)J(GiHhq(LSL#Hh9iJB1*LS&pHhPkK)Q$JS* -mHAZ$KS1$K(jfHi1#JiD#IRYjIiD&J)5%H(L#KB&rKB4mHAq%Ihk%K)&qIAprIS# -%KB&rIhTkJ)5'Ji5#HRClK)5'LS&jHRKjK)b,K(jeG(b!LC!!LRjdFhCrLBf2JhC -cFRL(Nif$J(9VGB12NiCpH(*bI)b2LS"hHRKiKBZ'JB"kGhk"JSD$J(plHi##J)' -$Ihk!IRprIS+%JAk#JAPlJ)+%KB5!HhKlJ)1(LS0iGhKlJ)H-LApdGRemJBZ-JRK -hHAb!KBf'GhPqHhb(Li&kHRZ!JB'(KAaeIS4rJ)5$IAKmJS1#Ji*mHAk#J)'$JRa -iIS1&JAq#JATfJSZ$IS"pHATqJiU(I(YpHAf&Ki9rI(TmJ)''KRjmIAjpJB@#JAa -jJ)&qJSD"HRf!I)#%JS"pIRprIi'(JAKmJB&pJSL#HhKqK)'"KB4jGAk%JS1'K(Y -eHS5'JS1)I(0mJS+&KS&mHhPrKi+$KRYfIB+#JSD%J(KeKBKqK)L!GRTqIiH%JB5 -!HAYrJ)5(JAprHhjrIS5'IRf$J(b#JRq#JS+!I(arIRf'L)#!IRTqJS#(LAekIhT -fKSb%Ji"kHAKqLif"IS*eFB'*L)L$IAYfGSD3!)1"KATbGi5+L)1!J(GfJiQ'JS* -qGhQ"LB5!JhpiHS1(K)#!JRefIBQ&IB'#IRYmJSD#IS+$Hhf%JAq!JB'!J)'%IhP -rKB*rJB0qHRb"K)+$K(jjHi'#JS5%JAPjIi+!JSL'I(ClJS'!LBTpGRKqK)1%L)* -hGi#$JSD$IRajI)5'Ji*rHRZ"JB+)JRTkIAq"Ji1&JAGjJi+!K)@!HhYlIi5$JB& -qI(b!Ji5#IAamIS'$KB*mHRk!J)1(JhKhIS1!J)L'I(9jJB1&K)@#GR4pKSD%KRp -hGhf"K)Q'I(KiI)'%KiGqH(KpJB@&Ji0mGAb&JS#&JRPjIi+$Ji+"IAKmK)@#Ihk -!IRPrLS9lIB"lIB1$K)0mHAf!JS@$IhjlHi#$K)9qHRepIB+)JheqI(f"JSD%IRT -mIAk&KB+#I(KpJB1)KRakI(KpLBU$IATjIB#%LiGjH(apJ)@(KAphH)#$K)H$Iha -iHi1&KB@"HRPqJ)1&JS4qGRZ#Ji5&JRemHRf(KB'$IRPlJB1&KAprIAQ"KS+!JRp -lIS#$KS"pJApkJ)H#IhpqJ(jqKSL"I(jpIB1%KB9pHAjrIBH+JAprHAQ"KB@&IRe -qGhk*Ki'#J(PmIS'*KRaqJ(KmLBL#J(emIAQ!MSCmIhpjI)'"KiPrHhjmIB+"K)U -!H(aqIS'$K)@!HAq$I(q'JRprIS#!I(k%JAq&JRaqIRf#K)+#IhTmIRk%LS*pIha -lIS+)KRakJ(jjJBL'JAalIRjmK)H"IhemI)#%Ji'!J(jlIS5$Ii'#I(U!Ji+"JB0 -mHS#"JS1#IhaqI(q&JS'"IAU!Jhq!Ji"lHi+&Ihk$J(GmKS0rJB*mH)#&JAk"JRj -lI)'%JRq"K(ahIi0rJ)H$H(b#IRk&KhplHhk"Ii#%JRemJ(prJS+"IherJAepKB4 -lIi9rHRq$Ii##J)#"I(b#JAb%KhelIhjpJB5%JhekIhjmJSD$JAjjI)*qJ)L$HAZ -!IAk%K)*rI(aqJB'$Ji"mI)#!J)5&IhapIAk!JiD#I(b!IRZ&Ki'!IRaqIRq%LAp -jJB"mIi1%JhpjIS4pIiD#IAjqIS'!Ii4rHi#$JAq"J)"rHS''J(f"JRjpJ)5$J(q -!IRf"Ji'%JRjqIAq"K)1#JAYlIRq$KB5$IAPqJS+#KB0pI(apJS5$K)&mIAppJBH -%Ii"pHRq"JS@$IRjrHRk(K)#"J(emIAq'KRjrJRjlIi+#JS+!J(emJB1#JB1$IAa -mJ)1$JB#$IhPqKB*rJi0pIApqJB5"J)*pHS+%IRq%JAjqIS1$IAq$IhZ"K(q"JAf -"J(aqKS0kJB*mIS+%J)#!IRppJ)1$J(aqIhjqJSH#I(k!IRb"KS0rIRemIi+$Ji* -qIAepIiD'IRb!IAPrLBD!IhplH(k%Ki9rIRajHS#)L)0pIAehI)@'K)1!GhPrIS1 -(K)&pHRTrJS+%JRjpHRf#JS'%JhTlJhjmJS@"IRapJhplJiL"HAk$IRYrKi4lIS0 -rHAb%K(pqJB*mHS#'JAf#JRajJ)4rIi5$IAZ!J)##JB'!Hhb!J(q#K(emIi#!Ii1 -&IhGpK(pqJi4rIAjpJS0qK)0mHhq#I)#&K)&lJ)*qIS'#IhprIi+!Ii#!J(q%Jhb -!JRalJB@#Ii'#HhU"K)@"J)"pHAU'LB&pIi&kHB+*L(YlJRYfJ)Z(JAjjIApjJC! -!L(ClJRPiKBQ(K(YiIhekKSb$IAjpHRf#KSH!I)"rHhq)KAerJAjpJ)5"J(jqJS" -pJiKmGS1%Hhq'KRjlI)'%Hi'+JhGkKB"lIiD)I(Q!K(jjKBGrIRk#IheqJiCmIS1 -!IAf$JS#!J)0pHS'$J(q%JheqIAq$JB'%JRTlJi&pK)D"HhTrJS"qKSCkH)##IRq -(KAjiHi1"IS1+JR0kJi"lK)b!HRTrJRerL)YkFS1#H(f(LAelIB'!Gi+,JRKpKRe -kIi5'IRb"JhpjJB0rIi'%Hhb"IRk!K)&pIhf!J(f$KRjiIS0qIS+%KAYfJBClI)Q -&HRTmIi0rISL'G(H&JAb!Ki4mGRb(J(U'KhahIB#"Jhb"KAPjJS0mJSClIB"qJ)# -#JB"lHiD!IS+"IhYqIi1$Hi'#HhU#L(pqJ(jmHB'%JS*qIReqIB++IhZ!IATrK)+ -$JAPmJ(b"Ki0qJ(YjJi*rKS4iH)"pISL'IhplGhk%JS@(IRKkI(k%L)1!IRPlIS' -%KS0kIApjISH(Ii##HharJBD$I(b%IRH&L(jmJB"pJRf"L(YjK)4jISGqIS'!J)& -rIB*qHi@$IRq#IhU!JB1%IS'$HRH#LAjrKS&kHRq%Ji*rK)&hHi1'JRq$J(elIiL -#IS+!HhU%JS#'JAYpJ(arLS0pJhpjISD!J)GpHRpqIi1%Ii+"HAq#IB+'IhZ$IAL -'KRf"KRaiK(jpKi0pIi0lI)@!JS@!IAk"IB##Ii@"Hi#%IAU%K(k!J(q!Ihf!KAp -mJi*pI)1$IAk#JhpmJ)'!Ihk$JRjrJ)"pJB+!JAjrJAjrJS*mJ)9mIS5!IB##Ii* -qHSD$HAq'J(Q!J)#%IAk&J(GrKherKApqIhemKB0mK)&mIS"pIiQ"HS+!Hhb"K)+ -#HRb%IAU#LRpiJB"pIi#$K(jiJ)CkI)H$I(eqIB1!HS@'H(Z&J(f%J(Z#IhQ"KRj -qJhamJRjrKB*lIRppJS&rKB0jHi1"I)1$J(jlIS+$J)#%J(alIi5!Ii'"IRb!J)+ -#IS#!IRjrJS*rI)'$I(k&J(b!Ihf$Jhf#JRPmK(prKB*mIRamK)+!KS0hHi0mISL -'IRjqHAq#IiD)IAKrJ(Z!L)@!IAamIi##Ki0mIS"pI)5%IB+"I(q"IS#&IRZ&J(Q -"KRjpK(pqJRk!Ji&mJS4lIi*rJ)&rIi9rHS5#I)'&J(k%IAZ$JAk$KRjmJRpqJS+ -#JRppIi&rJi*qJB&mIB5$Ii+!IB#!Hi+*IhU$JRYmK)@"Ihk$IhKrKi4mIi*qIRf -!L)0lIi4pGi1'IS'%J(arIi#&JRk$J(YpJi&rJi*rIRerJi&rKB0kHi1"IB1&J(p -pIB+$IS#)J(GqK)"mJiD!IRZ!JhppJSGpH)+%Ihk"JRpqIS'&IRk%J(PrKB'!Jhp -qJ(arKB&qJi&jIB0qJ)@!IS&mI)1"IS5%HRb#JB'"J)'"HAZ'JRb#JReqIRk%KRa -mKAjhJ)@#J)"rIhplJB9rIB#!IRq"JS*qI)'#I(k&JRPqJhemKS4lJB*lI)+#JB4 -mHi5!HB'*JAPrJB"rI)@)HRL$JhQ!LB&pIRYqJRprLB9hI)0pHS5(J(jqIAapJi@ -$IRjrIAerK)0rIhk!IAb$Ji&pJ)4jI)5#Ii#$IhprHi#$J(q#JRYqJ(k"JB+#Ihp -qIhjrK)'"JAjpJ)"qJS0rIS"qI)1$J)+!IReqIi#&JAq!I(q!J)+&JhYpJReqK)5 -!J(plJ)*qJBH"HRk!I)#%JS1"I(f"Ihf'K(arJ(YqJi+!KB"lJB"pJS9rIi0mHS+ -#Ii5%IS&rH(q'JAk&KRTmJ(q%JB#$JRajJi0qJi5"IhjmJ)5!J)5!I(f"IS+%J)' -!IRerJi'$JAf"J(apK)CqIi&rIAf"Ji0rJ)*qI(q#Ji#"J)+!HAk&JRq"K(jpJ(k -"Ji'"JB"pIi"rJi0rJ)"qIS+"JB*rI)'"I(q(JAb!JAprJB#$JhTpJi"mJBCrIB" -rIi#!JS0rHi+"Hi'$J(q"IRf%Ihf'JRTqJhelKS*pJS"mIi*rJB4qIS*qIB'#IS' -!I)+"I)#&J(U"JAarJB'"IharJhprK)*pIApqJB'!JhjlIi&rIiD$HRk!Ihq!Ji& -rI(f$Ihk$K(jlJB&qIi+$IRarJS"qJi4qI(q#Ii#$J(pmHi#$J)#'JAPrJheqK)* -qIAerJS"rKB0kHi&rJ)1!J)"pHi'%Ii'$IAarIRk$KAjqJ(emIi+"JS"mIS"qIi5 -%Ii"qI)#"Ii#%JAZ"Ihf#JB#"JAepJhjpJS'!JB"qJ)"mJB1!J)+!I)#"Ii+"J)# -!IAf$JAq"JAppIi##JRq"J(jpJ)1"JB"rJ(erJi5!IS0rHB#%JAq#JRjqIB#'JAf -#JRamJi+"JAk!JAeqKi*lJi4kI)@#Ii+"IS"qIB5%IB#%IhZ!K)'!Ii'#IRf#K(p -qJS&qJB1!Ii"qIi#"JB+#I(f#Ihq%JhaqJRerK)*rJAplJS4rJS*rIRprJB4rIi0 -qIB'$J(q"Ihq"IS'%JAarK(ppJi4rIAprIi##KS&pIB"qI)5)JRepJ(jpJ)D(IAU -"IhZ!Ki1!IheqIRq#KB"pJAjkJB5#IRk"IhemJiCpIB1"Hhk%JB#"IhprIAq%JRk -!JRepJS&rJ(pqIi#"JS&qIRppIi5$IRprHhb#Ji1$J(apIAb&KhjrJRYjJ)1"Ji* -mIApmJ)5$J)"qHRq#J)+#IhalIS'%JS#$IRPpJi1!JS&pI(aqJi@!Ii&pHRf$JS+ -$IhjpIB##K)'!IhjqIB'&JAk!JAapJS#"JB"qIS"qIi+!J)#!J(prIRq"J)'!J)" -pI)#$Ihq%JhYkJB"rJS+#J(elIi4qIi@"I(f!Ii#$J)'!HRk#Ii#%JRf!J(b#KB# -!JRjmJS"qKB4mI)+!I)+%JS&pIB#"IAq&JRjpJ)'!Ihq%JAYrK)"lJ)0qJ)'!JB# -!Ii+!IB1#IRk#JAb!Ji'!IS'$IRb!KAppJi*rIS#"JB"rJS"lJ)5"IB+$IAk!JS* -rIS#"I(k&JhprJApqIi'%JAf!JApqJB1!JB"qJ(q!JB+#IB'#I(k#JAq!Jhq!JAk -!JRprJi&qJB"rJAprJS*mIi4rIB'#IS##IS##IAk$JAf#JRarJhpqJS&qJB"rJhp -mJS0pIB5!HS+"IS'!Ii'#I(k&IRf&JRarJReqJRq!JRjqJAppJi*pJ)*qI)#"J)* -rJ)&qIB'$Ihq$IRerJ)#!JS#!Ihb"JAprJS&lIi&qIi##J(pqIS+!IS+"IAk"Ihk -#J(q"IRk#J(Z"JhaqK(pmJB&pJ)&rJAppJ)*pIS1"IRpqJ)&qIS'#IAk#Ihk!JRj -qJS"qJB&rIi&qIB+!Ii+#IRq#IAk#Ii#"IRq"IRb%K(Z!K(jmJB"qJRppJS&pIi0 -rIB&rJB*rJ)&rIB#"I)+$IAf"JRerJS'!IRq!J(pqJi&pJ)+!IB'#Ii"qJ)*rIB+ -%I(k%Ihb"JAk!JAq#JAb!JReqK)&qJi&mJ)"pJS*qJB4mHi+!IS+$Ihq!I)##IS' -$J(k!J(f"JAq#JRjqJB"qJB'"JS"qIi+!IS+#Ihq!J(q"JB'#J)#"J(k!JS#!JAp -rJ)"rJS+!JS"mIi&rIS1#IS"rIi#"JB##J(jrJ)#!JB'!Ihk"JRprJS&qJ)&qJB& -rJ)'!IS+#IS+"IRq"JAq!J)##Ihk$J(jrJS'!JS#!J(jrJS"rJB*rIB#!IS'#J)' -"IhprIi#$JAf"JRepJB*rJB&rJAjpJB*rIi*rIS&rIi+!IS'"Hhq$IRq#J(k!J(f -!JRq"J(jrJ(prJS#!JReqJRpmJ)4rIS&rIRq!JB&rIS'!IRq"JRpqIi'"I)#$J(e -rJhjpJS&rIB'"IS"rJB&qIi'!IAq$J(erJS"qJ)+#IAb#JReqJS*pIS#!J(q!JB" -qIS&rIS#"J(q!J(prJ)&rIi'!IhprJ(prIi'"IhprJ)"rJ)+#IRk"Ihk!JB'!IRk -!J(k!Ji&qIS#!IAk#K(jpJB"pIi+"J)"qJ(pqJ)+!Ii#!IRprJB*rJ)+!I)#$IRk -#JRjqJ)#!Ihq#JAprJ)"qJ)#"JAk!JAprJB0rIi&rIRq!JB'"J(prIi#!JS+!IS" -rIB##JB'!J(pqIi#$JB#!J(ppJ)+"JB'"Ihk!J)'!Ii+!IRq"J(q"JB"rJ)#"J(q -#JRjrJS&rJ)'"J(pqJB&rJ)+!IS#"Ii#"JB"rIi#!Ii#"J)"rIi'!Ii##J(k"JAp -rJB'!J(q!JAk!Ji"rJB&qIi'!JB&qJ)&rIS+$IRk"J(q!JB'"Ihk"JAq!JS'!Ihp -rJ)#"JB&rIS#!J)##JB#!IRk"JAq!JhpqJ(q!JB#!J)*rIS#!Ihk!JB#!J)#!Ihp -rJ)&rJ)'!IhjrJB&rIi'!IB#"Ii#"Ihk!Ihk"JRq!J(prJ)"rJB&qIS#!J(q"JRp -qIi#!IS#"JApqJ(prJ(q!JB"pJ)*qIB'"IS#"IS#!IAq#J(f!JRpqJ(q!J(q!JAp -qJ)"qJ)&qIi&rIRq"J(q!Ihq!Ihq!JAjqJi"pJ)'!IS#!Ii"qJ)*qIS'"IS#"IRq -!Ii#"Ihq!IRk"JB#!JAprIhq"J(k"JAjqJB"rJB"rJ(jrJB"qJ)*rIS#!J)#!Ii# -!IS##J)#"J(prJAjrJRprJB"qJ)&qIi*rIi*rIB'"IS##Ii##Ihq"Ihk#JRq!JRj -rJAjrJS"rJB"pJ)&rJB&rIi#!J)#!J)*rIB'!Ii#"J(q"IRq"Ii##J(k!JAq!JB# -#J(erJRppJS*rIi&rIi'!J)+"Ii#"IRq"J)#"JAprJ(q!JAq"JRprJB&pJ)0rJ)' -!Ii#!Ii+#IAq"Ihq"JB#!Ihq"Ihq"JAq!JAprJAq!JRprJB"rJ)"rJ)#!JB&rJ)& -pIi+!Ii'"IS#!Ii'"Ii#"Ihf!JAq!J)'!IS#!JB"rJB"rJ)#!Ii#!Ii#!J)#"J(k -!J(q"JAq!JAjrJB"rJ)&rIhpqJB&qIi"rIS#"Ii'!IRprJ)#"JAprIRq!J)#!JB" -rIRq"J(q"J(prIhq"JAprJ(prJB#!J(jqJ(prJB&rIhprJ)"rJ)"rIS#!IhprJ)" -qIi&rJ)&rIS#"Ii#"IRprIRq"JAq!J(erJ)#"JB"rIhjrJB"rJB"qIS'!IS'"Ihk -!J(q!J)#"J(jrJApqJB&qIi'!J)"qJ)"rJ)+!IS'!I)##J(q!J(prIS#$J(q"J(e -pJ)'"J(q!IherJB'!J)"rIhq!JB"rJ(pqIi'"JB"rIRq!J)'"J(prIi#"JB#!J)" -rJ)'!IhprIi"rJ)+!IRprIi'"J)'"IRf"JAq"JAprIhk!JS#!JS"pIi#!JB'!J)" -rIi#!J)'!Ii#"J(q"JB#!J)#"J(q!JAq!J)#!J)#!J)"rJB&rJ(pqJ)#"JB#!Ii" -rIi'"J)"rIhprJB'"J(prIhq!J)'!J(prJ)#!J)"rIi"rJ)+"IhprIhq"JB'!Ihq -!Ii#"JB"rJ(prJB'!Ihq!J)#!JB&rIS"rIi#"J(prIRq!J)'"J(pqIS#"JB'!IRp -rIS#"J)#!Ihq!J)#"J(jrIhk!JB#!JApqJ)#!J(q!J(prJ)&rIi#!J(q!JS"qIi# -!J)#!J(pqJ)#!J)'!IRprIhq!JB"qIRprJ)#!J(prJ)#!J)'!IRq!J(q!JB"qIRq -#JAq!J(jpJ)#!JB"rIhpqJ)'!J)&qIB#!Ii'"IhjqIS#"J)#!IhjrJ)'!J)#!Ihq -!J)#!J)"rIi"rIi#!J(prJ)#!Ihq!J(prJ)"rIhprIi#"J(prIhprJ)'!J(jrJ)# -!JB&rIi"rIi#!J)"rIi#!Ii#"Ii#"Ihk!J(q!J(q!J(q!JAprJ)"rIi#!J(prJ)" -rJ)#!Ii#!Ii#"J(prJ)#!J)#!J(prJ)"rJ)'!IhprJ)#!JB&rIi#!J)#!J)"rIi# -!J)#"J(q!Ii#"J)#"Ihk!J(q!JB#!J(q!JB'!J)"rIi"rJ)#!J)#!J)#!Ii#!J(q -"JAprJ)#!J)#!JApqJ)"rJ)#"JB"qJ)"rJ)'!J(q!J)"rJ)&rIi'"Ihq!J(prJB' -!Ihq!J(q"JB#!IhprIi#!JB#!J(prJ)'!Ii#!Ihk!JB"rJ)"rJ)#"JB"rIhprJ)# -!J)"rIi#!JB"rIi"rIi#"J(prJ)"qJ)+!IRq!Ii#!J)#!IRq!IRq"JAprJ)"rIi' -#Ihk!JAjrJB"rIi#!Ii#!J(prJ)"rIi#!J(jrJB"qJ)&rIRq!J(prJ)"qIi#!Ii' -!Ihq!IhprJ)"rIRq!Ihq"JB"qIi#!Ii#"Ihk!Ihq!JB"rJ(q!J(k!JApqJ)'!J)# -!IhprJ)&rIi&rIi#!Ihq!J(pqJ)#!Ihq!J(prJ)'!Ihq!Ii#!J)#!Ihq!Ihq!J)# -!IhprJ(q!JB"rIhprJ)#!J)"rIRprJ)#"J(prIhprJ)'!IhprIhprJB'!Ihq!Ihq -!J)#!J(q!J(q!J(q!J(prJ)#!J)#!J(prJ)"rIi#!J)"rIi"rJ)#!Ii"rIi#!J)" -rIi"rIi#"Ihq!J)#!Ii#"Ihq!J(q!JAprJ)#!J)#"J(prJAprJB&rIhq!J(prJB& -rIi#!Ii#!JB"qJ)'!Ii#!Ii#!J)"rJ)'!Ihq"J(q!J)"rIi#!Ii#!J(q!Ii#!J)# -"Ihq!J(q!JB"rJ(prJB#!JB"rJ)"rJ)#!J)"qIi#!J)#!IhprIi#"J(q!J)"rIi' -!J(q!J)#!Ii#!Ihq!J(q!Ihq!J)"rIi#!Ihq!J(prJ(prIi#!J)#!J(q!J)#!Ii# -!Ihq!JAprJ)"rIi#!J)"rIi#!Ii#"IhprIi"rJ)#!IhprIhq!J)"rIi"rIi#"JAp -rJ)"rIS#"IhjrJ(prJ)'!IRk"J(k!JApqIhq!J(q"JAjqIi"rIi+!IRprJ)"rJB+ -!IRq!Ihq!JB"rIhprIhq!JAprJ)"qIi'!Ihq!J(prJ)#!IRq"J(jrJ)"rIi#!J(p -rJ)"rJ)"rIi'!IS#"IhjrJ)#!J)#!IhjrJB"rJB"qIhq!J)#!J)"qIi'!Ii#"Ihk -!J)#!Ihq!Ihk!JB#!IhprIi#!JB'!Ihq!Ii#"JB"rIhq!J)#"JApqIhprJB'!Ihp -rIi#!JB&rIS#!IRq#JApqJ)"rIi#"J(jrJ)"rJB&rIS#!Ihq"J(prIi#"Ihq#JAj -rJB"rJ)#!J(prJB"rJ)"rIi'!Ihq!J(q!JB'!Ihq!J(q!JS"rIi"rIi#!J)"rIi# -!Ii#"Ihq!J(q!J)#!Ihq!J(q!JApqJ)#!J)#"J(prJ)"rJ)#!J(prJ)#!JB&rIhp -rJB"rJ)"rIi#!Ii#!IhprIi'"Ihq"J(jrJB'!Ihq!Ihq!JB"rJ)"rIi#!J)"rJ(p -rJ)'!IhprIhjrJB&rIi#!Ihq!JB"rIi&rIi#!Ii#!Ii"rIi#!Ihq"Ihq!J)"rIi# -!J(q!J(prJ)#!J(prJ(prJ)"rJ(prIhq!J)"rJ(prIi"rJ)"rIi"rIi#!IhprIhq -!Ii#!IRq!J(q!JB"rIhq!Ii#"J(jqJ)"rJ)'!IhjrJ(prJB&qIRq!J)#!JB"pIS# -!J)#!J(pqIi'!J)'!IRq!Ii#!J)"rIRq"J(q!J(prIi#!J(q!J(prJ(q!J(prIhq -!JB"rJ(prIhq!J)"rJ)"rJ)#!J)#!IhprIi#!J)"rIi#!Ii#!J)"rIi#!Ihq!J(q -!Ii#!Ihq!Ihq!J(q!Ihq!J(q!JAprJ(q!J)#!JB"rJ)"rJ)#!J)#!J)"rJ)#!Ii# -!J)"rJ)#!Ii#!J(q!Ii"rIi#!Ihq!J)#!J)"rIi#!J(q"JAprJ)"rJ)#!J(prJ)# -!J)"rIi"rJ)#!J)"rIi"rIi#!IhprIi"rIi'!Ihq!J(q!J)#!Ii#!Ii#!J(prJ(p -rJ(q!J(prJ(prJ)#!J(q!J(prJ)"rIi"rIhq!J)"rIi#!Ii"rJ)#!Ii"rIi#!Ii# -!Ii#!Ihq!Ihq!J(q!J(q!Ihq!J(prJ(prJ)#!J(prJ)"rJ)"rJ)"rJ)#!J(prJ)" -rIi#!J)"rJ)"rIi#!Ii#!Ihq!Ihq!Ihq!J(q!Ihq!J(q!Ihq!J(q!J(q!J(prJ(q -!J)"rJ(prIi#!J)"rIhprJ)&rIhprIi#!J)"rIi#!Ii#"J(q!Ii#!Ii#!J(prIhq -!Ihq!IhprJ(q!J)"rIhprIi#!J(prJ(prJ)"rIhprJ)"rJ)#!IhprJ)"rIi"rIi# -!Ihq!IhprIi#!Ii#!J(q!J)"rIi#!Ii#!J(prIi#"J)#"J(jrJ(q!JB"rIhprJ(q -!JB"rIi"rJ(q!J(prJ)"rIi'!Ii#!Ii#!J)#!Ii#!J)#!Ihq!Ii#!J)#!Ihq!JB# -!J(prIhq!J(q!J(prJ)#!J(prJ)"rJ)"rJ)"rIi#!Ii#!Ihq!Ii#!J)"rIi#!J(p -rJ)"rIi#"J(q!J(prIi#!J(q!J(prJ)#!Ii#!J(q!J)"rJ)"rIi"rIi#!Ii"rJ)# -!Ii#!Ii#!J(prJ)"rIi#!Ihq!J(q!J)#!J)#!J(q!J)"rIi#!Ii#!J(q!J(q!J)" -rIi#!Ii#!IhprIi#!Ihq!J(prJ)"rJ)"rJ)"rJ)"rIi#!Ihq!J)#!Ii"rIi#!J(q -!Ii#!Ihq!J(q!J)"rJ(q!Ihq!J(q!J(q!J(q!J)"rJ(prIi"rJ)"rIhprJ)#!Ii" -rIi#!Ii#!Ihq!Ihq!J)#!J(prJ)"rJ)"rJ(prJ(q!J(q!J(prJ)#!J(prJ(prIi# -!Ihq!J)#!J)"rJ)"rJ)#!Ii"rIi"rIi"rJ)"rIi#!Ihq!J(prIi#!IhprJ(prIi# -!Ihq!J(prIi"rJ(q!J(prJ(prJ(prJ(prIi#!J)#!Ii"rIi#!J(q!IhprJ)#!J)" -rIi"rJ(q!J(q!Ihq!J)#!J)#!Ii#!J)#!IhprJ)#!J)"rJ)#!J)#!J(prJ)"rIi# -!J(prJ)#!Ii#!IhprJ)"rIi"rIi#!J)#!J(prIi#!Ii#!IhprJ(q!J)"rIhq!J(q -!Ii#!Ii"rJ)#!J(prJ)"rJ)#!Ii"rIi#!J)#!Ihq!J)#!Ii"rIi#!Ii#!Ii#!Ihq -!J(q!J(prJ)"rJ)#!Ii#!Ihq!J)"rJ)"rIi#!J)"rIi#!Ii#!J(q!Ihq!J(prJ(q -!J(q!J(q!J(q!J)#!J(prJ)"rJ)"rJ)"rIi#!J)"rIhq!Ii#!J)#!Ihq!Ihq!J(p -rIhprJ)#!J(prJ(q!J)"rIi"rIi#!J)#!IhprIi#!J)#!IhprJ)#!Ii#!IhprJ(q -!Ii"rIhprIi"rIi"rIi#!J(prJ)"rIhprJ)#!Ii#!Ii"rIi#!Ii#!Ihq!J(prJ(p -rIi"rJ)"rJ(prJ)#!J(prJ)"rJ)#!Ii"rIhq!Ii#!J(prJ(q!J)"rIi#!J)"rJ)# -!Ii#!Ihq!Ihq!Ii#!Ii#!Ihq!J(q!J(prJ)#!J)#!J(prJ)"rIi"rIi#!J)"rJ)# -!Ii#!J(prJ)"rIi#!J)"rIi"rIi#!Ihq!Ihq!J)#!J(q!Ihq!J)#!J)"rJ)#!J)# -!J)"rJ)#!J)"rIi#!Ii#!J)#!Ihq!J)#!J)"rIi"rJ)#!J(q!J(q!J)#!J)"rJ(q -!J)"rJ)"rIi#!J(prJ)"rJ)#!Ii#!Ii#!J)#!Ihq!J(q!J)"rJ)"rJ)#!J)#!Ihq -!J)#!J)#!Ii"rJ)#!J)#!Ii#!J)#!J(prJ)#!J)#!J)#!Ii#!J)#!J(q!Ii#!J)# -!J)"rIi#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)# -!J)#!J)#!J)#!J)#!J)#!J!!!!3!!!`U%!!-*K!!!!8%!di-8&i)!!!!F!,B!!(0 -ZC#!!#`!+90m!!#!!!!!!di(S8%N!$#!!0d3!di(`4!-!&b!!HBJ!di(N*8S!)b! -![-`!di(J8L8!-#!"!hS!di(FGdN!Ib!"5,i!di(B,83!2b!"G3)!di(8+f3!FL! -"R8B!di(38KX!5L!"dBS!di(-++X!9#!#!-i!di()2VF!Cb!#N[`!di(%C'd!E5! -#ad!!di(!#e4[EfaPC#")Eh*Z#NeKCfPM)%KKFR!,6@&RD@-J4QaeG'8-6'9KG'K -PFL"%FR9Y$NK[FQiJ6fBJ8'aPER4j#NCbEh0d)%K[FQi*4QPbC5")Eh*Z%N4bG@d -J6fBJ4@&bG'KaG@&VC39#G@GXC34#C@aX$&G[Ef4PEL"'E(9dC3YAEfpNC@iJ5'& -bF"31: diff --git a/sys/mac/News b/sys/mac/News deleted file mode 100644 index a5e957cfe..000000000 --- a/sys/mac/News +++ /dev/null @@ -1,9 +0,0 @@ -Welcome to NetHack 3.6 for MacOS 7.0 - 9.x - -Unfortunately, the 68k version is no longer supported. - -This game is brought to you by Dean Luick, Kevin Hugo, and Mark Modrall. - -Bug reports, suggestions, comments, etc., should be e-mailed to the -Internet address nethack-bugs@nethack.org, or fill out our comment -form on the web at http://www.nethack.org. diff --git a/sys/mac/README b/sys/mac/README deleted file mode 100644 index dae21921e..000000000 --- a/sys/mac/README +++ /dev/null @@ -1,36 +0,0 @@ -Jan 2002 - -The MPW compilers are now supported again. - -Support for 68k has been discontinued due to a lack of a debugging -system for 68k binaries. - -Note that the tiled MacOS X port uses the Qt windowport and the UNIX -build system, not this windowport code. - - -26 Nov, 1999 - -NetHack 3.3.0 was built with Metrowerk's Pro 4 compiler on a PPC -system. We are still compiling with 68K alignment because we know -it works. No one has checked lately if the PPC alignment bug -still exists. - - -23 May, 1996 - -NetHack 3.2.1 was built with Metrowerk's DR8 compiler on a PPC system. -The official 68K and PPC versions were compiled with 68K Alignment -to share files. The 3.2.0 versions were compiled with PPC alignment, -but it was discovered that the Metrowerks 68K compiler has a bug with -PPC alignment and structures that can be aligned to a single byte. This -bug _may_ be fixed in DR10, it is not fixed in DR9. Why bother with PPC -alignment at all? Because the space saving from 68K alignment is small -and the PowerPC version will run better. The 68K version was compiled -with 4 byte ints using the far model. - -Only the Metrowerks compiler has been used to compile the code in a -long time. It is _very_ likely that the other compilers, Think C and -MPW C, will no longer be able to compile NetHack out of the box. They -and their files have been moved to the "old" directory until such time -that someone can compile with them. diff --git a/sys/mac/carbon.plist b/sys/mac/carbon.plist deleted file mode 100644 index 11dde333a..000000000 --- a/sys/mac/carbon.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleIconFile - nethack - CFBundleIdentifier - org.nethack.carbon - CFBundleLongVersionString - 3.5.0 © 1985-2005 devteam@nethack.org - CFBundleName - NetHack - CFBundlePackageType - APPL - CFBundleShortVersionString - 3.5.0 - CFBundleSignature - NHak - CFBundleVersion - 3.5.0 - LSPrefersCarbon - - NSAppleScriptEnabled - - NSHumanReadableCopyright - © 1985-2005 devteam@nethack.org - - diff --git a/sys/mac/dprintf.c b/sys/mac/dprintf.c deleted file mode 100644 index 43fb28a45..000000000 --- a/sys/mac/dprintf.c +++ /dev/null @@ -1,48 +0,0 @@ -/* NetHack 3.6 dprintf.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ -/* Copyright (c) Jon W{tte, 1993. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "macwin.h" - -static Boolean -KeyDown(unsigned short code) -{ - unsigned char keys[16]; - - GetKeys((void *) keys); - return ((keys[code >> 3] >> (code & 7)) & 1) != 0; -} - -void -dprintf(char *format, ...) -{ - char buffer[500]; - va_list list; - int doit; -#define DO_DEBUGSTR 1 -#define DO_PLINE 2 - - if (flags.debug) { - doit = 0; - if (macFlags.hasDebugger && KeyDown(0x39)) { /* Caps Lock */ - doit = DO_DEBUGSTR; - } else if (KeyDown(0x3B) && iflags.window_inited && /* Control */ - (WIN_MESSAGE != -1) - && theWindows[WIN_MESSAGE].its_window) { - doit = DO_PLINE; - } - - if (doit) { - va_start(list, format); - vsprintf(&buffer[1], format, list); - va_end(list); - - if (doit == DO_DEBUGSTR) { - buffer[0] = strlen(&buffer[1]); - DebugStr((uchar *) buffer); - } else if (doit == DO_PLINE) - pline("%s", &buffer[1]); - } - } -} diff --git a/sys/mac/maccurs.c b/sys/mac/maccurs.c deleted file mode 100644 index 2dd536f0e..000000000 --- a/sys/mac/maccurs.c +++ /dev/null @@ -1,212 +0,0 @@ -/* NetHack 3.6 maccurs.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (c) Jon W{tte, 1992. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "mactty.h" -#include "macwin.h" - -#if 1 /*!TARGET_API_MAC_CARBON*/ -#include -#include -#include -#endif - -static Boolean winFileInit = 0; -static unsigned char winFileName[32] = "\pNetHack Preferences"; -static long winFileDir; -static short winFileVol; - -typedef struct WinPosSave { - char validPos; - char validSize; - short top; - short left; - short height; - short width; -} WinPosSave; - -static WinPosSave savePos[kLastWindowKind + 1]; - -static void -InitWinFile(void) -{ - StringHandle sh; - long len; - short ref = 0; - - if (winFileInit) { - return; - } - /* We trust the glue. If there's an error, store in game dir. */ - if (FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, - &winFileVol, &winFileDir)) { - winFileVol = 0; - winFileDir = 0; - } - sh = GetString(128); - if (sh && *sh) { - BlockMove(*sh, winFileName, **sh + 1); - ReleaseResource((Handle) sh); - } - if (HOpen(winFileVol, winFileDir, winFileName, fsRdPerm, &ref)) { - return; - } - len = sizeof(savePos); - if (!FSRead(ref, &len, savePos)) { - winFileInit = 1; - } - FSClose(ref); -} - -static void -FlushWinFile(void) -{ - short ref; - long len; - - if (!winFileInit) { - if (!winFileName[0]) { - return; - } - HCreate(winFileVol, winFileDir, winFileName, MAC_CREATOR, PREF_TYPE); - HCreateResFile(winFileVol, winFileDir, winFileName); - } - if (HOpen(winFileVol, winFileDir, winFileName, fsWrPerm, &ref)) { - return; - } - winFileInit = 1; - len = sizeof(savePos); - (void) FSWrite(ref, &len, savePos); /* Don't care about error */ - FSClose(ref); -} - -Boolean -RetrievePosition(short kind, short *top, short *left) -{ - Point p; - - if (kind < 0 || kind > kLastWindowKind) { - dprintf("Retrieve Bad kind %d", kind); - return 0; - } - InitWinFile(); - if (!savePos[kind].validPos) { - dprintf("Retrieve Not stored kind %d", kind); - return 0; - } - p.v = savePos[kind].top; - p.h = savePos[kind].left; - *left = p.h; - *top = p.v; - dprintf("Retrieve Kind %d Pt (%d,%d)", kind, p.h, p.v); - return (PtInRgn(p, GetGrayRgn())); -} - -Boolean -RetrieveSize(short kind, short top, short left, short *height, short *width) -{ - Point p; - - if (kind < 0 || kind > kLastWindowKind) { - return 0; - } - InitWinFile(); - if (!savePos[kind].validSize) { - return 0; - } - *width = savePos[kind].width; - *height = savePos[kind].height; - p.h = left + *width; - p.v = top + *height; - return PtInRgn(p, GetGrayRgn()); -} - -static void -SavePosition(short kind, short top, short left) -{ - if (kind < 0 || kind > kLastWindowKind) { - dprintf("Save bad kind %d", kind); - return; - } - InitWinFile(); - savePos[kind].validPos = 1; - savePos[kind].top = top; - savePos[kind].left = left; - dprintf("Save kind %d pt (%d,%d)", kind, left, top); - FlushWinFile(); -} - -static void -SaveSize(short kind, short height, short width) -{ - if (kind < 0 || kind > kLastWindowKind) { - dprintf("Save bad kind %d", kind); - return; - } - InitWinFile(); - savePos[kind].validSize = 1; - savePos[kind].width = width; - savePos[kind].height = height; - FlushWinFile(); -} - -static short -GetWinKind(WindowPtr win) -{ - short kind; - - if (!CheckNhWin(win)) { - return -1; - } - kind = GetWindowKind(win) - WIN_BASE_KIND; - if (kind < 0 || kind > NHW_TEXT) { - return -1; - } - dprintf("In win kind %d (%lx)", kind, win); - switch (kind) { - case NHW_MAP: - case NHW_STATUS: - case NHW_BASE: - kind = kMapWindow; - break; - case NHW_MESSAGE: - kind = kMessageWindow; - break; - case NHW_MENU: - kind = kMenuWindow; - break; - default: - kind = kTextWindow; - break; - } - dprintf("Out kind %d", kind); - return kind; -} - -Boolean -RetrieveWinPos(WindowPtr win, short *top, short *left) -{ - return RetrievePosition(GetWinKind(win), top, left); -} - -void -SaveWindowPos(WindowPtr win) -{ - Rect r; - - GetWindowBounds(win, kWindowContentRgn, &r); - SavePosition(GetWinKind(win), r.top, r.left); -} - -void -SaveWindowSize(WindowPtr win) -{ - short width, height; - Rect r; - - GetWindowBounds(win, kWindowContentRgn, &r); - width = r.right - r.left; - height = r.bottom - r.top; - SaveSize(GetWinKind(win), height, width); -} diff --git a/sys/mac/macerrs.c b/sys/mac/macerrs.c deleted file mode 100644 index c78ef0f66..000000000 --- a/sys/mac/macerrs.c +++ /dev/null @@ -1,173 +0,0 @@ -/* NetHack 3.6 macerrs.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (c) Michael Hamel, 1991 */ -/* NetHack may be freely redistributed. See license for details. */ - -#if defined(macintosh) && defined(__SC__) && !defined(__FAR_CODE__) -/* this needs to be resident always */ -#pragma segment Main -#endif - -#include "hack.h" -#include "macwin.h" -#if !TARGET_API_MAC_CARBON -#include -#include -#include -#endif - -void -error(const char *format, ...) -{ - Str255 buf; - va_list ap; - - va_start(ap, format); - vsprintf((char *) buf, format, ap); - va_end(ap); - - C2P((char *) buf, buf); - ParamText(buf, (StringPtr) "", (StringPtr) "", (StringPtr) ""); - Alert(128, (ModalFilterUPP) NULL); - ExitToShell(); -} - -#if 0 /* Remainder of file is obsolete and will be removed */ - -#define stackDepth 1 -#define errAlertID 129 -#define stdIOErrID 1999 - -static Str255 gActivities[stackDepth] = {""}; -static short gTopactivity = 0; - -void showerror(char * errdesc, const char * errcomment) -{ - short itemHit; - Str255 paserr, - pascomment; - - SetCursor(&qd.arrow); - if (errcomment == nil) errcomment = ""; - C2P (errcomment, pascomment); - C2P (errdesc, paserr); - ParamText(paserr,pascomment,gActivities[gTopactivity],(StringPtr)""); - itemHit = Alert(errAlertID, (ModalFilterUPP)nil); -} - -Boolean itworked(short errcode) -/* Return TRUE if it worked, do an error message and return false if it didn't. Error - strings for native C errors are in STR#1999, Mac errs in STR 2000-errcode, e.g - 2108 for not enough memory */ - -{ - if (errcode != 0) { - short itemHit; - Str255 errdesc; - StringHandle strh; - - errdesc[0] = '\0'; - if (errcode > 0) GetIndString(errdesc,stdIOErrID,errcode); /* STDIO file rres, etc */ - else { - strh = GetString(2000-errcode); - if (strh != (StringHandle) nil) { - memcpy(errdesc,*strh,256); - ReleaseResource((Handle)strh); - } - } - if (errdesc[0] == '\0') { /* No description found, just give the number */ - sprintf((char *)&errdesc[1],"a %d error occurred",errcode); - errdesc[0] = strlen((char*)&errdesc[1]); - } - SetCursor(&qd.arrow); - ParamText(errdesc,(StringPtr)"",gActivities[gTopactivity],(StringPtr)""); - itemHit = Alert(errAlertID, (ModalFilterUPP)nil); - } - return(errcode==0); -} - -void mustwork(short errcode) -/* For cases where we can't recover from the error by any means */ -{ - if (itworked(errcode)) ; - else ExitToShell(); -} - -#if defined(USE_STDARG) || defined(USE_VARARGS) -#ifdef USE_STDARG -static void vprogerror(const char *line, va_list the_args); -#else -static void vprogerror(); -#endif - -/* Macro substitute for error() */ -void error VA_DECL(const char *, line) -{ - VA_START(line); - VA_INIT(line, char *); - vprogerror(line, VA_ARGS); - VA_END(); -} - -#ifdef USE_STDARG -static void -vprogerror(const char *line, va_list the_args) -#else -static void -vprogerror(line, the_args) const char *line; va_list the_args; -#endif - -#else /* USE_STDARG | USE_VARARG */ - -void -error VA_DECL(const char *, line) -#endif -{ /* opening brace for vprogerror(), nested block for USE_OLDARG error() */ - char pbuf[BUFSZ]; - - if(index(line, '%')) { - Vsprintf(pbuf,line,VA_ARGS); - line = pbuf; - } - showerror("of an internal error",line); - -#if !(defined(USE_STDARG) || defined(USE_VARARGS)) - VA_END(); /* provides closing brace for USE_OLDARGS's nested block */ -#endif -} - - -void attemptingto(char * activity) -/* Say what we are trying to do for subsequent error-handling: will appear as x in an - alert in the form "Could not x because y" */ -{ C2P(activity,gActivities[gTopactivity]); -} - -void comment(char *s, long n) -{ - Str255 paserr; - short itemHit; - - sprintf((char *)&paserr[1], "%s - %d",s,n); - paserr[0] = strlen ((char*)&paserr[1]); - ParamText(paserr,(StringPtr)"",(StringPtr)"",(StringPtr)""); - itemHit = Alert(128, (ModalFilterUPP)nil); -} - -void pushattemptingto(char * activity) -/* Push a new description onto stack so we can pop later to previous state */ -{ - if (gTopactivity < stackDepth) { - gTopactivity++; - attemptingto(activity); - } - else error("activity stack overflow"); -} - -void popattempt(void) -/* Pop to previous state */ -{ - if (gTopactivity > 1) --gTopactivity; - else error("activity stack underflow"); -} - -#endif /* Obsolete */ diff --git a/sys/mac/macfile.c b/sys/mac/macfile.c deleted file mode 100644 index d2055716b..000000000 --- a/sys/mac/macfile.c +++ /dev/null @@ -1,480 +0,0 @@ -/* NetHack 3.6 macfile.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ -/* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */ -/* NetHack may be freely redistributed. See license for details. */ -/* - * macfile.c - * MAC file I/O routines - */ - -#include "hack.h" -#include "macwin.h" - -#ifndef __MACH__ -#include -#include -#include -#include -#include -#include -#endif - -#include "dlb.h" - -/* - * We should get the default dirID and volRefNum (from name) from prefs and - * the situation at startup... For now, this will have to do. - */ - -/* The HandleFiles are resources built into the application which are treated - as read-only files: if we fail to open a file we look for a resource */ - -#define FIRST_HF 32000 /* file ID of first HandleFile */ -#define MAX_HF 6 /* Max # of open HandleFiles */ - -#define APP_NAME_RES_ID (-16396) - -typedef struct handlefile { - long type; /* Resource type */ - short id; /* Resource id */ - long mark; /* Current position */ - long size; /* total size */ - Handle data; /* The resource, purgeable */ -} HandleFile; - -static HandleFile *FDECL(IsHandleFile, (int)); -static int FDECL(OpenHandleFile, (const unsigned char *, long)); -static int FDECL(CloseHandleFile, (int)); -static int FDECL(ReadHandleFile, (int, void *, unsigned)); -static long FDECL(SetHandleFilePos, (int, short, long)); - -HandleFile theHandleFiles[MAX_HF]; -MacDirs theDirs; /* also referenced in macwin.c */ - -static HandleFile * -IsHandleFile(int fd) -{ - HandleFile *hfp = NULL; - - if (fd >= FIRST_HF && fd < FIRST_HF + MAX_HF) { - /* in valid range, check for data */ - hfp = &theHandleFiles[fd - FIRST_HF]; - if (!hfp->data) - hfp = NULL; - } - return hfp; -} - -static int -OpenHandleFile(const unsigned char *name, long fileType) -{ - int i; - Handle h; - Str255 s; - - for (i = 0; i < MAX_HF; i++) { - if (theHandleFiles[i].data == 0L) - break; - } - - if (i >= MAX_HF) - return -1; - - h = GetNamedResource(fileType, name); - if (!h) - return (-1); - - theHandleFiles[i].data = h; - theHandleFiles[i].size = GetHandleSize(h); - GetResInfo(h, &theHandleFiles[i].id, (void *) &theHandleFiles[i].type, s); - theHandleFiles[i].mark = 0L; - - return (i + FIRST_HF); -} - -static int -CloseHandleFile(int fd) -{ - if (!IsHandleFile(fd)) { - return -1; - } - fd -= FIRST_HF; - ReleaseResource(theHandleFiles[fd].data); - theHandleFiles[fd].data = 0L; - return (0); -} - -static int -ReadHandleFile(int fd, void *ptr, unsigned len) -{ - unsigned maxBytes; - Handle h; - - if (!IsHandleFile(fd)) - return -1; - - fd -= FIRST_HF; - maxBytes = theHandleFiles[fd].size - theHandleFiles[fd].mark; - if (len > maxBytes) - len = maxBytes; - - h = theHandleFiles[fd].data; - - HLock(h); - BlockMove(*h + theHandleFiles[fd].mark, ptr, len); - HUnlock(h); - theHandleFiles[fd].mark += len; - - return (len); -} - -static long -SetHandleFilePos(int fd, short whence, long pos) -{ - long curpos; - - if (!IsHandleFile(fd)) - return -1; - - fd -= FIRST_HF; - - curpos = theHandleFiles[fd].mark; - switch (whence) { - case SEEK_CUR: - curpos += pos; - break; - case SEEK_END: - curpos = theHandleFiles[fd].size - pos; - break; - default: /* set */ - curpos = pos; - break; - } - - if (curpos < 0) - curpos = 0; - else if (curpos > theHandleFiles[fd].size) - curpos = theHandleFiles[fd].size; - - theHandleFiles[fd].mark = curpos; - - return curpos; -} - -void -C2P(const char *c, unsigned char *p) -{ - int len = strlen(c), i; - - if (len > 255) - len = 255; - - for (i = len; i > 0; i--) - p[i] = c[i - 1]; - p[0] = len; -} - -void -P2C(const unsigned char *p, char *c) -{ - int idx = *p++; - for (; idx > 0; idx--) - *c++ = *p++; - *c = '\0'; -} - -static void -replace_resource(Handle new_res, ResType its_type, short its_id, - Str255 its_name) -{ - Handle old_res; - - SetResLoad(false); - old_res = Get1Resource(its_type, its_id); - SetResLoad(true); - if (old_res) { - RemoveResource(old_res); - DisposeHandle(old_res); - } - - AddResource(new_res, its_type, its_id, its_name); -} - -int -maccreat(const char *name, long fileType) -{ - return macopen(name, O_RDWR | O_CREAT | O_TRUNC, fileType); -} - -int -macopen(const char *name, int flags, long fileType) -{ - short refNum; - short perm; - Str255 s; - - C2P(name, s); - if (flags & O_CREAT) { - if (HCreate(theDirs.dataRefNum, theDirs.dataDirID, s, TEXT_CREATOR, - fileType) && (flags & O_EXCL)) { - return -1; - } -#if 0 /* Fails during makedefs */ - if (fileType == SAVE_TYPE) { - short resRef; - HCreateResFile(theDirs.dataRefNum, theDirs.dataDirID, s); - resRef = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID, s, - fsRdWrPerm); - if (resRef != -1) { - Handle name; - Str255 plnamep; - - C2P(plname, plnamep); - name = (Handle)NewString(plnamep); - if (name) - replace_resource(name, 'STR ', PLAYER_NAME_RES_ID, - "\pPlayer Name"); - - /* The application name resource. See IM VI, page 9-21. */ - name = (Handle)GetString(APP_NAME_RES_ID); - if (name) { - DetachResource(name); - replace_resource(name, 'STR ', APP_NAME_RES_ID, - "\pApplication Name"); - } - - CloseResFile(resRef); - } - } -#endif - } - /* - * Here, we should check for file type, maybe a SFdialog if - * we fail with default, etc. etc. Besides, we should use HOpen - * and permissions. - */ - if ((flags & O_RDONLY) == O_RDONLY) { - perm = fsRdPerm; - } - if ((flags & O_WRONLY) == O_WRONLY) { - perm = fsWrPerm; - } - if ((flags & O_RDWR) == O_RDWR) { - perm = fsRdWrPerm; - } - if (HOpen(theDirs.dataRefNum, theDirs.dataDirID, s, perm, &refNum)) { - return OpenHandleFile(s, fileType); - } - if (flags & O_TRUNC) { - if (SetEOF(refNum, 0L)) { - FSClose(refNum); - return -1; - } - } - return refNum; -} - -int -macclose(int fd) -{ - if (IsHandleFile(fd)) { - CloseHandleFile(fd); - } else { - if (FSClose(fd)) { - return -1; - } - FlushVol((StringPtr) 0, theDirs.dataRefNum); - } - return 0; -} - -int -macread(int fd, void *ptr, unsigned len) -{ - long amt = len; - - if (IsHandleFile(fd)) { - return ReadHandleFile(fd, ptr, amt); - } else { - short err = FSRead(fd, &amt, ptr); - - return ((err == noErr) || (err == eofErr && len)) ? amt : -1; - } -} - -#if 0 /* this function isn't used, if you use it, uncomment prototype in \ - macwin.h */ -char * -macgets (int fd, char *ptr, unsigned len) -{ - int idx = 0; - char c; - - while (-- len > 0) { - if (macread (fd, ptr + idx, 1) <= 0) - return (char *)0; - c = ptr[idx++]; - if (c == '\n' || c == '\r') - break; - } - ptr [idx] = '\0'; - return ptr; -} -#endif /* 0 */ - -int -macwrite(int fd, void *ptr, unsigned len) -{ - long amt = len; - - if (IsHandleFile(fd)) - return -1; - if (FSWrite(fd, &amt, ptr) == noErr) - return (amt); - else - return (-1); -} - -long -macseek(int fd, long where, short whence) -{ - short posMode; - long curPos; - - if (IsHandleFile(fd)) { - return SetHandleFilePos(fd, whence, where); - } - - switch (whence) { - default: - posMode = fsFromStart; - break; - case SEEK_CUR: - posMode = fsFromMark; - break; - case SEEK_END: - posMode = fsFromLEOF; - break; - } - - if (SetFPos(fd, posMode, where) == noErr && GetFPos(fd, &curPos) == noErr) - return (curPos); - else - return (-1); -} - -int -macunlink(const char *name) -{ - Str255 pname; - - C2P(name, pname); - return (HDelete(theDirs.dataRefNum, theDirs.dataDirID, pname) == noErr - ? 0 - : -1); -} - -/* ---------------------------------------------------------------------- */ - -boolean -rsrc_dlb_init(void) -{ - return TRUE; -} - -void -rsrc_dlb_cleanup(void) -{ -} - -boolean -rsrc_dlb_fopen(dlb *dp, const char *name, const char *mode) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(mode) -#endif - Str255 pname; - - C2P(name, pname); - dp->fd = OpenHandleFile(pname, 'File'); /* automatically read-only */ - return dp->fd >= 0; -} - -int -rsrc_dlb_fclose(dlb *dp) -{ - return CloseHandleFile(dp->fd); -} - -int -rsrc_dlb_fread(char *buf, int size, int quan, dlb *dp) -{ - int nread; - - if (size < 0 || quan < 0) - return 0; - nread = ReadHandleFile(dp->fd, buf, (unsigned) size * (unsigned) quan); - - return nread / size; /* # of whole pieces (== quan in normal case) */ -} - -int -rsrc_dlb_fseek(dlb *dp, long pos, int whence) -{ - return SetHandleFilePos(dp->fd, whence, pos); -} - -char * -rsrc_dlb_fgets(char *buf, int len, dlb *dp) -{ - HandleFile *hfp = IsHandleFile(dp->fd); - char *p; - int bytesLeft, n = 0; - - if (hfp && hfp->mark < hfp->size) { - bytesLeft = hfp->size - hfp->mark; - if (bytesLeft < len) - len = bytesLeft; - - HLock(hfp->data); - for (n = 0, p = *hfp->data + hfp->mark; n < len; n++, p++) { - buf[n] = *p; - if (*p == '\r') - buf[n] = '\n'; - if (buf[n] == '\n') { - n++; /* we want the return in the buffer */ - break; - } - } - HUnlock(hfp->data); - - hfp->mark += n; - if (n != 0) - buf[n] = '\0'; /* null terminate result */ - } - - return n ? buf : NULL; -} - -int -rsrc_dlb_fgetc(dlb *dp) -{ - HandleFile *hfp = IsHandleFile(dp->fd); - int ret; - - if (!hfp || hfp->size <= hfp->mark) - return EOF; - - ret = *(unsigned char *) (*hfp->data + hfp->mark); - hfp->mark++; - return ret; -} - -long -rsrc_dlb_ftell(dlb *dp) -{ - HandleFile *hfp = IsHandleFile(dp->fd); - - if (!hfp) - return 0; - return hfp->mark; -} diff --git a/sys/mac/machelp.hqx b/sys/mac/machelp.hqx deleted file mode 100644 index 5f9252043..000000000 --- a/sys/mac/machelp.hqx +++ /dev/null @@ -1,67 +0,0 @@ -(This file must be converted with BinHex 4.0) - -:#QeKBfKPE(!ZBQJ!9%9B9%0A588"#!!!#PX!!!'XRNmM#90$3e-J5@3k)%!S)bP -YB@0SC@a`,Q*S#6-Z-`Nj15m`-bma03dM#80[F(PbD@GSG#!SBbNJ-6Nj1#da16N -j)'*j)%YPGQPZ)%KeCfm0)b"1CA4)B@0V)'eKH5"LC5"QFQ9PE(NJFQ9NDA0dFQP -LGA4PC#iJ)&0PC5"XD@0PER0P)'C[FL"NCA4KD@ac,Jd0$5-M)b""FfYZB@eP)'4 -TB@a[Cb!M)b-04%P"6%p()$B`-$!JBA0VEQ&YC3d0)b"3E'&j)'*eG(4[EJda,Q9 -ZB@*XC@3J3faTBfXJD'9bC5"dEb"`E'&j)(4SDA-JBfKKFQ&MG'9b,Jda,Q4TFf& -LE'9N)%0XD@0V)'KPFQ8JG'mJF'aKH5"dD'Pc)'0SBA*KBh4PFLl#$5!J6Qpd)'& -fB@PXB@*XC5"LC@0KGA0P)(P[G5"SBACPELGd)(4jF'9N)'PZ)'%JEQ&YC5i0$5- -J8A9TG#"LGA4dEfi0-LiU)%0XD@0V)'KPFQ8JG'mJFA9TG#"dD'8JF(*[Ch*KE5i -0$5-J8QpXC5"`Eh"eF#"YC@je$63Z+L"6C@aPBh3JH@peFL"NCA0TFQ9N)(*[E'8 -J+%&bBfKPEfa[CfPcG#`J3Q&bBQ&bD@&Z,#"PG'-Z+F)0)(GTG'JJG'KTFb"`Eh" -eF#"YC@je,Jd0)b"5B@0P)("[F(9`)'ePER8005iU)&0PE'9MG#"jEh9b)'4PFfP -bC@3JFQ&MC5!S5(9YB@iX)%9XCL`JCA4M,LR#$5"hDA4S)(4SDA-JF'p`GA!JE@9 -ZG5i0$5-J4f9ZC'9b)("[F(9`)'ePER800LiU)&0PE'9MG#"jEh9b)'GPEQ4PFL! -SE@&XC5"[FL"QC@eKE'8T)(GTG'JJG'KTFb"`Eh"eF#"YC@je,Jd0)b""E'PREQe -PER3JF'p`GA!JE@9ZG3dh,LSJ8f9XC@0d)(P[GA)JB@aTCfjYC@jd)#KXBAGQG@` -X)'jPGA4bB@`X)'pb)'0SB@pdD@-T`JdJGfPdD#"dD'Pc)("[F(9`)'ePER8Z$3d -M)%e[C'8JF'p`GA!JE@9ZG3di,LSJ9A0P)(4SDA-JF'p`GA!JE@9ZG5"dEb"cC@a -PBh3JFQ9RG@aKFL"`E'&j)'e[C'8X`JdJCAK`E'pbC5"YEf4P,#"[FL"NC@*eCfG -TEQFJE@pNC5i0$5-J6Q&YC5"dCAKd)'PdC@d015iU)&4jF'8JD@iJH@peFL"MD'& -bB@0dCA)RFb"ZB@eP)'KPFQ8Z$3dM)%PMEfi0-6!Z+L"AD'mJDA-JG'KTFb"RGAN -r$3e&6N3Y4%P"6%p($3d0689195!a-MJJ3A"`E'80$6%ZC@jKBQaPC#"%DA0`E'& -jFb"TEQC[FQeKG'P[EL"KBQpeG#"dD'Pc)(CPFR0TEfiZ$3e&6N3Y689193d0$8e -&6P8J-6)j)%CTE'80$6!ZC@jKBQaPC#"'D@aP)%ePERA#`P9cC5"dD'Pc)'ePER8 -JG'mJE@&ZDA"eE'&dC5"hD@jNEhGc`JdJEfiJG'KP)(0MFQ9PEL`JB@jN)(4[)(0 -KGQ8JEh)JFA9TG#"dD'8JCf&YC5i0$6%Z+L"0B@YPFb"dD'8JE@&`)'&`F'9KFL" -[EL"dD'8JFf0bC@9Z,#"TEL"MBA0P)(P[G5"ME'pcC@6#$5"TG(-JGfPZC'ph,Jd -0-LiU)%C[FQ0PFb"dD'8JE@&`)(4[)'*P)(*PC(*KGfiZ$3dc,LSJ8f0bEfaXFb" -dD'8J6@9cFf&RCA-JGfPZC'ph)'*KBfXJEfjP)'ePFh0KCf8Z$3dd,LSJ8Q9`Eh0 -TG'P[ER-JB@aX)(GTEQ4[Gh-JFfmJG'KPH5"KFQ8JEfiYFf0bC@9Z,Jd005iU)%0 -XEh0PFb"dD'8JCR*[ER4YEh0d)(GTEQ4[Gbi0$6JZ+L"&ER4PFR-JCAK`E'pbC5" -YEf4P,#"hD'PMD#"TFb"K)'G[Ef3JGf&j)(4[)'aPBA*Z)(4SC5"RB@eP,Jd0-6! -Z+L"6BACPFb"dD'8JCf&YC5`JB@jN)(4SC@iJFA9TG(-JG'KP)("bEfGbB@dZ$3d -a-LiU)&&eDA4c)(4SC5"`FQpRFQ&Y)(GTG'K[GA3JFf&fD@jR)(4SC5"RB@eP,Jd -048j%,8e&6P80$3e048j9)$%c-#"&C'Pd$3d`,Q9ZB@*XC@3J4@4TG#"0C@je`X* -9Ff8JG'KTFb"YC@je)(4[)'9NDA3JG'9iG#"[FL"eEQ4[`JdJB@iJB@0dD@pZ,Jd -`,Q4TFf&LE'9N)%9NDA3J6@9ZGF,#9A0P)(4SDA-JE@9ZG5"dEb"PC'Pd)(4PH(3 -JEh)JG@jNEm)0)'&Z)'&MG'P[ELiJ)%&fB@PXB@*XC5"[EQaj)'C[FL"NCA0V)'& -MBf9cFfpbD@9c,Jd048j%,8e&6P80$3e048j9)$%c-5",BQ30$6!ZC@jKBQaPC#" -,CAPLEf&bC#"0C@je`X*9Ff8JG'KTFb"YC@je)(4[)(0TEA9XBA4P`JdJF(*PFh0 -TEQFJDf9jFb"[EL"K)'YPH@*[BA*N,#"cEb"jEh8JBf&Z)("XBANJC@jdDA*PE(R -#$5"LH5"YEh9cC5i0$8914#e048j9$3d0689195!a-c)J5'9XF!d0-#jPEQ&LE'9 -N)%KPE(!J6@9ZGF,#9A0P)(4SDA-JE@9ZG5"dEb"PH("XB@PZ)'K[Gm)0)(4SC5" -RB@eP)(G[FQYc,#"[FL"dEb"cCA3JEh"dD@pZFbi0$8914#e048j9$3d0689195! -a-c-J5@jQE`d0-#jPEQ&LE'9N)%PZCQmJ6@9ZGF,#9A0P)(4SDA-JE@9ZG5"dEb" -XEfpV)'&d)'pb`JdJE@&ZDA"eE'&dC5"jEh9b)'PZGQ9ZG'pbH5`JCAK`E'&TEL" -cEfePG'KTEQFJEfiJG'KP`JdJFf0bC@9Z,#"[FL"RDACP)'&Z)'pLDQ9MG#"[FL" -YEfjcG'9b)'%JEQ&YC5i0$8914#e048j9$3d0689195!a-c3J4A&eDA!0$6!ZC@j -KBQaPC#"&FA9TF'ePER3J6@9ZGF,#9A0P)(4SDA-JE@9ZG5"dEb"YB@jTF(9XBA4 -P`JdJGf9KF'pZFb`JBA*YEh)X)'&ZC#"[G'KPFL"hEh*Z)'PdC@ec,Jd048j%,8e -&6P80$3e048j9)$%c05""Bh30$6!ZC@jKBQaPC#""Bh4TEfiJ6@9ZGF,#9A0P)(4 -SDA-JE@9ZG5"dEb"`CA*QEh*Y)'&Z)'&MG'P[ELi0$8914#e048j9$3d0689195! -a-cBJ6@&RD@-0$6!ZC@jKBQaPC#"0B@GTBb"0C@je`X*9Ff8JG'KTFb"YC@je)(4 -[)'eKEQP`G@aKG'8JE@&RD@2#$5"TG'9YFbi0$8914#e048j9$3e048j9)$%c0b" -#DA4c$3d`,Q9ZB@*XC@3J3QPdFb"0C@je`X*9Ff8JG'KTFb"YC@je)(4[)("PFQC -[FQh#$5"YDA0MC@aXB@jPEh9c)'&MG'P[ER-Z$3e&6N3Y689193d048j%$5dp!!! -"!!!!!9S!!!"D!!!!8KY`!4m!6VVdjL!ZrqU`RfF-2`B["5m-U"YJ!!$+9Bmr#Qe -KBfKPE(!ZBQKbUL"*4%8J8(*PCR0TEfjMCA0PFfi!$&4&@&4$9dP&!3Mrrrrr!!! -!!!!!!!!!!!!!!!!!!!K$XNab!!!!#PX!!!'XmNkkqQSq(fCU9Bmr,[r`5'lrpNK -ZrrK)E[rm6VVpU$iICP"9Mh!!,`!r"Lm&6VVkKMiICJS[$+Qa9BqTVciIF!+`V[r -iCKC9Mh!!,`!r,[r`,blrmNkkqPik(f!39Bp`!#m!2blrm%kkpFJk(dT(CJ)q"6( -(#Q"-lK$JrpT1AL"I6`!!!%J!#8e[EQ&ME`!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!)!"!!V!+F"dJ*H!#X!T`(5!Pkc58b!!!!!!!!!#PX!!!!!!3!!!!!#!!! -!!!!%!!%!!!!!!3!!!!&D!!!!@J!!!&)"ITa%(YS!!!!F!&)!!8e38e)!!3!569G -#3J!!!#S$lIrr!!!!!!!!!!!$lrrr!!!!6!!!!!!$m2rr!!!!8J!!!!#PK!: diff --git a/sys/mac/macmain.c b/sys/mac/macmain.c deleted file mode 100644 index 6d76e8be1..000000000 --- a/sys/mac/macmain.c +++ /dev/null @@ -1,292 +0,0 @@ -/* NetHack 3.6 macmain.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.21 $ */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/*-Copyright (c) Robert Patrick Rankin, 2009. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* main.c - Mac NetHack */ - -#include "hack.h" -#include "dlb.h" -#include "macwin.h" -#include "mactty.h" - -#if 1 /*!TARGET_API_MAC_CARBON*/ -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#ifndef O_RDONLY -#include -#endif - -static void finder_file_request(void); -int main(void); - -#if __SC__ || __MRC__ -QDGlobals qd; -#endif - -int -main(void) -{ - register int fd = -1; - int argc = 1; - boolean resuming = FALSE; /* assume new game */ - - sys_early_init(); - windowprocs = mac_procs; - InitMac(); - - hname = "Mac Hack"; - hackpid = getpid(); - - setrandom(); - initoptions(); - init_nhwindows(&argc, (char **) &hname); - - /* - * It seems you really want to play. - */ - u.uhp = 1; /* prevent RIP on early quits */ - - finder_file_request(); - - dlb_init(); /* must be before newgame() */ - - /* - * Initialize the vision system. This must be before mklev() on a - * new game or before a level restore on a saved game. - */ - vision_init(); - - display_gamewindows(); - - set_playmode(); /* sets plname to "wizard" for wizard mode */ - /* strip role,race,&c suffix; calls askname() if plname[] is empty - or holds a generic user name like "player" or "games" */ - plnamesuffix(); - /* unlike Unix where the game might be invoked with a script - which forces a particular character name for each player - using a shared account, we always allow player to rename - the character during role/race/&c selection */ - iflags.renameallowed = TRUE; - - getlock(); - -/* - * First, try to find and restore a save file for specified character. - * We'll return here if new game player_selection() renames the hero. - */ -attempt_restore: - if ((fd = restore_saved_game()) >= 0) { -#ifdef NEWS - if (iflags.news) { - display_file(NEWS, FALSE); - iflags.news = FALSE; /* in case dorecover() fails */ - } -#endif - pline("Restoring save file..."); - mark_synch(); /* flush output */ - game_active = 1; - if (dorecover(fd)) { - resuming = TRUE; /* not starting new game */ - if (discover) - You("are in non-scoring discovery mode."); - if (discover || wizard) { - if (yn("Do you want to keep the save file?") == 'n') - (void) delete_savefile(); - else { - nh_compress(fqname(SAVEF, SAVEPREFIX, 0)); - } - } - } - } - - if (!resuming) { - /* new game: start by choosing role, race, etc; - player might change the hero's name while doing that, - in which case we try to restore under the new name - and skip selection this time if that didn't succeed */ - if (!iflags.renameinprogress) { - player_selection(); - if (iflags.renameinprogress) { - /* player has renamed the hero while selecting role; - discard current lock file and create another for - the new character name */ - delete_levelfile(0); /* remove empty lock file */ - getlock(); - goto attempt_restore; - } - } - game_active = 1; /* done with selection, draw active game window */ - newgame(); - if (discover) - You("are in non-scoring discovery mode."); - } - - UndimMenuBar(); /* Yes, this is the place for it (!) */ - - moveloop(resuming); - - exit(EXIT_SUCCESS); - /*NOTREACHED*/ - return 0; -} - -static OSErr -copy_file(short src_vol, long src_dir, short dst_vol, long dst_dir, - Str255 fName, - pascal OSErr (*opener)(short vRefNum, long dirID, - ConstStr255Param fileName, - signed char permission, short *refNum)) -{ - short src_ref, dst_ref; - OSErr err = (*opener)(src_vol, src_dir, fName, fsRdPerm, &src_ref); - if (err == noErr) { - err = (*opener)(dst_vol, dst_dir, fName, fsWrPerm, &dst_ref); - if (err == noErr) { - long file_len; - err = GetEOF(src_ref, &file_len); - if (err == noErr) { - Handle buf; - long count = MaxBlock(); - if (count > file_len) - count = file_len; - - buf = NewHandle(count); - err = MemError(); - if (err == noErr) { - while (count > 0) { - OSErr rd_err = FSRead(src_ref, &count, *buf); - err = FSWrite(dst_ref, &count, *buf); - if (err == noErr) - err = rd_err; - file_len -= count; - } - if (file_len == 0) - err = noErr; - - DisposeHandle(buf); - } - } - FSClose(dst_ref); - } - FSClose(src_ref); - } - - return err; -} - -static void -force_hdelete(short vol, long dir, Str255 fName) -{ - HRstFLock(vol, dir, fName); - HDelete(vol, dir, fName); -} - -void -process_openfile(short src_vol, long src_dir, Str255 fName, OSType ftype) -{ - OSErr err = noErr; - - if (ftype != SAVE_TYPE) - return; /* only deal with save files */ - - if (src_vol != theDirs.dataRefNum - || src_dir != theDirs.dataDirID - && CatMove(src_vol, src_dir, fName, theDirs.dataDirID, "\p:") - != noErr) { - HCreate(theDirs.dataRefNum, theDirs.dataDirID, fName, MAC_CREATOR, - SAVE_TYPE); - err = - copy_file(src_vol, src_dir, theDirs.dataRefNum, theDirs.dataDirID, - fName, &HOpen); /* HOpenDF is only there under 7.0 */ - if (err == noErr) - err = copy_file(src_vol, src_dir, theDirs.dataRefNum, - theDirs.dataDirID, fName, &HOpenRF); - if (err == noErr) - force_hdelete(src_vol, src_dir, fName); - else - HDelete(theDirs.dataRefNum, theDirs.dataDirID, fName); - } - - if (err == noErr) { - short ref; - - ref = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID, fName, - fsRdPerm); - if (ref != -1) { - Handle name = Get1Resource('STR ', PLAYER_NAME_RES_ID); - if (name) { - Str255 save_f_p; - P2C(*(StringHandle) name, plname); - set_savefile_name(TRUE); - C2P(fqname(SAVEF, SAVEPREFIX, 0), save_f_p); - force_hdelete(theDirs.dataRefNum, theDirs.dataDirID, - save_f_p); - - if (HRename(theDirs.dataRefNum, theDirs.dataDirID, fName, - save_f_p) == noErr) - macFlags.gotOpen = 1; - } - CloseResFile(ref); - } - } -} - -static void -finder_file_request(void) -{ - if (macFlags.hasAE) { - /* we're capable of handling Apple Events, so let's see if we have any - */ - EventRecord event; - long toWhen = TickCount() - + 20; /* wait a third of a second for all initial AE */ - - while (TickCount() < toWhen) { - if (WaitNextEvent(highLevelEventMask, &event, 3L, 0)) { - AEProcessAppleEvent(&event); - if (macFlags.gotOpen) - break; - } - } - } -#if 0 -#ifdef MAC68K - else { - short finder_msg, file_count; - CountAppFiles(&finder_msg, &file_count); - if (finder_msg == appOpen && file_count == 1) { - OSErr err; - AppFile src; - FSSpec filespec; - - GetAppFiles(1, &src); - err = FSMakeFSSpec(src.vRefNum, 0, src.fName, &filespec); - if (err == noErr && src.fType == SAVE_TYPE) { - process_openfile (filespec.vRefNum, filespec.parID, filespec.name, src.fType); - if (macFlags.gotOpen) - ClrAppFiles(1); - } - } - } -#endif /* MAC68K */ -#endif /* 0 */ -} - -/* validate wizard mode if player has requested access to it */ -boolean -authorize_wizard_mode() -{ - /* other ports validate user name or character name here */ - return TRUE; -} - -/*macmain.c*/ diff --git a/sys/mac/macmenu.c b/sys/mac/macmenu.c deleted file mode 100644 index 11675000e..000000000 --- a/sys/mac/macmenu.c +++ /dev/null @@ -1,1152 +0,0 @@ -/* NetHack 3.6 macmenu.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ */ -/* Copyright (c) Macintosh NetHack Port Team, 1993. */ -/* NetHack may be freely redistributed. See license for details. */ - -/****************************************\ - * Extended Macintosh menu support - * - * provides access to all keyboard commands from cmd.c - * provides control key functionality for classic keyboards - * provides key equivalent references and logical menu groups - * supports various menu highlighting modes -\****************************************/ - -/****************************************\ - * Edit History: - * - * 930512 - More bug fixes and getting tty to work again, Jon W{tte - * 930508 - Bug fixes in-flight, Jon W{tte - * 04/29/93 - 1st Release Draft, David Hairston - * 04/11/93 - 1st Draft, David Hairston -\****************************************/ - -/******** Application Defines ********/ -#include "hack.h" -#include "mactty.h" -#include "macwin.h" -#include "macpopup.h" -#include "patchlevel.h" - -/******** Toolbox Defines ********/ -#if !TARGET_API_MAC_CARBON -#include -#include -#include -#include -#include -#include -#endif - -/* Borrowed from the Mac tty port */ -extern WindowPtr _mt_window; - -/******** Local Defines ********/ - -/* 'MNU#' (menu list record) */ -typedef union menuRefUnn { - short mresID; /* MENU resource ID (before GetMenu) */ - MenuHandle mhnd; /* MENU handle (after GetMenu) */ -} menuRefUnn; - -typedef struct menuListRec { - short firstMenuID; - short numMenus; - menuRefUnn mref[]; -} menuListRec, *menuListPtr, **menuListHandle; - -/* indices and resource IDs of the menu list data */ -enum { - listMenubar, - listSubmenu, - - menuBarListID = 128, - subMenuListID -}; - -/* the following mref[] indices are reserved */ -enum { - /* menu bar */ - menuApple, - menuFile, - menuEdit, - - /* submenu */ - menuWizard = 0 -}; - -/* the following menu items are reserved */ -enum { - /* apple */ - menuAppleAboutBox = 1, - ____Apple__1, - - /* File */ - menuFileRedraw = 1, - menuFilePrevMsg, - menuFileCleanup, - ____File___1, - menuFilePlayMode, - menuFileEnterExplore, - ____File___2, - menuFileSave, - ____File___3, - menuFileQuit, - - /* standard minimum Edit menu items */ - - /* Wizard */ - menuWizardAttributes = 1 -}; - -/* - * menuListRec data (preloaded and locked) specifies the number of menus in - * the menu bar, the number of hierarchal or submenus and the menu IDs of - * all of those menus. menus that go into in the menu bar are specified by - * 'MNU#' 128 and submenus are specified by 'MNU#' 129. the fields of the - * menuListRec are: - * firstMenuID - the menu ID (not resource ID) of the 1st menu. subsequent - * menus in the list are _forced_ to have consecutively incremented IDs. - * numMenus - the total count of menus in a given list (and the extent of - * valid menu IDs). - * mref[] - initially the MENU resource ID is stored in the placeholder for - * the resource handle. after loading (GetResource), the menu handle - * is stored and the menu ID, in memory, is set as noted above. - * - * NOTE: a ResEdit template editor is supplied to edit the 'MNU#' resources. - * - * NOTE: the resource IDs do not need to match the menu IDs in a menu list - * record although they have been originally set that way. - * - * NOTE: the menu ID's of menus in the submenu list record may be reset, as - * noted above. it is the programmers responsibility to make sure that - * submenu references/IDs are valid. - * - * WARNING: the existence of the submenu list record is assumed even if the - * number of submenus is zero. also, no error checking is done on the - * extents of the menu IDs. this must be correctly setup by the programmer. - */ - -#define ID1_MBAR pMenuList[listMenubar]->firstMenuID -#define ID1_SUBM pMenuList[listSubmenu]->firstMenuID - -#define NUM_MBAR pMenuList[listMenubar]->numMenus -#define NUM_SUBM pMenuList[listSubmenu]->numMenus - -#define MHND_APPLE pMenuList[listMenubar]->mref[menuApple].mhnd -#define MHND_FILE pMenuList[listMenubar]->mref[menuFile].mhnd -#define MHND_EDIT pMenuList[listMenubar]->mref[menuEdit].mhnd - -#define MBARHND(x) pMenuList[listMenubar]->mref[(x)].mhnd - -#define MHND_WIZ pMenuList[listSubmenu]->mref[menuWizard].mhnd - -/* mutually exclusive (and prioritized) menu bar states */ -enum { - mbarDim, - mbarNoWindows, - mbarDA, - mbarNoMap, - mbarRegular, - mbarSpecial /* explore or debug mode */ -}; - -#define WKND_MAP (WIN_BASE_KIND + NHW_MAP) - -/* menu routine error numbers */ -enum { - errGetMenuList, - errGetMenu, - errGetANDlogTemplate, - errGetANDlogItems, - errGetANDialog, - errANNewMenu, - err_Menu_total -}; - -/* menu 'STR#' comment char */ -#define mstrEndChar 0xA5 /* '\245' or option-* or "bullet" */ - -/* 'ALRT' */ -enum { - alrt_Menu_start = 5000, - alrtMenuNote = alrt_Menu_start, - alrtMenu_NY, - alrt_Menu_limit -}; - -#define beepMenuAlertErr 1 /* # of SysBeep()'s before exitting */ -enum { bttnMenuAlertNo = 1, bttnMenuAlertYes }; - -/******** Globals ********/ -static unsigned char *menuErrStr[err_Menu_total] = { - "\pAbort: Bad \'MNU#\' resource!", /* errGetMenuList */ - "\pAbort: Bad \'MENU\' resource!", /* errGetMenu */ - "\pAbort: Bad \'DLOG\' resource!", /* errGetANDlogTemplate */ - "\pAbort: Bad \'DITL\' resource!", /* errGetANDlogItems */ - "\pAbort: Bad Dialog Allocation!", /* errGetANDialog */ - "\pAbort: Bad Menu Allocation!", /* errANNewMenu */ -}; -static menuListPtr pMenuList[2]; -static short theMenubar = mbarDA; /* force initial update */ -static short kAdjustWizardMenu = 1; - -/******** Prototypes ********/ -#if !TARGET_API_MAC_CARBON -static void alignAD(Rect *, short); -#endif -static void mustGetMenuAlerts(void); -static void menuError(short); -static void aboutNetHack(void); -static void askSave(void); -static void askQuit(void); - -/*** Askname dialog box ***/ - -#define RSRC_ASK 6000 /* Askname dialog and item list */ -#define RSRC_ASK_PLAY 1 /* Play button */ -#define RSRC_ASK_QUIT 2 /* Quit button */ -#define RSRC_ASK_DEFAULT 3 /* Default ring */ -#define RSRC_ASK_ROLE 4 /* Role popup menu */ -#define RSRC_ASK_RACE 5 /* Race popup menu */ -#define RSRC_ASK_GEND 6 /* Gender popup menu */ -#define RSRC_ASK_ALIGN 7 /* Alignment popup menu */ -#define RSRC_ASK_MODE 8 /* Mode popup menu */ -#define RSRC_ASK_NAME 9 /* Name text field */ -#define RSRC_ASK_MAX 10 /* Maximum enabled item */ - -#define KEY_MASK 0xff00 -#define KEY_RETURN 0x2400 -#define KEY_ENTER 0x4c00 -#define KEY_ESCAPE 0x3500 -#define CH_MASK 0x00ff -#define CH_RETURN 0x000d -#define CH_ENTER 0x0003 -#define CH_ESCAPE 0x001b - -static void ask_restring(const char *cstr, unsigned char *pstr); -static void ask_enable(DialogRef wind, short item, int enable); -static pascal void ask_redraw(DialogRef wind, DialogItemIndex item); -static pascal Boolean -ask_filter(DialogRef wind, EventRecord *event, DialogItemIndex *item); -#define noresource(t, n) \ - { \ - SysBeep(3); \ - ExitToShell(); \ - } -#define fatal(s) \ - { \ - SysBeep(3); \ - ExitToShell(); \ - } - -static MenuHandle askmenu[RSRC_ASK_MAX]; -static int askselect[RSRC_ASK_MAX]; -#define currrole askselect[RSRC_ASK_ROLE] -#define currrace askselect[RSRC_ASK_RACE] -#define currgend askselect[RSRC_ASK_GEND] -#define curralign askselect[RSRC_ASK_ALIGN] -#define currmode askselect[RSRC_ASK_MODE] - -static RGBColor blackcolor = { 0x0000, 0x0000, 0x0000 }, - // indentcolor = {0x4000, 0x4000, 0x4000}, - darkcolor = { 0x8000, 0x8000, 0x8000 }, - backcolor = { 0xdddd, 0xdddd, 0xdddd }, - lightcolor = { 0xffff, 0xffff, 0xffff }, - whitecolor = { 0xffff, 0xffff, 0xffff }; - -/* Convert a mixed-case C string to a Capitalized Pascal string */ -static void -ask_restring(const char *cstr, unsigned char *pstr) -{ - int i; - - for (i = 0; *cstr && (i < 255); i++) - pstr[i + 1] = *cstr++; - pstr[0] = i; - if ((pstr[1] >= 'a') && (pstr[1] <= 'z')) - pstr[1] += 'A' - 'a'; - return; -} - -/* Enable the dialog item with the given index */ -static void -ask_enable(DialogRef wind, short item, int enable) -{ - short type; - Handle handle; - Rect rect; - - /* Enable or disable the appropriate item */ - GetDialogItem(wind, item, &type, &handle, &rect); - if (enable) - type &= ~itemDisable; - else - type |= itemDisable; - HiliteControl((ControlHandle) handle, enable ? 0 : 255); - SetDialogItem(wind, item, type, handle, &rect); - return; -} - -static pascal void -ask_redraw(DialogRef wind, DialogItemIndex item) -{ - short type; - Handle handle; - Rect rect; - static char *modechar = "NED"; - - /* Which item shall we redraw? */ - GetDialogItem(wind, item, &type, &handle, &rect); - switch (item) { - case RSRC_ASK_DEFAULT: - PenSize(3, 3); - FrameRoundRect(&rect, 16, 16); - break; - - case RSRC_ASK_ROLE: - case RSRC_ASK_RACE: - case RSRC_ASK_GEND: - case RSRC_ASK_ALIGN: - case RSRC_ASK_MODE: - if (macFlags.color) { - RGBForeColor(&blackcolor); - RGBBackColor(&backcolor); - } - PenNormal(); - TextMode(srcOr); - EraseRect(&rect); - - /* Draw the frame and drop shadow */ - rect.right--; - rect.bottom--; - FrameRect(&rect); - MoveTo(rect.right, rect.top + 1); - LineTo(rect.right, rect.bottom); - LineTo(rect.left + 1, rect.bottom); - - /* Draw the menu character */ - MoveTo(rect.left + 4, rect.top + 12); - switch (item) { - case RSRC_ASK_ROLE: - DrawText(roles[askselect[item]].filecode, 0, 3); - break; - case RSRC_ASK_RACE: - DrawText(races[askselect[item]].filecode, 0, 3); - break; - case RSRC_ASK_GEND: - DrawText(genders[askselect[item]].filecode, 0, 3); - break; - case RSRC_ASK_ALIGN: - DrawText(aligns[askselect[item]].filecode, 0, 3); - break; - case RSRC_ASK_MODE: - DrawChar(modechar[askselect[item]]); - break; - } - - /* Draw the popup symbol */ - MoveTo(rect.right - 16, rect.top + 5); - LineTo(rect.right - 6, rect.top + 5); - LineTo(rect.right - 11, rect.top + 10); - LineTo(rect.right - 15, rect.top + 6); - LineTo(rect.right - 8, rect.top + 6); - LineTo(rect.right - 11, rect.top + 9); - LineTo(rect.right - 13, rect.top + 7); - LineTo(rect.right - 10, rect.top + 7); - LineTo(rect.right - 11, rect.top + 8); - - /* Draw the shadow */ - InsetRect(&rect, 1, 1); - if (macFlags.color) { - RGBColor color; - - /* Save the foreground color */ - GetForeColor(&color); - - /* Draw the top and left */ - RGBForeColor(&lightcolor); - MoveTo(rect.left, rect.bottom - 1); - LineTo(rect.left, rect.top); - LineTo(rect.right - 1, rect.top); - - /* Draw the bottom and right */ - RGBForeColor(&darkcolor); - MoveTo(rect.right - 1, rect.top + 1); - LineTo(rect.right - 1, rect.bottom - 1); - LineTo(rect.left + 1, rect.bottom - 1); - - /* Restore the foreground color */ - RGBForeColor(&color); - } - break; - - case RSRC_ASK_NAME: - PenNormal(); - if (macFlags.color) { - RGBForeColor(&whitecolor); - RGBBackColor(&whitecolor); - TextMode(srcOr); - } else { - PenMode(notPatCopy); - TextMode(srcBic); - } - InsetRect(&rect, -1, -1); - FrameRect(&rect); - InsetRect(&rect, -1, -1); - FrameRect(&rect); - InsetRect(&rect, -2, -2); - if (macFlags.color) { - /* Draw the top and left */ - RGBForeColor(&darkcolor); - MoveTo(rect.left, rect.bottom - 1); - LineTo(rect.left, rect.top); - LineTo(rect.right - 1, rect.top); - - /* Draw the bottom and right */ - RGBForeColor(&lightcolor); - MoveTo(rect.right - 1, rect.top + 1); - LineTo(rect.right - 1, rect.bottom - 1); - LineTo(rect.left + 1, rect.bottom - 1); - - /* Restore the colors */ - RGBForeColor(&blackcolor); - RGBBackColor(&backcolor); - } - break; - } - return; -} - -static pascal Boolean -ask_filter(DialogRef wind, EventRecord *event, DialogItemIndex *item) -{ - short ch, key; - - switch (event->what) { - case keyDown: - case autoKey: - ch = event->message & CH_MASK; - key = event->message & KEY_MASK; - /* Handle equivalents for OK */ - if ((ch == CH_RETURN) || (key == KEY_RETURN) || (ch == CH_ENTER) - || (key == KEY_ENTER)) { - if (GetDialogTextEditHandle(wind)[0]->teLength) { - FlashButton(wind, RSRC_ASK_PLAY); - *item = RSRC_ASK_PLAY; - } else - *item = 0; - return (TRUE); - } - /* Handle equivalents for Normal/Explore/Debug */ - if ((event->modifiers & cmdKey) && (ch == 'n')) { - currmode = 0; - ask_redraw(wind, RSRC_ASK_MODE); - *item = RSRC_ASK_MODE; - return (TRUE); - } - if ((event->modifiers & cmdKey) && (ch == 'e')) { - currmode = 1; - ask_redraw(wind, RSRC_ASK_MODE); - *item = RSRC_ASK_MODE; - return (TRUE); - } - if ((event->modifiers & cmdKey) && (ch == 'd')) { - currmode = 2; - ask_redraw(wind, RSRC_ASK_MODE); - *item = RSRC_ASK_MODE; - return (TRUE); - } - /* Handle equivalents for Cancel and Quit */ - if ((ch == CH_ESCAPE) || (key == KEY_ESCAPE) - || ((event->modifiers & cmdKey) && (ch == 'q')) - || ((event->modifiers & cmdKey) && (ch == '.'))) { - FlashButton(wind, RSRC_ASK_QUIT); - *item = RSRC_ASK_QUIT; - return (TRUE); - } - return (FALSE); - case updateEvt: - ask_redraw(wind, RSRC_ASK_NAME); - return (FALSE); - default: - return (FALSE); - } -} - -void -mac_askname() -{ - GrafPtr oldport; - DialogRef askdialog; - short i, j, item, type; - Handle handle; - Rect rect; - Str255 str; - Point pt; - UserItemUPP redraw = NewUserItemUPP(ask_redraw); - ModalFilterUPP filter = NewModalFilterUPP(ask_filter); - - /* Create the dialog */ - if (!(askdialog = GetNewDialog(RSRC_ASK, NULL, (WindowRef) -1))) - noresource('DLOG', RSRC_ASK); - GetPort(&oldport); - SetPortDialogPort(askdialog); - - /* Initialize the name text item */ - ask_restring(plname, str); - if (plname[0]) { - GetDialogItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); - SetDialogItemText(handle, str); - } -#if 0 - { - Str32 pName; - pName [0] = 0; - if (plname && plname [0]) { - strcpy ((char *) pName, plname); - c2pstr ((char *) pName); - } else { - Handle h; - h = GetResource ('STR ', -16096); - if (((Handle) 0 != h) && (GetHandleSize (h) > 0)) { - DetachResource (h); - HLock (h); - if (**h > 31) { - **h = 31; - } - BlockMove (*h, pName, **h + 1); - DisposeHandle (h); - } - } - if (pName [0]) { - GetDialogItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); - SetDialogItemText(handle, pName); - if (pName [0] > 2 && pName [pName [0] - 1] == '-') { - short role = (*pANR).anMenu[anRole]; - char suffix = (char) pName[pName[0]], - *sfxindx = strchr(pl_classes, suffix); - - if (sfxindx) - role = (short) (sfxindx - pl_classes); - else if (suffix == '@') - role = (short) rn2((int) strlen(pl_classes)); - (*pANR).anMenu[anRole] = role; - } - } - } -#endif - SelectDialogItemText(askdialog, RSRC_ASK_NAME, 0, 32767); - - /* Initialize the role popup menu */ - if (!(askmenu[RSRC_ASK_ROLE] = NewMenu(RSRC_ASK_ROLE, "\p"))) - fatal("\pCannot create role menu"); - for (i = 0; roles[i].name.m; i++) { - ask_restring(roles[i].name.m, str); - AppendMenu(askmenu[RSRC_ASK_ROLE], str); - } - InsertMenu(askmenu[RSRC_ASK_ROLE], hierMenu); - if (flags.initrole >= 0) - currrole = flags.initrole; - /* Check for backward compatibility */ - else if ((currrole = str2role(pl_character)) < 0) - currrole = randrole(FALSE); - - /* Initialize the race popup menu */ - if (!(askmenu[RSRC_ASK_RACE] = NewMenu(RSRC_ASK_RACE, "\p"))) - fatal("\pCannot create race menu"); - for (i = 0; races[i].noun; i++) { - ask_restring(races[i].noun, str); - AppendMenu(askmenu[RSRC_ASK_RACE], str); - } - InsertMenu(askmenu[RSRC_ASK_RACE], hierMenu); - if (flags.initrace >= 0) - currrace = flags.initrace; - else - currrace = randrace(currrole); - - /* Initialize the gender popup menu */ - if (!(askmenu[RSRC_ASK_GEND] = NewMenu(RSRC_ASK_GEND, "\p"))) - fatal("\pCannot create gender menu"); - for (i = 0; i < ROLE_GENDERS; i++) { - ask_restring(genders[i].adj, str); - AppendMenu(askmenu[RSRC_ASK_GEND], str); - } - InsertMenu(askmenu[RSRC_ASK_GEND], hierMenu); - if (flags.initgend >= 0) - currgend = flags.initgend; - else if (flags.female) - currgend = 1; - else - currgend = randgend(currrole, currrace); - - /* Initialize the alignment popup menu */ - if (!(askmenu[RSRC_ASK_ALIGN] = NewMenu(RSRC_ASK_ALIGN, "\p"))) - fatal("\pCannot create alignment menu"); - for (i = 0; i < ROLE_ALIGNS; i++) { - ask_restring(aligns[i].adj, str); - AppendMenu(askmenu[RSRC_ASK_ALIGN], str); - } - InsertMenu(askmenu[RSRC_ASK_ALIGN], hierMenu); - if (flags.initalign >= 0) - curralign = flags.initalign; - else - curralign = randalign(currrole, currrace); - - /* Initialize the mode popup menu */ - if (!(askmenu[RSRC_ASK_MODE] = NewMenu(RSRC_ASK_MODE, "\p"))) - fatal("\pCannot create mode menu"); - AppendMenu(askmenu[RSRC_ASK_MODE], "\pNormal"); - AppendMenu(askmenu[RSRC_ASK_MODE], "\pExplore"); - AppendMenu(askmenu[RSRC_ASK_MODE], "\pDebug"); - InsertMenu(askmenu[RSRC_ASK_MODE], hierMenu); - currmode = 0; - - /* Set the redraw procedures */ - for (item = RSRC_ASK_DEFAULT; item <= RSRC_ASK_MODE; item++) { - GetDialogItem(askdialog, item, &type, &handle, &rect); - SetDialogItem(askdialog, item, type, (Handle) redraw, &rect); - } - - /* Handle dialog events */ - do { - /* Adjust the Play button */ - ask_enable(askdialog, RSRC_ASK_PLAY, - GetDialogTextEditHandle(askdialog)[0]->teLength); - - /* Adjust the race popup menu */ - i = j = currrace; - do { - if (validrace(currrole, j)) { - EnableMenuItem(askmenu[RSRC_ASK_RACE], j + 1); - CheckMenuItem(askmenu[RSRC_ASK_RACE], j + 1, currrace == j); - } else { - DisableMenuItem(askmenu[RSRC_ASK_RACE], j + 1); - CheckMenuItem(askmenu[RSRC_ASK_RACE], j + 1, FALSE); - if ((currrace == j) && !races[++currrace].noun) - currrace = 0; - } - if (!races[++j].noun) - j = 0; - } while (i != j); - if (currrace != i) { - GetDialogItem(askdialog, RSRC_ASK_RACE, &type, &handle, &rect); - InvalWindowRect(GetDialogWindow(askdialog), &rect); - } - - /* Adjust the gender popup menu */ - i = j = currgend; - do { - if (validgend(currrole, currrace, j)) { - EnableMenuItem(askmenu[RSRC_ASK_GEND], j + 1); - CheckMenuItem(askmenu[RSRC_ASK_GEND], j + 1, currgend == j); - } else { - DisableMenuItem(askmenu[RSRC_ASK_GEND], j + 1); - CheckMenuItem(askmenu[RSRC_ASK_GEND], j + 1, FALSE); - if ((currgend == j) && (++currgend >= ROLE_GENDERS)) - currgend = 0; - } - if (++j >= ROLE_GENDERS) - j = 0; - } while (i != j); - if (currgend != i) { - GetDialogItem(askdialog, RSRC_ASK_GEND, &type, &handle, &rect); - InvalWindowRect(GetDialogWindow(askdialog), &rect); - } - - /* Adjust the alignment popup menu */ - i = j = curralign; - do { - if (validalign(currrole, currrace, j)) { - EnableMenuItem(askmenu[RSRC_ASK_ALIGN], j + 1); - CheckMenuItem(askmenu[RSRC_ASK_ALIGN], j + 1, curralign == j); - } else { - DisableMenuItem(askmenu[RSRC_ASK_ALIGN], j + 1); - CheckMenuItem(askmenu[RSRC_ASK_ALIGN], j + 1, FALSE); - if ((curralign == j) && (++curralign >= ROLE_ALIGNS)) - curralign = 0; - } - if (++j >= ROLE_ALIGNS) - j = 0; - } while (i != j); - if (curralign != i) { - GetDialogItem(askdialog, RSRC_ASK_ALIGN, &type, &handle, &rect); - InvalWindowRect(GetDialogWindow(askdialog), &rect); - } - - /* Adjust the role popup menu */ - for (i = 0; roles[i].name.m; i++) { - ask_restring((currgend && roles[i].name.f) ? roles[i].name.f - : roles[i].name.m, - str); - SetMenuItemText(askmenu[RSRC_ASK_ROLE], i + 1, str); - CheckMenuItem(askmenu[RSRC_ASK_ROLE], i + 1, currrole == i); - } - - /* Adjust the mode popup menu */ - CheckMenuItem(askmenu[RSRC_ASK_MODE], 1, currmode == 0); - CheckMenuItem(askmenu[RSRC_ASK_MODE], 2, currmode == 1); - CheckMenuItem(askmenu[RSRC_ASK_MODE], 3, currmode == 2); - - /* Wait for an action on an item */ - ModalDialog(filter, &item); - switch (item) { - case RSRC_ASK_PLAY: - break; - case RSRC_ASK_QUIT: - currmode = -1; - break; - case RSRC_ASK_ROLE: - case RSRC_ASK_RACE: - case RSRC_ASK_ALIGN: - case RSRC_ASK_GEND: - case RSRC_ASK_MODE: - GetDialogItem(askdialog, item, &type, &handle, &rect); - pt = *(Point *) ▭ - LocalToGlobal(&pt); - if (!!(i = PopUpMenuSelect(askmenu[item], pt.v, pt.h, - askselect[item] + 1))) - askselect[item] = LoWord(i) - 1; - InvalWindowRect(GetDialogWindow(askdialog), &rect); - break; - case RSRC_ASK_NAME: -#if 0 - /* limit the data here to 25 chars */ - { - short beepTEDelete = 1; - - while ((**dRec.textH).teLength > 25) - { - if (beepTEDelete++ <= 3) - SysBeep(3); - TEKey('\b', dRec.textH); - } - } - - /* special case filter (that doesn't plug all the holes!) */ - if (((**dRec.textH).teLength == 1) && (**((**dRec.textH).hText) < 32)) - TEKey('\b', dRec.textH); -#endif - break; - } - } while ((item != RSRC_ASK_PLAY) && (item != RSRC_ASK_QUIT)); - - /* Process the name */ - GetDialogItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); - GetDialogItemText(handle, str); - if (str[0] > PL_NSIZ - 1) - str[0] = PL_NSIZ - 1; - BlockMove(&str[1], plname, str[0]); - plname[str[0]] = '\0'; - - /* Destroy the dialog */ - for (i = RSRC_ASK_ROLE; i <= RSRC_ASK_MODE; i++) { - DeleteMenu(i); - DisposeMenu(askmenu[i]); - } - SetPort(oldport); - DisposeDialog(askdialog); - DisposeModalFilterUPP(filter); - DisposeUserItemUPP(redraw); - - /* Process the mode */ - wizard = discover = 0; - switch (currmode) { - case 0: /* Normal */ - break; - case 1: /* Explore */ - discover = 1; - break; - case 2: /* Debug */ - wizard = 1; - strcpy(plname, WIZARD_NAME); - break; - default: /* Quit */ - ExitToShell(); - } - - /* Process the role */ - strcpy(pl_character, roles[currrole].name.m); - flags.initrole = currrole; - - /* Process the race */ - flags.initrace = currrace; - - /* Process the gender */ - flags.female = flags.initgend = currgend; - - /* Process the alignment */ - flags.initalign = curralign; - - return; -} - -/*** Menu bar routines ***/ - -#if !TARGET_API_MAC_CARBON -static void -alignAD(Rect *pRct, short vExempt) -{ - BitMap qbitmap; - - GetQDGlobalsScreenBits(&qbitmap); - (*pRct).right -= (*pRct).left; /* width */ - (*pRct).bottom -= (*pRct).top; /* height */ - (*pRct).left = (qbitmap.bounds.right - (*pRct).right) / 2; - (*pRct).top = (qbitmap.bounds.bottom - (*pRct).bottom - vExempt) / 2; - (*pRct).top += vExempt; - (*pRct).right += (*pRct).left; - (*pRct).bottom += (*pRct).top; -} -#endif - -static void -mustGetMenuAlerts() -{ - short i; - Rect **hRct; - - for (i = alrt_Menu_start; i < alrt_Menu_limit; i++) { - if (!(hRct = (Rect **) GetResource('ALRT', i))) /* AlertTHndl */ - { - for (i = 0; i < beepMenuAlertErr; i++) - SysBeep(3); - ExitToShell(); - } - -#if !TARGET_API_MAC_CARBON - alignAD(*hRct, GetMBarHeight()); -#endif - } -} - -static void -menuError(short menuErr) -{ - short i; - - for (i = 0; i < beepMenuAlertErr; i++) - SysBeep(3); - - ParamText(menuErrStr[menuErr], "\p", "\p", "\p"); - (void) Alert(alrtMenuNote, (ModalFilterUPP) 0L); - - ExitToShell(); -} - -void -InitMenuRes() -{ - static Boolean was_inited = 0; - short i, j; - menuListHandle mlHnd; - MenuHandle menu; - - if (was_inited) - return; - was_inited = 1; - - mustGetMenuAlerts(); - - for (i = listMenubar; i <= listSubmenu; i++) { - if (!(mlHnd = - (menuListHandle) GetResource('MNU#', (menuBarListID + i)))) - menuError(errGetMenuList); - - pMenuList[i] = (menuListPtr) NewPtr(GetHandleSize((Handle) mlHnd)); - *pMenuList[i] = **mlHnd; - - for (j = 0; j < pMenuList[i]->numMenus; j++) { - if (!(menu = (MenuHandle) GetMenu((**mlHnd).mref[j].mresID))) { - Str31 d; - NumToString((**mlHnd).mref[j].mresID, d); - menuError(errGetMenu); - } - - pMenuList[i]->mref[j].mhnd = menu; - SetMenuID(menu, j + (**mlHnd).firstMenuID); /* consecutive IDs */ - - /* expand apple menu */ - if ((i == listMenubar) && (j == menuApple)) { - AppendResMenu(menu, 'DRVR'); - } - - InsertMenu(menu, ((i == listSubmenu) ? hierMenu : 0)); - } - } - DrawMenuBar(); - return; -} - -void -AdjustMenus(short dimMenubar) -{ - short newMenubar = mbarRegular; - WindowRef win = FrontWindow(); - short i; - - /* - * if (windowprocs != mac_procs) { - * return; - * } - */ - /* determine the new menubar state */ - if (dimMenubar) - newMenubar = mbarDim; - else if (!win) - newMenubar = mbarNoWindows; - else if (GetWindowKind(win) < 0) - newMenubar = mbarDA; - else if (!IsWindowVisible(_mt_window)) - newMenubar = mbarNoMap; - - if (newMenubar != mbarRegular) - ; /* we've already found its state */ - else if (wizard) { - newMenubar = mbarSpecial; - - if (kAdjustWizardMenu) { - kAdjustWizardMenu = 0; - - SetMenuItemText(MHND_FILE, menuFilePlayMode, "\pDebug"); - } - } - - else if (discover) { - newMenubar = mbarSpecial; - - if (kAdjustWizardMenu) { - kAdjustWizardMenu = 0; - - SetMenuItemText(MHND_FILE, menuFilePlayMode, "\pExplore"); - - for (i = CountMenuItems(MHND_WIZ); i > menuWizardAttributes; i--) - DeleteMenuItem(MHND_WIZ, i); - } - } - - /* adjust the menubar, if there's a state change */ - if (theMenubar != newMenubar) { - switch (theMenubar = newMenubar) { - case mbarDim: - /* disable all menus (except the apple menu) */ - for (i = menuFile; i < NUM_MBAR; i++) - DisableMenuItem(MBARHND(i), 0); - break; - - case mbarNoWindows: - case mbarDA: - case mbarNoMap: - /* enable the file menu, but ... */ - EnableMenuItem(MHND_FILE, 0); - - /* ... disable the window commands! */ - for (i = menuFileRedraw; i <= menuFileEnterExplore; i++) - DisableMenuItem(MHND_FILE, i); - - /* ... and disable the rest of the menus */ - for (i = menuEdit; i < NUM_MBAR; i++) - DisableMenuItem(MBARHND(i), 0); - - if (theMenubar == mbarDA) - EnableMenuItem(MHND_EDIT, 0); - - break; - - case mbarRegular: - case mbarSpecial: - /* enable all menus ... */ - for (i = menuFile; i < NUM_MBAR; i++) - EnableMenuItem(MBARHND(i), 0); - - /* ... except the unused Edit menu */ - DisableMenuItem(MHND_EDIT, 0); - - /* ... enable the window commands */ - for (i = menuFileRedraw; i <= menuFileEnterExplore; i++) - EnableMenuItem(MHND_FILE, i); - - if (theMenubar == mbarRegular) - DisableMenuItem(MHND_FILE, menuFilePlayMode); - else - DisableMenuItem(MHND_FILE, menuFileEnterExplore); - - break; - } - - DrawMenuBar(); - } -} - -void -DoMenuEvt(long menuEntry) -{ - short menuID = HiWord(menuEntry); - short menuItem = LoWord(menuEntry); - - switch (menuID - ID1_MBAR) /* all submenus are default case */ - { - case menuApple: - if (menuItem == menuAppleAboutBox) - aboutNetHack(); -#if !TARGET_API_MAC_CARBON - else { - unsigned char daName[32]; - - GetMenuItemText(MHND_APPLE, menuItem, *(Str255 *) daName); - (void) OpenDeskAcc(daName); - } -#endif - break; - - /* - * Those direct calls are ugly: they should be installed into cmd.c . - * Those AddToKeyQueue() calls are also ugly: they should be put into - * the 'STR#' resource. - */ - case menuFile: - switch (menuItem) { - case menuFileRedraw: - AddToKeyQueue('R' & 0x1f, 1); - break; - - case menuFilePrevMsg: - AddToKeyQueue('P' & 0x1f, 1); - break; - - case menuFileCleanup: - (void) SanePositions(); - break; - - case menuFileEnterExplore: - AddToKeyQueue('X', 1); - break; - - case menuFileSave: - askSave(); - break; - - case menuFileQuit: - askQuit(); - break; - } - break; - - case menuEdit: -#if !TARGET_API_MAC_CARBON - (void) SystemEdit(menuItem - 1); -#endif - break; - - default: /* get associated string and add to key queue */ - { - Str255 mstr; - short i; - - GetIndString(mstr, menuID, menuItem); - if (mstr[0] > QUEUE_LEN) - mstr[0] = QUEUE_LEN; - - for (i = 1; ((i <= mstr[0]) && (mstr[i] != mstrEndChar)); i++) - AddToKeyQueue(mstr[i], false); - } break; - } - - HiliteMenu(0); -} - -static void -aboutNetHack() -{ - if (theMenubar >= mbarRegular) { - (void) doversion(); /* is this necessary? */ - } else { - unsigned char aboutStr[32] = "\pNetHack 3.4."; - - if (PATCHLEVEL > 10) { - aboutStr[++aboutStr[0]] = '0' + PATCHLEVEL / 10; - } - - aboutStr[++aboutStr[0]] = '0' + (PATCHLEVEL % 10); - - ParamText(aboutStr, "\p\rdevteam@www.nethack.org", "\p", "\p"); - (void) Alert(alrtMenuNote, (ModalFilterUPP) 0L); - ResetAlertStage(); - } -} - -static void -askSave() -{ - Boolean doSave = 1; - Boolean doYes = 0; - - if (theMenubar < mbarRegular) { - short itemHit; - - ParamText("\pReally Save?", "\p", "\p", "\p"); - itemHit = Alert(alrtMenu_NY, (ModalFilterUPP) 0L); - ResetAlertStage(); - - if (itemHit != bttnMenuAlertYes) { - doSave = 0; - } else { - doYes = 1; - } - } - if (doSave) { - AddToKeyQueue('S', 1); - if (doYes) { - AddToKeyQueue('y', 1); - } - } -} - -static void -askQuit() -{ - Boolean doQuit = 1; - Boolean doYes = 0; - Boolean winMac; - char *quitinput; - - if (!strcmp(windowprocs.name, "mac")) - winMac = 1; - else - winMac = 0; - - if (theMenubar < mbarRegular) { - short itemHit; - - ParamText("\pReally Quit?", "\p", "\p", "\p"); - itemHit = Alert(alrtMenu_NY, (ModalFilterUPP) 0L); - ResetAlertStage(); - - if (itemHit != bttnMenuAlertYes) { - doQuit = 0; - } else { - doYes = 1; - } - } - if (doQuit) { - /* MWM -- forgive me lord, an even uglier kludge to deal with - differences - in command input handling - */ - if (winMac) - quitinput = "#quit\r"; - else - quitinput = "#q\r"; - - /* KMH -- Ugly kludge */ - while (*quitinput) - AddToKeyQueue(*quitinput++, 1); - if (doYes) { - if (winMac) - quitinput = "y\rq\r\r\r"; - else - quitinput = "yq\r"; - while (*quitinput) - AddToKeyQueue(*quitinput++, 1); - } - } -} diff --git a/sys/mac/macsnd.c b/sys/mac/macsnd.c deleted file mode 100644 index e4e313058..000000000 --- a/sys/mac/macsnd.c +++ /dev/null @@ -1,111 +0,0 @@ -/* NetHack 3.6 macsnd.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (c) 1992 by Jon Watte */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * This file contains music playing code. - * - * If we were REALLY determinated, we would make the sound play - * asynchronously, but I'll save that one for a rainy day... - * - * This may break A/UX, since it defines MAC but we need to - * check that the toolbox is booted. I'll defer that one too. - * - * - h+ 921128 - */ - -#include "hack.h" -#include "mactty.h" -#include "macwin.h" -#if 1 /*!TARGET_API_MAC_CARBON*/ -#include -#include -#endif - -#ifndef freqDurationCmd -#define freqDurationCmd 40 -#endif - -#define SND_BUFFER(s) (&(*s)[20]) -#define SND_LEN(s) (GetHandleSize(s) - 42) - -void -mac_speaker(struct obj *instr, char *melody) -{ - SndChannelPtr theChannel = (SndChannelPtr) 0; - SndCommand theCmd; - Handle theSound; - unsigned char theName[32]; - char *n = (char *) &theName[1]; - int typ = instr->otyp; - const char *actualn = OBJ_NAME(objects[typ]); - - /* - * First: are we in the library ? - */ - if (flags.silent) { - return; - } - - /* - * Is this a known instrument ? - */ - strcpy(n, actualn); - theName[0] = strlen(n); - theSound = GetNamedResource('snd ', theName); - if (!theSound) { - return; - } - HLock(theSound); - - /* - * Set up the synth - */ - if (SndNewChannel(&theChannel, sampledSynth, initMono + initNoInterp, - (void *) 0) == noErr) { - char midi_note[] = { 57, 59, 60, 62, 64, 65, 67 }; - - short err; - short snd_len = SND_LEN(theSound) / 18; - - theCmd.cmd = soundCmd; - theCmd.param1 = 0; - theCmd.param2 = (long) SND_BUFFER(theSound); - err = SndDoCommand(theChannel, &theCmd, false); - - /* - * We rack 'em up all in a row - * The mac will play them correctly and then end, since - * we do a sync close below. - * - */ - while (*melody && !err) { - while (*melody > 'G') { - *melody -= 8; - } - while (*melody < 'A') { - *melody += 8; - } - theCmd.cmd = freqDurationCmd; - theCmd.param1 = snd_len; - theCmd.param2 = midi_note[*melody - 'A']; - err = SndDoCommand(theChannel, &theCmd, false); - melody++; - } - SndDisposeChannel(theChannel, false); /* Sync wait for completion */ - ReleaseResource(theSound); - } -} - -void -tty_nhbell(void) -{ - Handle h = GetNamedResource('snd ', "\pNetHack Bell"); - - if (h) { - HLock(h); - SndPlay((SndChannelPtr) 0, (SndListHandle) h, 0); - ReleaseResource(h); - } else - SysBeep(30); -} diff --git a/sys/mac/mactopl.c b/sys/mac/mactopl.c deleted file mode 100644 index 0c087fc8b..000000000 --- a/sys/mac/mactopl.c +++ /dev/null @@ -1,66 +0,0 @@ -/* NetHack 3.6 mactopl.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "mactty.h" -#include "macwin.h" -#include "macpopup.h" - -char -queued_resp(char *resp) -{ - char buf[30]; - if (try_key_queue(buf)) { - if (!resp || strchr(resp, buf[0])) - return buf[0]; - if (digit(buf[0]) && strchr(resp, '#')) { - yn_number = atoi(buf); - return '#'; - } - } - return '\0'; -} - -char -topl_yn_function(const char *query, const char *resp, char def) -{ - char buf[30]; - char c = queued_resp((char *) resp); - if (!c) { - enter_topl_mode((char *) query); - topl_set_resp((char *) resp, def); - - do { - c = readchar(); - if (c && resp && !strchr(resp, c)) { - nhbell(); - c = '\0'; - } - } while (!c); - - topl_set_resp("", '\0'); - leave_topl_mode(buf); - if (c == '#') - yn_number = atoi(buf); - } - return c; -} - -char -mac_yn_function(query, resp, def) -const char *query, *resp; -char def; -/* - * Generic yes/no function. 'def' is the default (returned by space or - * return; 'esc' returns 'q', or 'n', or the default, depending on - * what's in the string. The 'query' string is printed before the user - * is asked about the string. - * If resp is NULL, any single character is accepted and returned. - */ -{ - return topl_yn_function(query, resp, def); -} - -/* mactopl.c */ diff --git a/sys/mac/mactty.c b/sys/mac/mactty.c deleted file mode 100644 index 2fe8a1e33..000000000 --- a/sys/mac/mactty.c +++ /dev/null @@ -1,1246 +0,0 @@ -/* NetHack 3.6 mactty.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (c) Jon W{tte 1993. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * mactty.c - * - * This file contains the actual code for the tty library. For a - * description, see the file mactty.h, which contains all you - * need to know to use the library. - */ - -#include "hack.h" /* to get flags */ -#include "mttypriv.h" -#if !TARGET_API_MAC_CARBON -#include -#endif - -char game_active = 0; /* flag to window rendering routines not to use ppat */ - -/* these declarations are here because I can't include macwin.h without - * including the world */ -extern void dprintf(char *, ...); /* dprintf.c */ - -/* - * Borrowed from the Mac tty port - */ -extern WindowPtr _mt_window; - -static void select_onscreen_window(tty_record *record); -static void select_offscreen_port(tty_record *record); - -#define MEMORY_MARGIN 30000 - -/* - * Convenience macro for most functions - put last in declaration - */ -#define RECORD_EXISTS(record) \ - tty_record *record; \ - if (!window || !(record = (tty_record *) GetWRefCon(window))) \ - return general_failure; - -/* - * Simple macro for deciding whether we draw at once or delay - */ -#define DRAW_DIRECT (TA_ALWAYS_REFRESH & record->attribute[TTY_ATTRIB_FLAGS]) - -/* - * Table of special characters. Zero is ALWAYS special; it means - * end of string and would be MISSED if it was not included here. - */ -#define COOKED_CONTROLS 0X00002581 -#define RAW_CONTROLS 1 -static unsigned long s_control = COOKED_CONTROLS; - -/* - * Memory-related error - */ -static short -mem_err(void) -{ - short ret_val = MemError(); - if (!ret_val) { - ret_val = general_failure; - } - return ret_val; -} - -/* - * Make a rectangle empty - */ -static void -empty_rect(Rect *r) -{ - r->right = -20000; - r->left = 20000; - r->top = 20000; - r->bottom = -20000; -} - -/* - * Union twp rect together - */ -static void -union_rect(Rect *r1, Rect *r2, Rect *dest) -{ - dest->left = min(r1->left, r2->left); - dest->top = min(r1->top, r2->top); - dest->bottom = max(r1->bottom, r2->bottom); - dest->right = max(r1->right, r2->right); -} - -/* - * Dispose a pointer using the set memory-allocator - */ -static short -dispose_ptr(void *ptr) -{ - if (!ptr) { - return noErr; /* Silently accept disposing nulls */ - } - DisposePtr(ptr); - return MemError(); -} - -#if 0 /* Use alloc.c instead */ -/* - * Allocate a pointer using the set memory-allocator - */ -static short -alloc_ptr (void **ptr, long size) { - *ptr = NewPtr (size); - return MemError (); -} -#endif - -/* - * Set up a GWorld in the record - */ -static short -allocate_offscreen_world(tty_record *record) -{ - GWorldPtr gw = (GWorldPtr) 0; - GWorldFlags world_flags = 0; - long mem_here, mem_there, other, required_mem; - Point p = { 0, 0 }; - Rect r_screen; - GDHandle gdh; - short s_err; - - select_onscreen_window(record); - LocalToGlobal(&p); - r_screen = record->its_bits.bounds; - OffsetRect(&r_screen, p.h, p.v); - - gdh = GetMaxDevice(&r_screen); - required_mem = (long) (*((*gdh)->gdPMap))->pixelSize - * ((long) record->its_bits.bounds.right - * record->its_bits.bounds.bottom) - >> 3; - - PurgeSpace(&other, &mem_here); - if (other < mem_here + MEMORY_MARGIN) { - mem_here = other - MEMORY_MARGIN; - } - dprintf("Heap %ld Required %ld", mem_here, required_mem); - if (required_mem > mem_here) { - mem_there = required_mem; - if (required_mem > TempMaxMem(&mem_there)) { - dprintf("No memory"); - return memFullErr; - } - world_flags |= useTempMem; - } - s_err = NewGWorld(&gw, 0, &r_screen, (CTabHandle) 0, (GDHandle) 0, - world_flags); - if (!s_err) { - record->offscreen_world = gw; - select_offscreen_port(record); - SetOrigin(0, 0); - select_onscreen_window(record); - dprintf("New GWorld @ %lx;dm", gw); - } - return s_err; -} - -/* - * Done with GWorld, release data - */ -static short -deallocate_gworld(tty_record *record) -{ - if (record->offscreen_world) { - DisposeGWorld(record->offscreen_world); - record->offscreen_world = (GWorldPtr) 0; - } - return noErr; -} - -/* - * Get rid of offscreen bitmap - */ -static short -free_bits(tty_record *record) -{ - short s_err; - - if (record->uses_gworld) { - s_err = deallocate_gworld(record); -#if !TARGET_API_MAC_CARBON - } else { - s_err = dispose_ptr(record->its_bits.baseAddr); - if (!s_err) { - record->its_bits.baseAddr = (char *) 0; - if (record->offscreen_port) { - ClosePort(record->offscreen_port); - s_err = dispose_ptr(record->offscreen_port); - if (!s_err) { - record->offscreen_port = (GrafPtr) 0; - } - } - } -#endif - } - return s_err; -} - -/* - * Snatch a window from the resource fork. Create the record. - * Otherwise, do nothing. - */ - -short -create_tty(WindowRef *window, short resource_id, Boolean in_color) -{ - tty_record *record; - Boolean was_allocated = !!*window; - - if (in_color) { - *window = GetNewCWindow(resource_id, (Ptr) *window, (WindowRef) -1L); - } else { - *window = GetNewWindow(resource_id, (Ptr) *window, (WindowRef) -1L); - } - if (!*window) { - return mem_err(); - } - - record = (tty_record *) NewPtrClear(sizeof(tty_record)); - if (!record) { -#if !TARGET_API_MAC_CARBON - if (was_allocated) { - CloseWindow(*window); - } else { -#endif - DisposeWindow(*window); -#if !TARGET_API_MAC_CARBON - } -#endif - return mem_err(); - } - record->its_window = *window; - SetWRefCon(*window, (long) record); - record->was_allocated = was_allocated; - record->its_bits.baseAddr = (char *) 0; - record->curs_state = TRUE; - - /* - * We need to keep the window world around if we switch worlds - */ - record->offscreen_world = (GWorldPtr) 0; - record->uses_gworld = in_color; - if (in_color) { - GDHandle gh; - - SetPortWindowPort(*window); - GetGWorld(&(record->its_window_world), &gh); - } else { - record->its_window_world = (GWorldPtr) 0; - } - -#if CLIP_RECT_ONLY - empty_rect(&(record->invalid_rect)); -#else - record->invalid_part = NewRgn(); - if (!record->invalid_part) { - return destroy_tty(*window); - } -#endif - - return noErr; -} - -short -init_tty_number(WindowPtr window, short font_number, short font_size, - short x_size, short y_size) -{ - RECORD_EXISTS(record); - - record->font_number = font_number; - record->font_size = font_size; - record->x_size = x_size; - record->y_size = y_size; - - return force_tty_coordinate_system_recalc(window); -} - -/* - * Done with a window - destroy it. Release the memory only if - * it wasn't allocated when we got it! - */ -short -destroy_tty(WindowPtr window) -{ - short s_err; - RECORD_EXISTS(record); - - s_err = free_bits(record); - if (!s_err) { -#if !TARGET_API_MAC_CARBON - if (record->was_allocated) { - CloseWindow(window); - } else { -#endif - DisposeWindow(window); -#if !TARGET_API_MAC_CARBON - } -#endif - s_err = dispose_ptr(record); - } - - return s_err; -} - -static void -do_set_port_font(tty_record *record) -{ - PenNormal(); - TextFont(record->font_number); - TextSize(record->font_size); - if (0L != (record->attribute[TTY_ATTRIB_FLAGS] & TA_OVERSTRIKE)) { - TextMode(srcOr); - } else { - TextMode(srcCopy); - } -} - -/* - * Fill in some fields from some other fields that may have changed - */ -static void -calc_font_sizes(tty_record *record) -{ - FontInfo font_info; - - do_set_port_font(record); - - GetFontInfo(&font_info); - record->char_width = font_info.widMax; - record->ascent_height = font_info.ascent + font_info.leading; - record->row_height = record->ascent_height + font_info.descent; -} - -/* - * Allocate memory for the bitmap holding the tty window - */ -static short -alloc_bits(tty_record *record) -{ - short s_err; - - SetRect(&record->its_bits.bounds, 0, 0, - record->char_width * record->x_size, - record->row_height * record->y_size); - - /* - * Clear two highest and lowest bit - not a color pixMap, and even in size - */ - record->its_bits.rowBytes = - ((record->its_bits.bounds.right + 15) >> 3) & 0x1ffe; - - if (record->uses_gworld) { - s_err = allocate_offscreen_world(record); -#if !TARGET_API_MAC_CARBON - } else { - s_err = alloc_ptr((void **) &(record->its_bits.baseAddr), - record->its_bits.rowBytes - * record->its_bits.bounds.bottom); - if (!s_err) { - s_err = alloc_ptr((void **) &(record->offscreen_port), - sizeof(GrafPort)); - } - if (!s_err) { - OpenPort(record->offscreen_port); - SetPort(record->offscreen_port); - ClipRect(&(record->its_bits.bounds)); - SetPortBits(&(record->its_bits)); - } -#endif - } - return s_err; -} - -/* - * Save the current port/world in a safe place for later retrieval - */ -static void -save_port(tty_record *record, void *save) -{ - GWorldPtr gw; - GDHandle gh; - GrafPtr gp; - - if (record->uses_gworld) { - GetGWorld(&gw, &gh); - *(GWorldPtr *) save = gw; - } else { - GetPort(&gp); - *(GrafPtr *) save = gp; - } -} - -/* - * Restore current port/world after a save - */ -static void -use_port(tty_record *record, void *port) -{ - if (record->uses_gworld) { - PixMapHandle pix_map; - - SetGWorld((GWorldPtr) port, (GDHandle) 0); - pix_map = GetGWorldPixMap(record->offscreen_world); - if (pix_map) { - if (port == record->offscreen_world) - LockPixels(pix_map); - else - UnlockPixels(pix_map); - } - } else { - SetPort((GrafPtr) port); - } -} - -/* - * Use offscreen drawing - lock the pixels through use_port - */ -static void -select_offscreen_port(tty_record *record) -{ - if (record->uses_gworld) { - use_port(record, record->offscreen_world); - } else { - use_port(record, record->offscreen_port); - } -} - -/* - * Use the window - unlock pixels - */ -static void -select_onscreen_window(tty_record *record) -{ - if (record->uses_gworld) { - use_port(record, record->its_window_world); - SetPortWindowPort(record->its_window); - } else { - use_port(record, record->its_window); - } -} - -/* - * Do bits copy depending on if we're using color or not - */ -static void -copy_bits(tty_record *record, Rect *bounds, short xfer_mode, - RgnHandle mask_rgn) -{ - GWorldFlags pix_state; - BitMap *source; - - if (record->uses_gworld) { - pix_state = GetPixelsState(GetGWorldPixMap(record->offscreen_world)); - LockPixels(GetGWorldPixMap(record->offscreen_world)); - source = (BitMapPtr) *GetGWorldPixMap(record->offscreen_world); - } else - source = &record->its_bits; - - SetPortWindowPort(record->its_window); - CopyBits(source, - GetPortBitMapForCopyBits(GetWindowPort(record->its_window)), - bounds, bounds, xfer_mode, mask_rgn); - - if (record->uses_gworld) { - SetPixelsState(GetGWorldPixMap(record->offscreen_world), pix_state); - } -} - -/* - * Fill an area with the background color - */ -static void -erase_rect(tty_record *record, Rect *area) -{ - if (game_active && u.uhp > 0 && iflags.use_stone - && record->its_window == _mt_window) { - PixPatHandle ppat; - - ppat = GetPixPat(iflags.use_stone + 127); /* find which pat to get */ - if (ppat) { /* in game window, using backgroung pattern, and have - pattern */ - FillCRect(area, ppat); - DisposePixPat(ppat); - return; - } - } - EraseRect(area); -} - -/* - * Recalculate the window based on new size, font, extent values, - * and re-allocate the bitmap. - */ -short -force_tty_coordinate_system_recalc(WindowPtr window) -{ - short s_err; - RECORD_EXISTS(record); - - s_err = free_bits(record); - if (s_err) { - return s_err; - } - calc_font_sizes(record); - - s_err = alloc_bits(record); - if (s_err) { - /* - * Catastrophe! We could not allocate memory for the bitmap! Things - * may go very - * much downhill from here! - */ - dprintf("alloc_bits returned null in " - "force_tty_coordinate_system_recalc!"); - return s_err; - } - select_offscreen_port(record); - do_set_port_font(record); - return clear_tty(window); -} - -#if 0 -/* - * Update TTY according to new color environment for the window - */ -static short -tty_environment_changed (tty_record *record) { -Point p = {0, 0}; -Rect r_screen; - - if (record->uses_gworld) { - r_screen = record->its_bits.bounds; - LocalToGlobal (&p); - OffsetRect (&r_screen, p.h, p.v); - UpdateGWorld (&(record->offscreen_world), 0, &r_screen, - (CTabHandle) 0, (GDHandle) 0, stretchPix); - select_offscreen_port (record); - SetOrigin (0, 0); - select_onscreen_window (record); - } - return 0; -} -#endif - -/* - * Read a lot of interesting and useful information from the current tty - */ -short -get_tty_metrics(WindowPtr window, short *x_size, short *y_size, - short *x_size_pixels, short *y_size_pixels, - short *font_number, short *font_size, short *char_width, - short *row_height) -{ - RECORD_EXISTS(record); - - /* - * First, test that we actually have something to draw to... - */ - if ((((char *) 0 == record->its_bits.baseAddr) && !record->uses_gworld) - || (((GWorldPtr) 0 == record->offscreen_world) - && record->uses_gworld)) { - return general_failure; - } - - *x_size = record->x_size; - *y_size = record->y_size; - *x_size_pixels = record->its_bits.bounds.right; - *y_size_pixels = record->its_bits.bounds.bottom; - *font_number = record->font_number; - *font_size = record->font_size; - *char_width = record->char_width; - *row_height = record->row_height; - - return noErr; -} - -/* - * Map a position on the map to screen coordinates - */ -static void -pos_rect(tty_record *record, Rect *r, short x_pos, short y_pos, short x_end, - short y_end) -{ - SetRect(r, x_pos * (record->char_width), y_pos * (record->row_height), - (1 + x_end) * (record->char_width), - (1 + y_end) * (record->row_height)); -} - -static void -accumulate_rect(tty_record *record, Rect *rect) -{ -#if CLIP_RECT_ONLY - union_rect(rect, &(record->invalid_rect), &(record->invalid_rect)); -#else - RgnHandle rh = NewRgn(); - - RectRgn(rh, rect); - UnionRgn(record->invalid_part, rh, record->invalid_part); - DisposeRgn(rh); -#endif -} - -/* - * get and set window invalid region. exposed for HandleUpdateEvent in - * macwin.c - * to correct display problem - */ - -short -get_invalid_region(WindowPtr window, Rect *inval_rect) -{ - RECORD_EXISTS(record); -#if CLIP_RECT_ONLY - if (record->invalid_rect.right <= record->invalid_rect.left - || record->invalid_rect.bottom <= record->invalid_rect.top) { - return general_failure; - } - *inval_rect = record->invalid_rect; -#else - if (EmptyRgn(record->invalid_part)) { - return general_failure; - } - *inval_rect = (*(record->invalid_part))->rgnBBox; -#endif - return noErr; -} - -short -set_invalid_region(WindowPtr window, Rect *inval_rect) -{ - RECORD_EXISTS(record); - accumulate_rect(record, inval_rect); - return noErr; -} - -/* - * Invert the specified position - */ -static void -curs_pos(tty_record *record, short x_pos, short y_pos, short to_state) -{ - Rect r; - - if (record->curs_state == to_state) { - return; - } - record->curs_state = to_state; - pos_rect(record, &r, x_pos, y_pos, x_pos, y_pos); - - if (DRAW_DIRECT) { - void *old_port; - - save_port(record, &old_port); - select_onscreen_window(record); - InvertRect(&r); - use_port(record, old_port); - } else { - accumulate_rect(record, &r); - } -} - -/* - * Move the cursor (both as displayed and where drawing goes) - * HOWEVER: The cursor is NOT stored in the bitmap! - */ -short -move_tty_cursor(WindowPtr window, short x_pos, short y_pos) -{ - RECORD_EXISTS(record); - - if (record->x_curs == x_pos && record->y_curs == y_pos) { - return noErr; - } - if (record->x_size <= x_pos || x_pos < 0 || record->y_size <= y_pos - || y_pos < 0) { - return general_failure; - } - curs_pos(record, record->x_curs, record->y_curs, 0); - record->x_curs = x_pos; - record->y_curs = y_pos; - curs_pos(record, x_pos, y_pos, 1); - - return noErr; -} - -/* - * Update the screen to match the current bitmap, after adding stuff - * with add_tty_char etc. - */ -short -update_tty(WindowPtr window) -{ - Rect r; - RECORD_EXISTS(record); - -#if CLIP_RECT_ONLY - if (record->invalid_rect.right <= record->invalid_rect.left - || record->invalid_rect.bottom <= record->invalid_rect.top) { - return noErr; - } - r = record->invalid_rect; -#else - if (EmptyRgn(record->invalid_part)) { - return noErr; - } - r = (*(record->invalid_part))->rgnBBox; -#endif - select_onscreen_window(record); - copy_bits(record, &r, srcCopy, (RgnHandle) 0); -#if CLIP_RECT_ONLY - empty_rect(&(record->invalid_rect)); -#else - SetEmptyRgn(record->invalid_part); -#endif - if (record->curs_state) { - pos_rect(record, &r, record->x_curs, record->y_curs, record->x_curs, - record->y_curs); - InvertRect(&r); - } - - return noErr; -} - -/* - * Low level add to screen - */ -static void -do_add_string(tty_record *record, char *str, short len) -{ - Rect r; - - if (len < 1) { - return; - } - select_offscreen_port(record); - - MoveTo(record->x_curs * record->char_width, - record->y_curs * record->row_height + record->ascent_height); - DrawText(str, 0, len); - - pos_rect(record, &r, record->x_curs, record->y_curs, - record->x_curs + len - 1, record->y_curs); - select_onscreen_window(record); - if (DRAW_DIRECT) { - copy_bits(record, &r, srcCopy, (RgnHandle) 0); - } else { - accumulate_rect(record, &r); - } -} - -/* - * Low-level cursor handling routine - */ -static void -do_add_cursor(tty_record *record, short x_pos) -{ - record->x_curs = x_pos; - if (record->x_curs >= record->x_size) { - if (0L != (record->attribute[TTY_ATTRIB_FLAGS] & TA_WRAP_AROUND)) { - record->y_curs++; - record->x_curs = 0; - if (record->y_curs >= record->y_size) { - if (0L != (record->attribute[TTY_ATTRIB_FLAGS] - & TA_INHIBIT_VERT_SCROLL)) { - record->y_curs = record->y_size; - } else { - scroll_tty(record->its_window, 0, - 1 + record->y_curs - record->y_size); - } - } - } else { - record->x_curs = record->x_size; - } - } -} - -/* - * Do control character - */ -static void -do_control(tty_record *record, short character) -{ - int recurse = 0; - - /* - * Check recursion because nl_add_cr and cr_add_nl may both be set and - * invoke each other - */ - do { - switch (character) { - case CHAR_CR: - record->x_curs = 0; - if (!recurse - && (record->attribute[TTY_ATTRIB_CURSOR] & TA_CR_ADD_NL)) { - recurse = 1; - } else { - recurse = 0; - break; - } /* FALL-THROUGH: if CR-LF, don't bother with loop */ - case CHAR_LF: - record->y_curs++; - if (record->y_curs >= record->y_size) { - scroll_tty(record->its_window, 0, - 1 + record->y_curs - record->y_size); - } - if (!recurse - && (record->attribute[TTY_ATTRIB_CURSOR] & TA_NL_ADD_CR)) { - character = CHAR_CR; - recurse = 1; - } else - recurse = 0; - break; - case CHAR_BELL: - tty_nhbell(); - break; - case CHAR_BS: - if (record->x_curs > 0) - record->x_curs--; - default: - break; - } - } while (recurse); -} - -/* - * Add a single character. It is drawn directly if the correct flag is set, - * else deferred to the next update event or call of update_tty() - */ -short -add_tty_char(WindowPtr window, short character) -{ - register char is_control; - char ch; - RECORD_EXISTS(record); - - if (!(record->attribute[TTY_ATTRIB_FLAGS] & TA_WRAP_AROUND) - && record->x_curs >= record->x_size) - return noErr; /* Optimize away drawing across border without wrap */ - - if (record->curs_state != 0) - curs_pos(record, record->x_curs, record->y_curs, 0); - - ch = character; - is_control = (ch < sizeof(long) * 8) && ((s_control & (1 << ch)) != 0L); - if (is_control) - do_control(record, ch); - else { - do_add_string(record, (char *) &ch, 1); - do_add_cursor(record, record->x_curs + 1); - } - - return noErr; -} - -/* - * Add a null-terminated string of characters - */ -short -add_tty_string(WindowPtr window, const char *string) -{ - register const unsigned char *start_c; - register const unsigned char *the_c; - register unsigned char ch, is_control = 0, tty_wrap; - register short max_x, pos_x; - RECORD_EXISTS(record); - - if (record->curs_state != 0) - curs_pos(record, record->x_curs, record->y_curs, 0); - - the_c = (const unsigned char *) string; - max_x = record->x_size; - tty_wrap = (record->attribute[TTY_ATTRIB_FLAGS] & TA_WRAP_AROUND); - for (;;) { - pos_x = record->x_curs; - if (!tty_wrap && pos_x >= max_x) - break; /* Optimize away drawing across border without wrap */ - - start_c = the_c; - ch = *the_c; - while (pos_x < max_x) { - is_control = - (ch < sizeof(long) * 8) && ((s_control & (1 << ch)) != 0L); - if (is_control) - break; - the_c++; - ch = *the_c; - pos_x++; - } - do_add_string(record, (char *) start_c, the_c - start_c); - do_add_cursor(record, pos_x); - if (!ch) - break; - - if (is_control) { - do_control(record, ch); - the_c++; - } - } - - return noErr; -} - -/* - * Read or change attributes for the tty. Note that some attribs may - * very well clear and reallocate the bitmap when changed, whereas - * others (color, highlight, ...) are guaranteed not to. - */ -short -get_tty_attrib(WindowPtr window, tty_attrib attrib, long *value) -{ - RECORD_EXISTS(record); - - if (attrib < 0 || attrib >= TTY_NUMBER_ATTRIBUTES) { - return general_failure; - } - *value = record->attribute[attrib]; - - return noErr; -} - -short -set_tty_attrib(WindowPtr window, tty_attrib attrib, long value) -{ - RGBColor rgb_color; - RECORD_EXISTS(record); - - if (attrib < 0 || attrib >= TTY_NUMBER_ATTRIBUTES) { - return general_failure; - } - record->attribute[attrib] = value; - /* - * Presently, no attributes generate a new bitmap. - */ - switch (attrib) { - case TTY_ATTRIB_CURSOR: - /* - * Check if we should change tables - */ - if (0L != (value & TA_RAW_OUTPUT)) { - s_control = RAW_CONTROLS; - } else { - s_control = COOKED_CONTROLS; - } - break; - case TTY_ATTRIB_FLAGS: - /* - * Check if we should flush the output going from cached to - * draw-direct - */ - if (0L != (value & TA_ALWAYS_REFRESH)) { - update_tty(window); - } - break; - case TTY_ATTRIB_FOREGROUND: - /* - * Set foreground color - */ - TA_TO_RGB(value, rgb_color); - select_offscreen_port(record); - RGBForeColor(&rgb_color); - select_onscreen_window(record); - break; - case TTY_ATTRIB_BACKGROUND: - /* - * Set background color - */ - TA_TO_RGB(value, rgb_color); - select_offscreen_port(record); - RGBBackColor(&rgb_color); - select_onscreen_window(record); - break; - default: - break; - } - return noErr; -} - -/* - * Scroll the window. Positive is up/left. scroll_tty ( window, 0, 1 ) is a - * line feed. - * Scroll flushes the accumulated update area by calling update_tty(). - */ - -short -scroll_tty(WindowPtr window, short delta_x, short delta_y) -{ - RgnHandle rgn; - short s_err; - RECORD_EXISTS(record); - - s_err = update_tty(window); - - rgn = NewRgn(); - - select_offscreen_port(record); - ScrollRect(&(record->its_bits.bounds), -delta_x * record->char_width, - -delta_y * record->row_height, rgn); - EraseRgn(rgn); - SetEmptyRgn(rgn); - - select_onscreen_window(record); - ScrollRect(&(record->its_bits.bounds), -delta_x * record->char_width, - -delta_y * record->row_height, rgn); - EraseRgn(rgn); - DisposeRgn(rgn); - - record->y_curs -= delta_y; - record->x_curs -= delta_x; - - return noErr; -} - -/* - * Clear the screen. Immediate. - */ -short -clear_tty(WindowPtr window) -{ - RECORD_EXISTS(record); - - record->curs_state = 0; - select_offscreen_port(record); - erase_rect(record, &(record->its_bits.bounds)); - accumulate_rect(record, &(record->its_bits.bounds)); - update_tty(window); - - return noErr; -} - -/* - * Blink cursor on window if necessary - */ -short -blink_cursor(WindowPtr window, long when) -{ - RECORD_EXISTS(record); - - if ((record->attribute[TTY_ATTRIB_CURSOR] & TA_BLINKING_CURSOR)) { - if (when > record->last_cursor + GetCaretTime()) { - curs_pos(record, record->x_curs, record->y_curs, - !record->curs_state); - record->last_cursor = when; - update_tty(window); - } - } - return 0; -} - -/* - * Draw an image of the tty - used for update events and can be called - * for screen dumps. - */ -short -image_tty(EventRecord *theEvent, WindowPtr window) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(theEvent) -#endif - RECORD_EXISTS(record); - -#if CLIP_RECT_ONLY - record->invalid_rect = record->its_bits.bounds; -#else - RgnHandle rh = NewRgn(); - - RectRgn(rh, record->its_bits.bounds); - UnionRgn(record->invalid_part, rh, record->invalid_part); - DisposeRgn(rh); -#endif - return update_tty(window); -} - -/* - * Clear an area - */ -short -clear_tty_window(WindowPtr window, short from_x, short from_y, short to_x, - short to_y) -{ - Rect r; - RECORD_EXISTS(record); - - if (from_x > to_x || from_y > to_y) { - return general_failure; - } - pos_rect(record, &r, from_x, from_y, to_x, to_y); - select_offscreen_port(record); - erase_rect(record, &r); - accumulate_rect(record, &r); - if (DRAW_DIRECT) { - update_tty(window); - } else - select_onscreen_window(record); - return noErr; -} - -#if EXTENDED_SUPPORT -/* - * Delete or insert operations used by many terminals can bottleneck through - * here. Note that the order of executin for row/colum insertions is NOT - * specified. Negative values for num_ mean delete, zero means no effect. - */ -short -mangle_tty_rows_columns(WindowPtr window, short from_row, short num_rows, - short from_column, short num_columns) -{ - Rect r; - RgnHandle rh = NewRgn(); - RECORD_EXISTS(record); - - update_tty(window); /* Always make sure screen is OK */ - curs_pos(record, record->x_curs, record->y_curs, 0); - - if (num_rows) { - pos_rect(record, &r, 0, from_row, record->x_size - 1, - record->y_size - 1); - select_offscreen_port(record); - ScrollRect(&r, 0, num_rows * record->row_height, rh); - EraseRgn(rh); - SetEmptyRgn(rh); - select_onscreen_window(record); - ScrollRect(&r, 0, num_rows * record->row_height, rh); - EraseRgn(rh); - SetEmptyRgn(rh); - } - if (num_columns) { - pos_rect(record, &r, from_column, 0, record->x_size - 1, - record->y_size - 1); - select_offscreen_port(record); - ScrollRect(&r, num_columns * record->char_width, 0, rh); - EraseRgn(rh); - SetEmptyRgn(rh); - select_onscreen_window(record); - ScrollRect(&r, num_columns * record->char_width, 0, rh); - EraseRgn(rh); - SetEmptyRgn(rh); - } - DisposeRgn(rh); - if (record->x_curs >= from_column) { - record->x_curs += num_columns; - } - if (record->y_curs >= from_row) { - record->y_curs += num_rows; - } - curs_pos(record, record->x_curs, record->y_curs, 1); - - return noErr; -} - -/* - * Frame an area in an aesthetically pleasing way. - */ -short -frame_tty_window(WindowPtr window, short from_x, short from_y, short to_x, - short to_y, short frame_fatness) -{ - Rect r; - RECORD_EXISTS(record); - - if (from_x > to_x || from_y > to_y) { - return general_failure; - } - pos_rect(record, &r, from_x, from_y, to_x, to_y); - select_offscreen_port(record); - PenSize(frame_fatness, frame_fatness); - FrameRect(&r); - PenNormal(); - accumulate_rect(record, &r); - if (DRAW_DIRECT) { - update_tty(window); - } else - select_onscreen_window(record); -} - -/* - * Highlighting a specific part of the tty window - */ -short -invert_tty_window(WindowPtr window, short from_x, short from_y, short to_x, - short to_y) -{ - Rect r; - RECORD_EXISTS(record); - - if (from_x > to_x || from_y > to_y) { - return general_failure; - } - pos_rect(record, &r, from_x, from_y, to_x, to_y); - select_offscreen_port(record); - InvertRect(&r); - accumulate_rect(record, &r); - if (DRAW_DIRECT) { - update_tty(window); - } else - select_onscreen_window(record); -} - -static void -canonical_rect(Rect *r, short x1, short y1, short x2, short y2) -{ - if (x1 < x2) { - if (y1 < y2) { - SetRect(r, x1, x2, y1, y2); - } else { - SetRect(r, x1, x2, y2, y1); - } - } else { - if (y1 < y2) { - SetRect(r, x2, x1, y1, y2); - } else { - SetRect(r, x2, x1, y2, y1); - } - } -} - -/* - * Line drawing - very device dependent - */ -short -draw_tty_line(WindowPtr window, short from_x, short from_y, short to_x, - short to_y) -{ - Rect r; - RECORD_EXISTS(record); - - select_offscreen_port(record); - MoveTo(from_x, from_y); - LineTo(to_x, to_y); - canonical_rect(&r, from_x, from_y, to_x, to_y); - accumulate_rect(record, &r); - if (DRAW_DIRECT) { - update_tty(window); - } else - select_onscreen_window(record); -} - -#endif /* EXTENDED_SUPPORT */ diff --git a/sys/mac/macunix.c b/sys/mac/macunix.c deleted file mode 100644 index 3c08bf3a7..000000000 --- a/sys/mac/macunix.c +++ /dev/null @@ -1,40 +0,0 @@ -/* NetHack 3.6 macunix.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* This file collects some Unix dependencies */ - -#include "hack.h" - -void -regularize(char *s) -{ - register char *lp; - - for (lp = s; *lp; lp++) { - if (*lp == '.' || *lp == ':') - *lp = '_'; - } -} - -void -getlock(void) -{ - int fd; - int pid = getpid(); /* Process ID */ - - Sprintf(lock, "%d%s", getuid(), plname); - set_levelfile_name(lock, 0); - - if ((fd = open(lock, O_RDWR | O_EXCL | O_CREAT, LEVL_TYPE)) == -1) { - raw_printf("Could not lock the game %s.", lock); - panic("Another game in progress?"); - } - - if (write(fd, (char *) &pid, sizeof(pid)) != sizeof(pid)) { - raw_printf("Could not lock the game %s.", lock); - panic("Disk locked?"); - } - close(fd); -} diff --git a/sys/mac/macwin.c b/sys/mac/macwin.c deleted file mode 100644 index aec93d0b0..000000000 --- a/sys/mac/macwin.c +++ /dev/null @@ -1,3283 +0,0 @@ -/* NetHack 3.6 macwin.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.26 $ */ -/* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */ -/* NetHack may be freely redistributed. See license for details. */ - -/********************************************************************** - * Imported variables and functions - */ - -#include "hack.h" -#include "func_tab.h" -#include "macwin.h" -#include "mactty.h" -#include "wintty.h" - -#if 1 /*!TARGET_API_MAC_CARBON*/ -#include -#include -#include -#include -#include -#include -#endif - -/********************************************************************** - * Local variables and functions - */ - -#if 0 // TARGET_API_MAC_CARBON -static EventTypeSpec baseevents[] = { - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyRepeat }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowHandleContentClick }, - { kEventClassWindow, kEventWindowClose } -}; - -static EventTypeSpec msgevents[] = { - { kEventClassControl, kEventControlHit }, - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyRepeat }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowHandleContentClick }, - { kEventClassWindow, kEventWindowClose } -}; - -static EventTypeSpec menwevents[] = { - { kEventClassControl, kEventControlHit }, - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyRepeat }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowHandleContentClick }, - { kEventClassWindow, kEventWindowClose } -}; - -static EventTypeSpec textevents[] = { - { kEventClassControl, kEventControlHit }, - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyRepeat }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowClose } -}; - -static EventTypeSpec globalevents[] = { - { kEventClassCommand, kEventCommandProcess } -}; - -EventTargetRef dispatcher; -EventHandlerUPP baseupp, msgupp, menwupp, textupp; - -static pascal OSStatus BaseEvent(EventHandlerCallRef, EventRef, void *); -static void MsgUpdate(NhWindow *wind); -static pascal OSStatus MsgEvent(EventHandlerCallRef, EventRef, void *); -static void MenwUpdate(NhWindow *wind); -static pascal OSStatus MenwEvent(EventHandlerCallRef, EventRef, void *); -static void TextUpdate(NhWindow *wind); -static pascal OSStatus TextEvent(EventHandlerCallRef, EventRef, void *); -static pascal OSStatus GlobalEvent(EventHandlerCallRef, EventRef, void *); - -#else - -static void FDECL(GeneralKey, (EventRecord *, WindowPtr)); -static void FDECL(macKeyMenu, (EventRecord *, WindowPtr)); -static void FDECL(macKeyText, (EventRecord *, WindowPtr)); - -static void FDECL(macClickMessage, (EventRecord *, WindowPtr)); -static void FDECL(macClickTerm, (EventRecord *, WindowPtr)); -static void FDECL(macClickMenu, (EventRecord *, WindowPtr)); -static void FDECL(macClickText, (EventRecord *, WindowPtr)); - -static short FDECL(macDoNull, (EventRecord *, WindowPtr)); -static short FDECL(macUpdateMessage, (EventRecord *, WindowPtr)); -static short FDECL(macUpdateMenu, (EventRecord *, WindowPtr)); -static short FDECL(GeneralUpdate, (EventRecord *, WindowPtr)); - -static void FDECL(macCursorTerm, (EventRecord *, WindowPtr, RgnHandle)); -static void FDECL(GeneralCursor, (EventRecord *, WindowPtr, RgnHandle)); -#endif - -static void TextUpdate(NhWindow *wind); - -NhWindow *theWindows = (NhWindow *) 0; -Cursor qdarrow; - -/* Borrowed from the Mac tty port */ -extern WindowPtr _mt_window; - -/* Some useful #defines for the scroll bar width and height */ -#define SBARWIDTH 15 -#define SBARHEIGHT 15 - -/* - * We put a TE on the message window for the "top line" queries. - * top_line is the TE that holds both the query and the user's - * response. The first topl_query_len characters in top_line are - * the query, the rests are the response. topl_resp is the valid - * response to a yn query, while topl_resp[topl_def_idx] is the - * default response to a yn query. - */ -static TEHandle top_line = (TEHandle) nil; -static int topl_query_len; -static int topl_def_idx = -1; -static char topl_resp[10] = ""; - -#define CHAR_ANY '\n' - -/* - * inSelect means we have a menu window up for selection or - * something similar. It makes the window with win number == - * inSelect a movable modal (unfortunately without the border) - * and clicking the close box forces an RET into the key - * buffer. Don't forget to set inSelect to WIN_ERR when you're - * done... - */ -static winid inSelect = WIN_ERR; - -/* - * The key queue ring buffer where Read is where to take from, - * Write is where next char goes and count is queue depth. - */ -static unsigned char keyQueue[QUEUE_LEN]; -static int keyQueueRead = 0, keyQueueWrite = 0, keyQueueCount = 0; - -static Boolean gClickedToMove = 0; /* For ObscureCursor */ - -static Point clicked_pos; /* For nh_poskey */ -static int clicked_mod; -static Boolean cursor_locked = false; - -static ControlActionUPP - MoveScrollUPP; /* scrolling callback, init'ed in InitMac */ - -void -lock_mouse_cursor(Boolean new_cursor_locked) -{ - cursor_locked = new_cursor_locked; -} - -/* - * Add key to input queue, force means flush left and replace if full - */ -void -AddToKeyQueue(unsigned char ch, Boolean force) -{ - if (keyQueueCount < QUEUE_LEN) { - keyQueue[keyQueueWrite++] = ch; - keyQueueCount++; - } else if (force) { - keyQueue[keyQueueWrite++] = ch; - keyQueueRead++; - if (keyQueueRead >= QUEUE_LEN) - keyQueueRead = 0; - keyQueueCount = QUEUE_LEN; - } - if (keyQueueWrite >= QUEUE_LEN) - keyQueueWrite = 0; -} - -/* - * Get key from queue - */ -unsigned char -GetFromKeyQueue(void) -{ - unsigned char ret; - - if (keyQueueCount) { - ret = keyQueue[keyQueueRead++]; - keyQueueCount--; - if (keyQueueRead >= QUEUE_LEN) - keyQueueRead = 0; - } else - ret = 0; - return ret; -} - -/* - * Cursor movement - */ -static RgnHandle gMouseRgn = (RgnHandle) 0; - -/* - * _Gestalt madness - we rely heavily on the _Gestalt glue, since we - * don't check for the trap... - */ -MacFlags macFlags; - -/* - * The screen layouts on the small 512x342 screen need special cares. - */ -Boolean small_screen = 0; - -#ifdef NHW_BASE -#undef NHW_BASE -#endif -#define NHW_BASE 0 - -static int FDECL(filter_scroll_key, (const int, NhWindow *)); - -#if 1 //!TARGET_API_MAC_CARBON -static void FDECL(DoScrollBar, (Point, short, ControlHandle, NhWindow *)); -#endif -static pascal void FDECL(MoveScrollBar, (ControlHandle, short)); - -#if 1 //!TARGET_API_MAC_CARBON -typedef void (*CbFunc)(EventRecord *, WindowPtr); -typedef short (*CbUpFunc)(EventRecord *, WindowPtr); -typedef void (*CbCursFunc)(EventRecord *, WindowPtr, RgnHandle); - -#define NUM_FUNCS 6 -static const CbFunc winKeyFuncs[NUM_FUNCS] = { GeneralKey, GeneralKey, - GeneralKey, GeneralKey, - macKeyMenu, macKeyText }; - -static const CbFunc winClickFuncs[NUM_FUNCS] = { - (CbFunc) macDoNull, macClickMessage, macClickTerm, - macClickTerm, macClickMenu, macClickText -}; - -static const CbUpFunc winUpdateFuncs[NUM_FUNCS] = { - macDoNull, macUpdateMessage, image_tty, - image_tty, macUpdateMenu, GeneralUpdate -}; - -static const CbCursFunc winCursorFuncs[NUM_FUNCS] = { - (CbCursFunc) macDoNull, GeneralCursor, macCursorTerm, - macCursorTerm, GeneralCursor, GeneralCursor -}; -#endif - -static NhWindow * -GetNhWin(WindowPtr mac_win) -{ - if (mac_win == _mt_window) /* term window is still maintained by both - systems, and */ - return theWindows; /* WRefCon still refers to tty struct, so we have - to map it */ - else { - NhWindow *aWin = (NhWindow *) GetWRefCon(mac_win); - if (aWin >= theWindows && aWin < &theWindows[NUM_MACWINDOWS]) - return aWin; - } - return ((NhWindow *) nil); -} - -Boolean -CheckNhWin(WindowPtr mac_win) -{ - return GetNhWin(mac_win) != nil; -} - -static pascal OSErr -AppleEventHandler(const AppleEvent *inAppleEvent, AppleEvent *outAEReply, - long inRefCon) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(outAEReply, inRefCon) -#endif - Size actualSize; - DescType typeCode; - AEEventID EventID; - OSErr err; - - /* Get Event ID */ - err = AEGetAttributePtr(inAppleEvent, keyEventIDAttr, typeType, &typeCode, - &EventID, sizeof(EventID), &actualSize); - if (err == noErr) { - switch (EventID) { - default: - case kAEOpenApplication: - macFlags.gotOpen = 1; - /* fall through */ - case kAEPrintDocuments: - err = errAEEventNotHandled; - break; - case kAEQuitApplication: - /* Flush key queue */ - keyQueueCount = keyQueueWrite = keyQueueRead = 0; - AddToKeyQueue('S', 1); - break; - case kAEOpenDocuments: { - FSSpec fss; - FInfo fndrInfo; - AEKeyword keywd; - AEDescList docList; - long index, itemsInList; - - if ((err = AEGetParamDesc(inAppleEvent, keyDirectObject, - typeAEList, &docList)) != noErr - || (err = AECountItems(&docList, &itemsInList)) != noErr) { - if (err == errAEDescNotFound) - itemsInList = 0; - else - break; - } - - for (index = 1; index <= itemsInList; index++) { - err = AEGetNthPtr(&docList, index, typeFSS, &keywd, &typeCode, - (Ptr) &fss, sizeof(FSSpec), &actualSize); - if (noErr != err) - break; - - err = FSpGetFInfo(&fss, &fndrInfo); - if (noErr != err) - break; - - if (fndrInfo.fdType != SAVE_TYPE) - continue; /* only look at save files */ - - process_openfile(fss.vRefNum, fss.parID, fss.name, - fndrInfo.fdType); - if (macFlags.gotOpen) - break; /* got our save file */ - } - err = AEDisposeDesc(&docList); - break; - } - } - } - - /* Check to see if all required parameters for this type of event are - * present */ - if (err == noErr) { - err = - AEGetAttributePtr(inAppleEvent, keyMissedKeywordAttr, - typeWildCard, &typeCode, NULL, 0, &actualSize); - if (err == errAEDescNotFound) - err = noErr; /* got all the required parameters */ - else if (err == noErr) /* missed a required parameter */ - err = errAEEventNotHandled; - } - - return err; -} - -short win_fonts[NHW_TEXT + 1]; - -void -InitMac(void) -{ - short i; - long l; - Str255 volName; - -#if !TARGET_API_MAC_CARBON - if (LMGetDefltStack() < 50 * 1024L) { - SetApplLimit((void *) ((long) LMGetCurStackBase() - (50 * 1024L))); - } - MaxApplZone(); - for (i = 0; i < 5; i++) - MoreMasters(); - - InitGraf(&qd.thePort); - InitFonts(); - InitWindows(); - InitMenus(); - InitDialogs(0L); - TEInit(); -#endif - - memset(&macFlags, 0, sizeof(macFlags)); - if (!Gestalt(gestaltOSAttr, &l)) { - macFlags.processes = (l & (1 << gestaltLaunchControl)) ? 1 : 0; - macFlags.tempMem = (l & (1 << gestaltRealTempMemory)) ? 1 : 0; - macFlags.hasDebugger = (l & (1 << gestaltSysDebuggerSupport)) ? 1 : 0; - } - if (!Gestalt(gestaltQuickdrawVersion, &l)) - macFlags.color = (l >= gestalt8BitQD) ? 1 : 0; - - if (!Gestalt(gestaltFindFolderAttr, &l)) - macFlags.folders = (l & (1 << gestaltFindFolderPresent)) ? 1 : 0; - - if (!Gestalt(gestaltHelpMgrAttr, &l)) - macFlags.help = (l & (1 << gestaltHelpMgrPresent)) ? 1 : 0; - - if (!Gestalt(gestaltFSAttr, &l)) - macFlags.fsSpec = (l & (1 << gestaltHasFSSpecCalls)) ? 1 : 0; - - if (!Gestalt(gestaltFontMgrAttr, &l)) - macFlags.trueType = (l & (1 << gestaltOutlineFonts)) ? 1 : 0; - - if (!Gestalt(gestaltAUXVersion, &l)) - macFlags.aux = (l >= 0x200) ? 1 : 0; - - if (!Gestalt(gestaltAliasMgrAttr, &l)) - macFlags.alias = (l & (1 << gestaltAliasMgrPresent)) ? 1 : 0; - - if (!Gestalt(gestaltStandardFileAttr, &l)) - macFlags.standardFile = (l & (1 << gestaltStandardFile58)) ? 1 : 0; - - gMouseRgn = NewRgn(); - InitCursor(); - GetQDGlobalsArrow(&qdarrow); - ObscureCursor(); - - MoveScrollUPP = NewControlActionUPP(MoveScrollBar); - - /* Set up base fonts for all window types */ - GetFNum("\pHackFont", &i); - if (i == 0) - i = kFontIDMonaco; - win_fonts[NHW_BASE] = win_fonts[NHW_MAP] = win_fonts[NHW_STATUS] = i; - GetFNum("\pPSHackFont", &i); - if (i == 0) - i = kFontIDGeneva; - win_fonts[NHW_MESSAGE] = i; - win_fonts[NHW_TEXT] = kFontIDGeneva; - - macFlags.hasAE = 0; - if (!Gestalt(gestaltAppleEventsAttr, &l) - && (l & (1L << gestaltAppleEventsPresent))) { - if (AEInstallEventHandler(kCoreEventClass, typeWildCard, - NewAEEventHandlerUPP(AppleEventHandler), 0, - FALSE) == noErr) - macFlags.hasAE = 1; - } - -#if TARGET_API_MAC_CARBON - HGetVol(volName, &theDirs.dataRefNum, &theDirs.dataDirID); -#else - /* - * We should try to get this data from a rsrc, in the profile file - * the user double-clicked... This data should be saved with the - * save file in the resource fork, AND be saveable in "stationary" - */ - GetVol(volName, &theDirs.dataRefNum); - GetWDInfo(theDirs.dataRefNum, &theDirs.dataRefNum, &theDirs.dataDirID, - &l); -#endif - if (volName[0] > 31) - volName[0] = 31; - for (l = 1; l <= volName[0]; l++) { - if (volName[l] == ':') { - volName[l] = 0; - volName[0] = l - 1; - break; - } - } - BlockMove(volName, theDirs.dataName, l); - BlockMove(volName, theDirs.saveName, l); - BlockMove(volName, theDirs.levelName, l); - theDirs.saveRefNum = theDirs.levelRefNum = theDirs.dataRefNum; - theDirs.saveDirID = theDirs.levelDirID = theDirs.dataDirID; - - /* Create the "record" file, if necessary */ - check_recordfile(""); - -#if 0 // TARGET_API_MAC_CARBON - /* Create event handler universal procedure pointers */ - dispatcher = GetEventDispatcherTarget(); - baseupp = NewEventHandlerUPP(BaseEvent); - msgupp = NewEventHandlerUPP(MsgEvent); - menwupp = NewEventHandlerUPP(MenwEvent); - textupp = NewEventHandlerUPP(TextEvent); - InstallApplicationEventHandler(NewEventHandlerUPP(GlobalEvent), - sizeof(globalevents)/sizeof(EventTypeSpec), globalevents, NULL, NULL); -#endif - return; -} - -/* - * Change default window fonts. - */ -short -set_tty_font_name(int window_type, char *font_name) -{ - short fnum; - Str255 new_font; - - if (window_type < NHW_BASE || window_type > NHW_TEXT) - return general_failure; - - C2P(font_name, new_font); - GetFNum(new_font, &(fnum)); - if (!fnum) - return general_failure; - win_fonts[window_type] = fnum; - return noErr; -} - -static void -DrawScrollbar(NhWindow *aWin) -{ - WindowPtr theWindow = aWin->its_window; - Rect crect, wrect; - Boolean vis; - short val, lin, win_height; - - if (!aWin->scrollBar) - return; - GetControlBounds(aWin->scrollBar, &crect); - GetWindowBounds(aWin->its_window, kWindowContentRgn, &wrect); - OffsetRect(&wrect, -wrect.left, -wrect.top); - win_height = wrect.bottom - wrect.top; - - if (crect.top != wrect.top - 1 || crect.left != wrect.right - SBARWIDTH) { - MoveControl(aWin->scrollBar, wrect.right - SBARWIDTH, wrect.top - 1); - } - if (crect.bottom != wrect.bottom - SBARHEIGHT - || crect.right != wrect.right + 1) { - SizeControl(aWin->scrollBar, SBARWIDTH + 1, - win_height - SBARHEIGHT + 2); - } - vis = (win_height > (50 + SBARHEIGHT)); - if (vis != IsControlVisible(aWin->scrollBar)) { - /* current status != control */ - if (vis) /* if visible, show */ - ShowControl(aWin->scrollBar); - else /* else hide */ - HideControl(aWin->scrollBar); - } - lin = aWin->y_size; - if (aWin == theWindows + WIN_MESSAGE) { - /* calculate how big scroll bar is for message window */ - lin -= (win_height - SBARHEIGHT) / aWin->row_height; - if (lin < 0) - lin = 0; - val = 0; /* always have message scrollbar active */ - } else { - /* calculate how big scroll bar is for other windows */ - lin -= win_height / aWin->row_height; - if (lin < 0) - lin = 0; - if (lin) - val = 0; /* if there are 1+ screen lines, activate scrollbar */ - else - val = 255; /* else grey it out */ - } - SetControlMaximum(aWin->scrollBar, lin); - HiliteControl(aWin->scrollBar, val); - val = GetControlValue(aWin->scrollBar); - if (val != aWin->scrollPos) { - InvalWindowRect(theWindow, &wrect); - aWin->scrollPos = val; - } -} - -#define MAX_HEIGHT 100 -#define MIN_HEIGHT 50 -#define MIN_WIDTH 300 - -/* - * This function could be overloaded with any amount of intelligence... - */ -int -SanePositions(void) -{ -#if TARGET_API_MAC_CARBON - Rect rbase, rmsg; - SInt16 i, width, height; - - ConstrainWindowToScreen(_mt_window, kWindowContentRgn, - kWindowConstrainMoveRegardlessOfFit, NULL, NULL); - GetWindowBounds(_mt_window, kWindowContentRgn, &rbase); - if (RetrievePosition(kMapWindow, &rbase.top, &rbase.left)) - MoveWindow(_mt_window, rbase.left, rbase.top, TRUE); - - GetWindowBounds(theWindows[NHW_MESSAGE].its_window, kWindowContentRgn, - &rmsg); - height = rmsg.bottom - rmsg.top; - rmsg.top = rbase.bottom + 2; - rmsg.bottom = rmsg.top + height; - rmsg.left = rbase.left; - rmsg.right = rbase.right; - RetrievePosition(kMessageWindow, &rmsg.top, &rmsg.left); - if (RetrieveSize(kMessageWindow, rmsg.top, rmsg.left, &height, &width)) { - rmsg.right = rmsg.left + width; - rmsg.bottom = rmsg.top + height; - } - SetWindowBounds(theWindows[NHW_MESSAGE].its_window, kWindowContentRgn, - &rmsg); - ConstrainWindowToScreen(theWindows[NHW_MESSAGE].its_window, - kWindowContentRgn, - kWindowConstrainMoveRegardlessOfFit, NULL, NULL); - DrawScrollbar(&theWindows[NHW_MESSAGE]); - - for (i = 0; i < NUM_MACWINDOWS; i++) - if (i != WIN_STATUS && i != WIN_MESSAGE && i != WIN_MAP - && i != BASE_WINDOW && theWindows[i].its_window) { - /* FIXME */ - ConstrainWindowToScreen( - theWindows[i].its_window, kWindowContentRgn, - kWindowConstrainMoveRegardlessOfFit, NULL, NULL); - } -#else - short left, top, width, height; - int ix, numText = 0, numMenu = 0; - int mbar_height = GetMBarHeight(); - BitMap qbitmap; - Rect screenArea; - WindowPtr theWindow; - NhWindow *nhWin; - - screenArea = GetQDGlobalsScreenBits(&qbitmap)->bounds; - OffsetRect(&screenArea, -screenArea.left, -screenArea.top); - - /* Map Window */ - height = _mt_window->portRect.bottom - _mt_window->portRect.top; - width = _mt_window->portRect.right - _mt_window->portRect.left; - - if (!RetrievePosition(kMapWindow, &top, &left)) { - top = mbar_height + (small_screen ? 2 : 20); - left = (screenArea.right - width) / 2; - } - MoveWindow(_mt_window, left, top, 1); - - /* Message Window */ - if (!RetrievePosition(kMessageWindow, &top, &left)) { - top += height; - if (!small_screen) - top += 20; - } - - if (!RetrieveSize(kMessageWindow, top, left, &height, &width)) { - height = - screenArea.bottom - top - (small_screen ? 2 - SBARHEIGHT : 2); - if (height > MAX_HEIGHT) { - height = MAX_HEIGHT; - } else if (height < MIN_HEIGHT) { - height = MIN_HEIGHT; - width = MIN_WIDTH; - left = screenArea.right - width; - top = screenArea.bottom - MIN_HEIGHT; - } - } - - /* Move these windows */ - nhWin = theWindows + WIN_MESSAGE; - theWindow = nhWin->its_window; - - MoveWindow(theWindow, left, top, 1); - SizeWindow(theWindow, width, height, 1); - if (nhWin->scrollBar) - DrawScrollbar(nhWin); - - /* Handle other windows */ - for (ix = 0; ix < NUM_MACWINDOWS; ix++) { - if (ix != WIN_STATUS && ix != WIN_MESSAGE && ix != WIN_MAP - && ix != BASE_WINDOW) { - theWindow = theWindows[ix].its_window; - if (theWindow && ((WindowPeek) theWindow)->visible) { - int shift; - if (((WindowPeek) theWindow)->windowKind - == WIN_BASE_KIND + NHW_MENU) { - if (!RetrievePosition(kMenuWindow, &top, &left)) { - top = mbar_height * 2; - left = 2; - } - top += (numMenu * mbar_height); - numMenu++; - shift = 20; - } else { - if (!RetrievePosition(kTextWindow, &top, &left)) { - top = mbar_height * 2; - left = screenArea.right - 3 - - (theWindow->portRect.right - - theWindow->portRect.left); - } - top += (numText * mbar_height); - numText++; - shift = -20; - } - while (top > screenArea.bottom - MIN_HEIGHT) { - top -= screenArea.bottom - mbar_height * 2; - left += shift; - } - MoveWindow(theWindow, left, top, 1); - } - } - } -#endif - return (0); -} - -void -mac_init_nhwindows(int *argcp, char **argv) -{ - Rect r; -#if !TARGET_API_MAC_CARBON - Rect scr = (*GetGrayRgn())->rgnBBox; - small_screen = - scr.bottom - scr.top <= (iflags.large_font ? 12 * 40 : 9 * 40); -#endif - - InitMenuRes(); - - theWindows = (NhWindow *) NewPtrClear(NUM_MACWINDOWS * sizeof(NhWindow)); - if (MemError()) - error("mac_init_nhwindows: Couldn't allocate memory for windows."); - - DimMenuBar(); - - tty_init_nhwindows(argcp, argv); - iflags.window_inited = TRUE; - - /* Some ugly hacks to make both interfaces happy: - * Mac port uses both tty interface (for main map) and extra windows. The - * winids need to - * be kept in synch for both interfaces to map. Also, the "blocked" - * display_nhwindow case - * for the map automatically calls the tty interface for the message box, - * so some version - * of the message box has to exist in the tty world to prevent a meltdown, - * even though most - * messages are handled in mac window. - */ - mac_create_nhwindow(NHW_BASE); - tty_create_nhwindow(NHW_MESSAGE); - -#if 1 //!TARGET_API_MAC_CARBON - /* Resize and reposition the message window */ - RetrievePosition(kMessageWindow, &r.top, &r.left); - RetrieveSize(kMessageWindow, r.top, r.left, &r.bottom, &r.right); - MoveWindow(theWindows[NHW_MESSAGE].its_window, r.left, r.top, false); - SizeWindow(theWindows[NHW_MESSAGE].its_window, r.right, r.bottom, true); -#endif - return; -} - -winid -mac_create_nhwindow(int kind) -{ - int i; - NhWindow *aWin; - FontInfo fi; - - if (kind < NHW_BASE || kind > NHW_TEXT) { - error("cre_win: Invalid kind %d.", kind); - return WIN_ERR; - } - - for (i = 0; i < NUM_MACWINDOWS; i++) { - if (!theWindows[i].its_window) - break; - } - if (i >= NUM_MACWINDOWS) { - error("cre_win: Win full; freeing extras"); - for (i = 0; i < NUM_MACWINDOWS; i++) { - if (IsWindowVisible(theWindows[i].its_window) || i == WIN_INVEN - || GetWindowKind(theWindows[i].its_window) - != WIN_BASE_KIND + NHW_MENU - && GetWindowKind(theWindows[i].its_window) - != WIN_BASE_KIND + NHW_TEXT) - continue; - mac_destroy_nhwindow(i); - goto got1; - } - error("cre_win: Out of ids!"); - return WIN_ERR; - } - -got1: - aWin = &theWindows[i]; - aWin->windowTextLen = 0L; - aWin->scrollBar = (ControlHandle) 0; - aWin->menuInfo = 0; - aWin->menuSelected = 0; - aWin->miLen = 0; - aWin->miSize = 0; - aWin->menuChar = 'a'; - - dprintf("cre_win: New kind %d", kind); - - if (kind == NHW_BASE || kind == NHW_MAP || kind == NHW_STATUS) { - short x_sz, x_sz_p, y_sz, y_sz_p; - if (kind != NHW_BASE) { - if (i != tty_create_nhwindow(kind)) { - dprintf("cre_win: error creating kind %d", kind); - } - if (kind == NHW_MAP) { - wins[i]->offy = - 0; /* the message box is in a separate window */ - } - } - aWin->its_window = _mt_window; - get_tty_metrics(aWin->its_window, &x_sz, &y_sz, &x_sz_p, &y_sz_p, - &aWin->font_number, &aWin->font_size, - &aWin->char_width, &aWin->row_height); -#if 0 // TARGET_API_MAC_CARBON - InstallWindowEventHandler(aWin->its_window, baseupp, - sizeof(baseevents)/sizeof(EventTypeSpec), baseevents, - (void *)aWin, NULL); -#endif - return i; - } - - aWin->its_window = - GetNewWindow(WIN_BASE_RES + kind, (WindowPtr) 0L, (WindowPtr) -1L); - SetWindowKind(aWin->its_window, WIN_BASE_KIND + kind); - SetWRefCon(aWin->its_window, (long) aWin); - if (!(aWin->windowText = NewHandle(TEXT_BLOCK))) { - error("cre_win: NewHandle fail(%ld)", (long) TEXT_BLOCK); - DisposeWindow(aWin->its_window); - aWin->its_window = (WindowPtr) 0; - return WIN_ERR; - } - aWin->x_size = aWin->y_size = 0; - aWin->x_curs = aWin->y_curs = 0; - aWin->drawn = TRUE; - mac_clear_nhwindow(i); -#if 0 // TARGET_API_MAC_CARBON - switch (kind) { - case NHW_MESSAGE: - InstallWindowEventHandler(aWin->its_window, msgupp, - sizeof(msgevents)/sizeof(EventTypeSpec), msgevents, - (void *)aWin, NULL); - break; - case NHW_MENU: - InstallWindowEventHandler(aWin->its_window, menwupp, - sizeof(menwevents)/sizeof(EventTypeSpec), menwevents, - (void *)aWin, NULL); - break; - case NHW_TEXT: - InstallWindowEventHandler(aWin->its_window, textupp, - sizeof(textevents)/sizeof(EventTypeSpec), textevents, - (void *)aWin, NULL); - break; - } -#endif - - SetPortWindowPort(aWin->its_window); - - if (kind == NHW_MESSAGE) { - aWin->font_number = win_fonts[NHW_MESSAGE]; - aWin->font_size = iflags.wc_fontsiz_message - ? iflags.wc_fontsiz_message - : iflags.large_font ? 12 : 9; - if (!top_line) { - const Rect out_of_scr = { 10000, 10000, 10100, 10100 }; - TextFont(aWin->font_number); - TextSize(aWin->font_size); - TextFace(bold); - top_line = TENew(&out_of_scr, &out_of_scr); - TEActivate(top_line); - TextFace(normal); - } - } else { - aWin->font_number = win_fonts[NHW_TEXT]; - aWin->font_size = iflags.wc_fontsiz_text ? iflags.wc_fontsiz_text : 9; - } - - TextFont(aWin->font_number); - TextSize(aWin->font_size); - - GetFontInfo(&fi); - aWin->ascent_height = fi.ascent + fi.leading; - aWin->row_height = aWin->ascent_height + fi.descent; - aWin->char_width = fi.widMax; - - if (kind == NHW_MENU || kind == NHW_TEXT || kind == NHW_MESSAGE) { - Rect r; - - GetWindowBounds(aWin->its_window, kWindowContentRgn, &r); - r.right -= (r.left - 1); - r.left = r.right - SBARWIDTH; - r.bottom -= (r.top + SBARHEIGHT); - r.top = -1; - aWin->scrollBar = - NewControl(aWin->its_window, &r, "\p", (r.bottom > r.top + 50), 0, - 0, 0, 16, 0L); - aWin->scrollPos = 0; - } - return i; -} - -void -mac_clear_nhwindow(winid win) -{ - long l; - Rect r; - NhWindow *aWin = &theWindows[win]; - WindowPtr theWindow = aWin->its_window; - - if (win < 0 || win >= NUM_MACWINDOWS || !theWindow) { - error("clr_win: Invalid win %d.", win); - return; - } - if (theWindow == _mt_window) { - tty_clear_nhwindow(win); - return; - } - if (!aWin->drawn) - return; - - SetPortWindowPort(theWindow); - GetWindowBounds(theWindow, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - if (aWin->scrollBar) - r.right -= SBARWIDTH; - - switch (GetWindowKind(theWindow) - WIN_BASE_KIND) { - case NHW_MESSAGE: - if (aWin->scrollPos - == aWin->y_size - 1) /* if no change since last clear */ - return; /* don't bother with redraw */ - r.bottom -= SBARHEIGHT; - for (l = 0; aWin->y_size > iflags.msg_history;) { - const char cr = CHAR_CR; - l = Munger(aWin->windowText, l, &cr, 1, nil, 0) + 1; - --aWin->y_size; - } - if (l) { - aWin->windowTextLen -= l; - BlockMove(*aWin->windowText + l, *aWin->windowText, - aWin->windowTextLen); - } - aWin->last_more_lin = aWin->y_size; - aWin->save_lin = aWin->y_size; - aWin->scrollPos = aWin->y_size ? aWin->y_size - 1 : 0; - break; - case NHW_MENU: - if (aWin->menuInfo) { - DisposeHandle((Handle) aWin->menuInfo); - aWin->menuInfo = NULL; - } - if (aWin->menuSelected) { - DisposeHandle((Handle) aWin->menuSelected); - aWin->menuSelected = NULL; - } - aWin->menuChar = 'a'; - aWin->miSelLen = 0; - aWin->miLen = 0; - aWin->miSize = 0; - /* Fall-Through */ - default: - SetHandleSize(aWin->windowText, TEXT_BLOCK); - aWin->windowTextLen = 0L; - aWin->x_size = 0; - aWin->y_size = 0; - aWin->scrollPos = 0; - break; - } - if (aWin->scrollBar) { - SetControlMaximum(aWin->scrollBar, aWin->y_size); - SetControlValue(aWin->scrollBar, aWin->scrollPos); - } - aWin->y_curs = 0; - aWin->x_curs = 0; - aWin->drawn = FALSE; - InvalWindowRect(theWindow, &r); -} - -static Boolean -ClosingWindowChar(const int c) -{ - return (c == CHAR_ESC || c == CHAR_BLANK || c == CHAR_LF || c == CHAR_CR); -} - -static Boolean -in_topl_mode(void) -{ - Rect rect; - - GetWindowBounds(theWindows[WIN_MESSAGE].its_window, kWindowContentRgn, - &rect); - OffsetRect(&rect, -rect.left, -rect.top); - return (WIN_MESSAGE != WIN_ERR && top_line - && (*top_line)->viewRect.left < rect.right); -} - -#define BTN_IND 2 -#define BTN_W 40 -#define BTN_H (SBARHEIGHT - 3) - -static void -topl_resp_rect(int resp_idx, Rect *r) -{ - Rect rect; - - GetWindowBounds(theWindows[WIN_MESSAGE].its_window, kWindowContentRgn, - &rect); - OffsetRect(&rect, -rect.left, -rect.top); - r->left = (BTN_IND + BTN_W) * resp_idx + BTN_IND; - r->right = r->left + BTN_W; - r->bottom = rect.bottom - 1; - r->top = r->bottom - BTN_H; - return; -} - -void -enter_topl_mode(char *query) -{ - if (in_topl_mode()) - return; - - putstr(WIN_MESSAGE, ATR_BOLD, query); - - topl_query_len = strlen(query); - (*top_line)->selStart = topl_query_len; - (*top_line)->selEnd = topl_query_len; - (*top_line)->viewRect.left = 0; - PtrToXHand(query, (*top_line)->hText, topl_query_len); - TECalText(top_line); - - DimMenuBar(); - mac_display_nhwindow(WIN_MESSAGE, FALSE); -} - -void -leave_topl_mode(char *answer) -{ - /*unsigned*/ char *ap, *bp; - - int ans_len = (*top_line)->teLength - topl_query_len; - NhWindow *aWin = theWindows + WIN_MESSAGE; - - if (!in_topl_mode()) - return; - - /* Cap length of reply */ - if (ans_len >= BUFSZ) - ans_len = BUFSZ - 1; - - /* remove unprintables from the answer */ - for (ap = *(*top_line)->hText + topl_query_len, bp = answer; ans_len > 0; - ans_len--, ap++) { - if (*ap >= ' ' && *ap < 128) { - *bp++ = *ap; - } - } - *bp = 0; - - if (aWin->windowTextLen - && (*aWin->windowText)[aWin->windowTextLen - 1] == CHAR_CR) { - --aWin->windowTextLen; - --aWin->y_size; - } - putstr(WIN_MESSAGE, ATR_BOLD, answer); - - (*top_line)->viewRect.left += 10000; - UndimMenuBar(); -} - -/* - * TESetSelect flushes out all the pending key strokes. I hate it. - */ -static void -topl_set_select(short selStart, short selEnd) -{ - TEDeactivate(top_line); - (*top_line)->selStart = selStart; - (*top_line)->selEnd = selEnd; - TEActivate(top_line); -} - -static void -topl_replace(char *new_ans) -{ - topl_set_select(topl_query_len, (*top_line)->teLength); - TEDelete(top_line); - TEInsert(new_ans, strlen(new_ans), top_line); -} - -Boolean -topl_key(unsigned char ch, Boolean ext) -{ - switch (ch) { - case CHAR_ESC: - topl_replace("\x1b"); - case CHAR_ENTER: - case CHAR_CR: - case CHAR_LF: - return false; - - case 0x1f & 'P': - mac_doprev_message(); - return true; - case '\x1e' /* up arrow */: - topl_replace(""); - return true; - case CHAR_BS: - case '\x1c' /* left arrow */: - if ((*top_line)->selEnd <= topl_query_len) - return true; - else if (ext) { - topl_replace(""); - return true; - } - default: - TEKey(ch, top_line); - if (ext) { - int com_index = -1, oindex = 0; - while (extcmdlist[oindex].ef_txt != (char *) 0) { - if (!strncmpi(*(*top_line)->hText + topl_query_len, - extcmdlist[oindex].ef_txt, - (*top_line)->teLength - topl_query_len)) { - if (com_index == -1) /* No matches yet*/ - com_index = oindex; - else /* More than 1 match */ { - com_index = -2; - break; - } - } - oindex++; - } - if (com_index >= 0) - topl_replace((char *) extcmdlist[com_index].ef_txt); - } - return true; - } -} - -static void -topl_flash_resp(int resp_idx) -{ - unsigned long dont_care; - Rect frame; - SetPortWindowPort(theWindows[WIN_MESSAGE].its_window); - topl_resp_rect(resp_idx, &frame); - InsetRect(&frame, 1, 1); - InvertRect(&frame); - Delay(GetDblTime() / 2, &dont_care); - InvertRect(&frame); -} - -static void -topl_set_def(int new_def_idx) -{ - Rect frame; - SetPortWindowPort(theWindows[WIN_MESSAGE].its_window); - topl_resp_rect(topl_def_idx, &frame); - InvalWindowRect(theWindows[WIN_MESSAGE].its_window, &frame); - topl_def_idx = new_def_idx; - topl_resp_rect(new_def_idx, &frame); - InvalWindowRect(theWindows[WIN_MESSAGE].its_window, &frame); -} - -void -topl_set_resp(char *resp, char def) -{ - char *loc; - Rect frame; - int r_len, r_len1; - - if (!resp) { - const char any_str[2] = { CHAR_ANY, '\0' }; - resp = (char *) any_str; - def = CHAR_ANY; - } - - SetPortWindowPort(theWindows[WIN_MESSAGE].its_window); - r_len1 = strlen(resp); - r_len = strlen(topl_resp); - if (r_len < r_len1) - r_len = r_len1; - topl_resp_rect(0, &frame); - frame.right = (BTN_IND + BTN_W) * r_len; - InvalWindowRect(theWindows[WIN_MESSAGE].its_window, &frame); - - strcpy(topl_resp, resp); - loc = strchr(resp, def); - topl_def_idx = loc ? loc - resp : -1; -} - -static char -topl_resp_key(char ch) -{ - if (strlen(topl_resp) > 0) { - char *loc = strchr(topl_resp, ch); - - if (!loc) { - if (ch == '\x9' /* tab */) { - topl_set_def(topl_def_idx <= 0 ? strlen(topl_resp) - 1 - : topl_def_idx - 1); - ch = '\0'; - } else if (ch == CHAR_ESC) { - loc = strchr(topl_resp, 'q'); - if (!loc) { - loc = strchr(topl_resp, 'n'); - if (!loc && topl_def_idx >= 0) - loc = topl_resp + topl_def_idx; - } - } else if (ch == (0x1f & 'P')) { - mac_doprev_message(); - ch = '\0'; - } else if (topl_def_idx >= 0) { - if (ch == CHAR_ENTER || ch == CHAR_CR || ch == CHAR_LF - || ch == CHAR_BLANK - || topl_resp[topl_def_idx] == CHAR_ANY) - loc = topl_resp + topl_def_idx; - - else if (strchr(topl_resp, '#')) { - if (digit(ch)) { - topl_set_def(strchr(topl_resp, '#') - topl_resp); - TEKey(ch, top_line); - ch = '\0'; - - } else if (topl_resp[topl_def_idx] == '#') { - if (ch == '\x1e' /* up arrow */) { - topl_set_select(topl_query_len, topl_query_len); - ch = '\0'; - } else if (ch == '\x1d' /* right arrow */ - || ch == '\x1f' /* down arrow */ - || ch == CHAR_BS - || ch == '\x1c' /* left arrow */ - && (*top_line)->selEnd - > topl_query_len) { - TEKey(ch, top_line); - ch = '\0'; - } - } - } - } - } - - if (loc) { - topl_flash_resp(loc - topl_resp); - if (*loc != CHAR_ANY) - ch = *loc; - TEKey(ch, top_line); - } - } - - return ch; -} - -static void -adjust_window_pos(NhWindow *aWin, short width, short height) -{ - WindowRef theWindow = aWin->its_window; -#if TARGET_API_MAC_CARBON - Rect r; - - GetWindowBounds(theWindow, kWindowContentRgn, &r); - RetrieveWinPos(theWindow, &r.top, &r.left); - MoveWindow(theWindow, r.left, r.top, false); - SizeWindow(theWindow, width, height, true); - ConstrainWindowToScreen(theWindow, kWindowStructureRgn, - kWindowConstrainMayResize - | kWindowConstrainMoveRegardlessOfFit, - NULL, NULL); -#else - Rect scr_r = (*GetGrayRgn())->rgnBBox; - const Rect win_ind = { 2, 2, 3, 3 }; - const short min_w = theWindow->portRect.right - theWindow->portRect.left, - max_w = - scr_r.right - scr_r.left - win_ind.left - win_ind.right; - Point pos; - short max_h; - - SetPortWindowPort(theWindow); - if (!RetrieveWinPos(theWindow, &pos.v, &pos.h)) { - pos.v = 0; /* take window's existing position */ - pos.h = 0; - LocalToGlobal(&pos); - } - - max_h = scr_r.bottom - win_ind.bottom - pos.v; - if (height > max_h) - height = max_h; - if (height < MIN_HEIGHT) - height = MIN_HEIGHT; - if (width < min_w) - width = min_w; - if (width > max_w) - width = max_w; - SizeWindow(theWindow, width, height, true); - - if (pos.v + height + win_ind.bottom > scr_r.bottom) - pos.v = scr_r.bottom - height - win_ind.bottom; - if (pos.h + width + win_ind.right > scr_r.right) - pos.h = scr_r.right - width - win_ind.right; - MoveWindow(theWindow, pos.h, pos.v, false); -#endif - if (aWin->scrollBar) - DrawScrollbar(aWin); - return; -} - -/* - * display/select/update the window. - * If f is true, this window should be "modal" - don't return - * until presumed seen. - */ -void -mac_display_nhwindow(winid win, BOOLEAN_P f) -{ - NhWindow *aWin = &theWindows[win]; - WindowPtr theWindow = aWin->its_window; - - if (win < 0 || win >= NUM_MACWINDOWS || !theWindow) { - error("disp_win: Invalid window %d.", win); - return; - } - - if (theWindow == _mt_window) { - tty_display_nhwindow(win, f); - return; - } - - if (f && inSelect == WIN_ERR && win == WIN_MESSAGE) { - topl_set_resp((char *) 0, 0); - if (aWin->windowTextLen > 0 - && (*aWin->windowText)[aWin->windowTextLen - 1] == CHAR_CR) { - --aWin->windowTextLen; - --aWin->y_size; - } - putstr(win, flags.standout ? ATR_INVERSE : ATR_NONE, " --More--"); - } - - if (!IsWindowVisible(theWindow)) { - if (win != WIN_MESSAGE) - adjust_window_pos(aWin, aWin->x_size + SBARWIDTH + 1, - aWin->y_size * aWin->row_height); - - SelectWindow(theWindow); - ShowWindow(theWindow); - } - - if (f && inSelect == WIN_ERR) { - int ch; - - DimMenuBar(); - inSelect = win; - do { - ch = mac_nhgetch(); - } while (!ClosingWindowChar(ch)); - inSelect = WIN_ERR; - UndimMenuBar(); - - if (win == WIN_MESSAGE) - topl_set_resp("", '\0'); - else - HideWindow(theWindow); - } -} - -void -mac_destroy_nhwindow(winid win) -{ - WindowPtr theWindow; - NhWindow *aWin = &theWindows[win]; - int kind; - - if (win < 0 || win >= NUM_MACWINDOWS) { - if (iflags.window_inited) - error("dest_win: Invalid win %d.", win); - return; - } - theWindow = aWin->its_window; - if (!theWindow) { - error("dest_win: Not allocated win %d.", win); - return; - } - - /* - * Check special windows. The base window should never go away. - * Other "standard" windows should not go away unless we've exitted - * nhwindows. - */ - if (theWindow == _mt_window) { - return; - } - if (win == WIN_INVEN || win == WIN_MESSAGE) { - if (iflags.window_inited) { - if (flags.tombstone && killer[0]) { - /* Prepare for the coming of the tombstone window. */ - win_fonts[NHW_TEXT] = kFontIDMonaco; - } - return; - } - if (win == WIN_MESSAGE) - WIN_MESSAGE = WIN_ERR; - } - - kind = GetWindowKind(theWindow) - WIN_BASE_KIND; - - if ((!IsWindowVisible(theWindow) - || (kind != NHW_MENU && kind != NHW_TEXT))) { - DisposeWindow(theWindow); - if (aWin->windowText) { - DisposeHandle(aWin->windowText); - } - aWin->its_window = (WindowPtr) 0; - aWin->windowText = (Handle) 0; - } -} - -void -mac_number_pad(int pad) -{ /* no effect */ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(pad) -#endif - return; -} - -void -trans_num_keys(EventRecord *theEvent) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(theEvent) -#endif -/* KMH -- Removed this translation. - * Number pad keys should always emit digit characters. - * That's consistent with the default MacOS behavior. - * The number_pad option controls how digits are interpreted. - */ -#if 0 - if (Cmd.num_pad) { - Handle h = GetResource('Nump', theEvent->modifiers & shiftKey ? 129 : 128); - if (h) { - short inkey = (theEvent->message & keyCodeMask), *ab = (short *)*h; - int i = ab[0]; - for (; i; i--) { - if (inkey == (ab[i] & keyCodeMask)) { - theEvent->message = ab[i]; - break; - } - } - } - } -#endif -} - -/* - * Routine used to select and de-select elements in a menu window, used by - * KeyMenu, - * ClickMenu, and UpdateMenu. Takes the NhWindow and a line ref relative to - * the scrollbar. - */ -static void -ToggleMenuSelect(NhWindow *aWin, int line) -{ - Rect r; - - GetWindowBounds(aWin->its_window, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - if (aWin->scrollBar) - r.right -= SBARWIDTH; - r.top = line * aWin->row_height; - r.bottom = r.top + aWin->row_height; - - LMSetHiliteMode((UInt8)(LMGetHiliteMode() & 0x7F)); - InvertRect(&r); -} - -/* - * Check to see if given item is selected, return index if it is - */ -static int -ListItemSelected(NhWindow *aWin, int item) -{ - int i; - - HLock((char **) aWin->menuSelected); - /* Find item in selection list */ - for (i = aWin->miSelLen - 1; i >= 0; i--) { - if ((*aWin->menuSelected)[i] == item) - break; - } - HUnlock((char **) aWin->menuSelected); - return i; -} - -/* - * Add item to selection list if it's not selected already - * If it is selected already, remove it from the list. - */ -static void -ToggleMenuListItemSelected(NhWindow *aWin, short item) -{ - int i = ListItemSelected(aWin, item); - - HLock((char **) aWin->menuSelected); - if (i < 0) { /* not there, so add */ - (*aWin->menuSelected)[aWin->miSelLen] = item; - aWin->miSelLen++; - } else { /* there, so remove */ - short *mi = &(*aWin->menuSelected)[i]; - aWin->miSelLen--; - memcpy(mi, mi + 1, (aWin->miSelLen - i) * sizeof(short)); - } - HUnlock((char **) aWin->menuSelected); -} - -/* - * Find menu item in list given a line number on the window - */ -static short -ListCoordinateToItem(NhWindow *aWin, short Row) -{ - int i, item = -1; - MacMHMenuItem *mi; - - HLock((char **) aWin->menuInfo); - for (i = 0, mi = *aWin->menuInfo; i < aWin->miLen; i++, mi++) { - if (mi->line == Row + aWin->scrollPos) { - item = i; - break; - } - } - HUnlock((char **) aWin->menuInfo); - return item; -} - -static pascal void -MoveScrollBar(ControlHandle theBar, short part) -{ -#if 1 //!TARGET_API_MAC_CARBON - EventRecord fake; -#endif - Rect r; - RgnHandle rgn; - int now, amtToScroll; - WindowPtr theWin; - NhWindow *winToScroll; - - if (!part) - return; - - theWin = GetControlOwner(theBar); - GetWindowBounds(theWin, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - winToScroll = (NhWindow *) (GetWRefCon(theWin)); - now = GetControlValue(theBar); - - if (part == kControlPageUpPart || part == kControlPageDownPart) - amtToScroll = (r.bottom - r.top) / winToScroll->row_height; - else - amtToScroll = 1; - - if (part == kControlPageUpPart || part == kControlUpButtonPart) { - int bound = GetControlMinimum(theBar); - if (now - bound < amtToScroll) - amtToScroll = now - bound; - amtToScroll = -amtToScroll; - } else { - int bound = GetControlMaximum(theBar); - if (bound - now < amtToScroll) - amtToScroll = bound - now; - } - - if (!amtToScroll) - return; - - SetControlValue(theBar, now + amtToScroll); - winToScroll->scrollPos = now + amtToScroll; - r.right -= SBARWIDTH; - if (winToScroll == theWindows + WIN_MESSAGE) - r.bottom -= SBARHEIGHT; - rgn = NewRgn(); - ScrollRect(&r, 0, -amtToScroll * winToScroll->row_height, rgn); - if (rgn) { - InvalWindowRgn(theWin, rgn); - BeginUpdate(theWin); - } -#if 0 // TARGET_API_MAC_CARBON - switch (GetWindowKind(theWin) - WIN_BASE_KIND) { - case NHW_MESSAGE: - MsgUpdate(GetNhWin(theWin)); - break; - case NHW_MENU: - MenwUpdate(GetNhWin(theWin)); - break; - case NHW_TEXT: - TextUpdate(GetNhWin(theWin)); - break; - } -#else - winUpdateFuncs[GetWindowKind(theWin) - WIN_BASE_KIND](&fake, theWin); -#endif - if (rgn) { - EndUpdate(theWin); - DisposeRgn(rgn); - } -} - -#if 1 //!TARGET_API_MAC_CARBON -static void -DoScrollBar(Point p, short code, ControlHandle theBar, NhWindow *aWin) -{ - ControlActionUPP func = NULL; - Rect rect; - - if (code == kControlUpButtonPart || code == kControlPageUpPart - || code == kControlDownButtonPart || code == kControlPageDownPart) - func = MoveScrollUPP; - (void) TrackControl(theBar, p, func); - if (!func) { - if (aWin->scrollPos != GetControlValue(theBar)) { - aWin->scrollPos = GetControlValue(theBar); - GetWindowBounds(aWin->its_window, kWindowContentRgn, &rect); - OffsetRect(&rect, -rect.left, -rect.top); - InvalWindowRect(aWin->its_window, &rect); - } - } -} -#endif - -static int -filter_scroll_key(const int ch, NhWindow *aWin) -{ - if (aWin->scrollBar - && GetControlValue(aWin->scrollBar) - < GetControlMaximum(aWin->scrollBar)) { - short part = 0; - if (ch == CHAR_BLANK) { - part = kControlPageDownPart; - } else if (ch == CHAR_CR || ch == CHAR_LF) { - part = kControlDownButtonPart; - } - if (part) { - SetPortWindowPort(aWin->its_window); - MoveScrollBar(aWin->scrollBar, part); - return 0; - } - } - return ch; -} - -int -mac_doprev_message(void) -{ - if (WIN_MESSAGE) { - NhWindow *winToScroll = &theWindows[WIN_MESSAGE]; - mac_display_nhwindow(WIN_MESSAGE, FALSE); - SetPortWindowPort(winToScroll->its_window); - MoveScrollBar(winToScroll->scrollBar, kControlUpButtonPart); - } - return 0; -} - -static void -draw_growicon_vert_only(WindowPtr wind) -{ - GrafPtr org_port; - RgnHandle org_clip = NewRgn(); - Rect r; - - GetPort(&org_port); - SetPortWindowPort(wind); - GetClip(org_clip); - GetWindowBounds(wind, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - r.left = r.right - SBARWIDTH; - ClipRect(&r); - DrawGrowIcon(wind); - SetClip(org_clip); - DisposeRgn(org_clip); - SetPort(org_port); -} - -/* NOT_IN_CARBON */ -static void -WindowGoAway(EventRecord *theEvent, WindowPtr theWindow) -{ - NhWindow *aWin = GetNhWin(theWindow); - - if (!theEvent || TrackGoAway(theWindow, theEvent->where)) { - if (aWin - theWindows == BASE_WINDOW && !iflags.window_inited) { - AddToKeyQueue('\033', 1); - } else { - HideWindow(theWindow); - if (aWin - theWindows != inSelect) - mac_destroy_nhwindow(aWin - theWindows); - else /* if this IS the inSelect window put a close char */ - AddToKeyQueue(CHAR_CR, - 1); /* in queue to exit and maintain inSelect */ - } - } -} - -void -mac_get_nh_event(void) -{ - EventRecord anEvent; - - /* KMH -- Don't proceed if the window system isn't set up */ - if (!iflags.window_inited) - return; - -#if TARGET_API_MAC_CARBON - QDFlushPortBuffer(GetWindowPort(_mt_window), NULL); -#endif - (void) WaitNextEvent(everyEvent, &anEvent, 1, gMouseRgn); - HandleEvent(&anEvent); - return; -} - -int -mac_nhgetch(void) -{ - int ch; - long doDawdle = 1L; - EventRecord anEvent; - -#if 1 //!TARGET_API_MAC_CARBON - /* We want to take care of keys in the buffer as fast as - * possible - */ - if (keyQueueCount) - doDawdle = 0L; - else { - long total, contig; - static char warn = 0; - - doDawdle = (in_topl_mode() ? GetCaretTime() : 120L); - /* Since we have time, check memory */ - PurgeSpace(&total, &contig); - if (contig < 25000L || total < 50000L) { - if (!warn) { - pline("Low Memory!"); - warn = 1; - } - } else { - warn = 0; - } - } -#endif - - do { -#if TARGET_API_MAC_CARBON - QDFlushPortBuffer(GetWindowPort(_mt_window), NULL); -#endif -#if 0 // TARGET_API_MAC_CARBON - EventRef event; - - if (ReceiveNextEvent(0, NULL, kEventDurationForever, TRUE, &event) == noErr) { - SendEventToEventTarget(event, dispatcher); - ReleaseEvent(event); - } -#else - (void) WaitNextEvent(everyEvent, &anEvent, doDawdle, gMouseRgn); - HandleEvent(&anEvent); -#endif - ch = GetFromKeyQueue(); - } while (!ch && !gClickedToMove); - - if (!gClickedToMove) - ObscureCursor(); - else - gClickedToMove = 0; - -#ifdef THINK_C - if (ch == '\r') - ch = '\n'; -#endif - - return (ch); -} - -void -mac_delay_output(void) -{ - long destTicks = TickCount() + 1; - - while (TickCount() < destTicks) { - mac_get_nh_event(); - } -} - -#ifdef CLIPPING -static void -mac_cliparound(int x, int y) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(x, y) -#endif - /* TODO */ -} -#endif - -void -mac_exit_nhwindows(const char *s) -{ - clear_screen(); - tty_exit_nhwindows(s); - mac_destroy_nhwindow(WIN_MESSAGE); - mac_destroy_nhwindow(WIN_INVEN); -} - -/* - * Don't forget to decrease in_putstr before returning... - */ -void -mac_putstr(winid win, int attr, const char *str) -{ - long len, slen; - NhWindow *aWin = &theWindows[win]; - static char in_putstr = 0; - short newWidth, maxWidth; - Rect r; - char *src, *sline, *dst, ch; - - if (win < 0 || win >= NUM_MACWINDOWS || !aWin->its_window) { - error("putstr: Invalid win %d (Max %d).", win, NUM_MACWINDOWS, attr); - return; - } - - if (aWin->its_window == _mt_window) { - tty_putstr(win, attr, str); - return; - } - - if (in_putstr > 3) - return; - - in_putstr++; - slen = strlen(str); - - SetPortWindowPort(aWin->its_window); - GetWindowBounds(aWin->its_window, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - if (win == WIN_MESSAGE) { - r.right -= SBARWIDTH; - r.bottom -= SBARHEIGHT; - if (flags.page_wait - && aWin->last_more_lin - <= aWin->y_size - (r.bottom - r.top) / aWin->row_height) { - aWin->last_more_lin = aWin->y_size; - mac_display_nhwindow(win, TRUE); - } - } - - /* - * A "default" text window - uses TETextBox - * We just add the text, without attributes for now - */ - len = GetHandleSize(aWin->windowText); - while (aWin->windowTextLen + slen + 1 > len) { - len = (len > 2048) ? (len + 2048) : (len * 2); - SetHandleSize(aWin->windowText, len); - if (MemError()) { - error("putstr: SetHandleSize"); - aWin->windowTextLen = 0L; - aWin->save_lin = 0; - aWin->y_curs = 0; - aWin->y_size = 0; - } - } - - len = aWin->windowTextLen; - dst = *(aWin->windowText) + len; - sline = src = (char *) str; - maxWidth = newWidth = 0; - for (ch = *src; ch; ch = *src) { - if (ch == CHAR_LF) - ch = CHAR_CR; - *dst++ = ch; - if (ch == CHAR_CR) { - aWin->y_curs++; - aWin->y_size++; - aWin->x_curs = 0; - newWidth = TextWidth(sline, 0, src - sline); - if (newWidth > maxWidth) { - maxWidth = newWidth; - } - sline = src + 1; /* keep track of where new line begins */ - } else - aWin->x_curs++; - src++; - } - - newWidth = TextWidth(sline, 0, src - sline); - if (newWidth > maxWidth) { - maxWidth = newWidth; - } - - aWin->windowTextLen += slen; - - if (ch != CHAR_CR) { - (*(aWin->windowText))[len + slen] = CHAR_CR; - aWin->windowTextLen++; - aWin->y_curs++; - aWin->y_size++; - aWin->x_curs = 0; - } - - if (win == WIN_MESSAGE) { - short min = aWin->y_size - (r.bottom - r.top) / aWin->row_height; - if (aWin->scrollPos < min) { - aWin->scrollPos = min; - SetControlMaximum(aWin->scrollBar, aWin->y_size); - SetControlValue(aWin->scrollBar, min); - } - InvalWindowRect(aWin->its_window, &r); - } else /* Message has a fixed width, other windows base on content */ - if (maxWidth > aWin->x_size) - aWin->x_size = maxWidth; - in_putstr--; -} - -void -mac_curs(winid win, int x, int y) -{ - NhWindow *aWin = &theWindows[win]; - - if (aWin->its_window == _mt_window) { - tty_curs(win, x, y); - return; - } - - SetPortWindowPort(aWin->its_window); - MoveTo(x * aWin->char_width, - (y * aWin->row_height) + aWin->ascent_height); - aWin->x_curs = x; - aWin->y_curs = y; -} - -int -mac_nh_poskey(int *a, int *b, int *c) -{ - int ch = mac_nhgetch(); - *a = clicked_pos.h; - *b = clicked_pos.v; - *c = clicked_mod; - return ch; -} - -void -mac_start_menu(winid win) -{ - HideWindow(theWindows[win].its_window); - mac_clear_nhwindow(win); -} - -void -mac_add_menu(winid win, int glyph, const anything *any, CHAR_P menuChar, - CHAR_P groupAcc, int attr, const char *inStr, int preselected) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(glyph) -#endif - NhWindow *aWin = &theWindows[win]; - const char *str; - char locStr[4 + BUFSZ]; - MacMHMenuItem *item; - - if (!inStr) - return; - - if (any->a_void != 0) { -#define kMenuSizeBump 26 - if (!aWin->miSize) { - aWin->menuInfo = (MacMHMenuItem **) NewHandle( - sizeof(MacMHMenuItem) * kMenuSizeBump); - if (!aWin->menuInfo) { - error("Can't alloc menu handle"); - return; - } - aWin->menuSelected = - (short **) NewHandle(sizeof(short) * kMenuSizeBump); - if (!aWin->menuSelected) { - error("Can't alloc menu select handle"); - return; - } - aWin->miSize = kMenuSizeBump; - } - - if (aWin->miLen >= aWin->miSize) { - SetHandleSize((Handle) aWin->menuInfo, - sizeof(MacMHMenuItem) - * (aWin->miLen + kMenuSizeBump)); - if (MemError()) { - error("Can't resize menu handle"); - return; - } - SetHandleSize((Handle) aWin->menuSelected, - sizeof(short) * (aWin->miLen + kMenuSizeBump)); - if (MemError()) { - error("Can't resize menu select handle"); - return; - } - aWin->miSize += kMenuSizeBump; - } - - if (menuChar == 0) { - if (('a' <= aWin->menuChar && aWin->menuChar <= 'z') - || ('A' <= aWin->menuChar && aWin->menuChar <= 'Z')) { - menuChar = aWin->menuChar++; - if (menuChar == 'z') - aWin->menuChar = 'A'; - } - } - - Sprintf(locStr, "%c - %s", (menuChar ? menuChar : ' '), inStr); - str = locStr; - HLock((char **) aWin->menuInfo); - HLock((char **) aWin->menuSelected); - (*aWin->menuSelected)[aWin->miLen] = preselected; - item = &(*aWin->menuInfo)[aWin->miLen]; - aWin->miLen++; - item->id = *any; - item->accelerator = menuChar; - item->groupAcc = groupAcc; - item->line = aWin->y_size; - HUnlock((char **) aWin->menuInfo); - HUnlock((char **) aWin->menuSelected); - } else - str = inStr; - - putstr(win, attr, str); -} - -/* - * End a menu in this window, window must a type NHW_MENU. - * str is a list of cancel characters (values that may be input) - * morestr is a prompt to display, rather than the default. - * str and morestr might be ignored by some ports. - */ -void -mac_end_menu(winid win, const char *morestr) -{ - Str255 buf; - NhWindow *aWin = &theWindows[win]; - - buf[0] = 0; - if (morestr) - C2P(morestr, buf); - SetWTitle(aWin->its_window, buf); -} - -int -mac_select_menu(winid win, int how, menu_item **selected_list) -{ - int c; - NhWindow *aWin = &theWindows[win]; - WindowPtr theWin = aWin->its_window; - - inSelect = win; - - mac_display_nhwindow(win, FALSE); - - aWin->how = (short) how; - for (;;) { - c = map_menu_cmd(mac_nhgetch()); - if (c == CHAR_ESC) { - /* deselect everything */ - aWin->miSelLen = 0; - break; - } else if (ClosingWindowChar(c)) { - break; - } else { - nhbell(); - } - } - - HideWindow(theWin); - - if (aWin->miSelLen) { - menu_item *mp; - MacMHMenuItem *mi; - *selected_list = mp = - (menu_item *) alloc(aWin->miSelLen * sizeof(menu_item)); - HLock((char **) aWin->menuInfo); - HLock((char **) aWin->menuSelected); - for (c = 0; c < aWin->miSelLen; c++) { - mi = &(*aWin->menuInfo)[(*aWin->menuSelected)[c]]; - mp->item = mi->id; - mp->count = -1L; - mp++; - } - HUnlock((char **) aWin->menuInfo); - HUnlock((char **) aWin->menuSelected); - } else - *selected_list = 0; - - inSelect = WIN_ERR; - - return aWin->miSelLen; -} - -#include "dlb.h" - -static void -mac_display_file(name, complain) -const char *name; /* not ANSI prototype because of boolean parameter */ -boolean complain; -{ - Ptr buf; - int win; - dlb *fp = dlb_fopen(name, "r"); - - if (fp) { - long l = dlb_fseek(fp, 0, SEEK_END); - (void) dlb_fseek(fp, 0, 0L); - buf = NewPtr(l + 1); - if (buf) { - l = dlb_fread(buf, 1, l, fp); - if (l > 0) { - buf[l] = '\0'; - win = create_nhwindow(NHW_TEXT); - if (WIN_ERR == win) { - if (complain) - error("Cannot make window."); - } else { - putstr(win, 0, buf); - display_nhwindow(win, FALSE); - } - } - DisposePtr(buf); - } - dlb_fclose(fp); - } else if (complain) - error("Cannot open %s.", name); -} - -void -port_help() -{ - display_file(PORT_HELP, TRUE); -} - -static void -mac_unimplemented(void) -{ -} - -static void -mac_suspend_nhwindows(const char *foo) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(foo) -#endif - /* Can't really do that :-) */ -} - -int -try_key_queue(char *bufp) -{ - if (keyQueueCount) { - char ch; - for (ch = GetFromKeyQueue();; ch = GetFromKeyQueue()) { - if (ch == CHAR_LF || ch == CHAR_CR) - ch = 0; - *bufp++ = ch; - if (ch == 0) - break; - } - return 1; - } - return 0; -} - -/********************************************************************** - * Base window - */ - -static void -BaseClick(NhWindow *wind, Point pt, UInt32 modifiers) -{ - pt.h = pt.h / wind->char_width + 1; - pt.v = pt.v / wind->row_height; - clicked_mod = (modifiers & shiftKey) ? CLICK_2 : CLICK_1; - - if (strchr(topl_resp, *click_to_cmd(pt.h, pt.v, clicked_mod))) - nhbell(); - else { -#if 1 //!TARGET_API_MAC_CARBON - if (cursor_locked) - while (WaitMouseUp()) - /*SystemTask()*/; -#endif - - gClickedToMove = TRUE; - clicked_pos = pt; - } - return; -} - -static void -BaseCursor(NhWindow *wind, Point pt) -{ - char *dir_bas, *dir; - CursHandle ch; - - if (cursor_locked) - dir = (char *) 0; - else { - dir_bas = (char *) Cmd.dirchars; - dir = - strchr(dir_bas, *click_to_cmd(pt.h / wind->char_width + 1, - pt.v / wind->row_height, CLICK_1)); - } - ch = GetCursor(dir ? dir - dir_bas + 513 : 512); - if (ch) { - HLock((Handle) ch); - SetCursor(*ch); - HUnlock((Handle) ch); - } else { - SetCursor(&qdarrow); - } - return; -} - -#if 0 // TARGET_API_MAC_CARBON -static pascal OSStatus -BaseEvent(EventHandlerCallRef nexthandler, EventRef event, void *userdata) -{ - NhWindow *wind = (NhWindow *) userdata; - - - switch (GetEventClass(event)) { - case kEventClassKeyboard: { - char ch; - UInt32 modifiers; - - - GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, - sizeof(char), NULL, &ch); - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(UInt32), NULL, &modifiers); - if (modifiers & cmdKey) - return (eventNotHandledErr); - AddToKeyQueue(topl_resp_key(ch), TRUE); - return (noErr); - } - - case kEventClassMouse: { - CGrafPtr saveport; - GDHandle savedev; - Point pt; - - switch (GetEventKind(event)) { - case kEventMouseMoved: - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, - NULL, sizeof(Point), NULL, &pt); - GetGWorld(&saveport, &savedev); - SetPortWindowPort(wind->its_window); - GlobalToLocal(&pt); - SetGWorld(saveport, savedev); - BaseCursor(wind, pt); - return (eventNotHandledErr); - } - break; - } - - case kEventClassWindow: - switch (GetEventKind(event)) { - case kEventWindowDrawContent: - CallNextEventHandler(nexthandler, event); - image_tty(NULL, wind->its_window); - return (noErr); - - case kEventWindowHandleContentClick: { - CGrafPtr saveport; - GDHandle savedev; - Point pt; - UInt32 modifiers; - - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, - NULL, sizeof(Point), NULL, &pt); - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(UInt32), NULL, &modifiers); - GetGWorld(&saveport, &savedev); - SetPortWindowPort(wind->its_window); - GlobalToLocal(&pt); - SetGWorld(saveport, savedev); - BaseClick(wind, pt, modifiers); - return (noErr); - } - - case kEventWindowClose: - /* TODO... */ - break; - } - break; - } - return (eventNotHandledErr); -} - -#else - -static void -macClickTerm(EventRecord *theEvent, WindowPtr theWindow) -{ - Point where = theEvent->where; - - GlobalToLocal(&where); - BaseClick(GetNhWin(theWindow), where, theEvent->modifiers); - return; -} - -static void -macCursorTerm(EventRecord *theEvent, WindowPtr theWindow, RgnHandle mouseRgn) -{ - GrafPtr gp; - Point where = theEvent->where; - Rect r = { 0, 0, 1, 1 }; - - GetPort(&gp); - SetPortWindowPort(theWindow); - GlobalToLocal(&where); - BaseCursor(GetNhWin(theWindow), where); - OffsetRect(&r, theEvent->where.h, theEvent->where.v); - RectRgn(mouseRgn, &r); - SetPort(gp); - return; -} - -#endif /* !TARGET_API_MAC_CARBON */ - -/********************************************************************** - * Status subwindow - */ - -/********************************************************************** - * Map subwindow - */ - -/********************************************************************** - * Message window - */ - -static void -MsgClick(NhWindow *wind, Point pt) -{ - int r_idx = 0; - - while (topl_resp[r_idx]) { - Rect frame; - topl_resp_rect(r_idx, &frame); - InsetRect(&frame, 1, 1); - if (PtInRect(pt, &frame)) { - Boolean in_btn = true; - - InvertRect(&frame); - while (WaitMouseUp()) { -#if !TARGET_API_MAC_CARBON - SystemTask(); -#endif - GetMouse(&pt); - if (PtInRect(pt, &frame) != in_btn) { - in_btn = !in_btn; - InvertRect(&frame); - } - } - if (in_btn) { - InvertRect(&frame); - AddToKeyQueue(topl_resp[r_idx], 1); - } - return; - } - ++r_idx; - } - return; -} - -static void -MsgUpdate(NhWindow *wind) -{ - RgnHandle org_clip = NewRgn(), clip = NewRgn(); - Rect r; - int l; - - GetClip(org_clip); - GetWindowBounds(wind->its_window, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - - DrawControls(wind->its_window); - DrawGrowIcon(wind->its_window); - - for (l = 0; topl_resp[l]; l++) { - StringPtr name; - unsigned char tmp[2]; - FontInfo font; - Rect frame; - topl_resp_rect(l, &frame); - switch (topl_resp[l]) { - case 'y': - name = "\pyes"; - break; - case 'n': - name = "\pno"; - break; - case 'N': - name = "\pNone"; - break; - case 'a': - name = "\pall"; - break; - case 'q': - name = "\pquit"; - break; - case CHAR_ANY: - name = "\pany key"; - break; - default: - tmp[0] = 1; - tmp[1] = topl_resp[l]; - name = tmp; - break; - } - TextFont(kFontIDGeneva); - TextSize(9); - GetFontInfo(&font); - MoveTo((frame.left + frame.right - StringWidth(name)) / 2, - (frame.top + frame.bottom + font.ascent - font.descent - - font.leading - 1) / 2); - DrawString(name); - PenNormal(); - if (l == topl_def_idx) - PenSize(2, 2); - FrameRoundRect(&frame, 4, 4); - } - - r.right -= SBARWIDTH; - r.bottom -= SBARHEIGHT; - /* Clip to the portrect - scrollbar/growicon *before* adjusting the rect - to be larger than the size of the window (!) */ - RectRgn(clip, &r); - SectRgn(clip, org_clip, clip); - if (r.right < MIN_RIGHT) - r.right = MIN_RIGHT; - r.top -= wind->scrollPos * wind->row_height; - -#if 0 - /* If you enable this band of code (and disable the next band), you will get - fewer flickers but a slower performance while drawing the dot line. */ - { RgnHandle dotl_rgn = NewRgn(); - Rect dotl; - dotl.left = r.left; - dotl.right = r.right; - dotl.bottom = r.top + aWin->save_lin * aWin->row_height; - dotl.top = dotl.bottom - 1; - FillRect(&dotl, &qd.gray); - RectRgn(dotl_rgn, &dotl); - DiffRgn(clip, dotl_rgn, clip); - DisposeRgn(dotl_rgn); - SetClip(clip); - } -#endif - - if (in_topl_mode()) { - RgnHandle topl_rgn = NewRgn(); - Rect topl_r = r; - topl_r.top += (wind->y_size - 1) * wind->row_height; - l = (*top_line)->destRect.right - (*top_line)->destRect.left; - (*top_line)->viewRect = topl_r; - (*top_line)->destRect = topl_r; - if (l != topl_r.right - topl_r.left) - TECalText(top_line); - TEUpdate(&topl_r, top_line); - RectRgn(topl_rgn, &topl_r); - DiffRgn(clip, topl_rgn, clip); - DisposeRgn(topl_rgn); - SetClip(clip); - } - - DisposeRgn(clip); - - TextFont(wind->font_number); - TextSize(wind->font_size); - HLock(wind->windowText); - TETextBox(*wind->windowText, wind->windowTextLen, &r, teJustLeft); - HUnlock(wind->windowText); - -#if !TARGET_API_MAC_CARBON - r.bottom = r.top + aWin->save_lin * aWin->row_height; - r.top = r.bottom - 1; - FillRect(&r, (void *) &qd.gray); -#endif - - SetClip(org_clip); - DisposeRgn(org_clip); - return; -} - -#if 0 // TARGET_API_MAC_CARBON -static pascal OSStatus -MsgEvent(EventHandlerCallRef nexthandler, EventRef event, void *userdata) -{ - NhWindow *wind = (NhWindow *) userdata; - - - switch (GetEventClass(event)) { - case kEventClassControl: { - ControlRef control; - ControlID id; - - switch (GetEventKind(event)) { - case kEventControlHit: - GetEventParameter(event, kEventParamDirectObject, - typeControlRef, NULL, sizeof(ControlRef), NULL, &control); - GetControlID(control, &id); - /* TODO... */ - return (noErr); - } - break; - } - - case kEventClassKeyboard: { - char ch; - UInt32 modifiers; - - - GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, - sizeof(char), NULL, &ch); - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(UInt32), NULL, &modifiers); - if (modifiers & cmdKey) - return (eventNotHandledErr); - AddToKeyQueue(topl_resp_key(ch), TRUE); - return (noErr); - } - - case kEventClassWindow: - switch (GetEventKind(event)) { - case kEventWindowDrawContent: - CallNextEventHandler(nexthandler, event); - MsgUpdate(wind); - return (noErr); - - case kEventWindowHandleContentClick: { - CGrafPtr saveport; - GDHandle savedev; - Point pt; - - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, - NULL, sizeof(Point), NULL, &pt); - GetGWorld(&saveport, &savedev); - SetPortWindowPort(wind->its_window); - GlobalToLocal(&pt); - SetGWorld(saveport, savedev); - MsgClick(wind, pt); - return (noErr); - } - - case kEventWindowClose: - /* TODO... */ - break; - } - break; - } - return (eventNotHandledErr); -} - -#else - -static void -macClickMessage(EventRecord *theEvent, WindowPtr theWindow) -{ - Point mouse = theEvent->where; - - GlobalToLocal(&mouse); - MsgClick(GetNhWin(theWindow), mouse); - macClickText(theEvent, theWindow); -} - -static short -macUpdateMessage(EventRecord *theEvent, WindowPtr theWindow) -{ - if (!theEvent) - return 0; - MsgUpdate(GetNhWin(theWindow)); - return 0; -} - -#endif /* !TARGET_API_MAC_CARBON */ - -/********************************************************************** - * Menu windows - */ - -static void -MenwKey(NhWindow *wind, char ch) -{ - MacMHMenuItem *mi; - int i; - - ch = filter_scroll_key(ch, wind); - if (!ch) - return; - if (ClosingWindowChar(ch)) { - AddToKeyQueue(CHAR_CR, 1); - return; - } - - if (!wind || !wind->menuInfo) - return; - HLock((char **) wind->menuInfo); - for (i = 0, mi = *wind->menuInfo; i < wind->miLen; i++, mi++) { - if (mi->accelerator == ch) { - ToggleMenuListItemSelected(wind, i); - if (mi->line >= wind->scrollPos && mi->line <= wind->y_size) { - SetPortWindowPort(wind->its_window); - ToggleMenuSelect(wind, mi->line - wind->scrollPos); - } - /* Dismiss window if only picking one item */ - if (wind->how != PICK_ANY) - AddToKeyQueue(CHAR_CR, 1); - break; - } - } - HUnlock((char **) wind->menuInfo); - /* add key if didn't find it in menu and not filtered */ - return; -} - -static void -MenwClick(NhWindow *wind, Point pt) -{ - Rect wrect; - - GetWindowBounds(wind->its_window, kWindowContentRgn, &wrect); - OffsetRect(&wrect, -wrect.left, -wrect.top); - if (inSelect != WIN_ERR && wind->how != PICK_NONE) { - short currentRow = -1, previousRow = -1; - short previousItem = -1, item = -1; - Boolean majorSelectState, firstRow = TRUE; - - do { -#if !TARGET_API_MAC_CARBON - SystemTask(); -#endif - GetMouse(&pt); - currentRow = pt.v / wind->row_height; - if (pt.h < wrect.left || pt.h > wrect.right || pt.v < 0 - || pt.v > wrect.bottom || currentRow >= wind->y_size) { - continue; /* not in window range */ - } - - item = ListCoordinateToItem(wind, currentRow); - - if (item != previousItem) { - /* Implement typical Mac multiple-selection behavior - * (ie, not the UI implemented by the Finder) - */ - Boolean itemIsSelected = (ListItemSelected(wind, item) >= 0); - - if (firstRow) { - /* this is first valid row, so major state is opposite of - * what this row is */ - majorSelectState = !itemIsSelected; - firstRow = FALSE; - } - - if (wind->how == PICK_ONE && previousItem != -1) { - /* if previous row was selected and we're only selecting - * one object, - * deselect previous row! - */ - ToggleMenuListItemSelected(wind, previousItem); - ToggleMenuSelect(wind, previousRow); - previousItem = -1; - } - - if (item == -1) - continue; /* header line */ - - if (majorSelectState != itemIsSelected) { - ToggleMenuListItemSelected(wind, item); - ToggleMenuSelect(wind, currentRow); - } - - previousRow = currentRow; - previousItem = item; - } - } while (StillDown()); - - /* Dismiss window if only picking one item */ - if (wind->how == PICK_ONE) - AddToKeyQueue(CHAR_CR, 1); - } - return; -} - -static void -MenwUpdate(NhWindow *wind) -{ - int i, line; - MacMHMenuItem *mi; - - TextUpdate(wind); - HLock((Handle) wind->menuInfo); - HLock((Handle) wind->menuSelected); - for (i = 0; i < wind->miSelLen; i++) { - mi = &(*wind->menuInfo)[(*wind->menuSelected)[i]]; - line = mi->line; - if (line > wind->scrollPos && line <= wind->y_size) - ToggleMenuSelect(wind, line - wind->scrollPos); - } - HUnlock((Handle) wind->menuInfo); - HUnlock((Handle) wind->menuSelected); - return; -} - -#if 0 // TARGET_API_MAC_CARBON -static pascal OSStatus -MenwEvent(EventHandlerCallRef nexthandler, EventRef event, void *userdata) -{ - NhWindow *wind = (NhWindow *) userdata; - - - switch (GetEventClass(event)) { - case kEventClassControl: { - ControlRef control; - ControlID id; - - switch (GetEventKind(event)) { - case kEventControlHit: - GetEventParameter(event, kEventParamDirectObject, - typeControlRef, NULL, sizeof(ControlRef), NULL, &control); - GetControlID(control, &id); - /* TODO... */ - return (noErr); - } - break; - } - - case kEventClassKeyboard: { - char ch; - UInt32 modifiers; - - - GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, - sizeof(char), NULL, &ch); - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(UInt32), NULL, &modifiers); - if (modifiers & cmdKey) - return (eventNotHandledErr); - MenwKey(wind, ch); - return (noErr); - } - - case kEventClassWindow: - switch (GetEventKind(event)) { - case kEventWindowDrawContent: - CallNextEventHandler(nexthandler, event); - MenwUpdate(wind); - return (noErr); - - case kEventWindowHandleContentClick: { - CGrafPtr saveport; - GDHandle savedev; - Point pt; - - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, - NULL, sizeof(Point), NULL, &pt); - GetGWorld(&saveport, &savedev); - SetPortWindowPort(wind->its_window); - GlobalToLocal(&pt); - SetGWorld(saveport, savedev); - MenwClick(wind, pt); - return (noErr); - } - - case kEventWindowClose: - /* TODO... */ - break; - } - break; - } - return (eventNotHandledErr); -} - -#else - -static void -macKeyMenu(EventRecord *theEvent, WindowPtr theWindow) -{ - MenwKey(GetNhWin(theWindow), theEvent->message & 0xff); - return; -} - -static void -macClickMenu(EventRecord *theEvent, WindowRef theWindow) -{ - Point p; - NhWindow *aWin = GetNhWin(theWindow); - - if (aWin->scrollBar && IsControlVisible(aWin->scrollBar)) { - short code; - ControlHandle theBar; - - p = theEvent->where; - GlobalToLocal(&p); - code = FindControl(p, theWindow, &theBar); - if (code) { - DoScrollBar(p, code, theBar, aWin); - return; - } - } - MenwClick(aWin, theEvent->where); -} - -static short -macUpdateMenu(EventRecord *theEvent, WindowPtr theWindow) -{ - MenwUpdate(GetNhWin(theWindow)); - return 0; -} - -#endif /* !TARGET_API_MAC_CARBON */ - -/********************************************************************** - * Text windows - */ - -static void -TextKey(NhWindow *wind, char ch) -{ - ch = filter_scroll_key(ch, wind); - if (!ch) - return; - if (inSelect == WIN_ERR && ClosingWindowChar(ch)) { - HideWindow(wind->its_window); - mac_destroy_nhwindow(wind - theWindows); - } else - AddToKeyQueue(topl_resp_key(ch), TRUE); - return; -} - -static void -TextUpdate(NhWindow *wind) -{ - Rect r, r2; - RgnHandle h; - Boolean vis; - - GetWindowBounds(wind->its_window, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - r2 = r; - r2.left = r2.right - SBARWIDTH; - r2.right += 1; - r2.top -= 1; - vis = (r2.bottom > r2.top + 50); - - draw_growicon_vert_only(wind->its_window); - DrawControls(wind->its_window); - - h = (RgnHandle) 0; - if (vis && (h = NewRgn())) { - RgnHandle tmp = NewRgn(); - if (!tmp) { - DisposeRgn(h); - h = (RgnHandle) 0; - } else { - GetClip(h); - RectRgn(tmp, &r2); - DiffRgn(h, tmp, tmp); - SetClip(tmp); - DisposeRgn(tmp); - } - } - if (r.right < MIN_RIGHT) - r.right = MIN_RIGHT; - r.top -= wind->scrollPos * wind->row_height; - r.right -= SBARWIDTH; - HLock(wind->windowText); - TETextBox(*wind->windowText, wind->windowTextLen, &r, teJustLeft); - HUnlock(wind->windowText); - if (h) { - SetClip(h); - DisposeRgn(h); - } - return; -} - -#if 0 // TARGET_API_MAC_CARBON -static pascal OSStatus -TextEvent(EventHandlerCallRef nexthandler, EventRef event, void *userdata) -{ - NhWindow *wind = (NhWindow *) userdata; - - - switch (GetEventClass(event)) { - case kEventClassControl: { - ControlRef control; - ControlID id; - - switch (GetEventKind(event)) { - case kEventControlHit: - GetEventParameter(event, kEventParamDirectObject, - typeControlRef, NULL, sizeof(ControlRef), NULL, &control); - GetControlID(control, &id); - /* TODO... */ - return (noErr); - } - break; - } - - case kEventClassKeyboard: { - char ch; - UInt32 modifiers; - - - GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, - sizeof(char), NULL, &ch); - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(UInt32), NULL, &modifiers); - if (modifiers & cmdKey) - return (eventNotHandledErr); - TextKey(wind, ch); - return (noErr); - } - - case kEventClassWindow: - switch (GetEventKind(event)) { - case kEventWindowDrawContent: - CallNextEventHandler(nexthandler, event); - TextUpdate(wind); - return (noErr); - - case kEventWindowClose: - /* TODO... */ - break; - } - break; - } - return (eventNotHandledErr); -} - -#else - -static void -macKeyText(EventRecord *theEvent, WindowPtr theWindow) -{ - TextKey(GetNhWin(theWindow), theEvent->message & 0xff); - return; -} - -static void -macClickText(EventRecord *theEvent, WindowPtr theWindow) -{ - NhWindow *aWin = GetNhWin(theWindow); - - if (aWin->scrollBar && IsControlVisible(aWin->scrollBar)) { - short code; - Point p = theEvent->where; - ControlHandle theBar; - - GlobalToLocal(&p); - code = FindControl(p, theWindow, &theBar); - if (code) { - DoScrollBar(p, code, theBar, aWin); - } - } -} - -#endif /* !TARGET_API_MAC_CARBON */ - -/********************************************************************** - * Global events - */ - -#if 0 // TARGET_API_MAC_CARBON -static pascal OSStatus -GlobalEvent(EventHandlerCallRef nexthandler, EventRef event, void *userdata) -{ - switch (GetEventClass(event)) { - case kEventClassCommand: - return (eventNotHandledErr); - } - return (eventNotHandledErr); -} - -#else - -static short -macDoNull(EventRecord *theEvent, WindowPtr theWindow) -{ - return 0; -} - -/* - * Note; theWindow may very well be null here, since keyDown may call - * it when theres no window !!! - */ -/* NOT_IN_CARBON */ -static void -GeneralKey(EventRecord *theEvent, WindowPtr theWindow) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(theWindow) -#endif -#if 0 - trans_num_keys (theEvent); -#endif - AddToKeyQueue(topl_resp_key(theEvent->message & 0xff), TRUE); -} - -static void -HandleKey(EventRecord *theEvent) -{ - WindowPtr theWindow = FrontWindow(); - - if (theEvent->modifiers & cmdKey) { - if (theEvent->message & 0xff == '.') { - /* Flush key queue */ - keyQueueCount = keyQueueWrite = keyQueueRead = 0; - theEvent->message = '\033'; - goto dispatchKey; - } else { - UndimMenuBar(); - DoMenuEvt(MenuKey(theEvent->message & 0xff)); - } - } else { - dispatchKey: - if (theWindow) { - int kind = GetWindowKind(theWindow) - WIN_BASE_KIND; - winKeyFuncs[kind](theEvent, theWindow); - } else { - GeneralKey(theEvent, (WindowPtr) 0); - } - } -} - -#endif /* !TARGET_API_MAC_CARBON */ - -static void -HandleClick(EventRecord *theEvent) -{ - int code; - unsigned long l; - WindowPtr theWindow; - NhWindow *aWin; - Rect r; - Boolean not_inSelect; - - InsetRect(GetRegionBounds(GetGrayRgn(), &r), 4, 4); - - code = FindWindow(theEvent->where, &theWindow); - aWin = GetNhWin(theWindow); - not_inSelect = (inSelect == WIN_ERR || aWin - theWindows == inSelect); - - switch (code) { - case inContent: -#if 1 //!TARGET_API_MAC_CARBON - if (not_inSelect) { - int kind = GetWindowKind(theWindow) - WIN_BASE_KIND; - winCursorFuncs[kind](theEvent, theWindow, gMouseRgn); - SelectWindow(theWindow); - SetPortWindowPort(theWindow); - winClickFuncs[kind](theEvent, theWindow); - } else { - nhbell(); - } -#endif - break; - - case inDrag: - if (not_inSelect) { - SetCursor(&qdarrow); - DragWindow(theWindow, theEvent->where, &r); - SaveWindowPos(theWindow); - } else { - nhbell(); - } - break; - - case inGrow: - if (not_inSelect) { - SetCursor(&qdarrow); - SetRect(&r, 80, 2 * aWin->row_height + 1, r.right, r.bottom); - if (aWin == theWindows + WIN_MESSAGE) - r.top += SBARHEIGHT; - l = GrowWindow(theWindow, theEvent->where, &r); - SizeWindow(theWindow, l & 0xffff, l >> 16, FALSE); - SaveWindowSize(theWindow); - SetPortWindowPort(theWindow); - GetWindowBounds(theWindow, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - InvalWindowRect(theWindow, &r); - if (aWin->scrollBar) { - DrawScrollbar(aWin); - } - } else { - nhbell(); - } - break; - - case inGoAway: - WindowGoAway(theEvent, theWindow); - break; - - case inMenuBar: - DoMenuEvt(MenuSelect(theEvent->where)); - break; - -#if !TARGET_API_MAC_CARBON - case inSysWindow: - SystemClick(theEvent, theWindow); -#endif - default: - break; - } -} - -#if 1 //!TARGET_API_MAC_CARBON - -static short -GeneralUpdate(EventRecord *theEvent, WindowPtr theWindow) -{ - if (!theEvent) - return 0; - TextUpdate(GetNhWin(theWindow)); - return 0; -} - -#endif - -static void -HandleUpdate(EventRecord *theEvent) -{ - WindowPtr theWindow = (WindowPtr) theEvent->message; - NhWindow *aWin = GetNhWin(theWindow); - Rect r; -#if 1 //!TARGET_API_MAC_CARBON - EventRecord fake; -#endif - - char existing_update_region = FALSE; - Rect rect; - - if (theWindow == _mt_window) { - existing_update_region = - (get_invalid_region(theWindow, &rect) == noErr); - } - BeginUpdate(theWindow); - SetPortWindowPort(theWindow); - GetWindowBounds(theWindow, kWindowContentRgn, &r); - OffsetRect(&r, -r.left, -r.top); - EraseRect(&r); -#if 0 // TARGET_API_MAC_CARBON - switch (GetWindowKind(theWindow) - WIN_BASE_KIND) { - case NHW_BASE: - case NHW_MAP: - case NHW_STATUS: - image_tty(NULL, theWindow); - break; - case NHW_MESSAGE: - MsgUpdate(GetNhWin(theWindow)); - break; - case NHW_MENU: - MenwUpdate(GetNhWin(theWindow)); - break; - case NHW_TEXT: - TextUpdate(GetNhWin(theWindow)); - break; - } -#else - winUpdateFuncs[GetWindowKind(theWindow) - WIN_BASE_KIND](&fake, - theWindow); -#endif - - if (theWindow == _mt_window && existing_update_region) { - set_invalid_region(theWindow, &rect); - } - aWin->drawn = TRUE; - EndUpdate(theWindow); -} - -#if 1 //!TARGET_API_MAC_CARBON - -static void -GeneralCursor(EventRecord *theEvent, WindowPtr theWindow, RgnHandle mouseRgn) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(theWindow) -#endif - Rect r = { -1, -1, 2, 2 }; - - SetCursor(&qdarrow); - OffsetRect(&r, theEvent->where.h, theEvent->where.v); - RectRgn(mouseRgn, &r); -} - -static void -DoOsEvt(EventRecord *theEvent) -{ - WindowRef win; - short code; - - if ((theEvent->message & 0xff000000) == 0xfa000000) { - /* Mouse Moved */ - - code = FindWindow(theEvent->where, &win); - if (code != inContent) { - Rect r = { -1, -1, 2, 2 }; - - SetCursor(&qdarrow); - OffsetRect(&r, theEvent->where.h, theEvent->where.v); - RectRgn(gMouseRgn, &r); - } else { -#if 1 //!TARGET_API_MAC_CARBON - int kind = GetWindowKind(win) - WIN_BASE_KIND; - if (kind >= 0 && kind <= NHW_TEXT) { - winCursorFuncs[kind](theEvent, win, gMouseRgn); - } -#endif - } - } -} - -#endif /* !TARGET_API_MAC_CARBON */ - -void -HandleEvent(EventRecord *theEvent) -{ - switch (theEvent->what) { -#if 1 //!TARGET_API_MAC_CARBON - case autoKey: - case keyDown: - HandleKey(theEvent); - break; -#endif - case updateEvt: - HandleUpdate(theEvent); - break; - case mouseDown: - HandleClick(theEvent); - break; -#if !TARGET_API_MAC_CARBON - case diskEvt: - if ((theEvent->message & 0xffff0000) != 0) { - Point p = { 150, 150 }; - (void) DIBadMount(p, theEvent->message); - } - break; -#endif -#if !TARGET_API_MAC_CARBON - case osEvt: - DoOsEvt(theEvent); - break; -#endif - case kHighLevelEvent: - AEProcessAppleEvent(theEvent); - default: - break; - } -} - -/********************************************************************** - * Interface definition, for windows.c - */ - -struct window_procs mac_procs = { - "mac", - WC_COLOR | WC_HILITE_PET | WC_FONT_MAP | WC_FONT_MENU | WC_FONT_MESSAGE - | WC_FONT_STATUS | WC_FONT_TEXT | WC_FONTSIZ_MAP | WC_FONTSIZ_MENU - | WC_FONTSIZ_MESSAGE | WC_FONTSIZ_STATUS | WC_FONTSIZ_TEXT, - 0L, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* color availability */ - mac_init_nhwindows, - mac_unimplemented, /* see macmenu.c:mac_askname() for player selection */ - mac_askname, mac_get_nh_event, mac_exit_nhwindows, mac_suspend_nhwindows, - mac_unimplemented, mac_create_nhwindow, mac_clear_nhwindow, - mac_display_nhwindow, mac_destroy_nhwindow, mac_curs, mac_putstr, - genl_putmixed, mac_display_file, mac_start_menu, mac_add_menu, - mac_end_menu, mac_select_menu, genl_message_menu, mac_unimplemented, - mac_get_nh_event, mac_get_nh_event, -#ifdef CLIPPING - mac_cliparound, -#endif -#ifdef POSITIONBAR - donull, -#endif - tty_print_glyph, tty_raw_print, tty_raw_print_bold, mac_nhgetch, - mac_nh_poskey, tty_nhbell, mac_doprev_message, mac_yn_function, - mac_getlin, mac_get_ext_cmd, mac_number_pad, mac_delay_output, -#ifdef CHANGE_COLOR - tty_change_color, tty_change_background, set_tty_font_name, - tty_get_color_string, -#endif - /* other defs that really should go away (they're tty specific) */ - 0, // mac_start_screen, - 0, // mac_end_screen, - genl_outrip, genl_preference_update, genl_can_suspend_no, -}; - -/*macwin.c*/ diff --git a/sys/mac/mgetline.c b/sys/mac/mgetline.c deleted file mode 100644 index 7b3e91ba7..000000000 --- a/sys/mac/mgetline.c +++ /dev/null @@ -1,78 +0,0 @@ -/* NetHack 3.6 mgetline.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "mactty.h" -#include "macwin.h" -#include "macpopup.h" -#include "func_tab.h" - -extern int NDECL(extcmd_via_menu); /* cmd.c */ - -typedef Boolean FDECL((*key_func), (unsigned char)); - -int -get_line_from_key_queue(char *bufp) -{ - *bufp = 0; - if (try_key_queue(bufp)) { - while (*bufp) { - if (*bufp == 10 || *bufp == 13) { - *bufp = 0; - } - bufp++; - } - return true; - } - return false; -} - -static void -topl_getlin(const char *query, char *bufp, Boolean ext) -{ - if (get_line_from_key_queue(bufp)) - return; - - enter_topl_mode((char *) query); - while (topl_key(nhgetch(), ext)) - ; - leave_topl_mode(bufp); -} - -/* - * Read a line closed with '\n' into the array char bufp[BUFSZ]. - * (The '\n' is not stored. The string is closed with a '\0'.) - * Reading can be interrupted by an escape ('\033') - now the - * resulting string is "\033". - */ -void -mac_getlin(const char *query, char *bufp) -{ - topl_getlin(query, bufp, false); -} - -/* Read in an extended command - doing command line completion for - * when enough characters have been entered to make a unique command. - * This is just a modified getlin() followed by a lookup. -jsb - */ -int -mac_get_ext_cmd() -{ - char bufp[BUFSZ]; - int i; - - if (iflags.extmenu) - return extcmd_via_menu(); - topl_getlin("# ", bufp, true); - for (i = 0; extcmdlist[i].ef_txt != (char *) 0; i++) - if (!strcmp(bufp, extcmdlist[i].ef_txt)) - break; - if (extcmdlist[i].ef_txt == (char *) 0) - i = -1; /* not found */ - - return i; -} - -/* macgetline.c */ diff --git a/sys/mac/mmodal.c b/sys/mac/mmodal.c deleted file mode 100644 index 83fdfada9..000000000 --- a/sys/mac/mmodal.c +++ /dev/null @@ -1,29 +0,0 @@ -/* NetHack 3.6 mmodal.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ -/* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */ -/* NetHack may be freely redistributed. See license for details. */ - -#if 1 /*!TARGET_API_MAC_CARBON*/ -#include -#include -#else -#include -#endif - -#include "macpopup.h" - -/* Flash a dialog button when its accelerator key is pressed */ -void -FlashButton(DialogRef wind, short item) -{ - short type; - Handle handle; - Rect rect; - unsigned long ticks; - - /* Apple recommends 8 ticks */ - GetDialogItem(wind, item, &type, &handle, &rect); - HiliteControl((ControlHandle) handle, kControlButtonPart); - Delay(8, &ticks); - HiliteControl((ControlHandle) handle, 0); - return; -} diff --git a/sys/mac/mrecover.c b/sys/mac/mrecover.c deleted file mode 100644 index 01ea7587b..000000000 --- a/sys/mac/mrecover.c +++ /dev/null @@ -1,1338 +0,0 @@ -/* NetHack 3.6 mrecover.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (c) David Hairston, 1993. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* Macintosh Recovery Application */ - -/* based on code in util/recover.c. the significant differences are: - * - GUI vs. CLI. the vast majority of code here supports the GUI. - * - Mac toolbox equivalents are used in place of ANSI functions. - * - void restore_savefile(void) is event driven. - * - integral type substitutions here and there. - */ - -/* - * Think C 5.0.4 project specs: - * signature: 'nhRc' - * SIZE (-1) info: flags: 0x5880, size: 65536L/65536L (64k/64k) - * libraries: MacTraps [yes], MacTraps2 (HFileStuff) [yes], ANSI [no] - * compatibility: system 6 and system 7 - * misc: sizeof(int): 2, "\p": unsigned char, enum size varies, - * prototypes required, type checking enforced, no optimizers, - * FAR CODE [no], FAR DATA [no], SEPARATE STRS [no], single segment, - * short macsbug symbols - */ - -/* - * To do (maybe, just maybe): - * - Merge with the code in util/recover.c. - * - Document launch (e.g. GUI equivalent of 'recover basename'). - * - Drag and drop. - * - Internal memory tweaks (stack and heap usage). - * - Use status file to allow resuming aborted recoveries. - * - Bundle 'LEVL' files with recover (easier document launch). - * - Prohibit recovering games "in progress". - * - Share AppleEvents with NetHack to auto-recover crashed games. - */ - -#include "config.h" - -/**** Toolbox defines ****/ - -/* MPW C headers (99.44% pure) */ -#include -#include -#include -#include -#ifdef applec -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef THINK /* glue for System 7 Icon Family call (needed by Think C 5.0.4) \ - */ -pascal OSErr GetIconSuite(Handle *theIconSuite, short theResID, - long selector) = { 0x303C, 0x0501, 0xABC9 }; -#endif - -/**** Application defines ****/ - -/* Memory */ -typedef struct memBytes /* format of 'memB' resource, preloaded/locked */ - { - short memReserved; - short memCleanup; /* 4 - memory monitor activity limit */ - long memPreempt; /* 32k - start iff FreeMem() > */ - long memWarning; /* 12k - warn if MaxMem() < */ - long memAbort; /* 4k - abort if MaxMem() < */ - long memIOBuf; /* 16k - read/write buffer size */ -} memBytes, *memBytesPtr, **memBytesHandle; - -#define membID 128 /* 'memB' resource ID */ - -/* Cursor */ -#define CURS_FRAME 4L /* 1/15 second - spin cursor */ -#define CURS_LATENT 60L /* pause before spin cursor */ -#define curs_Init (-1) /* token for set arrow */ -#define curs_Total 8 /* maybe 'acur' would be better */ -#define cursorOffset 128 /* GetCursor(cursorOffset + i) */ - -/* Menu */ -enum { - mbar_Init = -1, - mbarAppl, /* normal mode */ - mbarRecover, /* in recovery mode */ - mbarDA /* DA in front mode */ -}; -enum { - menuApple, - menuFile, - menuEdit, - menu_Total, - - muidApple = 128, - muidFile, - muidEdit -}; -enum { - /* Apple menu */ - mitmAbout = 1, - mitmHelp, - ____128_1, - - /* File menu */ - mitmOpen = 1, - ____129_1, - mitmClose_DA, - ____129_2, - mitmQuit - - /* standard minimum required Edit menu */ -}; - -/* Alerts */ -enum { - alrtNote, /* general messages */ - alrtHelp, /* help message */ - alrt_Total, - - alertAppleMenu = 127, /* menuItem to alert ID offset */ - alidNote, - alidHelp -}; - -#define aboutBufSize 80 /* i.e. 2 lines of 320 pixels */ - -/* Notification */ -#define nmBufSize (32 + aboutBufSize + 32) -typedef struct notifRec { - NMRec nmr; - struct notifRec *nmNext; - short nmDispose; - unsigned char nmBuf[nmBufSize]; -} notifRec, *notifPtr; - -#define nmPending nmRefCon /* &in.Notify */ -#define iconNotifyID 128 -#define ics_1_and_4 0x00000300 - -/* Dialogs */ -enum { dlogProgress = 256 }; -enum { uitmThermo = 1 }; -enum { initItem, invalItem, drawItem }; - -/* Miscellaneous */ -typedef struct modeFlags { - short Front; /* fg/bg event handling */ - short Notify; /* level of pending NM notifications */ - short Dialog; /* a modeless dialog is open */ - short Recover; /* restoration progress index */ -} modeFlags; - -/* convenient define to allow easier (for me) parsing of 'vers' resource */ -typedef struct versXRec { - NumVersion numVers; - short placeCode; - unsigned char versStr[]; /* (small string)(large string) */ -} versXRec, *versXPtr, **versXHandle; - -/**** Global variables ****/ -modeFlags in = { 1 }; /* in Front */ -EventRecord wnEvt; -SysEnvRec sysEnv; -unsigned char aboutBuf[aboutBufSize]; /* vers 1 "Get Info" string */ -memBytesPtr pBytes; /* memory management */ -unsigned short memActivity; /* more memory management */ -MenuHandle mHnd[menu_Total]; -CursPtr cPtr[curs_Total]; /* busy cursors */ -unsigned long timeCursor; /* next cursor frame time */ -short oldCursor = curs_Init; /* see adjustGUI() below */ -notifPtr pNMQ; /* notification queue pointer */ -notifRec nmt; /* notification template */ -DialogTHndl thermoTHnd; -DialogRecord dlgThermo; /* progress thermometer */ -#define DLGTHM ((DialogPtr) &dlgThermo) -#define WNDTHM ((WindowPtr) &dlgThermo) -#define GRFTHM ((GrafPtr) &dlgThermo) - -Point sfGetWhere; /* top left corner of get file dialog */ -Ptr pIOBuf; /* read/write buffer pointer */ -short vRefNum; /* SFGetFile working directory/volume refnum */ -long dirID; /* directory i.d. */ -NMUPP nmCompletionUPP; /* UPP for nmCompletion */ -FileFilterUPP basenameFileFilterUPP; /* UPP for basenameFileFilter */ -UserItemUPP drawThermoUPP; /* UPP for progress callback */ - -#define MAX_RECOVER_COUNT 256 - -#define APP_NAME_RES_ID (-16396) /* macfile.h */ -#define PLAYER_NAME_RES_ID 1001 /* macfile.h */ - -/* variables from util/recover.c */ -#define SAVESIZE FILENAME -unsigned char savename[SAVESIZE]; /* originally a C string */ -unsigned char lock[256]; /* pascal string */ - -int hpid; /* NetHack (unix-style) process i.d. */ -short saveRefNum; /* save file descriptor */ -short gameRefNum; /* level 0 file descriptor */ -short levRefNum; /* level n file descriptor */ - -/**** Prototypes ****/ -static void warmup(void); -static Handle alignTemplate(ResType, short, short, short, Point *); -pascal void nmCompletion(NMRec *); -static void noteErrorMessage(unsigned char *, unsigned char *); -static void note(short, short, unsigned char *); -static void adjustGUI(void); -static void adjustMemory(void); -static void optionMemStats(void); -static void RecoverMenuEvent(long); -static void eventLoop(void); -static void cooldown(void); - -pascal void drawThermo(WindowPtr, short); -static void itemizeThermo(short); -pascal Boolean basenameFileFilter(ParmBlkPtr); -static void beginRecover(void); -static void continueRecover(void); -static void endRecover(void); -static short saveRezStrings(void); - -/* analogous prototypes from util/recover.c */ -static void set_levelfile_name(long); -static short open_levelfile(long); -static short create_savefile(unsigned char *); -static void copy_bytes(short, short); -static void restore_savefile(void); - -/* auxiliary prototypes */ -static long read_levelfile(short, Ptr, long); -static long write_savefile(short, Ptr, long); -static void close_file(short *); -static void unlink_file(unsigned char *); - -/**** Routines ****/ - -main() -{ - /* heap adjust */ - MaxApplZone(); - MoreMasters(); - MoreMasters(); - - /* manager initialization */ - InitGraf(&qd.thePort); - InitFonts(); - InitWindows(); - InitMenus(); - TEInit(); - InitDialogs(0L); - InitCursor(); - nmCompletionUPP = NewNMProc(nmCompletion); - basenameFileFilterUPP = NewFileFilterProc(basenameFileFilter); - drawThermoUPP = NewUserItemProc(drawThermo); - - /* get system environment, notification requires 6.0 or better */ - (void) SysEnvirons(curSysEnvVers, &sysEnv); - if (sysEnv.systemVersion < 0x0600) { - ParamText("\pAbort: System 6.0 is required", "\p", "\p", "\p"); - (void) Alert(alidNote, (ModalFilterUPP) 0L); - ExitToShell(); - } - - warmup(); - eventLoop(); - - /* normally these routines are never reached from here */ - cooldown(); - ExitToShell(); - return 0; -} - -static void -warmup() -{ - short i; - - /* pre-System 7 MultiFinder hack for smooth launch */ - for (i = 0; i < 10; i++) { - if (WaitNextEvent(osMask, &wnEvt, 2L, (RgnHandle) 0L)) - if (((wnEvt.message & osEvtMessageMask) >> 24) - == suspendResumeMessage) - in.Front = (wnEvt.message & resumeFlag); - } - -#if 0 // ??? - /* clear out the Finder info */ - { - short message, count; - - CountAppFiles(&message, &count); - while(count) - ClrAppFiles(count--); - } -#endif - - /* fill out the notification template */ - nmt.nmr.qType = nmType; - nmt.nmr.nmMark = 1; - nmt.nmr.nmSound = (Handle) -1L; /* system beep */ - nmt.nmr.nmStr = nmt.nmBuf; - nmt.nmr.nmResp = nmCompletionUPP; - nmt.nmr.nmPending = (long) &in.Notify; - -#if 1 - { - /* get the app name */ - ProcessInfoRec info; - ProcessSerialNumber psn; - - info.processInfoLength = sizeof(info); - info.processName = nmt.nmBuf; - info.processAppSpec = NULL; - GetCurrentProcess(&psn); - GetProcessInformation(&psn, &info); - } -#else - /* prepend app name (31 chars or less) to notification buffer */ - { - short apRefNum; - Handle apParams; - - GetAppParms(*(Str255 *) &nmt.nmBuf, &apRefNum, &apParams); - } -#endif - - /* add formatting (two line returns) */ - nmt.nmBuf[++(nmt.nmBuf[0])] = '\r'; - nmt.nmBuf[++(nmt.nmBuf[0])] = '\r'; - - /**** note() is usable now but not aesthetically complete ****/ - - /* get notification icon */ - if (sysEnv.systemVersion < 0x0700) { - if (!(nmt.nmr.nmIcon = GetResource('SICN', iconNotifyID))) - note(nilHandleErr, 0, "\pNil SICN Handle"); - } else { - if (GetIconSuite(&nmt.nmr.nmIcon, iconNotifyID, ics_1_and_4)) - note(nilHandleErr, 0, "\pBad Icon Family"); - } - - /* load and align various dialog/alert templates */ - (void) alignTemplate('ALRT', alidNote, 0, 4, (Point *) 0L); - (void) alignTemplate('ALRT', alidHelp, 0, 4, (Point *) 0L); - - thermoTHnd = (DialogTHndl) alignTemplate('DLOG', dlogProgress, 20, 8, - (Point *) 0L); - - (void) alignTemplate('DLOG', getDlgID, 0, 6, (Point *) &sfGetWhere); - - /* get the "busy cursors" (preloaded/locked) */ - for (i = 0; i < curs_Total; i++) { - CursHandle cHnd; - - if (!(cHnd = GetCursor(i + cursorOffset))) - note(nilHandleErr, 0, "\pNil CURS Handle"); - - cPtr[i] = *cHnd; - } - - /* get the 'vers' 1 long (Get Info) string - About Recover... */ - { - versXHandle vHnd; - - if (!(vHnd = (versXHandle) GetResource('vers', 1))) - note(nilHandleErr, 0, "\pNil vers Handle"); - - i = (**vHnd).versStr[0] + 1; /* offset to Get Info pascal string */ - - if ((aboutBuf[0] = (**vHnd).versStr[i]) > (aboutBufSize - 1)) - aboutBuf[0] = aboutBufSize - 1; - - i++; - - MoveHHi((Handle) vHnd); /* DEE - Fense ... */ - HLock((Handle) vHnd); - BlockMove(&((**vHnd).versStr[i]), &(aboutBuf[1]), aboutBuf[0]); - ReleaseResource((Handle) vHnd); - } - - /* form the menubar */ - for (i = 0; i < menu_Total; i++) { - if (!(mHnd[i] = GetMenu(i + muidApple))) - note(nilHandleErr, 0, "\pNil MENU Handle"); - - /* expand the apple menu */ - if (i == menuApple) - AddResMenu(mHnd[menuApple], 'DRVR'); - - InsertMenu(mHnd[i], 0); - } - - /* pre-emptive memory check */ - { - memBytesHandle hBytes; - Size grow; - - if (!(hBytes = (memBytesHandle) GetResource('memB', membID))) - note(nilHandleErr, 0, "\pNil Memory Handle"); - - pBytes = *hBytes; - - if (MaxMem(&grow) < pBytes->memPreempt) - note(memFullErr, 0, "\pMore Memory Required\rTry adding 16k"); - - memActivity = pBytes->memCleanup; /* force initial cleanup */ - } - - /* get the I/O buffer */ - if (!(pIOBuf = NewPtr(pBytes->memIOBuf))) - note(memFullErr, 0, "\pNil I/O Pointer"); -} - -/* align a window-related template to the main screen */ -static Handle -alignTemplate(ResType rezType, short rezID, short vOff, short vDenom, - Point *pPt) -{ - Handle rtnHnd; - Rect *pRct; - - vOff += GetMBarHeight(); - - if (!(rtnHnd = GetResource(rezType, rezID))) - note(nilHandleErr, 0, "\pNil Template Handle"); - - pRct = (Rect *) *rtnHnd; - - /* don't move memory while aligning rect */ - pRct->right -= pRct->left; /* width */ - pRct->bottom -= pRct->top; /* height */ - pRct->left = (qd.screenBits.bounds.right - pRct->right) / 2; - pRct->top = (qd.screenBits.bounds.bottom - pRct->bottom - vOff) / vDenom; - pRct->top += vOff; - pRct->right += pRct->left; - pRct->bottom += pRct->top; - - if (pPt) - *pPt = *(Point *) pRct; /* top left corner */ - - return rtnHnd; -} - -/* notification completion routine */ -pascal void -nmCompletion(NMRec *pNMR) -{ - (void) NMRemove(pNMR); - - (*(short *) (pNMR->nmPending))--; /* decrement pending note level */ - ((notifPtr) pNMR)->nmDispose = 1; /* allow DisposPtr() */ -} - -/* - * handle errors inside of note(). the error message is appended to the - * given message but on a separate line and must fit within nmBufSize. - */ -static void -noteErrorMessage(unsigned char *msg, unsigned char *errMsg) -{ - short i = nmt.nmBuf[0] + 1; /* insertion point */ - - BlockMove(&msg[1], &nmt.nmBuf[i], msg[0]); - nmt.nmBuf[i + msg[0]] = '\r'; - nmt.nmBuf[0] += (msg[0] + 1); - - note(memFullErr, 0, errMsg); -} - -/* - * display messages using Notification Manager or an alert. - * no run-length checking is done. the messages are created to fit - * in the allocated space (nmBufSize and aboutBufSize). - */ -static void -note(short errorSignal, short alertID, unsigned char *msg) -{ - if (!errorSignal) { - Size grow; - - if (MaxMem(&grow) < pBytes->memAbort) - noteErrorMessage(msg, "\pOut of Memory"); - } - - if (errorSignal || !in.Front) { - notifPtr pNMR; - short i = nmt.nmBuf[0] + 1; /* insertion point */ - - if (errorSignal) /* use notification template */ - { - pNMR = &nmt; - - /* we're going to abort so add in this prefix */ - BlockMove("Abort: ", &nmt.nmBuf[i], 7); - i += 7; - nmt.nmBuf[0] += 7; - } else /* allocate a notification record */ - { - if (!(pNMR = (notifPtr) NewPtr(sizeof(notifRec)))) - noteErrorMessage(msg, "\pNil New Pointer"); - - /* initialize it */ - *pNMR = nmt; - pNMR->nmr.nmStr = (StringPtr) & (pNMR->nmBuf); - - /* update the notification queue */ - if (!pNMQ) - pNMQ = pNMR; - else { - notifPtr pNMX; - - /* find the end of the queue */ - for (pNMX = pNMQ; pNMX->nmNext; pNMX = pNMX->nmNext) - ; - - pNMX->nmNext = pNMR; - } - } - - /* concatenate the message */ - BlockMove(&msg[1], &((pNMR->nmBuf)[i]), msg[0]); - (pNMR->nmBuf)[0] += msg[0]; - - in.Notify++; /* increase note pending level */ - - NMInstall((NMRec *) pNMR); - - if (errorSignal) - cooldown(); - - return; - } - - /* in front and no error so use an alert */ - ParamText(msg, "\p", "\p", "\p"); - (void) Alert(alertID, (ModalFilterUPP) 0L); - ResetAlrtStage(); - - memActivity++; -} - -static void -adjustGUI() -{ - static short oldMenubar = mbar_Init; /* force initial update */ - short newMenubar; - WindowPeek frontWindow; - - /* oldCursor is external so it can be reset in endRecover() */ - static short newCursor = curs_Init; - unsigned long timeNow; - short useArrow; - - /* adjust menubar 1st */ - newMenubar = in.Recover ? mbarRecover : mbarAppl; - - /* desk accessories take precedence */ - if (frontWindow = (WindowPeek) FrontWindow()) - if (frontWindow->windowKind < 0) - newMenubar = mbarDA; - - if (newMenubar != oldMenubar) { - /* adjust menus */ - switch (oldMenubar = newMenubar) { - case mbarAppl: - EnableItem(mHnd[menuFile], mitmOpen); - SetItemMark(mHnd[menuFile], mitmOpen, noMark); - DisableItem(mHnd[menuFile], mitmClose_DA); - DisableItem(mHnd[menuEdit], 0); - break; - - case mbarRecover: - DisableItem(mHnd[menuFile], mitmOpen); - SetItemMark(mHnd[menuFile], mitmOpen, checkMark); - DisableItem(mHnd[menuFile], mitmClose_DA); - DisableItem(mHnd[menuEdit], 0); - break; - - case mbarDA: - DisableItem(mHnd[menuFile], mitmOpen); - EnableItem(mHnd[menuFile], mitmClose_DA); - EnableItem(mHnd[menuEdit], 0); - break; - } - - DrawMenuBar(); - } - - /* now adjust the cursor */ - if (useArrow = (!in.Recover || (newMenubar == mbarDA))) - newCursor = curs_Init; - else if ((timeNow = TickCount()) >= timeCursor) /* spin cursor */ - { - timeCursor = timeNow + CURS_FRAME; - if (++newCursor >= curs_Total) - newCursor = 0; - } - - if (newCursor != oldCursor) { - oldCursor = newCursor; - - SetCursor(useArrow ? &qd.arrow : cPtr[newCursor]); - } -} - -static void -adjustMemory() -{ - Size grow; - - memActivity = 0; - - if (MaxMem(&grow) < pBytes->memWarning) - note(noErr, alidNote, "\pWarning: Memory is running low"); - - (void) ResrvMem((Size) FreeMem()); /* move all handles high */ -} - -/* show memory stats: FreeMem, MaxBlock, PurgeSpace, and StackSpace */ -static void -optionMemStats() -{ - unsigned char *pFormat = "\pFree:#k Max:#k Purge:#k Stack:#k"; - char *pSub = "#"; /* not a pascal string */ - unsigned char nBuf[16]; - long nStat, contig; - Handle strHnd; - long nOffset; - short i; - - if (wnEvt.modifiers & shiftKey) - adjustMemory(); - - if (!(strHnd = NewHandle((Size) 128))) { - note(noErr, alidNote, "\pOops: Memory stats unavailable!"); - return; - } - - SetString((StringHandle) strHnd, pFormat); - nOffset = 1L; - - for (i = 1; i <= 4; i++) { - /* get the replacement number stat */ - switch (i) { - case 1: - nStat = FreeMem(); - break; - case 2: - nStat = MaxBlock(); - break; - case 3: - PurgeSpace(&nStat, &contig); - break; - case 4: - nStat = StackSpace(); - break; - } - - NumToString((nStat >> 10), *(Str255 *) &nBuf); - - **strHnd += nBuf[0] - 1; - nOffset = - Munger(strHnd, nOffset, (Ptr) pSub, 1L, (Ptr) &nBuf[1], nBuf[0]); - } - - MoveHHi(strHnd); - HLock(strHnd); - note(noErr, alidNote, (unsigned char *) *strHnd); - DisposHandle(strHnd); -} - -static void -RecoverMenuEvent(long menuEntry) -{ - short menuID = HiWord(menuEntry); - short menuItem = LoWord(menuEntry); - - switch (menuID) { - case muidApple: - switch (menuItem) { - case mitmAbout: - if (wnEvt.modifiers & optionKey) - optionMemStats(); - /* fall thru */ - case mitmHelp: - note(noErr, (alertAppleMenu + menuItem), aboutBuf); - break; - - default: /* DA's or apple menu items */ - { - unsigned char daName[32]; - - GetItem(mHnd[menuApple], menuItem, *(Str255 *) &daName); - (void) OpenDeskAcc(daName); - - memActivity++; - } break; - } - break; - - case muidFile: - switch (menuItem) { - case mitmOpen: - beginRecover(); - break; - - case mitmClose_DA: { - WindowPeek frontWindow; - short refNum; - - if (frontWindow = (WindowPeek) FrontWindow()) - if ((refNum = frontWindow->windowKind) < 0) - CloseDeskAcc(refNum); - - memActivity++; - } break; - - case mitmQuit: - cooldown(); - break; - } - break; - - case muidEdit: - (void) SystemEdit(menuItem - 1); - break; - } - - HiliteMenu(0); -} - -static void -eventLoop() -{ - short wneMask = (in.Front ? everyEvent : (osMask + updateMask)); - long wneSleep = (in.Front ? 0L : 3L); - - while (1) { - if (in.Front) - adjustGUI(); - - if (memActivity >= pBytes->memCleanup) - adjustMemory(); - - (void) WaitNextEvent(wneMask, &wnEvt, wneSleep, (RgnHandle) 0L); - - if (in.Dialog) - (void) IsDialogEvent(&wnEvt); - - switch (wnEvt.what) { - case osEvt: - if (((wnEvt.message & osEvtMessageMask) >> 24) - == suspendResumeMessage) { - in.Front = (wnEvt.message & resumeFlag); - wneMask = (in.Front ? everyEvent : (osMask + updateMask)); - wneSleep = (in.Front ? 0L : 3L); - } - break; - - case nullEvent: - /* adjust the FIFO notification queue */ - if (pNMQ && pNMQ->nmDispose) { - notifPtr pNMX = pNMQ->nmNext; - - DisposPtr((Ptr) pNMQ); - pNMQ = pNMX; - - memActivity++; - } - - if (in.Recover) - continueRecover(); - break; - - case mouseDown: { - WindowPtr whichWindow; - - switch (FindWindow(wnEvt.where, &whichWindow)) { - case inMenuBar: - RecoverMenuEvent(MenuSelect(wnEvt.where)); - break; - - case inSysWindow: - SystemClick(&wnEvt, whichWindow); - break; - - case inDrag: { - Rect boundsRect = qd.screenBits.bounds; - Point offsetPt; - - InsetRect(&boundsRect, 4, 4); - boundsRect.top += GetMBarHeight(); - - DragWindow(whichWindow, *((Point *) &wnEvt.where), - &boundsRect); - - boundsRect = whichWindow->portRect; - offsetPt = *(Point *) &(whichWindow->portBits.bounds); - OffsetRect(&boundsRect, -offsetPt.h, -offsetPt.v); - - *(Rect *) *thermoTHnd = boundsRect; - } break; - } - } break; - - case keyDown: { - char key = (wnEvt.message & charCodeMask); - - if (wnEvt.modifiers & cmdKey) { - if (key == '.') { - if (in.Recover) { - endRecover(); - note(noErr, alidNote, "\pSorry: Recovery aborted"); - } - } else - RecoverMenuEvent(MenuKey(key)); - } - } break; - - /* without windows these events belong to our thermometer */ - case updateEvt: - case activateEvt: { - DialogPtr dPtr; - short itemHit; - - (void) DialogSelect(&wnEvt, &dPtr, &itemHit); - } - - case diskEvt: - if (HiWord(wnEvt.message)) { - Point pt = { 60, 60 }; - - (void) DIBadMount(pt, wnEvt.message); - DIUnload(); - - memActivity++; - } - break; - } /* switch (wnEvt.what) */ - } /* while (1) */ -} - -static void -cooldown() -{ - if (in.Recover) - endRecover(); - - /* wait for pending notifications to complete */ - while (in.Notify) - (void) WaitNextEvent(0, &wnEvt, 3L, (RgnHandle) 0L); - - ExitToShell(); -} - -/* draw the progress thermometer and frame. 1 level <=> 1 horiz. pixel */ -pascal void -drawThermo(WindowPtr wPtr, short inum) -{ - itemizeThermo(drawItem); -} - -/* manage progress thermometer dialog */ -static void -itemizeThermo(short itemMode) -{ - short iTyp, iTmp; - Handle iHnd; - Rect iRct; - - GetDItem(DLGTHM, uitmThermo, &iTyp, &iHnd, &iRct); - - switch (itemMode) { - case initItem: - SetDItem(DLGTHM, uitmThermo, iTyp, (Handle) drawThermoUPP, &iRct); - break; - - case invalItem: { - GrafPtr oldPort; - - GetPort(&oldPort); - SetPort(GRFTHM); - - InsetRect(&iRct, 1, 1); - InvalRect(&iRct); - - SetPort(oldPort); - } break; - - case drawItem: - FrameRect(&iRct); - InsetRect(&iRct, 1, 1); - - iTmp = iRct.right; - iRct.right = iRct.left + in.Recover; - PaintRect(&iRct); - - iRct.left = iRct.right; - iRct.right = iTmp; - EraseRect(&iRct); - break; - } -} - -/* show only .0 files in get file dialog */ -pascal Boolean -basenameFileFilter(ParmBlkPtr pPB) -{ - unsigned char *pC; - - if (!(pC = (unsigned char *) pPB->fileParam.ioNamePtr)) - return true; - - if ((*pC < 4) || (*pC > 28)) /* save/ 1name .0 */ - return true; - - if ((pC[*pC - 1] == '.') && (pC[*pC] == '0')) /* bingo! */ - return false; - - return true; -} - -static void -beginRecover() -{ - SFTypeList levlType = { 'LEVL' }; - SFReply sfGetReply; - - SFGetFile(sfGetWhere, "\p", basenameFileFilterUPP, 1, levlType, - (DlgHookUPP) 0L, &sfGetReply); - - memActivity++; - - if (!sfGetReply.good) - return; - - /* get volume (working directory) refnum, basename, and directory i.d. */ - vRefNum = sfGetReply.vRefNum; - BlockMove(sfGetReply.fName, lock, sfGetReply.fName[0] + 1); - { - static CInfoPBRec catInfo; - - catInfo.hFileInfo.ioNamePtr = (StringPtr) sfGetReply.fName; - catInfo.hFileInfo.ioVRefNum = sfGetReply.vRefNum; - catInfo.hFileInfo.ioDirID = 0L; - - if (PBGetCatInfoSync(&catInfo)) { - note(noErr, alidNote, "\pSorry: Bad File Info"); - return; - } - - dirID = catInfo.hFileInfo.ioFlParID; - } - - /* open the progress thermometer dialog */ - (void) GetNewDialog(dlogProgress, (Ptr) &dlgThermo, (WindowPtr) -1L); - if (ResError() || MemError()) - note(noErr, alidNote, "\pOops: Progress thermometer unavailable"); - else { - in.Dialog = 1; - memActivity++; - - itemizeThermo(initItem); - - ShowWindow(WNDTHM); - } - - timeCursor = TickCount() + CURS_LATENT; - saveRefNum = gameRefNum = levRefNum = -1; - in.Recover = 1; -} - -static void -continueRecover() -{ - restore_savefile(); - - /* update the thermometer */ - if (in.Dialog && !(in.Recover % 4)) - itemizeThermo(invalItem); - - if (in.Recover <= MAX_RECOVER_COUNT) - return; - - endRecover(); - - if (saveRezStrings()) - return; - - note(noErr, alidNote, "\pOK: Recovery succeeded"); -} - -/* no messages from here (since we might be quitting) */ -static void -endRecover() -{ - in.Recover = 0; - - oldCursor = curs_Init; - SetCursor(&qd.arrow); - - /* clean up abandoned files */ - if (gameRefNum >= 0) - (void) FSClose(gameRefNum); - - if (levRefNum >= 0) - (void) FSClose(levRefNum); - - if (saveRefNum >= 0) { - (void) FSClose(saveRefNum); - (void) FlushVol((StringPtr) 0L, vRefNum); - /* its corrupted so trash it ... */ - (void) HDelete(vRefNum, dirID, savename); - } - - saveRefNum = gameRefNum = levRefNum = -1; - - /* close the progress thermometer dialog */ - in.Dialog = 0; - CloseDialog(DLGTHM); - DisposHandle(dlgThermo.items); - memActivity++; -} - -/* add friendly, non-essential resource strings to save file */ -static short -saveRezStrings() -{ - short sRefNum; - StringHandle strHnd; - short i, rezID; - unsigned char *plName; - - HCreateResFile(vRefNum, dirID, savename); - - sRefNum = HOpenResFile(vRefNum, dirID, savename, fsRdWrPerm); - if (sRefNum <= 0) { - note(noErr, alidNote, "\pOK: Minor resource map error"); - return 1; - } - - /* savename and hpid get mutilated here... */ - plName = savename + 5; /* save/ */ - *savename -= 5; - do { - plName++; - (*savename)--; - hpid /= 10; - } while (hpid); - *plName = *savename; - - for (i = 1; i <= 2; i++) { - switch (i) { - case 1: - rezID = PLAYER_NAME_RES_ID; - strHnd = NewString(*(Str255 *) plName); - break; - - case 2: - rezID = APP_NAME_RES_ID; - strHnd = NewString(*(Str255 *) "\pNetHack"); - break; - } - - if (!strHnd) { - note(noErr, alidNote, "\pOK: Minor \'STR \' resource error"); - CloseResFile(sRefNum); - return 1; - } - - /* should check for errors... */ - AddResource((Handle) strHnd, 'STR ', rezID, *(Str255 *) "\p"); - } - - memActivity++; - - /* should check for errors... */ - CloseResFile(sRefNum); - return 0; -} - -static void -set_levelfile_name(long lev) -{ - unsigned char *tf; - - /* find the dot. this is guaranteed to happen. */ - for (tf = (lock + *lock); *tf != '.'; tf--, lock[0]--) - ; - - /* append the level number string (pascal) */ - if (tf > lock) { - NumToString(lev, *(Str255 *) tf); - lock[0] += *tf; - *tf = '.'; - } else /* huh??? */ - { - endRecover(); - note(noErr, alidNote, "\pSorry: File Name Error"); - } -} - -static short -open_levelfile(long lev) -{ - OSErr openErr; - short fRefNum; - - set_levelfile_name(lev); - if (!in.Recover) - return (-1); - - if ((openErr = HOpen(vRefNum, dirID, lock, fsRdWrPerm, &fRefNum)) - && (openErr != fnfErr)) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Open Error"); - return (-1); - } - - return (openErr ? -1 : fRefNum); -} - -static short -create_savefile(unsigned char *savename) -{ - short fRefNum; - - /* translate savename to a pascal string (in place) */ - { - unsigned char *pC; - short nameLen; - - for (pC = savename; *pC; pC++) - ; - - nameLen = pC - savename; - - for (; pC > savename; pC--) - *pC = *(pC - 1); - - *savename = nameLen; - } - - if (HCreate(vRefNum, dirID, savename, MAC_CREATOR, SAVE_TYPE) - || HOpen(vRefNum, dirID, savename, fsRdWrPerm, &fRefNum)) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Create Error"); - return (-1); - } - - return fRefNum; -} - -static void -copy_bytes(short inRefNum, short outRefNum) -{ - char *buf = (char *) pIOBuf; - long bufSiz = pBytes->memIOBuf; - - long nfrom, nto; - - do { - nfrom = read_levelfile(inRefNum, buf, bufSiz); - if (!in.Recover) - return; - - nto = write_savefile(outRefNum, buf, nfrom); - if (!in.Recover) - return; - - if (nto != nfrom) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Copy Error"); - return; - } - } while (nfrom == bufSiz); -} - -static void -restore_savefile() -{ - static int savelev; - long saveTemp, lev; - xchar levc; - struct version_info version_data; - - /* level 0 file contains: - * pid of creating process (ignored here) - * level number for current level of save file - * name of save file nethack would have created - * and game state - */ - - lev = in.Recover - 1; - if (lev == 0L) { - gameRefNum = open_levelfile(0L); - - if (in.Recover) - (void) read_levelfile(gameRefNum, (Ptr) &hpid, sizeof(hpid)); - - if (in.Recover) - saveTemp = - read_levelfile(gameRefNum, (Ptr) &savelev, sizeof(savelev)); - - if (in.Recover && (saveTemp != sizeof(savelev))) { - endRecover(); - note(noErr, alidNote, "\pSorry: \"checkpoint\" was not enabled"); - return; - } - - if (in.Recover) - (void) read_levelfile(gameRefNum, (Ptr) savename, - sizeof(savename)); - if (in.Recover) - (void) read_levelfile(gameRefNum, (Ptr) &version_data, - sizeof version_data); - - /* save file should contain: - * current level (including pets) - * (non-level-based) game state - * other levels - */ - if (in.Recover) - saveRefNum = create_savefile(savename); - - if (in.Recover) - levRefNum = open_levelfile(savelev); - - if (in.Recover) - (void) write_savefile(saveRefNum, (Ptr) &version_data, - sizeof version_data); - if (in.Recover) - copy_bytes(levRefNum, saveRefNum); - - if (in.Recover) - close_file(&levRefNum); - - if (in.Recover) - unlink_file(lock); - - if (in.Recover) - copy_bytes(gameRefNum, saveRefNum); - - if (in.Recover) - close_file(&gameRefNum); - - if (in.Recover) - set_levelfile_name(0L); - - if (in.Recover) - unlink_file(lock); - } else if (lev != savelev) { - levRefNum = open_levelfile(lev); - if (levRefNum >= 0) { - /* any or all of these may not exist */ - levc = (xchar) lev; - - (void) write_savefile(saveRefNum, (Ptr) &levc, sizeof(levc)); - - if (in.Recover) - copy_bytes(levRefNum, saveRefNum); - - if (in.Recover) - close_file(&levRefNum); - - if (in.Recover) - unlink_file(lock); - } - } - - if (in.Recover == MAX_RECOVER_COUNT) - close_file(&saveRefNum); - - if (in.Recover) - in.Recover++; -} - -static long -read_levelfile(short rdRefNum, Ptr bufPtr, long count) -{ - OSErr rdErr; - long rdCount = count; - - if ((rdErr = FSRead(rdRefNum, &rdCount, bufPtr)) && (rdErr != eofErr)) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Read Error"); - return (-1L); - } - - return rdCount; -} - -static long -write_savefile(short wrRefNum, Ptr bufPtr, long count) -{ - long wrCount = count; - - if (FSWrite(wrRefNum, &wrCount, bufPtr)) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Write Error"); - return (-1L); - } - - return wrCount; -} - -static void -close_file(short *pFRefNum) -{ - if (FSClose(*pFRefNum) || FlushVol((StringPtr) 0L, vRefNum)) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Close Error"); - return; - } - - *pFRefNum = -1; -} - -static void -unlink_file(unsigned char *filename) -{ - if (HDelete(vRefNum, dirID, filename)) { - endRecover(); - note(noErr, alidNote, "\pSorry: File Delete Error"); - return; - } -} diff --git a/sys/mac/mrecover.hqx b/sys/mac/mrecover.hqx deleted file mode 100644 index 2cf115d79..000000000 --- a/sys/mac/mrecover.hqx +++ /dev/null @@ -1,69 +0,0 @@ -(This file must be converted with BinHex 4.0) - -:$@ebC@0[GQ9b,R*cFQ-!FR0bBe*6483!!!!!!!!!!!aI55J!!!!!!3!!!!TJ!!! -*B!!!!Im!!'1M#Q&$E'YTEQPd,Q1!!J!!!&4&@&4,38K-!3!!-"*YFQ9MEhCPFLj -`FQpU,R*cFQ0b!J!!!(*cFQ058d9%!!"bFh*M8P0&4!%!!0!!J!!!!!!!!!!!!!! -!!!!!!!!!!+lTZ(B!!!!!!!!-F`!!!!!!!!!!%!!!!'1M#Q&$E'YXEfp`,Q1!!J! -!!&4&@&4,38K-!3!!B!"X!!!!!'1V!!!!!&Le!!"F!!!!!!!!!!!!!!#Mk`QeT3H -i4`!!!!"hD3!!!!!!!!!!!!!!!!!!!!!p93!A!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!L!!%!!!!!!$J!EJ"-!1B%!Np,!!!!!!!+!!S!+J&+L!*H-!!!!!` -!+!!S!))"I!#!!!3!!!!-!#J!+!$#!A`!J3!%!!!!5!##!!!!!!!!!!$rrrrl"%9 -NDA3%9@jNE`"D!!!",3!!!!!$3h9d!&J!!!4$Eh"j!%-!!!93BA0dC3"@!!!&3fa -PBA)!!!!!!!!!!$J!J!!!!!!!!!!!rrrrp`%8%%&LEh9d)&*PBfpfCA)Z,Li!!!! -!"dKPE(!Z,Li!!!!!!5d!!!!!!!!!!%3!!!2!!X!$`!'!!m!--!J3%#J35"H)%!J -)%!``!m!!!!2!"q!(i!IJ!m!2m"ri(rJrr$rm2r`rr"ri(rJ2m!2!!!N!"`!!!%! -'J!l!CZ!hB"r!6mcq%[mUkG6XL#N3-V!&@!5-!`3!!"r!Ir"rq2rmrrlrr[rrrrr -rrrrrIrprrcrr(ri2rJ2i!!!!('jS8Q-!!!!"4P*&4J!!!!!!J%P$6L-!!!!!!)! -!!!!(39"36!!!!!!!!"364'&fD@3J5'&TFR0dEfiJ-bmj-`!!!3!!!!!!!"m!!!" -r`!!JIm!!1$q`!"3rF!!512J!#6Gi!!6rH!!#IlJ!!6ri!''Iq!$rc$$Jrq3"-1l -b!T!!kIN&82IPLU$[ip9!6Z%LJ!(Jb3!2m))!$r%N!!I#LJ!!"9N!!!UNJ!!93N! -!%S&J!"N!d!!1!&!!!!!`!!!!!!!!!!!2r`!!2rr!!(rrm!"rrrJ!rrrm!2rrrJ$ -rrrm!rrrrJ2rrrm$rrrrJrrrrm2rrrrMrrrrmrrrrr2rrrrlrrrrqrrrrrhrrrrp -rrrrr2rrrrcrrrrmIrrrr$rrrr`Irrrm$rrrr!Irrr`$rrrm!Irrr!$rrrJ!Irri -!"rrm!!(rm!!!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrm!!!!!!!!!!!!!!!! -2%4%4r`!!!!!!!!!!m!!!$a%4%4m!!!!!!!!!!2r`!!$a%4%Ir`!!!!!!!!!2h`! -!m4%4m4m!!!!!!!!!$ph`!2%Ira%4m!!!!!!!!!$ph`$am4(a%I!!!!!!!!!!$ph -r%4%4m4(`!!!!!!!!!!$pha%4%4m4m!!!!!!!!!!!$pha%4%4%I!!!!!!!!r`!!r -pha(rra(`!!!!!!$a(rra(phr!!$r!!$rm!!!m4%4%4(ph`!!!!!242m!!2%I%4m -4(ph`!!!!p242!!$a(ara%Irph`!!$dp26`!!m4(a%4(`$p$`!26dp2!!!2%I%4% -4m!$`$`p26dm!!!!2ra%I%I!!$phd426`!!!!!!rrm4(`!!$r4242!!!!!!!2%4% -4(`!!p%4%m!!!!!!!$r%4%4m!$d6d6`!!!!!!!!!2rrr`!26d42h`!!!!!!!!!!! -!!!p26drph`!!!!!!!!!!!!$dp26`$ph`!!!!!!!!!!!26dp2!!$ph`!!!!!!!!! -!$d6dm!!!$p$`!!!!!!!!!!rd6`!!!!$`h`!!!!!!!!!!rr!!!!!!$pm!!!!!!!! -!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)! -!!!rrm!!!!!!!m4mI!!!!$G!2(a(`!!!!h3m4mI!!!!!0ha%I!!!!$`$Grrm!r`$ -arrh3!!p%m2%4(pd!p26`m4mI$Gp26`$rram!p%6`!!!!m!p%6`!!!!!!p26p!!! -!!!p26`h3!!!!$d6`!0d!!!!!r`!!$3!!!!!!!!!!!!!!!#!'J!l!CZ!hB"r!6mc -q%[mUkG6XL#N3-V!&@!5-!`3!!!!!!2B!!3!!!!!!H!"Z!)`!jJ3#6dX!!!!!!!S -!#J"U!8U)e6%T)&0PE'9MG#!L6h"PELiZ,L)JCR*[E5"dD'8J4QPXC5"YC@je,Jd -b+5"6C@aPBh3JG'KP)'GKE@8JG'mJFQ9MEhCPFL"QFQpY)(4SC5"ND@&XEfFZ$6- -T)&GKDA3JCQpb)(4SC5"bCA0eE(3J+%p,)'pb)&0[FR*j+5i0$84[)'j[G#"KG(4 -PEA"d)(4[)(*PBfpfCA)JB5"RB@eP)(4SBA3JDA-J)QPZ)("bEfGbCA0c)L!SD5j -P,L"cG'PXE#"bG@jZD@jR)'PZ)%jPG%KKBfXT)3!!!!"#!)%!!!!!!!!!!2rrrqX -%4QPXC3G2F'9Z,LiZ!%m!!!%Y!!!!!!K$E'pcC5"%33"A!!!",3!!!!!%8A9TG!" -4!!!!!!!!&!!!!!3!!)!!!!!`!!!!%!!!!%!!!!!!3J43FQPf4PG54!G$E'9KER9 -`4&G54!G3FQ9PEA"d4%a14`GABA*ZD@jR4%a14`9"BQpbG%4-6NF'58mJ3R9Q4%a -14`!!!%3!!!2!!d!$`!'!!B!#3!4J"#!%B!@J"#!%B!*!!B!!!!2!"q!(i!IJ!m! -$`!IJ$r!2m!r`$r!2m!r`"q!$`!'!!!N!"`!!!%3!!!2!!X!$`!'!!B!#3!2!!N! -(`!C!!m!#3!2!!B!!!!2!"q!(i!IJ!m!$`!IJ"q!(i!rJ$q!(i!IJ"q!$`!'!!!N -!"`!!!"d!+!!S!%!"3!!%!!!!!!!!!!!"!!K3FQpRFQ9cF`!!!"!!!!!!!!!!"`! -,!"%"$B!!!!!!4!!!!m!$3!2!!B!"J!*!"Q!%)!CJ"D!')!4J!d!"J!!!!m!(i!I -J"q!$`!2!"q!2m!r`$r!2m!r`$r!(i!2!!B!!#3!(!!!!4!!!!m!$3!2!!B!"J!0 -!"L!&B!8J"@!&)!9J!N!"J!!!!m!(i!IJ"q!$`!2!"q!2m!r`$r!2m!r`$r!(i!2 -!!B!!#3!(!!!!4!!!!m!#`!2!!B!"J!*!!m!#3!2J!Q!$`!*!!m!"J!!!!m!(i!I -J"q!$`!2!"q!(i!IJ"r!(m!IJ"q!(i!2!!B!!#3!(!!!!4!!!!m!#`!2!!B!$J!q -3!!`3'CJCQ"QB'CJ*N!!-%!2!!!!$`!IJ"q!(i!2!$r!Iq"ri2r`rr$rm2r`Iq"r -i$r!$`!!*!!F!!!"%!!!$`!0!!m!"J!'!!m!&)!DJ"+!'S!5J"U!$3!'!!!!$`!I -J"q!(i!2!!m!(i!r`$r!2m!r`$r!2m!IJ!m!"J!!*!!F!!!!U!c#!!!!!!c-Z-ap -5C@0[GQ9b)$-Z-`eNCACdC@&Y3'jPG'KKBfXZEh*R!!!!&J-`J!!!!!-c,M-,8Q9 -MEhCPFL!c,M-!!!%!!!!+B!!!#@!!!!(r"-)(q#qq!!!!(!(k!!p"6&*8!!%!JN4 -*9%`!!J#D689193!#!,j$99*6!!F!iNP$6L-!!!&#D@0c)`!!!8j#6N4-!!!"@Qj -S8Q-!!!&Q4P*&4J!!!A*fCA*c!!%"IQPME$3!!!'@D@0c0!!!!D*65801!!!"VQe -PE8)!!!'k9%e36!!!!FC%6%p(!!!"dJ#!rrm!!!!Q!!!!!!#"rrm!!!!f!!!!!!# -!rrmJ!!!!!!!!!!#"rrmJ!!90!!!!!!%!rrmJ!!HF!!!!!!##rrm!!!"'!!!!!!# -!rrm!!!#5!!!!!!#"rrm!!!C(!!!!!!#!rrm8!!$1!!!!!!#"rrm8!!EV!!!!!!# -#rrm8!!Fc!!!!!!#(rrm8!!H`!!!!!!#&rrm8!!Ii!!!!!!#'rrm8!!K!!!!!!!# -%rrm8!!L)!!!!!!#$rrm8!!M3!!!!!!#!rrm!!!'G!!!!!!#!rrm!!!%@!!!!!!# -!rrm!!!&D!!!!!!!!rrm!!!'&!!!!!!#!rrm!!!&k!!!!!!!"rrm!!!NB!!!!!!! -#rrm!!!P'!!!!!!#!rrm!!!+K!!!!!!#!rrm!!!5P!!!!!!#!rrm!!!8T!!!!!!# -!rrm8!!D0!!!!!!#!!!!!!!DP!!!!!!%!rrm!!!Gl!!!!!!4YC@e#8i3: diff --git a/sys/mac/mttymain.c b/sys/mac/mttymain.c deleted file mode 100644 index 2cd59a9d2..000000000 --- a/sys/mac/mttymain.c +++ /dev/null @@ -1,626 +0,0 @@ -/* NetHack 3.6 mttymain.c $NHDT-Date: 1554215928 2019/04/02 14:38:48 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.13 $ */ -/* Copyright (c) Jon W{tte, 1993 */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "macwin.h" -#include "mttypriv.h" -#include "mactty.h" -#include "wintty.h" - -#if !TARGET_API_MAC_CARBON -#include -#endif -#include - -#define MT_WINDOW 135 -#define MT_WIDTH 80 -#define MT_HEIGHT 24 - -/* - * Names: - * - * Statics are prefixed _ - * Mac-tty becomes mt_ - */ - -static long _mt_attrs[5][2] = { - { 0x000000, 0xffffff }, /* Normal */ - { 0xff8080, 0xffffff }, /* Underline */ - { 0x40c020, 0xe0e0e0 }, /* Bold */ - { 0x003030, 0xff0060 }, /* Blink */ - { 0xff8888, 0x000000 }, /* Inverse */ -}; - -static char _attrs_inverse[5] = { - 0, 0, 0, 0, 0, -}; - -/* see color.h */ - -static long _mt_colors[CLR_MAX][2] = { - { 0x000000, 0x808080 }, /* Black */ - { 0x880000, 0xffffff }, /* Red */ - { 0x008800, 0xffffff }, /* Green */ - { 0x553300, 0xffffff }, /* Brown */ - { 0x000088, 0xffffff }, /* Blue */ - { 0x880088, 0xffffff }, /* Magenta */ - { 0x008888, 0xffffff }, /* Cyan */ - { 0x888888, 0xffffff }, /* Gray */ - { 0x000000, 0xffffff }, /* No Color */ - { 0xff4400, 0xffffff }, /* Orange */ - { 0x00ff00, 0xffffff }, /* Bright Green */ - { 0xffff00, 0x606060 }, /* Yellow */ - { 0x0033ff, 0xffffff }, /* Bright Blue */ - { 0xff00ff, 0xffffff }, /* Bright Magenta */ - { 0x00ffff, 0xffffff }, /* Bright Cyan */ - { 0xffffff, 0x505050 }, /* White */ -}; - -static char _colors_inverse[CLR_MAX] = { - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -#ifdef CHANGE_COLOR - -#define POWER_LIMIT 22 -#define SECONDARY_POWER_LIMIT 16 -#define CHANNEL_LIMIT 14 -#define SECONDARY_CHANNEL_LIMIT 12 - -void -tty_change_color(int color, long rgb, int reverse) -{ - long inverse, working_rgb = rgb; - int total_power = 0, max_channel = 0; - int cnt = 3; - - working_rgb >>= 4; - while (cnt-- > 0) { - total_power += working_rgb & 0xf; - max_channel = max(max_channel, working_rgb & 0xf); - working_rgb >>= 8; - } - - if (total_power >= POWER_LIMIT - || (total_power >= SECONDARY_POWER_LIMIT - && max_channel >= SECONDARY_CHANNEL_LIMIT) - || max_channel >= CHANNEL_LIMIT) - inverse = 0x000000; - else - inverse = 0xffffff; - - if (reverse) { - working_rgb = rgb; - rgb = inverse; - inverse = working_rgb; - } - - if (color >= CLR_MAX) { - if (color - CLR_MAX >= 5) - impossible("Changing too many colors"); - else { - _mt_attrs[color - CLR_MAX][0] = rgb; - _mt_attrs[color - CLR_MAX][1] = inverse; - _attrs_inverse[color - CLR_MAX] = reverse; - } - } else if (color >= 0) { - _mt_colors[color][0] = rgb; - _mt_colors[color][1] = inverse; - _colors_inverse[color] = reverse; - } else - impossible("Changing negative color"); -} - -void -tty_change_background(int white_or_black) -{ - register int i; - - for (i = 0; i < CLR_MAX; i++) { - if (white_or_black) - _mt_colors[i][1] = 0xffffff; /* white */ - else - _mt_colors[i][1] = 0x000000; /* black */ - } - - /* special cases */ - if (white_or_black) { - _mt_colors[CLR_BLACK][1] = - 0x808080; /* differentiate black from no color */ - _mt_colors[CLR_WHITE][1] = - 0x505050; /* highlight white with grey background */ - _mt_colors[CLR_YELLOW][1] = - 0x606060; /* highlight yellow with grey background */ - _mt_colors[CLR_BLUE][0] = 0x000088; /* make pure blue */ - _mt_colors[NO_COLOR][0] = 0x000000; /* make no_color black on white */ - _mt_attrs[0][0] = 0x000000; /* "normal" is black on white */ - _mt_attrs[0][1] = 0xffffff; - } else { - _mt_colors[NO_COLOR][0] = 0xffffff; /* make no_color white on black */ - _mt_colors[CLR_BLACK][1] = - 0x808080; /* differentiate black from no color */ - _mt_colors[CLR_BLUE][0] = - 0x222288; /* lighten blue - it's too dark on black */ - _mt_attrs[0][0] = 0xffffff; /* "normal" is white on black */ - _mt_attrs[0][1] = 0x000000; - } -} - -char * -tty_get_color_string(void) -{ - char *ptr; - int count; - static char color_buf[5 * (CLR_MAX + 5) + 1]; - - color_buf[0] = 0; - ptr = color_buf; - - for (count = 0; count < CLR_MAX; count++) { - int flag = _colors_inverse[count] ? 1 : 0; - - sprintf(ptr, "%s%s%x%x%x", count ? "/" : "", flag ? "-" : "", - (int) (_mt_colors[count][flag] >> 20) & 0xf, - (int) (_mt_colors[count][flag] >> 12) & 0xf, - (int) (_mt_colors[count][flag] >> 4) & 0xf); - ptr += strlen(ptr); - } - for (count = 0; count < 5; count++) { - int flag = _attrs_inverse[count] ? 1 : 0; - - sprintf(ptr, "/%s%x%x%x", flag ? "-" : "", - (int) (_mt_attrs[count][flag] >> 20) & 0xf, - (int) (_mt_attrs[count][flag] >> 12) & 0xf, - (int) (_mt_attrs[count][flag] >> 4) & 0xf); - ptr += strlen(ptr); - } - - return color_buf; -} -#endif - -extern struct DisplayDesc *ttyDisplay; /* the tty display descriptor */ - -char kill_char = CHAR_ESC; -char erase_char = CHAR_BS; - -WindowRef _mt_window = (WindowRef) 0; -static Boolean _mt_in_color = 0; -extern short win_fonts[NHW_TEXT + 1]; - -static void -_mt_init_stuff(void) -{ - long resp, flag; - short num_cols, num_rows, win_width, win_height, font_num, font_size; - short char_width, row_height; - short hor, vert; - - LI = MT_HEIGHT; - CO = MT_WIDTH; - - if (!strcmp(windowprocs.name, "mac")) { - dprintf("Mac Windows"); - LI -= 1; - } else { - dprintf("TTY Windows"); - } - - /* - * If there is at least one screen CAPABLE of color, and if - * 32-bit QD is there, we use color. 32-bit QD is needed for the - * offscreen GWorld - */ - if (!Gestalt(gestaltQuickdrawVersion, &resp) && resp > 0x1ff) { - GDHandle gdh = GetDeviceList(); - while (gdh) { - if (TestDeviceAttribute(gdh, screenDevice)) { - if (HasDepth(gdh, 4, 1, 1) || HasDepth(gdh, 8, 1, 1) - || HasDepth(gdh, 16, 1, 1) || HasDepth(gdh, 32, 1, 1)) { - _mt_in_color = 1; - break; - } - } - gdh = GetNextDevice(gdh); - } - } - - if (create_tty(&_mt_window, WIN_BASE_KIND + NHW_MAP, _mt_in_color) - != noErr) - error("_mt_init_stuff: Couldn't create tty."); - SetWindowKind(_mt_window, WIN_BASE_KIND + NHW_MAP); - SelectWindow(_mt_window); - SetPortWindowPort(_mt_window); - SetOrigin(-1, -1); - - font_size = iflags.wc_fontsiz_map - ? iflags.wc_fontsiz_map - : (iflags.large_font && !small_screen) ? 12 : 9; - if (init_tty_number(_mt_window, win_fonts[NHW_MAP], font_size, CO, LI) - != noErr) - error("_mt_init_stuff: Couldn't init tty."); - - if (get_tty_metrics(_mt_window, &num_cols, &num_rows, &win_width, - &win_height, &font_num, &font_size, &char_width, - &row_height)) - error("_mt_init_stuff: Couldn't get tty metrics."); - - SizeWindow(_mt_window, win_width + 2, win_height + 2, 1); - if (RetrievePosition(kMapWindow, &vert, &hor)) { - dprintf("Moving window to (%d,%d)", hor, vert); - MoveWindow(_mt_window, hor, vert, 1); - } - ShowWindow(_mt_window); - - /* Start in raw, always flushing mode */ - get_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, &flag); - flag |= TA_ALWAYS_REFRESH | TA_WRAP_AROUND; - set_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, flag); - - get_tty_attrib(_mt_window, TTY_ATTRIB_CURSOR, &flag); - flag |= (TA_BLINKING_CURSOR | TA_NL_ADD_CR); - set_tty_attrib(_mt_window, TTY_ATTRIB_CURSOR, flag); - - set_tty_attrib(_mt_window, TTY_ATTRIB_FOREGROUND, - _mt_colors[NO_COLOR][0]); - set_tty_attrib(_mt_window, TTY_ATTRIB_BACKGROUND, - _mt_colors[NO_COLOR][1]); - clear_tty(_mt_window); - - InitMenuRes(); - - { - /* update the window proc has_color table */ - int i, setting = 0; - Rect r; -// Point p = {0, 0}; - GDHandle gh = (GDHandle) 0; - - if (_mt_in_color) { - GetWindowBounds(_mt_window, kWindowContentRgn, &r); -// SetPortWindowPort(_mt_window); -// LocalToGlobal (&p); -// OffsetRect (&r, p.h, p.v); - gh = GetMaxDevice(&r); - /* > 4 bpp */ - setting = ((*((*gh)->gdPMap))->pixelSize > 4) ? 1 : 0; - } - - for (i = 0; i < CLR_MAX ; ++i) { - tty_procs.has_color[i] = - (i == CLR_BLACK || i == NO_COLOR || i == CLR_WHITE) - ? 1 - : (_mt_in_color && gh) - ? setting - : 0; - } - } -} - -int -tgetch(void) -{ - EventRecord event; - long sleepTime = 0; - int ret = 0; - - for (; !ret;) { - WaitNextEvent(-1, &event, sleepTime, 0); - HandleEvent(&event); - blink_cursor(_mt_window, event.when); - if (event.what == nullEvent) { - sleepTime = GetCaretTime(); - } else { - sleepTime = 0; - } - ret = GetFromKeyQueue(); - if (ret == CHAR_CR) - ret = CHAR_LF; - } - return ret; -} - -void -getreturn(char *str) -{ - FlushEvents(-1, 0); - msmsg("Press space %s", str); - (void) tgetch(); -} - -#if 0 /* this function is commented out */ -/* the tty has_color[] table is filled in during init above */ -int -has_color(int color) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(color) -#endif - Rect r; - // Point p = {0, 0}; - GDHandle gh; - - if (!_mt_in_color) - return 0; - - GetWindowBounds(_mt_window, kWindowContentRgn, &r); - // SetPortWindowPort(_mt_window); - // LocalToGlobal (&p); - // OffsetRect (&r, p.h, p.v); - - gh = GetMaxDevice(&r); - if (!gh) { - return 0; - } - - return (*((*gh)->gdPMap))->pixelSize > 4; /* > 4 bpp */ -} -#endif - -void -tty_delay_output(void) -{ - EventRecord event; - long toWhen = TickCount() + 3; - - while (TickCount() < toWhen) { - WaitNextEvent(updateMask, &event, 3L, 0); - if (event.what == updateEvt) { - HandleEvent(&event); - blink_cursor(_mt_window, event.when); - } - } -} - -void -cmov(int x, int y) -{ - move_tty_cursor(_mt_window, x, y); - ttyDisplay->cury = y; - ttyDisplay->curx = x; -} - -void -nocmov(int x, int y) -{ - cmov(x, y); -} - -static void -_mt_set_colors(long *colors) -{ - short err; - - if (!_mt_in_color) { - return; - } - err = set_tty_attrib(_mt_window, TTY_ATTRIB_FOREGROUND, colors[0]); - err = set_tty_attrib(_mt_window, TTY_ATTRIB_BACKGROUND, colors[1]); -} - -int -term_attr_fixup(int attrmask) -{ - attrmask &= ~ATR_DIM; - return attrmask; -} - -void -term_end_attr(int attr) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(attr) -#endif - _mt_set_colors(_mt_attrs[0]); -} - -void -term_start_attr(int attr) -{ - switch (attr) { - case ATR_ULINE: - _mt_set_colors(_mt_attrs[1]); - break; - case ATR_BOLD: - _mt_set_colors(_mt_attrs[2]); - break; - case ATR_BLINK: - _mt_set_colors(_mt_attrs[3]); - break; - case ATR_INVERSE: - _mt_set_colors(_mt_attrs[4]); - break; - default: - _mt_set_colors(_mt_attrs[0]); - break; - } -} - -void -standoutend(void) -{ - term_end_attr(ATR_INVERSE); -} - -void -standoutbeg(void) -{ - term_start_attr(ATR_INVERSE); -} - -void -term_end_color(void) -{ - _mt_set_colors(_mt_colors[NO_COLOR]); -} - -void -cl_end(void) -{ - _mt_set_colors(_mt_attrs[0]); - clear_tty_window(_mt_window, ttyDisplay->curx, ttyDisplay->cury, CO - 1, - ttyDisplay->cury); -} - -void -clear_screen(void) -{ - _mt_set_colors(_mt_attrs[0]); - clear_tty(_mt_window); -} - -void -cl_eos(void) -{ - _mt_set_colors(_mt_attrs[0]); - clear_tty_window(_mt_window, ttyDisplay->curx, ttyDisplay->cury, CO - 1, - LI - 1); -} - -void -home(void) -{ - cmov(0, 0); -} - -void -backsp(void) -{ - char eraser[] = { CHAR_BS, CHAR_BLANK, CHAR_BS, 0 }; - short err; - - err = add_tty_string(_mt_window, eraser); - err = update_tty(_mt_window); -} - -void -msmsg(const char *str, ...) -{ - va_list args; - char buf[1000]; - - va_start(args, str); - vsprintf(buf, str, args); - va_end(args); - - xputs(buf); -} - -void -term_end_raw_bold(void) -{ - term_end_attr(ATR_INVERSE); -} - -void -term_start_raw_bold(void) -{ - term_start_attr(ATR_INVERSE); -} - -void -term_start_color(int color) -{ - if (color >= 0 && color < CLR_MAX) { - _mt_set_colors(_mt_colors[color]); - } -} - -void -setftty(void) -{ - long flag; - - /* Buffered output for the game */ - get_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, &flag); - flag &= ~TA_ALWAYS_REFRESH; - flag |= TA_INHIBIT_VERT_SCROLL; /* don't scroll */ - set_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, flag); - iflags.cbreak = 1; -} - -void -tty_startup(int *width, int *height) -{ - _mt_init_stuff(); - *width = CO; - *height = LI; -} - -void -gettty(void) -{ -} - -void -settty(const char *str) -{ - long flag; - - update_tty(_mt_window); - - /* Buffered output for the game, raw in "raw" mode */ - get_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, &flag); - flag &= ~TA_INHIBIT_VERT_SCROLL; /* scroll */ - flag |= TA_ALWAYS_REFRESH; - set_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, flag); - - tty_raw_print("\n"); - if (str) { - tty_raw_print(str); - } -} - -void -tty_number_pad(int arg) -{ -#if defined(__SC__) || defined(__MRC__) -#pragma unused(arg) -#endif -} - -void -tty_start_screen(void) -{ - iflags.cbreak = 1; -} - -void -tty_end_screen(void) -{ -} - -void -xputs(const char *str) -{ - add_tty_string(_mt_window, str); -} - -int -term_puts(const char *str) -{ - xputs(str); - return strlen(str); -} - -int -term_putc(int c) -{ - short err; - - err = add_tty_char(_mt_window, c); - return err ? EOF : c; -} - -int -term_flush(void *desc) -{ - if (desc == stdout || desc == stderr) { - update_tty(_mt_window); - } else { - impossible("Substituted flush for file"); - return fflush(desc); - } - return 0; -} diff --git a/sys/msdos/Install.dos b/sys/msdos/Install.dos index b3ac0abd7..a8091e607 100644 --- a/sys/msdos/Install.dos +++ b/sys/msdos/Install.dos @@ -1,30 +1,25 @@ - Copyright (c) NetHack PC Development Team 1990-2002. + Copyright (c) NetHack PC Development Team 1990-2026. NetHack may be freely redistributed. See license for details. ============================================================== Instructions for compiling and installing - NetHack 3.6 on a DOS system + NetHack 5.0 on a DOS system ====================================================== - (or, How to make PC NetHack 3.6) - Last revision: $NHDT-Date: 1432512791 2015/05/25 00:13:11 $ + (or, How to make PC NetHack 5.0) + Last revision: $NHDT-Date: 1596508786 2021/06/04 08:45:00 $ -Credit for a runnable full PC NetHack 3.6 goes to the PC Development team -of Paul Winner, Kevin Smolkowski, Michael Allison, Yitzhak Sapir, Bill Dyer, -Timo Hakulinen, Yamamoto Keizo, Mike Threepoint, Mike Stephenson, +Credit for a runnable full PC NetHack 5.0 goes to the PC Development team +of Paul Winner, Kevin Smolkowski, Michael Allison, Yitzhak Sapir, Bill Dyer, +Timo Hakulinen, Yamamoto Keizo, Mike Threepoint, Mike Stephenson, Stephen White, Ken Washikita and Janet Walz. The present port is based on the previous effort of Pierre Martineau, Stephen Spackman, Steve Creps, Mike Threepoint, Mike Stephenson, Norm Meluch and Don Kneller. -There has been very little port-specific maintenance for NetHack on DOS since -NetHack 3.3.0. - CONTENTS: - I. Dispelling the Myths - II. Compiling on a DOS machine - Appendix A - Building the "official binary" - Appendix B - DJGPP Compiler (gcc ported to msdos) notes - Appendix C - Additional Notes + I. Dispelling the Myths + II. Compiling on Linux or macOS via cross-compiler + Appendix A - Additional Notes Appendix D - Contacting Us I. Dispelling the Myths: @@ -33,233 +28,140 @@ I. Dispelling the Myths: however it will behoove you to read this entire file through before beginning the task. - We have provided a proper Makefile for building NetHack using the - following compilers: - djgpp V2.03 or later - - For specific details concerning the djgpp compiler, please see the - appendix B. - - The makefile named Makefile.GCC is for use with GNU Make that - accompanies djgpp. - - If you want to build a copy of NetHack that is identical to the - "official binary", please see appendix A. - - The unsupported sys/msdos/Makefile.MSC was for the old 16 bit - Microsoft Visual C 1.52c compiler and has not been made compliant - with 3.5.x. - - You may find it useful to obtain copies of lex (flex) and yacc (bison - or byacc). While not strictly necessary to compile nethack, they are - required should you desire to make any changes to the level and dungeon - compilers. Flex and Bison are included with the DJGPP distribution and - are also available on many archive sites. - - Also be sure to pick up djgpp v2gnu/fil41b.zip to get ls.exe and - touch.exe, since the Makefile uses them by default. - -II. To compile your copy of NetHack on a DOS machine: - (or "just follow these few 'simple' steps outlined below.") - -1. It almost goes without saying that you should make sure that your tools - are set up and running correctly. - -2. 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\msdos, util, win\tty and - win\share. Other subdirectories may also be included in your - distribution, but they are not necessary for use with DOS. You can - delete them to save space. - - Required Source Directories for DOS NetHack: - - (top) - | - ------------------------------------------------- - | | | | | | | - util dat doc include src sys win - | | - ------ ----- - | | | | - share msdos tty share - - Check the file "Files" in your top level directory for an exact - listing of what files are in which directory. In order for the - Makefiles to work, all the source files must be in the proper - locations. - - 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 - return and line feed pairs used by DOS. Some programs have trouble - with them, so you may need to convert them (with a utility like - Rahul Dhesi's "flip"). - -3. Go to the sys/msdos directory and ensure that the file setup.bat - has MSDOS style end-of-line characters rather than UNIX style - end-of-line characters. You can do that using a utility like - Rahul Dhesi's "flip", or by invoking the MSDOS edit utility on - setup.bat and saving the file without making any changes. Failure to - do this will prevent the bat file from executing completely, yet no - warning message will be given. - - Run the setup.bat batch file with the following as the argument: - - GCC For djgpp and GNU MAKE. - - The appropriate and necessary Makefile movement will be accomplished - for you, as well as verifying a few files and fixing a few file names - on FAT systems with long file name support. - -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 the WIZARD option, - and check TERMLIB and COMPRESS. Also be sure to leave DLB support - commented out in config.h. MSDOS has support for DLB, but it must be - done through the Makefile, rather than config.h, to ensure that the - necessary packaging steps are done. - - We've managed to enable all the special features. You may include all - or as few of them as you wish. To conserve disk space, you may wish - to disable LOGFILE and NEWS. - - Also check pcconf.h, which should not need much editing (if you are - including random.c, and if you do not require termcap for screen - management). If you are not including random.c you will need to - comment out RANDOM. - - If using DJGPP, you can choose between SCREEN_BIOS - and SCREEN_DJGPPFAST. Never, never, ever choose both. Bad things - will happen. We are not kidding. - -5. If you want to change the high score list behavior, examine the top of - topten.c, in the src directory. You may want to change the definitions of - PERSMAX, POINTSMIN, and ENTRYMAX. We set POINTSMIN to 51 and ENTRYMAX to - 50 to keep the size of the score list down. - -6. Go to the src directory and edit the top of your Makefile. Be sure the - directory you want the game installed in (GAMEDIR) actually exists. - -7. Now that everything is set up, - - Go to the src directory, and using the GNU Make utility, - "make install". - - Depending on your particular machine and compiler, you can either - grab a cup of coffee or go home for the day. Your computer will be - occupied for quite some time. If all goes well, you will get an - NetHack executable. - -9. If you chose DLB support (recommended), make sure that the file nhdat - got copied into the game directory. - - If you didn't choose DLB support, make sure the support files -- - data, rumors, cmdhelp, opthelp, help, hh,history, guidebook.txt - license, and all the *.lev files -- were copied to the game directory. - If not, move them there from the dat directory yourself. rumors can - be created manually be entering "makedefs -r", data by entering - "makedefs -d". - - Make sure the files NetHack1.tib and NetHacko.tib made it to your game - directory. Copy them from src to the game directory yourself if - necessary. - - Make sure the files defaults.nh and termcap made it to your game - directory. If not, go to sys\share and copy NetHack.cnf to - your game directory as defaults.nh. The name in previous versions was - nethack.cnf, but the CNF extension conflicted with the MS Windows - speed-dialer, making the file hidden on many machines. - - If you changed your build settings to include TERMCAP support, copy - termcap to your game directory. - - Also, make sure the file msdoshlp.txt made it to your game directory. - If it didn't, move it from sys\msdos to your game directory - yourself. - -10. In your game directory, review the settings in defaults.nh and adjust - them according to your style of play. -11. Play NetHack. If it works, you're done! +II. There once was a time when people built NetHack right on their DOS machine. + The arcane recipe often involved flat cylinders known as "floppy disks", + much gnashing of teeth, squeezing large things into small spaces, and + required the sacrifice of copious amounts of time and coffee. + + These days, to compile your copy of NetHack on Linux or macOS machine you + can use Andrew Wu's djgpp cross-compiler from: + https://github.com/andrewwutw/build-djgpp + downloaded from: + https://github.com/andrewwutw/build-djgpp/releases/download/v3.0/ + a DOS-extender (for including in msdos packaging) from: + http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip + and Lua from: + http://www.lua.org/ftp/lua-5.4.8.tar.gz + + If you want the DOSVGA build, to support higher resolutions and Unicode + symbols, you also need: + pdcursesmod from: + https://github.com/Bill-Gray/PDCursesMod.git + (Name this lib/pdcurmod for the native build) + Terminus fonts from: + https://sourceforge.net/projects/terminus-font/files/terminus-font-4.49/terminus-font-4.49.1.tar.gz + (Name this lib/terminus for the native build) + If not, you also need: + pdcurses from: + https://github.com/wmcbrine/PDCurses.git + + - A bash script to download the above-mentioned djgpp cross-compiler and + associated support pieces for either linux or macOS is available: + sys/msdos/fetch-cross-compiler.sh + + That script won't install anything, it just does file fetches and stores + them in subfolders of lib. The linux.500 and macOS.500 hints files are + configured to find the cross-compiler there if you add + CROSS_TO_MSDOS=1 + on your make command line. + + Note: Both the fetch-cross-compiler.sh bash script and the msdos + cross-compile and package procedures require unzip and zip to be available + on your host build system. -Appendix A - Building the "official binary" + On your linux host: - If you wish to build a copy of NetHack identical to the one that - the pc team distributes, simply do the following: + cd sys/unix ; sh setup.sh hints/linux.500 ; cd ../.. + make fetch-lua - The 32-bit Protected Mode DPMI version built with 32-bit djgpp - compiler V2.03 or greater, make no changes to any of the defines and use - the Makefile.GCC as distributed, and as moved in step 3. + On your macOS host: - Paths below are relative to the top of your unpacked - NetHack source distribution: + cd sys/unix ; sh setup.sh hints/macOS.500 ; cd ../.. + make fetch-lua - md \nethack\binary (must match Makefile) - cd sys\msdos - setup GCC - cd ..\..\src - make install + The MSDOS cross-compile can then be carried out by specifying + CROSS_TO_MSDOS=1 on the make command line: + make CROSS_TO_MSDOS=1 package - Make sure the following files have been converted from the - unix style "^J" end of line, to the msdos style "^M^J": - license, defaults.nh. + You can explicitly include tty and curses support if desired. The default + you'll end up with if you don't specify any WANT_ command line options + is a tty-only cross-compile build: - Place all the files in a clean directory and test. + make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_MSDOS=1 package -Appendix B - DJGPP Compiler (gcc ported to msdos) + Add WANT_DOSVGA for a curses build that supports higher resolutions, + external fonts and Unicode symbols: + + make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_MSDOS=1 WANT_DOSVGA=1 package + + Result: The "make package" target will bundle all of the necessary + components to run NetHack on msdos into a folder: + targets/msdos/pkg + and then it zips the contents of that folder into: + targets/msdos/nh370dos.zip + + Also note that building the msdos targets using the make command + above, does not preclude you from building local linux or macOS + targets as well. Just drop the CROSS_TO_MSDOS=1 from the make + command line. That's because the cross-compiler hints additions are + enclosed inside ifdef sections and won't interfere with the + non-cross-compile build in that case. + +Appendix A - Additional Notes + +1. In your game directory, review the settings in defaults.nh and adjust + them according to your style of play. - If you have a 386 or better machine, you are in luck. You can compile - NetHack without spending money on a compiler. DJGPP is available free - from many archive sites. - At the time of this release in April 2002, the URL - http://www.delorie.com/djgpp/zip-picker.html/ - had information on how to obtain djgpp and what pieces to get. - Be sure to pick up djgpp v2gnu/fil41b.zip to get ls.exe and - touch.exe, since the Makefile uses them by default (or change - the Makefile to use alternatives). +2. Play NetHack. If it works, you're done! - Special note for Windows 2000 / Windows XP users: You must have a - recent djgpp distribution for the build process, and the generated - executables to work properly on those platforms. +Appendix B - Common Difficulties Encountered - Setting up DJGPP is more than adequately explained in the documentation - that comes with it. Be sure to pick up the yacc and flex built with - DJGPP if you intend to do any modification of the special levels or - dungeon compilers. They should be available at the same place you got - djgpp. + i) The cross-compile stops with an error about "No rule to make target + '../lib/djgpp/djgpp-patch/src/libc/go32/exceptn.S'" - The latest version of djgpp, V2.03 with the most recent refresh - will produce a binary that will run under Microsoft Windows, or any - other DPMI provider. djgpp also comes with a DPMI provider called CWSDPMI. - Place CWSDPMI.EXE in your path and it will be used in the absence of any - other DPMI provider. + For example: + make CROSS_TO_MSDOS=1 package + ( cd src ; make LUA_VERSION=5.4.8 nethack ) + make[1]: Entering directory '/home/johndoe/NHsource/src' + mkdir -p ../targets/msdos ; make ../targets/msdos/exceptn.o ; + make[2]: Entering directory '/home/johndoe/NHsource/src' + make[2]: *** No rule to make target + '../lib/djgpp/djgpp-patch/src/libc/go32/exceptn.S', + needed by '../targets/msdos/exceptn.o'. Stop. + make[2]: Leaving directory '/home/johndoe/NHsource/src' + make[1]: *** [Makefile:2027: pregame] Error 2 + make[1]: Leaving directory '/home/johndoe/NHsource/src' + make: *** [Makefile:1531: nethack] Error 2 - If you want to use the built-in DJGPP screen routines, uncomment - SCREEN_DJGPPFAST in pcconf.h (the default for djgpp). + That result usually indicates that you haven't successfully run + the bash script to fetch the cross-compiler. Try again: + sys/msdos/fetch-cross-compiler.sh -Appendix C - Additional Notes + ii) The cross-compile stops with an error "libfl.so.2: cannot open + shared object file: No such file or directory. -1) Save files and bones files from versions of NetHack prior to 3.5.0 will not - work with this NetHack. Don't bother trying to keep them. + This indicates that your host system does not have the flex + library installed, and the cross-compiler needs it to be. + On Ubuntu systems, you can easily rectify this issue by + just installing the flex shared library as follows: -2) To install an update of NetHack after changing something, type 'make' - for DJGPP from the src directory. If you add, delete, or reorder monsters or - objects, or you change the format of saved level files, delete any save - and bones files. (Trying to use such files sometimes produces amusing - confusions on the game's part, but usually crashes.) + sudo apt install libfl2 + Reading package lists... Done + Building dependency tree... Done + Reading state information... Done + The following NEW packages will be installed: + libfl2 + 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Appendix D - Contacting the Development Team If you discover a bug and wish to report it, or if you have comments or suggestions we recommend using our "Contact Us" web page at: - http://www.nethack.org/common/contact.html + https://www.nethack.org/common/contact.html If you don't have access to the web, or you want to send us a patch to the NetHack source code feel free to drop us a line c/o: diff --git a/sys/msdos/Makefile.BC b/sys/msdos/Makefile.BC deleted file mode 100644 index ce0756ae1..000000000 --- a/sys/msdos/Makefile.BC +++ /dev/null @@ -1,2079 +0,0 @@ -# NetHack 3.6 Makefile.BC $NHDT-Date: 1432512791 2015/05/25 00:13:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.17 $ -# Copyright (c) Yitzhak Sapir, 1999-2006. -# NetHack may be freely distributed. See license for details. -# - -# PC NetHack 3.6 Makefile for Borland C++ 3.1 and 4.5. -# -# Nota Bene: Before you get to here you should have already read -# the Install.dos file located in the sys/msdos directory. -# Additionally, you should run this makefile with the -N -# Microsoft Compatibility option. -# -# This Makefile is for use with Borland C++ version 3.1 and 4.5, but might -# also work with more up to date versions. -# -# This Makefile is specific to Borland's MAKE which is supplied with the -# compiler. It supports only one overlay management facility - VROOMM. -# (This Makefile won't work with make45l or NDMAKE) -# -# NOTE: This Makefile has not been tested with NetHack 3.6.x - -# -# Game Installation Variables. -# NOTE: Make sure GAMEDIR exists before nmake is started. -# - -GAME = NetHack -GAMEDIR = ..\binary - -# -# -# Directories -# - -DAT = ..\dat -DOC = ..\doc -INCL = ..\include -SRC = ..\src -OBJ = o -MSYS = ..\sys\msdos -SYS = ..\sys\share -UTIL = ..\util -WTTY = ..\win\tty -WSHR = ..\win\share - - -# -# Compiler File Info. -# ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.) -# - -CC = bcc # Compiler -LINK = tlink # Linker -ASM = tasm # Assembler (not currently needed for BC) -MAKEBIN = make -UUDECODE = uudecode # Unix style uudecoder - -#BCTOP = c:\borlandc # main Borland C++ directory -BCTOP = c:\bc31 - -# -# Yacc/Lex ... if you got 'em. -# -# If you have yacc and lex programs (or work-alike such as bison -# and flex), comment out the upper two lines below, and uncomment -# the lower two. -# -# On Borland C++, the newest versions of flex and bison provide -# problems when run from MAKE. -# - -DO_YACC = YACC_MSG -DO_LEX = LEX_MSG -#DO_YACC = YACC_ACT -#DO_LEX = LEX_ACT - -# -# - Specify your yacc and lex programs (or work-alikes for each) here. -# - -YACC = bison -y -#YACC = yacc -#YACC = byacc - -LEX = flex -#LEX = lex - -# -# - Specify your flex skeleton file (if needed). -# -FLEXSKEL = -#FLEXSKEL = -Sc:\tools16\flex.ske - -# -# - Your yacc (or work-alike) output files -# -YTABC = y_tab.c -YTABH = y_tab.h -#YTABC = ytab.c -#YTABH = ytab.h - -# -# - Your lex (or work-alike) output files -# -LEXYYC = lexyy.c -#LEXYYC = lex.yy.c - -# -# Optional high-quality BSD random number generation routines -# (see pcconf.h). Set to nothing if not used. -# - -RANDOM = $(OBJ)\random.o -#RANDOM = - -# -# If TERMLIB is #defined in the source (in include\pcconf.h), -# comment out the upper line and uncomment the lower. Make sure -# that TERMLIB contains the full pathname to the termcap library. - -TERMLIB = -#TERMLIB = $(SYS)\termcap.lib - -# -# MEMORY USAGE AND OVERLAYING -# -# Overlay Schema 1 -# -# - Minimal extended memory available, lots of 640K base RAM free -# Minimize overlay turns. Requires that a minimum of -# 607K RAM be free as follows: -# 462K Executable load requirement -# 115K for malloc() calls -# 30K Overlay buffer -# 607K Total memory requirement -# -# Overlay Schema 2 -# -# - Favor small load size, requires extended memory for bearable performance. -# If you have very little base 640K RAM available, but lots of extended -# memory for caching overlays, you might try this. (eg. A machine with -# lots of TSR's or network drivers). Do not try to set SCHEMA = 2 -# without a disk cache and extended memory. -# 381K Executable load requirement -# 115K for malloc() calls -# 30K Overlay buffer -# 526K Total memory requirement -# -# On Borland C++, you have to make a full rebuild of all object modules each -# time you change schemas. -# - -SCHEMA = 2 - -# -# OPTIONAL TILE SUPPORT. -# -# This release of NetHack allows you to build a version of NetHack -# that will draw 16x16 color tiles on the display to represent -# NetHack maps, objects, monsters, etc. on machines with appropriate -# display hardware. Currently the only supported video hardware is -# VGA. -# -# Note: You can build NetHack with tile support and then choose -# whether to use it or not at runtime via the defaults.nh file option -# "video". -# - -TILESUPPORT = Y - -# -# C COMPILER AND LINKER SETTINGS -# -# For debugging ability, comment out the upper three -# macros and uncomment the lower three. You can also -# uncomment only either LDFLAGSU or LDFLAGSN if you -# want to include debug information only in the utilities -# or only in the game file. - -# On Borland C++, you cannot include debug information for -# all the object modules because the linker cannot handle -# it. - -#CDFLAGS = -LDFLAGSN = -#LDFLAGSU = - -CDFLAGS = -v -vi # use debug info (compiler) -#LDFLAGSN = /v # use debug info (linker - game) -LDFLAGSU = /v # use debug info (linker - utilities) - -# -# - Don't warn about unreachable code because flex generates a whole bunch -# of unreachable code warnings, which stops the compile process. -# - -CW = -w-rch - -# -# Select whether to use pre-compiled headers or not. -# Set PRECOMPHEAD to Y to use pre-compiled headers, set it to anything -# else and pre-compiled headers will not be used. -# (Pre-compiled headers speed up compiles, but require a bit more -# disk space during the build. The pre-compiled headers can be deleted -# afterwards via DEL *.PCH if desired). -# - -PRECOMPHEAD = N - -# -# C Compiler Flags -# - -CFLAGS = -c - -# Uncomment the line below if you want to store all the level files, -# help files, etc. in a single library file (recommended). - -USE_DLB = Y - -# -######################################################################## -######################################################################## -# -# Nothing below here should have to be changed. -# -######################################################################## -######################################################################## -# -# Warning: -# -# Changing anything below here means that you should be *very* -# familiar with your compiler's workings, *very* knowledgeable -# about the overlay structure and mechanics of NetHack, and *very* -# confident in your understanding of Makefiles and Make utilities. -# -######################################################################## -# -# Default Make Procedure -# - -default: $(GAME) - -# -######################################################################## -# Tile preparation -# - -! IF ("$(TILESUPPORT)"=="Y") - -TILEGAME = $(OBJ)\tile.o $(OBJ)\pctiles.0 $(OBJ)\pctiles.b - -# -# - VGA Tile Support, uncomment these three lines. -# - -TILEVGA = $(OBJ)\vidvga.0 $(OBJ)\vidvga.1 $(OBJ)\vidvga.2 $(OBJ)\vidvga.b -PLANAR_TIB = NetHack1.tib -OVERVIEW_TIB = NetHacko.tib - -# -# Leave this line uncommented and unchanged. -TILEUTIL = $(TILEGAME) $(TILEVGA) $(UTIL)\tile2bin.exe $(UTIL)\til2bin2.exe \ - $(PLANAR_TIB) $(OVERVIEW_TIB) - -! ENDIF - -! IF ("$(USE_DLB)"=="Y") -DLB = nhdat -! ELSE -DLB = -! ENDIF - -# -############################################################################# -# -# General Overlay Schema Settings -# - -OVLINIT =$(OBJ)\ovlinit.o - - -# -############################################################################# -# -# C Compiler and Linker Setup Options -# (To Maintainer; modify only if absolutely necessary) -# - -BCINCL = $(BCTOP)\include # include directory for main BC headers -BCLIB = $(BCTOP)\lib # library directory for main BC libraries -BCCFG = nethack.cfg # name of the nethack configuration file -VROOMMCFG= vroomm.cfg # name of file with code segment information - -# -# Model -# - -MODEL = h - -# -# - Optional C library specifier for those with non-standard -# libraries or a multiple-target library setup. -# - -CLIB = - -# -# Borland C++ libraries -# - -BCOVL = $(BCLIB)\OVERLAY -BCMDL = $(BCLIB)\C$(MODEL) - -# -# Compiler Options -# - -CNOLNK = -c # just generate .OBJ -CPCHUSE = -Hu # use precompiled headers -CPCHGEN = -H # generate precompiled headers -CPCHNAM = -H= # set the name of the precompiled header file -CPCHEXT = .PCH # precompiled header extension -CDEFINE = -D # define a macro -CSTKSZ = -DSTKSIZ= # set stack size -CCSNAM = -zC # set the code segment name -COBJNAM = -o # name the .OBJ file - -# -# Linker Options -# - -LWCASE = /c # treat case as significant -LMAP = /m # create map file -LINIT = $(BCLIB)\C0$(MODEL) # initialization object file -LOVL = /oOVLY # overlay all needed segments - -# -# Stack Sizes -# - -STKSUTL = 4096 # Utilities Stack Size -STKSNRM = 5120 # Normal Stack Size - -CUSTACK = $(CSTKSZ)$(STKSUTL) # Utilities Stack Set for Compiler -CNSTACK = $(CSTKSZ)$(STKSNRM) # Normal Stack Set for Compiler - - -# -######################################################################## -# DLB preparation -# - -! IF ("$(USE_DLB)"=="Y") -DLBFLG = $(CDEFINE)DLB -! ELSE -DLBFLG = -! ENDIF - -# -######################################################################## -# tile preparation -# - -! IF ("$(TILESUPPORT)"=="Y") -TILFLG = $(CDEFINE)USE_TILES -! ELSE -TILFLG = -! ENDIF - -############################################################################# -# -# Overlay switches -# - -COVL0 = $(CDEFINE)OVL0 -COVL1 = $(CDEFINE)OVL1 -COVL2 = $(CDEFINE)OVL2 -COVL3 = $(CDEFINE)OVL3 -COVLB = $(CDEFINE)OVLB - -# -# Flags -# - -FLAGOPT = $(DLBFLG) $(TILFLG) - -# -# Precompiled Header Section -# - -#common options (placed in $(BCCFG)) -CFLGTOT = $(CDFLAGS) $(CFLAGS) $(FLAGOPT) $(CW) -#util builds -CFLAGSU = $(CUSTACK) +$(VROOMMCFG) -#normal build, no PCH -CFLAGSN = $(CNSTACK) +$(VROOMMCFG) -#no optimizations -CFLAGNO = $(CNOOPT) $(CFLAGSN) - -! IF ("$(PRECOMPHEAD)"!="Y") - -CFLAGCO = $(COVLO) -CFLAGUO = $(COVLO) -CFLAGC0 = $(COVL0) -CFLAGU0 = $(COVL0) -CFLAGC1 = $(COVL1) -CFLAGU1 = $(COVL1) -CFLAGC2 = $(COVL2) -CFLAGU2 = $(COVL2) -CFLAGC3 = $(COVL3) -CFLAGU3 = $(COVL3) -CFLAGCB = $(COVLB) -CFLAGUB = $(COVLB) -PCHO = -PCH0 = -PCH1 = -PCH2 = -PCH3 = -PCHB = - -precomp.msg: - @echo Not using precompiled headers... - -! ELSE - -# .o files -CFLAGUO = $(CPCHUSE) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) -CFLAGCO = $(CPCHGEN) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) -PCHO = PHO$(CPCHEXT) -# .0 files -CFLAGU0 = $(CPCHUSE) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) -CFLAGC0 = $(CPCHGEN) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) -PCH0 = PH0$(CPCHEXT) -# .1 files -CFLAGU1 = $(CPCHUSE) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) -CFLAGC1 = $(CPCHGEN) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) -PCH1 = PH1$(CPCHEXT) -# .2 files -CFLAGU2 = $(CPCHUSE) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) -CFLAGC2 = $(CPCHGEN) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) -PCH2 = PH2$(CPCHEXT) -# .3 files -CFLAGU3 = $(CPCHUSE) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) -CFLAGC3 = $(CPCHGEN) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) -PCH3 = PH3$(CPCHEXT) -# .B files -CFLAGUB = $(CPCHUSE) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) -CFLAGCB = $(CPCHGEN) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) -PCHB = PHB$(CPCHEXT) - -precomp.msg: - @echo Using precompiled headers... - -! ENDIF - - -FLAGCO = $(CNSTACK) +$(VROOMMCFG) -FLAGUO = $(CNSTACK) +$(VROOMMCFG) -FLAGC0 = $(CNSTACK) +$(VROOMMCFG) -FLAGU0 = $(CNSTACK) +$(VROOMMCFG) -FLAGC1 = $(CNSTACK) +$(VROOMMCFG) -FLAGU1 = $(CNSTACK) +$(VROOMMCFG) -FLAGC2 = $(CNSTACK) +$(VROOMMCFG) -FLAGU2 = $(CNSTACK) +$(VROOMMCFG) -FLAGC3 = $(CNSTACK) +$(VROOMMCFG) -FLAGU3 = $(CNSTACK) +$(VROOMMCFG) -FLAGCB = $(CNSTACK) +$(VROOMMCFG) -FLAGUB = $(CNSTACK) +$(VROOMMCFG) - -# End of Pre-compiled header section -#=========================================================================== - -# -# Basic Borland C++ option line -# -BCOPTS1 = -Y -O -Z -Oe -Ob -Os -Ff -I$(BCINCL);$(INCL) -m$(MODEL) -BCOPTS2 = $(CDEFINE)__IO_H $(CFLGTOT) -DSTRNCMPI - -# -# Linker options for building various things. -# - -LFLAGSU = $(LDFLAGSU) $(LUSTACK) $(LINIT) -LFLAGSN = $(LDFLAGSN) $(LNSTACK) $(LWCASE) $(LMAXSEG) $(INTOVL) $(LMAXALL) \ - $(LINFO) $(LINIT) $(LOVL) - -# -# Make Roolz dude. -# Due to the inadequacy of some makes these must accord with a -# topological sort of the generated-from relation... output on -# the left, input on the right. Trust me. -# - -.SUFFIXES: .exe .0 .1 .2 .3 .B .o .til .uu .c .y .l - -# -# Rules for files in src -# - - -.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(SRC)}.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(SRC)}.c{$(OBJ)}.0: - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $< - -{$(SRC)}.c{$(OBJ)}.1: - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $< - -{$(SRC)}.c{$(OBJ)}.2: - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $< - -{$(SRC)}.c{$(OBJ)}.3: - @type schema$(SCHEMA).bc | find "$(@B)_3" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU3) >> $(VROOMMCFG) - $(CC) $(FLAGU3) $(COBJNAM)$@ $< - -{$(SRC)}.c{$(OBJ)}.B: - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $< - -# -# Rules for files in sys\share -# - -{$(SYS)}.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(SYS)}.c{$(OBJ)}.0: - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $< - -{$(SYS)}.c{$(OBJ)}.1: - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $< - -{$(SYS)}.c{$(OBJ)}.2: - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $< - -{$(SYS)}.c{$(OBJ)}.3: - @type schema$(SCHEMA).bc | find "$(@B)_3" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU3) >> $(VROOMMCFG) - $(CC) $(FLAGU3) $(COBJNAM)$@ $< - -{$(SYS)}.c{$(OBJ)}.B: - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $< - -# -# Rules for files in sys\msdos -# - -{$(MSYS)}.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(MSYS)}.c{$(OBJ)}.0: - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $< - -{$(MSYS)}.c{$(OBJ)}.1: - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $< - -{$(MSYS)}.c{$(OBJ)}.2: - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $< - -{$(MSYS)}.c{$(OBJ)}.3: - @type schema$(SCHEMA).bc | find "$(@B)_3" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU3) >> $(VROOMMCFG) - $(CC) $(FLAGU3) $(COBJNAM)$@ $< - -{$(MSYS)}.c{$(OBJ)}.B: - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $< - -{$(MSYS)}.h{$(INCL)}.h: - @copy $< $@ - -# -# Rules for files in util -# - -{$(UTIL)}.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) (COBJNAM)$@ $< - -# -# Rules for files in win\share -# - -{$(WSHR)}.c.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - @$(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(WSHR)}.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - @$(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(WSHR)}.h{$(INCL)}.h: - @copy $< $@ - -{$(WSHR)}.txt{$(DAT)}.txt: - @copy $< $@ - -# -# Rules for files in win\tty -# - -{$(WTTY)}.c{$(OBJ)}.o: - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $< - -{$(WTTY)}.c{$(OBJ)}.0: - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $< - -{$(WTTY)}.c{$(OBJ)}.1: - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $< - -{$(WTTY)}.c{$(OBJ)}.2: - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $< - -{$(WTTY)}.c{$(OBJ)}.3: - @type schema$(SCHEMA).bc | find "$(@B)_3" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU3) >> $(VROOMMCFG) - $(CC) $(FLAGU3) $(COBJNAM)$@ $< - -{$(WTTY)}.c{$(OBJ)}.B: - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $< - -# -# NETHACK OBJECTS -# -# This section creates shorthand macros for many objects -# referenced later on in the Makefile. -# - -# -# Shorten up the location for some files -# - -O = $(OBJ)\ # comment so \ isn't last char - -U = $(UTIL)\ # comment so \ isn't last char - -SPLEVDES = $(DAT)\Arch.des $(DAT)\Barb.des $(DAT)\bigroom.des \ - $(DAT)\castle.des $(DAT)\Caveman.des $(DAT)\endgame.des \ - $(DAT)\gehennom.des $(DAT)\Healer.des $(DAT)\Knight.des \ - $(DAT)\knox.des $(DAT)\Monk.des $(DAT)\medusa.des \ - $(DAT)\mines.des $(DAT)\oracle.des $(DAT)\Priest.des \ - $(DAT)\Ranger.des $(DAT)\Rogue.des $(DAT)\Samurai.des \ - $(DAT)\Tourist.des $(DAT)\tower.des $(DAT)\Valkyrie.des \ - $(DAT)\Wizard.des $(DAT)\yendor.des - -# -# Utility Objects. -# - -MAKESRC = $(U)makedefs.c - -SPLEVSRC = $(U)lev_yacc.c $(U)lev_$(LEX).c $(U)lev_main.c $(U)panic.c - -DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_$(LEX).c $(U)dgn_main.c - -MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o - -SPLEVOBJS =$(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o \ - $(O)alloc.o $(O)decl.o $(O)drawing.o $(O)monst.o \ - $(O)objects.o $(O)panic.o $(O)stubvid.o - -DGNCOMPOBJS =$(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o \ - $(O)alloc.o $(O)panic.o - -RECOVOBJS = $(O)recover.o - -GIFREADERS =$(O)gifread.o $(O)alloc.o $(O)panic.o - -TEXT_IO =$(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o - -PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o - -GIFREAD2 =$(O)gifread2.o $(O)alloc.o $(O)panic.o - -TEXT_IO2 =$(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o - -PPMWRIT2 = $(O)ppmwrit2.o $(O)alloc.o $(O)panic.o - -TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt - -TILEFILES2 = $(WSHR)\monthin.txt $(WSHR)\objthin.txt $(WSHR)\oththin.txt - -DLBOBJS = $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o - -# -# Object files for the game itself. -# - -OBJ01 = $(O)alloc.o $(RANDOM) $(O)decl.o $(O)objects.o \ - $(O)muse.o $(O)display.o $(O)vision.o $(O)mapglyph.o \ - $(O)rect.o $(O)vis_tab.o $(O)monst.o $(O)wintty.o \ - $(O)files.o $(O)sys.o $(O)monstr.o $(O)minion.o \ - $(O)worm.o $(O)detect.o $(O)exper.o $(O)mplayer.o \ - $(O)uhitm.o $(O)pager.o $(O)windows.o $(O)quest.o \ - $(O)questpgr.o $(O)write.o $(O)drawing.o $(O)dokick.o \ - $(O)dothrow.o $(O)pickup.o $(O)pray.o $(O)spell.o \ - $(O)ball.o $(O)wield.o $(O)worn.o $(O)fountain.o \ - $(O)music.o $(O)rumors.o $(O)dlb.o $(O)sit.o \ - $(O)bones.o $(O)mklev.o $(O)save.o $(O)restore.o \ - $(O)mkmaze.o $(O)mkmap.o $(O)end.o $(O)o_init.o \ - $(O)options.o $(O)rip.o $(O)sound.o $(O)teleport.o \ - $(O)topten.o $(O)tty.o $(O)u_init.o $(O)extralev.o \ - $(O)sp_lev.o $(O)dig.o $(O)pckeys.o $(O)role.o \ - $(O)steed.o $(O)region.o - -OVL0 = $(O)allmain.0 $(O)apply.0 $(O)artifact.0 $(O)attrib.0 \ - $(O)botl.0 $(O)cmd.0 $(O)dbridge.0 $(O)do.0 \ - $(O)do_name.0 $(O)do_wear.0 $(O)dogmove.0 $(O)dungeon.0 \ - $(O)eat.0 $(O)engrave.0 $(O)hacklib.0 $(O)invent.0 \ - $(O)lock.0 $(O)pcmain.0 $(O)mail.0 $(O)makemon.0 \ - $(O)mcastu.0 $(O)mhitm.0 $(O)mhitu.0 $(O)mkobj.0 \ - $(O)mkroom.0 $(O)mon.0 $(O)mondata.0 $(O)monmove.0 \ - $(O)mthrowu.0 $(O)objnam.0 $(O)polyself.0 $(O)priest.0 \ - $(O)rnd.0 $(O)shknam.0 $(O)sounds.0 $(O)steal.0 \ - $(O)timeout.0 $(O)track.0 $(O)trap.0 $(O)vault.0 \ - $(O)weapon.0 $(O)were.0 $(O)wizard.0 $(O)msdos.0 \ - $(O)termcap.0 $(O)video.0 $(O)vidtxt.0 $(O)zap.0 \ - $(O)explode.0 $(O)shk.0 - -OVL1 = $(O)allmain.1 $(O)apply.1 $(O)artifact.1 $(O)attrib.1 \ - $(O)botl.1 $(O)cmd.1 $(O)dbridge.1 $(O)do.1 \ - $(O)do_wear.1 $(O)dog.1 $(O)dungeon.1 $(O)eat.1 \ - $(O)engrave.1 $(O)hack.1 $(O)hacklib.1 $(O)invent.1 \ - $(O)makemon.1 $(O)mhitu.1 $(O)mkobj.1 $(O)mon.1 \ - $(O)mondata.1 $(O)monmove.1 $(O)mthrowu.1 $(O)objnam.1 \ - $(O)pcmain.1 $(O)polyself.1 $(O)rnd.1 $(O)shk.1 \ - $(O)steal.1 $(O)timeout.1 $(O)track.1 $(O)trap.1 \ - $(O)weapon.1 $(O)getline.1 $(O)termcap.1 $(O)topl.1 \ - $(O)video.1 $(O)zap.1 $(O)explode.1 - -OVL2 = $(O)attrib.2 $(O)do.2 $(O)do_name.2 $(O)do_wear.2 \ - $(O)dog.2 $(O)engrave.2 $(O)hack.2 $(O)hacklib.2 \ - $(O)invent.2 $(O)makemon.2 $(O)mon.2 $(O)mondata.2 \ - $(O)monmove.2 $(O)getline.2 $(O)shk.2 $(O)topl.2 \ - $(O)trap.2 $(O)zap.2 - -OVL3 = $(O)do.3 $(O)hack.3 $(O)invent.3 $(O)light.3 \ - $(O)shk.3 $(O)trap.3 $(O)zap.3 - - -OVLB = $(O)allmain.B $(O)apply.B $(O)artifact.B $(O)attrib.B \ - $(O)botl.B $(O)cmd.B $(O)dbridge.B $(O)do.B \ - $(O)do_name.B $(O)do_wear.B $(O)dog.B $(O)dogmove.B \ - $(O)eat.B $(O)engrave.B $(O)hack.B $(O)hacklib.B \ - $(O)invent.B $(O)lock.B $(O)mail.B $(O)makemon.B \ - $(O)mcastu.B $(O)mhitm.B $(O)mhitu.B $(O)mkobj.B \ - $(O)mkroom.B $(O)mon.B $(O)mondata.B $(O)monmove.B \ - $(O)mthrowu.B $(O)objnam.B $(O)pcmain.B $(O)pline.B \ - $(O)polyself.B $(O)potion.B $(O)priest.B $(O)read.B \ - $(O)rnd.B $(O)shk.B $(O)shknam.B $(O)sounds.B \ - $(O)steal.B $(O)timeout.B $(O)track.B $(O)trap.B \ - $(O)vault.B $(O)weapon.B $(O)were.B $(O)wizard.B \ - $(O)msdos.B $(O)pcunix.B $(O)termcap.B $(O)topl.B \ - $(O)video.B $(O)vidtxt.B $(O)zap.B - -TILOBJ = $(TILEGAME) $(TILEVGA) - -VVOBJ = $(O)version.o - -NVOBJ = $(OBJ01) $(OVL0) $(OVL1) $(OVL2) \ - $(OVL3) $(OVLB) $(TILOBJ) - -ALLOBJ= $(NVOBJ) $(VVOBJ) $(OVLINIT) - -# -# Header objects -# - -# This comment copied from sys/unix/Makefile.src, -# extern.h is ignored, even though its declared function types may affect the -# compilation of all the .c files, since extern.h changes every time the -# type of an external function does, and we would spend all our time recompiling -# if we did not ignore it. -#EXTERN_H = $(INCL)\extern.h -EXTERN_H = -PCCONF_H = $(INCL)\pcconf.h $(INCL)\micro.h $(INCL)\system.h -PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\align.h -YOUPROP_H = $(INCL)\prop.h $(PERMONST_H) $(INCL)\pm.h $(INCL)\youprop.h \ - $(INCL)\mondata.h -YOU_H = $(INCL)\attrib.h $(INCL)\monst.h $(INCL)\mextra.h $(YOUPROP_H) \ - $(INCL)\align.h -DECL_H = $(INCL)\quest.h $(INCL)\spell.h $(INCL)\color.h \ - $(INCL)\obj.h $(YOU_H) $(INCL)\onames.h $(INCL)\pm.h - -CONFIG_H = $(INCL)\config1.h $(INCL)\tradstdc.h $(INCL)\coord.h $(PCCONF_H) \ - $(INCL)\config.h -HACK_H = $(CONFIG_H) $(INCL)\context.h $(INCL)\dungeon.h $(INCL)\align.h \ - $(INCL)\monsym.h $(INCL)\mkroom.h $(INCL)\objclass.h $(DECL_H) \ - $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ - $(INCL)\vision.h $(INCL)\mondata.h $(INCL)\wintype.h \ - $(INCL)\engrave.h $(INCL)\rect.h $(EXTERN_H) $(INCL)\sys.h \ - $(INCL)\winprocs.h $(INCL)\trampoli.h $(INCL)\display.h -TILE_H = $(INCL)\tile.h $(INCL)\pctiles.h -PCVIDEO_H = $(INCL)\portio.h $(INCL)\pcvideo.h -ALIGN_H = $(INCL)\align.h -ARTIFACT_H = $(INCL)\artifact.h -ARTILIST_H = $(INCL)\artilist.h -COLOR_H = $(INCL)\color.h -DATE_H = $(INCL)\date.h -DGN_FILE_H = $(INCL)\dgn_file.h -DLB_H = $(INCL)\dlb.h -FUNC_TAB_H = $(INCL)\func_tab.h -LEV_H = $(INCL)\lev.h -LEV_COMP_H = $(INCL)\lev_comp.h -MAIL_H = $(INCL)\mail.h -MFNDPOS_H = $(INCL)\mfndpos.h -MONSYM_H = $(INCL)\monsym.h -OBJ_H = $(INCL)\obj.h -OBJCLASS_H = $(INCL)\objclass.h -OBJECTS_H = $(INCL)\objects.h -PROP_H = $(INCL)\prop.h -QTEXT_H = $(INCL)\qtext.h -QUEST_H = $(INCL)\quest.h -SP_LEV_H = $(INCL)\sp_lev.h -TERMCAP_H = $(INCL)\tcap.h -VIS_TAB_H = $(INCL)\vis_tab.h -WINTTY_H = $(INCL)\wintty.h - -# -# In the unix distribution this file is patchlevel.h, make it 8.3 here -# to avoid an nmake warning under dos. -# - -PATCHLEVEL_H = $(INCL)\patchlev.h - - -# -# The name of the game. -# - -GAMEFILE = $(GAMEDIR)\$(GAME).exe - -# -# make data.base an 8.3 filename to prevent an nmake warning -# - -DATABASE = $(DAT)\data.bas - -####################################################################### -# -# TARGETS - -# -# The main target. -# - -$(GAME): obj.tag envchk $(U)utility.tag $(GAMEFILE) - @echo $(GAME) is up to date. - -# -# Everything -# - -all : install - -install: $(GAME) install.tag - @echo Done. - - -install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ - $(DAT)\oracles $(DAT)\quest.dat $(DAT)\sp_lev.tag $(DLB) -! IF ("$(USE_DLB)"=="Y") - copy nhdat $(GAMEDIR) - copy $(DAT)\license $(GAMEDIR) -! ELSE - copy $(DAT)\*. $(GAMEDIR) - copy $(DAT)\*.dat $(GAMEDIR) - copy $(DAT)\*.lev $(GAMEDIR) - copy $(MSYS)\msdoshlp.txt $(GAMEDIR) - if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile -! ENDIF - copy $(SYS)\termcap $(GAMEDIR) - if exist $(DAT)\symbols copy $(DAT)\symbols $(GAMEDIR) - if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) - if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt - if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) - copy $(SYS)\NetHack.cnf $(GAMEDIR)\defaults.nh - copy $(MSYS)\NHAccess.nh $(GAMEDIR) - copy $(U)recover.exe $(GAMEDIR) - if exist *.tib copy *.tib $(GAMEDIR) - echo install done > $@ - -$(DAT)\sp_lev.tag: $(U)utility.tag $(SPLEVDES) - cd $(DAT) - $(U)lev_comp bigroom.des - $(U)lev_comp castle.des - $(U)lev_comp endgame.des - $(U)lev_comp gehennom.des - $(U)lev_comp knox.des - $(U)lev_comp mines.des - $(U)lev_comp medusa.des - $(U)lev_comp oracle.des - $(U)lev_comp sokoban.des - $(U)lev_comp tower.des - $(U)lev_comp yendor.des - $(U)lev_comp arch.des - $(U)lev_comp barb.des - $(U)lev_comp caveman.des - $(U)lev_comp healer.des - $(U)lev_comp knight.des - $(U)lev_comp monk.des - $(U)lev_comp priest.des - $(U)lev_comp ranger.des - $(U)lev_comp rogue.des - $(U)lev_comp samurai.des - $(U)lev_comp tourist.des - $(U)lev_comp valkyrie.des - $(U)lev_comp wizard.des - cd $(SRC) - echo sp_levs done > $(DAT)\sp_lev.tag - -$(U)utility.tag: envchk $(INCL)\date.h $(INCL)\onames.h \ - $(INCL)\pm.h $(SRC)\monstr.c $(SRC)\vis_tab.c \ - $(U)lev_comp.exe $(VIS_TAB_H) $(U)dgn_comp.exe \ - $(U)recover.exe $(TILEUTIL) - @echo utilities made >$@ - @echo utilities made. - -tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe - @echo Optional tile development utilities are up to date. - -# -# Inline files : -# Specifying the "<<" means to start an inline file. -# Another "<<" at the start of a line closes the -# inline file. -# -# DO NOT INDENT THE << below! -# - -$(GAMEFILE) : $(ALLOBJ) - @echo Linking.... - $(LINK) $(LFLAGSN) @<<$(GAME).lnk - $(ALLOBJ) - $(GAMEFILE) - $(GAME) - $(TERMLIB) $(MOVETR) $(CLIB) $(BCOVL) $(BCMDL) -<< - @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak - -# -# Makedefs Stuff -# - -$(U)makedefs.exe: $(MAKEOBJS) - @$(LINK) $(LFLAGSU) $(MAKEOBJS), $@,, $(CLIB) $(BCMDL); - -$(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(OBJCLASS_H) \ - $(MONSYM_H) $(QTEXT_H) $(PATCHLEVEL_H) \ - $(U)makedefs.c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)makedefs.c - -# -# date.h should be remade every time any of the source or include -# files is modified. -# - -$(INCL)\date.h : $(U)makedefs.exe - $(U)makedefs -v - @echo A new $@ has been created. - -$(INCL)\onames.h : $(U)makedefs.exe - $(U)makedefs -o - -$(INCL)\pm.h : $(U)makedefs.exe - $(U)makedefs -p - -#$(INCL)\trap.h : $(U)makedefs.exe -# $(U)makedefs -t - -$(SRC)\monstr.c: $(U)makedefs.exe - $(U)makedefs -m - -$(INCL)\vis_tab.h: $(U)makedefs.exe - $(U)makedefs -z - -$(SRC)\vis_tab.c: $(U)makedefs.exe - $(U)makedefs -z - -# -# Level Compiler Stuff -# - -$(U)lev_comp.exe: $(SPLEVOBJS) - @echo Linking $@... - $(LINK) $(LFLAGSU) @&&! - $(O)stubvid.o $(O)panic.o $(O)objects.o $(O)monst.o + - $(O)drawing.o $(O)decl.o $(O)alloc.o $(O)lev_main.o + - $(O)lev_$(LEX).o $(O)lev_yacc.o - $@ - $(@B) - $(BCMDL); -! - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_yacc.c - -$(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ - $(U)lev_$(LEX).c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_$(LEX).c - -$(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_main.c - -$(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y -! IF "$(DO_YACC)"=="YACC_ACT" - $(YACC) -d -l $(U)lev_comp.y - copy $(YTABC) $(U)lev_yacc.c - copy $(YTABH) $(INCL)\lev_comp.h - @del $(YTABC) - @del $(YTABH) -! ELSE - @echo. - @echo $(U)lev_comp.y has changed. - @echo To update $(U)lev_yacc.c and $(INCL)\lev_comp.h run $(YACC). - @echo. - @echo For now, we will copy the prebuilt lev_yacc.c - @echo from $(SYS) to $(U)lev_yacc.c, and copy the prebuilt - @echo lev_comp.h from $(SYS) to $(UTIL)\lev_comp.h - @echo and use those. - @echo. - copy $(SYS)\lev_yacc.c $@ >nul - touch $@ - copy $(SYS)\lev_comp.h $(INCL)\lev_comp.h >nul - touch $(INCL)\lev_comp.h -! ENDIF - -$(U)lev_$(LEX).c: $(U)lev_comp.l -! IF "$(DO_LEX)"=="LEX_ACT" - $(LEX) $(FLEXSKEL) $(U)lev_comp.l - copy $(LEXYYC) $@ - @del $(LEXYYC) -! ELSE - @echo. - @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). - @echo. - @echo For now, we will copy a prebuilt lev_lex.c - @echo from $(SYS) to $@ and use it. - @echo. - copy $(SYS)\lev_lex.c $@ >nul - touch $@ -! ENDIF - -# -# Dungeon Stuff -# - -$(U)dgn_comp.exe: $(DGNCOMPOBJS) - @echo Linking $@... - $(LINK) $(LFLAGSU) @&&! - $(O)panic.o $(O)alloc.o $(O)dgn_main.o $(O)dgn_$(LEX).o + - $(O)dgn_yacc.o - $@ - $(@B) - $(BCMDL); -! - -$(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_yacc.c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_yacc.c - -$(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_$(LEX).c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_$(LEX).c - -$(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_main.c - -$(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y -! IF "$(DO_YACC)"=="YACC_ACT" - $(YACC) -d -l $(U)dgn_comp.y - copy $(YTABC) $(U)dgn_yacc.c - copy $(YTABH) $(INCL)\dgn_comp.h - @del $(YTABC) - @del $(YTABH) -! ELSE - @echo. - @echo $(U)dgn_comp.y has changed. To update $@ and - @echo $(INCL)\dgn_comp.h run $(YACC). - @echo. - @echo For now, we will copy the prebuilt dgn_yacc.c from - @echo $(SYS) to $(U)dgn_yacc.c, and copy the prebuilt - @echo dgn_comp.h from $(SYS) to $(INCL)\dgn_comp.h - @echo and use those. - @echo. - copy $(SYS)\dgn_yacc.c $@ >nul - touch $@ - copy $(SYS)\dgn_comp.h $(INCL)\dgn_comp.h >nul - touch $(INCL)\dgn_comp.h -! ENDIF - -$(U)dgn_$(LEX).c: $(U)dgn_comp.l -! IF "$(DO_LEX)"=="LEX_ACT" - $(LEX) $(FLEXSKEL) $(U)dgn_comp.l - copy $(LEXYYC) $@ - @del $(LEXYYC) -! ELSE - @echo. - @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). - @echo. - @echo For now, we will copy a prebuilt dgn_lex.c - @echo from $(SYS) to $@ and use it. - @echo. - copy $(SYS)\dgn_lex.c $@ >nul - touch $@ -! ENDIF - - -obj.tag: - @if not exist $(O)*.* mkdir $(OBJ) - @echo directory $(OBJ) created - @echo directory $(OBJ) created >$@ - -envchk: precomp.msg -! IF "$(TILEGAME)"=="" - @echo. - @echo NOTE: This build will NOT include tile support. - @echo. -! ELSE - @echo. - @echo This build includes tile support. - @echo. -! ENDIF - -# -# SECONDARY TARGETS -# - -# -# Header files NOT distributed in ..\include -# - -$(INCL)\tile.h: $(WSHR)\tile.h - copy $(WSHR)\tile.h $@ - -$(INCL)\pctiles.h: $(MSYS)\pctiles.h - copy $(MSYS)\pctiles.h $@ - -$(INCL)\pcvideo.h: $(MSYS)\pcvideo.h - copy $(MSYS)\pcvideo.h $@ - -$(INCL)\portio.h: $(MSYS)\portio.h - copy $(MSYS)\portio.h $@ - -# -# Recover Utility -# - -$(U)recover.exe: $(RECOVOBJS) - @$(LINK) $(LFLAGSU) $(RECOVOBJS),$@,, $(CLIB) $(BCMDL); - -# -# Tile Mapping -# - -$(SRC)\tile.c: $(U)tilemap.exe - @echo A new $@ is being created. - @$(U)tilemap - -$(U)tilemap.exe: $(O)tilemap.o - @$(LINK) $(LFLAGSU) $(O)tilemap.o,$@,, $(CLIB) $(BCMDL); - -$(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tilemap.c - - -# -# Tile Utilities -# - -# -# Optional (for development) -# - - - -# - -$(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) - @$(LINK) $(LFLAGSU) << $(@B).lnk - $(GIFREADERS) $(TEXT_IO) - $@,,$(CLIB) $(BCMDL) -<< - -$(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) - @$(LINK) $(LFLAGSU) << $(@B).lnk - $(PPMWRITERS) $(TEXT_IO) - $@,,$(CLIB) $(BCMDL); -<< - -$(U)gif2txt2.exe: $(GIFREAD2) $(TEXT_IO2) - @$(LINK) $(LFLAGSU) << $(@B).lnk - $(GIFREAD2) $(TEXT_IO2) - $@,,$(CLIB) $(BCMDL); -<< - -$(U)txt2ppm2.exe: $(PPMWRIT2) $(TEXT_IO2) - @$(LINK) $(LFLAGSU) << $(@B).lnk - $(PPMWRIT2) $(TEXT_IO2) - $@,,$(CLIB) $(BCMDL); -<< - -# -# Required for tile support -# - -NetHack1.tib: $(TILEFILES) $(U)tile2bin.exe - @echo Creating binary tile files (this may take some time) - @$(U)tile2bin - -NetHackO.tib: thintile.tag $(TILEFILES2) $(U)til2bin2.exe - @echo Creating overview binary tile files (this may take some time) - @$(U)til2bin2 - -thintile.tag: $(U)thintile.exe $(TILEFILES) - $(U)thintile - @echo thintiles created >thintile.tag - -$(U)tile2bin.exe: $(O)tile2bin.o $(TEXT_IO) - @echo Linking $@... - $(LINK) $(LFLAGSU) @&&! - $(O)tile2bin.o+ - $(O)stubvid.o $(O)objects.o $(O)monst.o $(O)decl.o + - $(O)drawing.o $(O)tiletxt.o $(O)tiletext.o - $@ - $(@B) - $(BCMDL); -! - -$(U)til2bin2.exe: $(O)til2bin2.o $(TEXT_IO2) - @echo Linking $@... - $(LINK) $(LFLAGSU) @&&! - $(O)til2bin2.o+ - $(O)stubvid.o $(O)objects.o $(O)monst.o $(O)decl.o + - $(O)drawing.o $(O)tiletxt2.o $(O)tiletex2.o - $@ - $(@B) - $(BCMDL); -! - - -$(U)thintile.exe: $(O)thintile.o - @$(LINK) $(LFLAGSU) $(O)thintile.o,$@,, $(CLIB) $(BCMDL); - -$(O)thintile.o: $(HACK_H) $(INCL)\tile.h $(WSHR)\thintile.c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\thintile.c - -$(O)tile2bin.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(MSYS)\tile2bin.c - -$(O)til2bin2.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(CDEFINE)OVERVIEW_FILE \ - $(COBJNAM)$@ $(MSYS)\tile2bin.c - - -# -# DLB stuff -# - -nhdat: $(U)dlb_main.exe - @copy $(MSYS)\msdoshlp.txt $(DAT) - @cd $(DAT) - @echo data >dlb.lst - @echo oracles >>dlb.lst - @echo options >>dlb.lst - @echo quest.dat >>dlb.lst - @echo rumors >>dlb.lst - @echo help >>dlb.lst - @echo hh >>dlb.lst - @echo cmdhelp >>dlb.lst - @echo history >>dlb.lst - @echo opthelp >>dlb.lst - @echo wizhelp >>dlb.lst - @echo dungeon >>dlb.lst - @echo license >>dlb.lst - @echo msdoshlp.txt >>dlb.lst - @for %%N in (*.lev) do echo %%N >>dlb.lst - $(U)dlb_main cvIf dlb.lst $(SRC)\nhdat - @cd $(SRC) - -$(U)dlb_main.exe: $(DLBOBJS) - @$(LINK) $(LFLAGSU) $(DLBOBJS),$@,, $(CLIB) $(BCMDL); - -$(O)dlb_main.o: $(U)dlb_main.c $(INCL)\config.h $(DLB_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dlb_main.c - -# -# Housekeeping -# - -spotless: clean - rmdir $(OBJ) - if exist $(DATE_H) del $(DATE_H) - if exist $(INCL)\onames.h del $(INCL)\onames.h - if exist $(INCL)\pm.h del $(INCL)\pm.h - if exist $(VIS_TAB_H) del $(VIS_TAB_H) - if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c - if exist $(SRC)\tile.c del $(SRC)\tile.c - if exist $(DAT)\rumors del $(DAT)\rumors - if exist $(DAT)\data del $(DAT)\data - if exist $(DAT)\dungeon del $(DAT)\dungeon - if exist $(DAT)\dungeon.pdf del $(DAT)\dungeon.pdf - if exist $(DAT)\options del $(DAT)\options - if exist $(DAT)\oracles del $(DAT)\oracles - if exist $(DAT)\rumors del $(DAT)\rumors - if exist $(DAT)\quest.dat del $(DAT)\quest.dat - if exist $(DAT)\*.lev del $(DAT)\*.lev - if exist $(DAT)\sp_lev.tag del $(DAT)\sp_lev.tag - if exist $(SRC)\monstr.c del $(SRC)\monstr.c - if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c - if exist $(SRC)\$(PLANAR_TIB) del $(SRC)\$(PLANAR_TIB) - if exist $(SRC)\$(OVERVIEW_TIB) del $(SRC)\$(OVERVIEW_TIB) - if exist $(U)recover.exe del $(U)recover.exe - -clean: - if exist $(O)*.o del $(O)*.o - if exist $(O)*.0 del $(O)*.0 - if exist $(O)*.1 del $(O)*.1 - if exist $(O)*.2 del $(O)*.2 - if exist $(O)*.3 del $(O)*.3 - if exist $(O)*.b del $(O)*.b - if exist $(U)utility.tag del $(U)utility.tag - if exist $(U)makedefs.exe del $(U)makedefs.exe - if exist $(U)lev_comp.exe del $(U)lev_comp.exe - if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe - if exist $(U)dlb_main.exe del $(U)dlb_main.exe - if exist $(SRC)\*.lnk del $(SRC)\*.lnk - if exist $(SRC)\*.map del $(SRC)\*.map - if exist $(SRC)\*$(CPCHEXT) del $(SRC)\*$(CPCHEXT) - if exist $(SRC)\*.cfg del $(SRC)\*.cfg - if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst - -pch.c: $(HACK_H) - @echo ^#include "hack.h" > $@ - @echo main(int argc, char *argv[]) >> $@ - @echo { >> $@ - @echo } >> $@ - @echo. >> $@ - -# -# OTHER DEPENDENCIES -# - -# -# Precompiled Header dependencies -# (We need to force the generation of these at the beginning) -# - -PHO$(CPCHEXT): $(HACK_H) pch.c - @echo Generating new precompiled header for .O files - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGCO) >> $(VROOMMCFG) - @$(CC) $(FLAGCO) pch.c -PH0$(CPCHEXT): $(HACK_H) pch.c - @echo Generating new precompiled header for .0 files - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGC0) >> $(VROOMMCFG) - @$(CC) $(FLAGC0) pch.c -PH1$(CPCHEXT): $(HACK_H) pch.c - @echo Generating new precompiled header for .1 files - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGC1) >> $(VROOMMCFG) - @$(CC) $(FLAGC1) pch.c -PH2$(CPCHEXT): $(HACK_H) pch.c - @echo Generating new precompiled header for .2 files - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGC2) >> $(VROOMMCFG) - @$(CC) $(FLAGC2) pch.c -PH3$(CPCHEXT): $(HACK_H) pch.c - @echo Generating new precompiled header for .3 files - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGC3) >> $(VROOMMCFG) - @$(CC) $(FLAGC3) pch.c -PHB$(CPCHEXT): $(HACK_H) pch.c - @echo Generating new precompiled header for .B files - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGCB) >> $(VROOMMCFG) - @$(CC) $(FLAGCB) pch.c - - -# Overlay initialization routines used by pcmain() at startup to -# determine EMS/XMS memory usage. - -# Comment out the following line if you don't want Borland C++ to check for -# extended memory. -RECOGNIZE_XMS = $(CDEFINE)RECOGNIZE_XMS - - -$(O)ovlinit.o: $(MSYS)\ovlinit.c $(HACK_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(RECOGNIZE_XMS) $(COBJNAM)$@ $(MSYS)\ovlinit.c - -# -# dat dependencies -# - -$(DAT)\data: $(U)utility.tag $(DATABASE) - $(U)makedefs -d - -$(DAT)\rumors: $(U)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal - $(U)makedefs -r - -$(DAT)\quest.dat: $(U)utility.tag $(DAT)\quest.txt - $(U)makedefs -q - -$(DAT)\oracles: $(U)utility.tag $(DAT)\oracles.txt - $(U)makedefs -h - -$(DAT)\dungeon: $(U)utility.tag $(DAT)\dungeon.def - $(U)makedefs -e - cd $(DAT) - $(U)dgn_comp dungeon.pdf - cd $(SRC) - -# -# Util Dependencies. -# - -$(O)panic.o: $(U)panic.c $(CONFIG_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)panic.c - -$(O)recover.o: $(CONFIG_H) $(U)recover.c - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)recover.c - -# -# from win\share -# - -$(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT $(COBJNAM)$@ $(WSHR)\tilemap.c - -$(O)tiletxt2.o: $(WSHR)\tilemap.c $(HACK_H) - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT \ - $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tilemap.c - -$(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\gifread.c - -$(O)gifread2.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\gifread.c - -$(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\ppmwrite.c - -$(O)ppmwrit2.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\ppmwrite.c - -$(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tiletext.c - -$(O)tiletex2.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h - @echo $(BCOPTS1) > $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tiletext.c - -# -# from win\tty -# - -$(O)getline.1: $(PCH1) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $(WTTY)\getline.c - -$(O)getline.2: $(PCH2) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $(WTTY)\getline.c - -$(O)termcap.0: $(PCH0) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $(WTTY)\termcap.c - -$(O)termcap.1: $(PCH1) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $(WTTY)\termcap.c - -$(O)termcap.B: $(PCHB) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(WTTY)\termcap.c - -$(O)topl.1: $(PCH1) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $(WTTY)\topl.c - -$(O)topl.2: $(PCH2) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $(WTTY)\topl.c - -$(O)topl.B: $(PCHB) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(WTTY)\topl.c - -$(O)wintty.o: $(PCHO) $(CONFIG_H) $(WTTY)\wintty.c $(PATCHLEVEL_H) $(DATE_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $(WTTY)\wintty.c - -# -# from sys\share -# - -$(O)pcmain.0: $(PCH0) $(HACK_H) $(SYS)\pcmain.c - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $(SYS)\pcmain.c - -$(O)pcmain.1: $(PCH1) $(HACK_H) $(SYS)\pcmain.c - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $(SYS)\pcmain.c - -$(O)pcmain.B: $(PCHB) $(HACK_H) $(SYS)\pcmain.c - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(SYS)\pcmain.c - -$(O)pcunix.B: $(PCHB) $(SYS)\pcunix.c $(HACK_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(SYS)\pcunix.c - -$(O)tty.o: $(HACK_H) $(WINTTY_H) $(SYS)\pctty.c - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SYS)\pctty.c - -$(O)pcsys.o: $(HACK_H) $(SYS)\pcsys.c - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SYS)\pcsys.c - -$(O)random.o: $(PCHO) $(HACK_H) $(SYS)\random.c - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $(SYS)\random.c - -# -# from sys\msdos -# - -$(O)msdos.0: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COVL0) $(COBJNAM)$@ $(MSYS)\msdos.c - -$(O)msdos.B: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COVLB) $(COBJNAM)$@ $(MSYS)\msdos.c - -$(O)pctiles.0: $(PCH0) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $(MSYS)\pctiles.c - -$(O)pctiles.B: $(PCHB) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(MSYS)\pctiles.c - -$(O)sound.o: $(PCH0) $(MSYS)\sound.c $(HACK_H) $(INCL)\portio.h - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $(MSYS)\sound.c - -$(O)pckeys.o: $(PCHO) $(MSYS)\pckeys.c $(HACK_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(COBJNAM)$@ $(MSYS)\pckeys.c - -$(O)stubvid.o : $(MSYS)\video.c $(HACK_H) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUO) >> $(VROOMMCFG) - $(CC) $(FLAGUO) $(CDEFINE)STUBVIDEO $(COBJNAM)$@ $(MSYS)\video.c - -$(O)video.0: $(PCH0) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $(MSYS)\video.c - -$(O)video.1: $(PCH1) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $(MSYS)\video.c - -$(O)video.B: $(PCHB) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(MSYS)\video.c - -$(O)vidtxt.0: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COVL0) $(COBJNAM)$@ $(MSYS)\vidtxt.c - -$(O)vidtxt.B: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COVLB) $(COBJNAM)$@ $(MSYS)\vidtxt.c - -$(O)vidvga.0: $(PCH0) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_0" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU0) >> $(VROOMMCFG) - $(CC) $(FLAGU0) $(COBJNAM)$@ $(MSYS)\vidvga.c - -$(O)vidvga.1: $(PCH1) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_1" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU1) >> $(VROOMMCFG) - $(CC) $(FLAGU1) $(COBJNAM)$@ $(MSYS)\vidvga.c - -$(O)vidvga.2: $(PCH2) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_2" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGU2) >> $(VROOMMCFG) - $(CC) $(FLAGU2) $(COBJNAM)$@ $(MSYS)\vidvga.c - -$(O)vidvga.B: $(PCHB) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ - $(TILE_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) $(CFLAGUB) >> $(VROOMMCFG) - $(CC) $(FLAGUB) $(COBJNAM)$@ $(MSYS)\vidvga.c - -# -# from src -# - -$(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\alloc.c -$(O)ball.o: $(PCHO) $(SRC)\ball.c $(HACK_H) -$(O)bones.o: $(PCHO) $(SRC)\bones.c $(HACK_H) $(LEV_H) -$(O)decl.o: $(PCHO) $(SRC)\decl.c $(HACK_H) $(QUEST_H) -$(O)detect.o: $(PCHO) $(SRC)\detect.c $(HACK_H) $(ARTIFACT_H) -$(O)dig.o: $(PCHO) $(SRC)\dig.c $(HACK_H) # check dep -$(O)display.o: $(PCHO) $(SRC)\display.c $(HACK_H) -$(O)dlb.o: $(SRC)\dlb.c $(DLB_H) $(HACK_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\dlb.c -$(O)dokick.o: $(PCHO) $(SRC)\dokick.c $(HACK_H) -$(O)dothrow.o: $(PCHO) $(SRC)\dothrow.c $(HACK_H) -$(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(TERMCAP_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\drawing.c -$(O)end.o: $(SRC)\end.c $(HACK_H) $(LEV_H) $(DLB_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\end.c -$(O)exper.o: $(PCHO) $(SRC)\exper.c $(HACK_H) -$(O)extralev.o: $(PCHO) $(SRC)\extralev.c $(HACK_H) -$(O)files.o: $(PCHO) $(SRC)\files.c $(HACK_H) $(DLB_H) -$(O)fountain.o: $(PCHO) $(SRC)\fountain.c $(HACK_H) -$(O)mapglyph.o: $(PCHO) $(SRC)\mapglyph.c $(HACK_H) -$(O)minion.o: $(PCHO) $(SRC)\minion.c $(HACK_H) -$(O)mklev.o: $(PCHO) $(SRC)\mklev.c $(HACK_H) -$(O)mkmap.o: $(PCHO) $(SRC)\mkmap.c $(HACK_H) $(SP_LEV_H) -$(O)mkmaze.o: $(PCHO) $(SRC)\mkmaze.c $(HACK_H) $(SP_LEV_H) $(LEV_H) -$(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(PERMONST_H) $(MONSYM_H) \ - $(COLOR_H) $(ALIGN_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\monst.c -$(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\monstr.c -$(O)mplayer.o: $(PCHO) $(SRC)\mplayer.c $(HACK_H) -$(O)muse.o: $(PCHO) $(SRC)\muse.c $(HACK_H) -$(O)music.o: $(PCHO) $(SRC)\music.c $(HACK_H) -$(O)o_init.o: $(PCHO) $(SRC)\o_init.c $(HACK_H) $(LEV_H) -$(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(OBJ_H) $(OBJCLASS_H) \ - $(PROP_H) $(COLOR_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\objects.c -$(O)options.o: $(SRC)\options.c $(HACK_H) $(TERMCAP_H) $(OBJCLASS_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\options.c -$(O)pager.o: $(SRC)\pager.c $(HACK_H) $(DLB_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGNO) $(COBJNAM)$@ $(SRC)\pager.c -$(O)pickup.o: $(PCHO) $(SRC)\pickup.c $(HACK_H) -$(O)pray.o: $(PCHO) $(SRC)\pray.c $(HACK_H) -$(O)quest.o: $(PCHO) $(SRC)\quest.c $(HACK_H) $(QUEST_H) $(QTEXT_H) -$(O)questpgr.o: $(PCHO) $(SRC)\questpgr.c $(HACK_H) $(QTEXT_H) $(DLB_H) -$(O)rect.o: $(PCHO) $(SRC)\rect.c $(HACK_H) -$(O)region.o: $(PCHO) $(SRC)\region.c $(HACK_H) -$(O)restore.o: $(PCHO) $(SRC)\restore.c $(HACK_H) $(LEV_H) $(TERMCAP_H) \ - $(QUEST_H) -$(O)rip.o: $(PCHO) $(SRC)\rip.c $(HACK_H) -$(O)role.o: $(PCHO) $(SRC)\role.c $(HACK_H) -$(O)rumors.o: $(PCHO) $(SRC)\rumors.c $(HACK_H) $(DLB_H) -$(O)save.o: $(PCHO) $(SRC)\save.c $(HACK_H) $(LEV_H) $(QUEST_H) -$(O)sit.o: $(PCHO) $(SRC)\sit.c $(HACK_H) $(ARTIFACT_H) -$(O)steed.o: $(PCHO) $(SRC)\steed.c $(HACK_H) -$(O)sys.o: $(PCHO) $(SRC)\sys.c $(HACK_H) -$(O)sp_lev.o: $(PCHO) $(SRC)\sp_lev.c $(HACK_H) $(SP_LEV_H) $(DLB_H) -$(O)spell.o: $(PCHO) $(SRC)\spell.c $(HACK_H) -$(O)teleport.o: $(PCHO) $(SRC)\teleport.c $(HACK_H) # check dep -$(O)tile.o: $(PCHO) $(SRC)\tile.c $(HACK_H) -$(O)topten.o: $(PCHO) $(SRC)\topten.c $(HACK_H) $(DLB_H) $(PATCHLEVEL_H) -$(O)u_init.o: $(PCHO) $(SRC)\u_init.c $(HACK_H) -$(O)uhitm.o: $(PCHO) $(SRC)\uhitm.c $(HACK_H) -$(O)version.o: $(PCHO) $(SRC)\version.c $(HACK_H) $(PATCHLEVEL_H) -$(O)vision.o: $(PCHO) $(SRC)\vision.c $(HACK_H) $(VIS_TAB_H) -$(O)vis_tab.o: $(SRC)\vis_tab.c $(HACK_H) $(VIS_TAB_H) - @type schema$(SCHEMA).bc | find "$(@B)_o" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\vis_tab.c -$(O)wield.o: $(PCHO) $(SRC)\wield.c $(HACK_H) -$(O)windows.o: $(PCHO) $(SRC)\windows.c $(HACK_H) $(WINTTY_H) -$(O)worm.o: $(PCHO) $(SRC)\worm.c $(HACK_H) $(LEV_H) -$(O)worn.o: $(PCHO) $(SRC)\worn.c $(HACK_H) -$(O)write.o: $(PCHO) $(SRC)\write.c $(HACK_H) - -# -# Overlays -# - -# OVL0 -# - -$(O)allmain.0: $(PCH0) $(SRC)\allmain.c $(HACK_H) -$(O)apply.0: $(PCH0) $(SRC)\apply.c $(HACK_H) -$(O)artifact.0: $(PCH0) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) -$(O)attrib.0: $(PCH0) $(SRC)\attrib.c $(HACK_H) -$(O)botl.0: $(PCH0) $(SRC)\botl.c $(HACK_H) -$(O)cmd.0: $(PCH0) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) -$(O)dbridge.0: $(PCH0) $(SRC)\dbridge.c $(HACK_H) -$(O)do.0: $(PCH0) $(SRC)\do.c $(HACK_H) $(LEV_H) -$(O)do_name.0: $(PCH0) $(SRC)\do_name.c $(HACK_H) -$(O)do_wear.0: $(PCH0) $(SRC)\do_wear.c $(HACK_H) -$(O)dogmove.0: $(PCH0) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) -$(O)dungeon.0: $(PCH0) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) \ - $(DLB_H) -$(O)eat.0: $(PCH0) $(SRC)\eat.c $(HACK_H) -$(O)engrave.0: $(PCH0) $(SRC)\engrave.c $(HACK_H) $(LEV_H) -$(O)explode.0: $(PCH0) $(SRC)\explode.c $(HACK_H) -$(O)hacklib.0: $(PCH0) $(SRC)\hacklib.c $(HACK_H) -$(O)invent.0: $(PCH0) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) -$(O)lock.0: $(PCH0) $(SRC)\lock.c $(HACK_H) -$(O)mail.0: $(PCH0) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(DATE_H) -$(O)makemon.0: $(PCH0) $(SRC)\makemon.c $(HACK_H) -$(O)mcastu.0: $(PCH0) $(SRC)\mcastu.c $(HACK_H) -$(O)mhitm.0: $(PCH0) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) -$(O)mhitu.0: $(PCH0) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) -$(O)mkobj.0: $(PCH0) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) -$(O)mkroom.0: $(PCH0) $(SRC)\mkroom.c $(HACK_H) -$(O)mon.0: $(PCH0) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) -$(O)mondata.0: $(PCH0) $(SRC)\mondata.c $(HACK_H) -$(O)monmove.0: $(PCH0) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) -$(O)mthrowu.0: $(PCH0) $(SRC)\mthrowu.c $(HACK_H) -$(O)objnam.0: $(PCH0) $(SRC)\objnam.c $(HACK_H) -$(O)polyself.0: $(PCH0) $(SRC)\polyself.c $(HACK_H) -$(O)priest.0: $(PCH0) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) -$(O)rnd.0: $(PCH0) $(SRC)\rnd.c $(HACK_H) -$(O)shk.0: $(PCH0) $(SRC)\shk.c $(HACK_H) -$(O)shknam.0: $(PCH0) $(SRC)\shknam.c $(HACK_H) -$(O)sounds.0: $(PCH0) $(SRC)\sounds.c $(HACK_H) -$(O)steal.0: $(PCH0) $(SRC)\steal.c $(HACK_H) -$(O)timeout.0: $(PCH0) $(SRC)\timeout.c $(HACK_H) $(LEV_H) -$(O)track.0: $(PCH0) $(SRC)\track.c $(HACK_H) -$(O)trap.0: $(PCH0) $(SRC)\trap.c $(HACK_H) -$(O)vault.0: $(PCH0) $(SRC)\vault.c $(HACK_H) -$(O)weapon.0: $(PCH0) $(SRC)\weapon.c $(HACK_H) -$(O)were.0: $(PCH0) $(SRC)\were.c $(HACK_H) -$(O)wizard.0: $(PCH0) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) -$(O)zap.0: $(PCH0) $(SRC)\zap.c $(HACK_H) - -# -# OVL1 -# - -$(O)allmain.1: $(PCH1) $(SRC)\allmain.c $(HACK_H) -$(O)apply.1: $(PCH1) $(SRC)\apply.c $(HACK_H) -$(O)artifact.1: $(PCH1) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) -$(O)attrib.1: $(PCH1) $(SRC)\attrib.c $(HACK_H) -$(O)botl.1: $(PCH1) $(SRC)\botl.c $(HACK_H) -$(O)cmd.1: $(PCH1) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) -$(O)dbridge.1: $(PCH1) $(SRC)\dbridge.c $(HACK_H) -$(O)do.1: $(PCH1) $(SRC)\do.c $(HACK_H) $(LEV_H) -$(O)do_wear.1: $(PCH1) $(SRC)\do_wear.c $(HACK_H) -$(O)dog.1: $(PCH1) $(SRC)\dog.c $(HACK_H) -$(O)dungeon.1: $(PCH1) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) $(DLB_H) -$(O)eat.1: $(PCH1) $(SRC)\eat.c $(HACK_H) -$(O)engrave.1: $(PCH1) $(SRC)\engrave.c $(HACK_H) $(LEV_H) -$(O)explode.1: $(PCH1) $(SRC)\explode.c $(HACK_H) -$(O)hack.1: $(PCH1) $(SRC)\hack.c $(HACK_H) -$(O)hacklib.1: $(PCH1) $(SRC)\hacklib.c $(HACK_H) -$(O)invent.1: $(PCH1) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) -$(O)makemon.1: $(PCH1) $(SRC)\makemon.c $(HACK_H) -$(O)mhitu.1: $(PCH1) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) -$(O)mkobj.1: $(PCH1) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) -$(O)mon.1: $(PCH1) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) -$(O)mondata.1: $(PCH1) $(SRC)\mondata.c $(HACK_H) -$(O)monmove.1: $(PCH1) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) -$(O)mthrowu.1: $(PCH1) $(SRC)\mthrowu.c $(HACK_H) -$(O)objnam.1: $(PCH1) $(SRC)\objnam.c $(HACK_H) -$(O)polyself.1: $(PCH1) $(SRC)\polyself.c $(HACK_H) -$(O)rnd.1: $(PCH1) $(SRC)\rnd.c $(HACK_H) -$(O)shk.1: $(PCH1) $(SRC)\shk.c $(HACK_H) -$(O)steal.1: $(PCH1) $(SRC)\steal.c $(HACK_H) -$(O)timeout.1: $(PCH1) $(SRC)\timeout.c $(HACK_H) $(LEV_H) -$(O)track.1: $(PCH1) $(SRC)\track.c $(HACK_H) -$(O)trap.1: $(PCH1) $(SRC)\trap.c $(HACK_H) -$(O)weapon.1: $(PCH1) $(SRC)\weapon.c $(HACK_H) -$(O)zap.1: $(PCH1) $(SRC)\zap.c $(HACK_H) - -# -# OVL2 -# - -$(O)attrib.2: $(PCH2) $(SRC)\attrib.c $(HACK_H) -$(O)do.2: $(PCH2) $(SRC)\do.c $(HACK_H) $(LEV_H) -$(O)do_name.2: $(PCH2) $(SRC)\do_name.c $(HACK_H) -$(O)do_wear.2: $(PCH2) $(SRC)\do_wear.c $(HACK_H) -$(O)dog.2: $(PCH2) $(SRC)\dog.c $(HACK_H) -$(O)engrave.2: $(PCH2) $(SRC)\engrave.c $(HACK_H) $(LEV_H) -$(O)hack.2: $(PCH2) $(SRC)\hack.c $(HACK_H) -$(O)hacklib.2: $(PCH2) $(SRC)\hacklib.c $(HACK_H) -$(O)invent.2: $(PCH2) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) -$(O)makemon.2: $(PCH2) $(SRC)\makemon.c $(HACK_H) -$(O)mon.2: $(PCH2) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) -$(O)mondata.2: $(PCH2) $(SRC)\mondata.c $(HACK_H) -$(O)monmove.2: $(PCH2) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) -$(O)shk.2: $(PCH2) $(SRC)\shk.c $(HACK_H) -$(O)trap.2: $(PCH2) $(SRC)\trap.c $(HACK_H) -$(O)zap.2: $(PCH2) $(SRC)\zap.c $(HACK_H) - -# -# OVL3 -# - -$(O)do.3: $(PCH3) $(SRC)\do.c $(HACK_H) $(LEV_H) -$(O)hack.3: $(PCH3) $(SRC)\hack.c $(HACK_H) -$(O)invent.3: $(PCH3) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) -$(O)light.3: $(PCH3) $(SRC)\light.c $(HACK_H) -$(O)shk.3: $(PCH3) $(SRC)\shk.c $(HACK_H) -$(O)trap.3: $(PCH3) $(SRC)\trap.c $(HACK_H) -$(O)zap.3: $(PCH3) $(SRC)\zap.c $(HACK_H) - -# -# OVLB -# - -$(O)allmain.B: $(PCHB) $(SRC)\allmain.c $(HACK_H) -$(O)apply.B: $(PCHB) $(SRC)\apply.c $(HACK_H) -$(O)artifact.B: $(PCHB) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) -$(O)attrib.B: $(PCHB) $(SRC)\attrib.c $(HACK_H) -$(O)botl.B: $(PCHB) $(SRC)\botl.c $(HACK_H) -$(O)cmd.B: $(PCHB) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) -$(O)dbridge.B: $(PCHB) $(SRC)\dbridge.c $(HACK_H) -$(O)do.B: $(PCHB) $(SRC)\do.c $(HACK_H) $(LEV_H) -$(O)do_name.B: $(PCHB) $(SRC)\do_name.c $(HACK_H) -$(O)do_wear.B: $(PCHB) $(SRC)\do_wear.c $(HACK_H) -$(O)dog.B: $(PCHB) $(SRC)\dog.c $(HACK_H) -$(O)dogmove.B: $(PCHB) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) -$(O)eat.B: $(PCHB) $(SRC)\eat.c $(HACK_H) -$(O)engrave.B: $(PCHB) $(SRC)\engrave.c $(HACK_H) $(LEV_H) -$(O)hack.B: $(PCHB) $(SRC)\hack.c $(HACK_H) -$(O)hacklib.B: $(PCHB) $(SRC)\hacklib.c $(HACK_H) -$(O)invent.B: $(PCHB) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) -$(O)lock.B: $(PCHB) $(SRC)\lock.c $(HACK_H) -$(O)mail.B: $(PCHB) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(DATE_H) -$(O)makemon.B: $(PCHB) $(SRC)\makemon.c $(HACK_H) -$(O)mcastu.B: $(PCHB) $(SRC)\mcastu.c $(HACK_H) -$(O)mhitm.B: $(PCHB) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) -$(O)mhitu.B: $(PCHB) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) -$(O)mkobj.B: $(PCHB) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) -$(O)mkroom.B: $(PCHB) $(SRC)\mkroom.c $(HACK_H) -$(O)mon.B: $(PCHB) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) -$(O)mondata.B: $(PCHB) $(SRC)\mondata.c $(HACK_H) -$(O)monmove.B: $(PCHB) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) -$(O)mthrowu.B: $(PCHB) $(SRC)\mthrowu.c $(HACK_H) -$(O)objnam.B: $(PCHB) $(SRC)\objnam.c $(HACK_H) -$(O)pline.B: $(SRC)\pline.c $(HACK_H) - @type schema$(SCHEMA).bc | find "$(@B)_b" > $(VROOMMCFG) - @echo $(BCOPTS1) >> $(VROOMMCFG) - @echo $(BCOPTS2) >> $(VROOMMCFG) - $(CC) $(CFLAGSN) $(COBJNAM)$@ $(SRC)\pline.c -$(O)polyself.B: $(PCHB) $(SRC)\polyself.c $(HACK_H) -$(O)potion.B: $(PCHB) $(SRC)\potion.c $(HACK_H) -$(O)priest.B: $(PCHB) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) -$(O)read.B: $(PCHB) $(SRC)\read.c $(HACK_H) -$(O)rnd.B: $(PCHB) $(SRC)\rnd.c $(HACK_H) -$(O)shk.B: $(PCHB) $(SRC)\shk.c $(HACK_H) -$(O)shknam.B: $(PCHB) $(SRC)\shknam.c $(HACK_H) -$(O)sounds.B: $(PCHB) $(SRC)\sounds.c $(HACK_H) -$(O)steal.B: $(PCHB) $(SRC)\steal.c $(HACK_H) -$(O)timeout.B: $(PCHB) $(SRC)\timeout.c $(HACK_H) $(LEV_H) -$(O)track.B: $(PCHB) $(SRC)\track.c $(HACK_H) -$(O)trap.B: $(PCHB) $(SRC)\trap.c $(HACK_H) -$(O)vault.B: $(PCHB) $(SRC)\vault.c $(HACK_H) -$(O)weapon.B: $(PCHB) $(SRC)\weapon.c $(HACK_H) -$(O)were.B: $(PCHB) $(SRC)\were.c $(HACK_H) -$(O)wizard.B: $(PCHB) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) -$(O)zap.B: $(PCHB) $(SRC)\zap.c $(HACK_H) - -# end of file diff --git a/sys/msdos/Makefile.GCC b/sys/msdos/Makefile.GCC index 4693bda37..d7220fc10 100644 --- a/sys/msdos/Makefile.GCC +++ b/sys/msdos/Makefile.GCC @@ -1,9 +1,9 @@ -# NetHack 3.6 Makefile.GCC $NHDT-Date: 1519600525 2018/02/25 23:15:25 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.34 $ -# Copyright (c) NetHack PC Development Team 1996-2019. -# PC NetHack 3.6 Makefile for djgpp V2 +# NetHack 5.0 Makefile.GCC $NHDT-Date: 1596498268 2020/08/03 23:44:28 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.53 $ +# Copyright (c) NetHack PC Development Team 1996-2024. +# PC NetHack 5.0 Makefile for djgpp V2 # # Gnu gcc compiler for msdos (djgpp) -# Requires Gnu Make utility (V3.79.1 or greater) supplied with djgpp +# Requires Gnu Make utility (V5.09.1 or greater) supplied with djgpp # # For questions or comments: devteam@nethack.org # @@ -35,10 +35,42 @@ GAMEDIR =../binary # of your PDCurses C files which must already be resident on # your machine. # +ifdef WANT_WIN_CURSES ADD_CURSES=Y -PDCURSES_TOP=../../pdcurses +ifdef WANT_DOSVGA +PDCURSES_TOP=../lib/pdcurmod +PDCDOS = $(PDCURSES_TOP)/dosvga +else +PDCURSES_TOP=../lib/pdcurses +PDCDOS = $(PDCURSES_TOP)/dos +endif +endif +#--------------------------------------------------------------- +ifeq "$(LUA_VERSION)" "5.3.5" +LUAVER=535 +else +LUAVER=546 +endif +#--------------------------------------------------------------- +# Location of LUA +# +# Original source needs to be obtained from: +# http://www.lua.org/ftp/lua-5.4.8.tar.gz +# +# This build assumes that the LUA sources are located +# at the specified location. If they are actually elsewhere +# you'll need to specify the correct spot below in order to +# successfully build NetHack-5.0. +# +ADD_LUA=Y +LUATOP=../lib/lua$(LUAVER) # + +#--------------------------------------------------------------- +# Location of terminus-fonts +# +FONTTOP=../lib/terminus #============================================================================== # This marks the end of the BUILD DECISIONS section. #============================================================================== @@ -79,38 +111,6 @@ TERMLIB = LIBRARIES = $(LIBS) $(TERMLIB) -# -# Yacc/Lex ... if you got 'em. -# -# If you have yacc/lex or a work-alike set YACC_LEX to Y -# -YACC_LEX = N - -ifeq "$(YACC_LEX)" "Y" -DO_YACC = YACC_ACT -DO_LEX = LEX_ACT -endif - -# If YACC_LEX is Y above, set the following to values appropriate for -# your tools. -# -YACC = bison -y -LEX = flex -# -# If your flex and bison port mess with the output names directly -# you must set the file names to the appropriate output file names -# here -#YTABC = y_tab.c -#YTABH = y_tab.h -#LEXYYC = lexyy.c -# -# If your flex and bison are able to produce files named -# y.tab.c, y.tab.h or lex.yy.c you might have to set these -# to the short file name equivalent (DIR /X to reveal them): -YTABC = ytab~1.c -YTABH = ytab~1.h -LEXYYC = lexyy~1.c - # # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file. @@ -163,6 +163,9 @@ else DLBFLG = endif +# +HACKLIB = $(O)hacklib.a + TERMLIB = # Build NetHack suitable for blind players @@ -202,22 +205,12 @@ U = $(UTIL)/ # Utility Objects. #========================================== -VGAOBJ = $(O)vidvga.o $(O)vidvesa.o +VGAOBJ = $(O)vidvga.o $(O)vidvesa.o $(O)font.o MAKESRC = makedefs.c -SPLEVSRC = lev_yacc.c lev_$(LEX).c lev_main.c panic.c - -DGNCOMPSRC = dgn_yacc.c dgn_$(LEX).c dgn_main.c - -MAKEDEFSOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o - -SPLEVOBJS = $(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o $(O)alloc.o \ - $(O)monst.o $(O)objects.o $(O)panic.o \ - $(O)drawing.o $(O)decl.o $(O)stubvid.o - -DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o $(O)alloc.o \ - $(O)panic.o +MAKEDEFSOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o $(O)alloc.o \ + $(O)date.o $(O)panic.o RECOVOBJS = $(O)recover.o @@ -246,10 +239,10 @@ TILOBJ = $(O)tile.o $(VGAOBJ) TILOBJ2 = $(O)tileset.o $(O)bmptiles.o $(O)giftiles.o -TEXTIO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o $(O)decl.o $(O)monst.o \ +TEXTIO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o $(O)monst.o \ $(O)objects.o $(O)stubvid.o -TEXTIO2 = $(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o $(O)decl.o $(O)monst.o \ +TEXTIO2 = $(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o $(O)monst.o \ $(O)objects.o $(O)stubvid.o TILE_BMP = $(DAT)/nhtiles.bmp @@ -278,35 +271,41 @@ DLBOBJ = $(O)dlb.o # Object files for the game itself. -VOBJ01 = $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o $(O)attrib.o -VOBJ02 = $(O)ball.o $(O)bones.o $(O)botl.o $(O)cmd.o $(O)dbridge.o -VOBJ03 = $(O)decl.o $(O)detect.o $(O)display.o $(O)do.o $(O)do_name.o -VOBJ04 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o $(O)dothrow.o -VOBJ05 = $(O)drawing.o $(O)dungeon.o $(O)eat.o $(O)end.o $(O)engrave.o -VOBJ06 = $(O)exper.o $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o -VOBJ07 = $(O)getline.o $(O)hack.o $(O)hacklib.o $(O)invent.o $(O)lock.o -VOBJ08 = $(O)mail.o $(O)main.o $(O)makemon.o $(O)mapglyph.o $(O)mcastu.o $(O)mhitm.o -VOBJ09 = $(O)mhitu.o $(O)minion.o $(O)mkmap.o $(O)mklev.o $(O)mkmaze.o -VOBJ10 = $(O)mkobj.o $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o -VOBJ11 = $(O)monst.o $(O)monstr.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o -VOBJ12 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o $(O)options.o -VOBJ13 = $(O)pickup.o $(O)pline.o $(O)polyself.o $(O)potion.o $(O)quest.o -VOBJ14 = $(O)questpgr.o $(O)pager.o $(O)pray.o $(O)priest.o $(O)read.o -VOBJ15 = $(O)rect.o $(O)restore.o $(O)rip.o $(O)rnd.o $(O)role.o -VOBJ16 = $(O)rumors.o $(O)save.o $(O)shk.o $(O)shknam.o $(O)sit.o -VOBJ17 = $(O)sounds.o $(O)sp_lev.o $(O)spell.o $(O)steal.o $(O)steed.o -VOBJ18 = $(O)termcap.o $(O)timeout.o $(O)topl.o $(O)topten.o $(O)track.o -VOBJ19 = $(O)trap.o $(O)u_init.o $(O)uhitm.o $(O)vault.o $(O)vision.o -VOBJ20 = $(O)vis_tab.o $(O)weapon.o $(O)were.o $(O)wield.o $(O)windows.o -VOBJ21 = $(O)wintty.o $(O)wizard.o $(O)worm.o $(O)worn.o $(O)write.o -VOBJ22 = $(O)zap.o $(O)light.o $(O)dlb.o $(O)dig.o $(O)teleport.o -VOBJ23 = $(O)region.o $(O)sys.o $(REGEX) $(O)isaac64.o - -SOBJ = $(O)msdos.o $(O)sound.o $(O)pcsys.o $(O)tty.o $(O)unix.o \ +VOBJ01 = $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o $(O)attrib.o +VOBJ02 = $(O)ball.o $(O)bones.o $(O)botl.o $(O)calendar.o $(O)cfgfiles.o +VOBJ03 = $(O)cmd.o $(O)coloratt.o $(O)date.o $(O)dbridge.o $(O)decl.o +VOBJ04 = $(O)detect.o $(O)dig.o $(O)display.o $(O)do.o $(O)do_name.o +VOBJ05 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o $(O)dothrow.o +VOBJ06 = $(O)drawing.o $(O)dungeon.o $(O)earlyarg.o $(O)eat.o $(O)end.o +VOBJ07 = $(O)engrave.o $(O)exper.o $(O)explode.o $(O)extralev.o $(O)files.o +VOBJ08 = $(O)fountain.o $(O)getpos.o $(O)glyphs.o $(O)getline.o $(O)hack.o +VOBJ09 = $(O)hacklib.o $(O)iactions.o $(O)insight.o $(O)invent.o $(O)isaac64.o +VOBJ10 = $(O)lock.o $(O)mail.o $(O)main.o $(O)makemon.o $(O)mcastu.o +VOBJ11 = $(O)mdlib.o $(O)mhitm.o $(O)mhitu.o $(O)minion.o $(O)mkmap.o +VOBJ12 = $(O)mklev.o $(O)mkmaze.o $(O)mkobj.o $(O)mkroom.o $(O)mon.o +VOBJ13 = $(O)mondata.o $(O)monmove.o $(O)monst.o $(O)mplayer.o $(O)mthrowu.o +VOBJ14 = $(O)muse.o $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o +VOBJ15 = $(O)options.o $(O)pickup.o $(O)pline.o $(O)polyself.o $(O)potion.o +VOBJ16 = $(O)quest.o $(O)questpgr.o $(O)pager.o $(O)pray.o $(O)priest.o +VOBJ17 = $(O)read.o $(O)rect.o $(O)region.o $(O)report.o $(O)restore.o +VOBJ18 = $(O)rip.o $(O)rnd.o $(O)role.o $(O)rumors.o $(O)save.o +VOBJ19 = $(O)selvar.o $(O)sfstruct.o $(O)shk.o $(O)shknam.o $(O)sit.o +VOBJ20 = $(O)sounds.o $(O)sp_lev.o $(O)spell.o $(O)stairs.o $(O)steal.o +VOBJ21 = $(O)steed.o $(O)symbols.o $(O)sys.o $(O)teleport.o $(O)strutil.o +VOBJ22 = $(O)termcap.o $(O)timeout.o $(O)topl.o $(O)topten.o $(O)trap.o +VOBJ23 = $(O)u_init.o $(O)uhitm.o $(O)utf8map.o $(O)vault.o $(O)track.o +VOBJ24 = $(O)vision.o $(O)weapon.o $(O)were.o $(O)wield.o $(O)windows.o +VOBJ25 = $(O)wintty.o $(O)wizard.o $(O)wizcmds.o $(O)worm.o $(O)worn.o +VOBJ26 = $(O)write.o $(O)zap.o $(O)light.o $(O)dlb.o $(REGEX) + +SOBJ = $(O)msdos.o $(O)pcsys.o $(O)tty.o $(O)unix.o \ $(O)video.o $(O)vidtxt.o $(O)pckeys.o VVOBJ = $(O)version.o +LUAOBJ = $(O)nhlua.o $(O)nhlsel.o $(O)nhlobj.o +LUA_QTEXT_FILE = "quest.lua" + ifeq "$(ADD_CURSES)" "Y" 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 @@ -318,11 +317,40 @@ VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ - $(VOBJ21) $(VOBJ22) $(VOBJ23) \ - $(CURSESOBJ) + $(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \ + $(VOBJ26) $(CURSESOBJ) $(LUAOBJ) ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(TILOBJ2) $(VVOBJ) +#===============-================================================= +# LUA library +# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz +#================================================================= + +LUASRC = $(LUATOP)/src +LUALIB = $(O)lua$(LUAVER)s.a +LUAINCL = -I$(LUASRC) +#LUAFLAGS = unix added -lm here? +LUATARGETS = lua.exe luac.exe $(LUALIB) + +LUASRCFILES = lapi.c lauxlib.c lbaselib.c lcode.c \ + lcorolib.c lctype.c ldblib.c ldebug.c ldo.c \ + ldump.c lfunc.c lgc.c linit.c liolib.c llex.c \ + lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c \ + loslib.c lparser.c lstate.c lstring.c lstrlib.c \ + ltable.c ltablib.c ltm.c lundump.c lutf8lib.c \ + lvm.c lzio.c + +LUAOBJFILES1 = $(O)lapi.o $(O)lauxlib.o $(O)lbaselib.o \ + $(O)lcode.o $(O)lcorolib.o $(O)lctype.o $(O)ldblib.o \ + $(O)ldebug.o $(O)ldo.o $(O)ldump.o $(O)lfunc.o +LUAOBJFILES2 = $(O)lgc.o $(O)linit.o $(O)liolib.o $(O)llex.o \ + $(O)lmathlib.o $(O)lmem.o $(O)loadlib.o $(O)lobject.o \ + $(O)lopcodes.o $(O)loslib.o $(O)lparser.o $(O)lstate.o +LUAOBJFILES3 = $(O)lstring.o $(O)lstrlib.o $(O)ltable.o $(O)ltablib.o \ + $(O)ltm.o $(O)lundump.o $(O)lutf8lib.o $(O)lvm.o $(O)lzio.o +LUAOBJFILES = $(LUAOBJFILES1) $(LUAOBJFILES2) $(LUAOBJFILES3) + ifeq "$(ADD_CURSES)" "Y" #========================================== # PDCurses build macros @@ -331,7 +359,6 @@ PDCURSES_CURSES_H = $(PDCURSES_TOP)/curses.h PDCURSES_CURSPRIV_H = $(PDCURSES_TOP)/curspriv.h PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) PDCSRC = $(PDCURSES_TOP)/pdcurses -PDCDOS = $(PDCURSES_TOP)/dos PDCLIBOBJS1 = $(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)getch.o @@ -355,6 +382,7 @@ PDCLIB = $(O)pdcurses.a PDCINCL = -I$(PDCURSES_TOP) -I$(PDCSRC) -I$(PDCDOS) else PDCLIB = +PDCINCL = endif #========================================== @@ -372,26 +400,27 @@ REGION_H = $(INCL)/region.h RM_H = $(INCL)/align.h $(INCL)/rm.h SKILLS_H = $(INCL)/skills.h SP_LEV_H = $(INCL)/align.h $(INCL)/sp_lev.h -YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ - $(INCL)/pm.h $(INCL)/youprop.h -YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ +YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ + $(INCL)/youprop.h +YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ $(INCL)/attrib.h $(INCL)/you.h DISPLAY_H = $(MONDATA_H) $(INCL)/vision.h $(INCL)/display.h -PCCONF_H = $(INCL)/micro.h $(INCL)/system.h $(INCL)/pcconf.h \ +PCCONF_H = $(INCL)/micro.h $(INCL)/cstd.h $(INCL)/pcconf.h \ $(MSYS)/pcvideo.h -CONFIG_H = $(GLOBAL_H) $(INCL)/tradstdc.h $(INCL)/config1.h \ - $(INCL)/config.h -DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ - $(INCL)/obj.h $(INCL)/onames.h $(INCL)/pm.h \ +CONFIG_H = $(GLOBAL_H) $(INCL)/fnamesiz.h $(INCL)/tradstdc.h \ + $(INCL)/config1.h $(INCL)/config.h +DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ + $(INCL)/obj.h $(INCL)/objects.h \ $(INCL)/decl.h GLOBAL_H = $(PCCONF_H) $(INCL)/coord.h $(INCL)/global.h HACK_H = $(CONFIG_H) $(INCL)/context.h $(DUNGEON_H) \ - $(DECL_H) $(DISPLAY_H) $(INCL)/monsym.h \ - $(INCL)/mkroom.h $(INCL)/objclass.h $(INCL)/trap.h \ - $(INCL)/flag.h $(RM_H) $(INCL)/vision.h \ - $(INCL)/wintype.h $(INCL)/engrave.h $(INCL)/rect.h \ - $(INCL)/trampoli.h $(INCL)/hack.h $(REGION_H) \ - $(INCL)/sys.h + $(DECL_H) $(DISPLAY_H) $(INCL)/sym.h \ + $(INCL)/defsym.h $(INCL)/mkroom.h $(INCL)/objclass.h \ + $(INCL)/mcastu.h \ + $(INCL)/trap.h $(INCL)/flag.h $(RM_H) \ + $(INCL)/vision.h $(INCL)/wintype.h $(INCL)/engrave.h \ + $(INCL)/rect.h $(INCL)/hack.h $(REGION_H) \ + $(INCL)/sys.h $(INCL)/weight.h DLB_H = $(INCL)/dlb.h ifeq ($(SUPPRESS_GRAPHICS),Y) @@ -418,27 +447,23 @@ endif #========================================== # ifeq "$(ADD_CURSES)" "Y" -CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" +CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" -DPDC_RGB +ifdef WANT_DOSVGA +CURSESDEF += -DCURSES_UNICODE -DPDC_WIDE +endif else CURSESDEF= CURSESLIB= endif -INCLDIR=-I../include -I../sys/msdos +INCLDIR=$(PDCINCL) -I../include -I../sys/msdos $(LUAINCL) # Debugging -#cflags = -pg -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS +#cflags = -pg -c -D_NAIVE_DOS_REGS $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS #LFLAGS = -pg -cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS -LFLAGS = - -# Debugging -#cflags = -g -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES -#LFLAGS = -g - # Normal -cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES +cflags = -c -O -D_NAIVE_DOS_REGS $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DTILES_IN_GLYPHMAP LFLAGS = #========================================== @@ -500,20 +525,27 @@ $(OBJ)/%.o : $(TTY)/%.c #========================================== $(OBJ)/%.o : $(WCURSES)/%.c - $(CC) -DPDC_NCMOUSE $(PDCINCL) $(cflags) -o$@ $< + $(CC) -DPDC_NCMOUSE $(cflags) -o$@ $< #========================================== # Rules for files in PDCurses #========================================== $(OBJ)/%.o : $(PDCURSES_TOP)/%.c - $(CC) $(PDCINCL) $(cflags) -o$@ $< + $(CC) $(cflags) -o$@ $< $(OBJ)/%.o : $(PDCSRC)/%.c - $(CC) $(PDCINCL) $(cflags) -o$@ $< + $(CC) $(cflags) -o$@ $< $(OBJ)/%.o : $(PDCDOS)/%.c - $(CC) $(PDCINCL) $(cflags) -o$@ $< + $(CC) $(cflags) -o$@ $< + +#========================================== +# Rules for LUA files +#========================================== + +$(OBJ)/%.o : $(LUASRC)/%.c + $(CC) $(cflags) -o$@ $< #========================================== # Primary Targets. @@ -530,11 +562,8 @@ default: $(GAMEFILE) util: $(O)utility.tag -LEVCOMPEXE = $(U)lev_comp.exe - -$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/onames.h \ - $(INCL)/pm.h monstr.c vis_tab.c $(LEVCOMPEXE) \ - $(U)dgn_comp.exe $(TILEUTIL) +$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/objects.h \ + $(TILEUTIL) $(subst /,\,echo utilities made > $@) tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe @@ -544,14 +573,14 @@ recover: $(U)recover.exe @$(subst /,\,if exist $(U)recover.exe copy $(U)recover.exe $(GAMEDIR)) @$(subst /,\,if exist $(DOC)/recover.txt copy $(DOC)/recover.txt $(GAMEDIR)) -$(O)install.tag: $(O)dat.tag $(GAMEFILE) +$(O)install.tag: $(O)dat.tag $(O)fonts.tag $(GAMEFILE) ifeq ($(USE_DLB),Y) @$(subst /,\,copy $(DAT)/nhdat $(GAMEDIR)) @$(subst /,\,copy $(DAT)/license $(GAMEDIR)) else @$(subst /,\,copy $(DAT)/*. $(GAMEDIR)) @$(subst /,\,copy $(DAT)/*.dat $(GAMEDIR)) - @$(subst /,\,copy $(DAT)/*.lev $(GAMEDIR)) + @$(subst /,\,copy $(DAT)/*.lua $(GAMEDIR)) @$(subst /,\,copy $(MSYS)/msdoshlp.txt $(GAMEDIR)) @$(subst /,\,if exist $(GAMEDIR)/makefile. del $(GAMEDIR)/makefile.) endif @@ -563,94 +592,65 @@ endif @$(subst /,\,copy $(SSHR)/NetHack.cnf $(GAMEDIR)/defaults.nh) -@$(subst /,\,touch $(GAMEDIR)/record) @$(subst /,\,copy $(DOC)/guideb*.txt $(GAMEDIR)) - @$(subst /,\,copy ../sys/winnt/sysconf $(GAMEDIR)) + @$(subst /,\,copy $(MSYS)/sysconf $(GAMEDIR)) + @$(subst /,\,if not exist $(GAMEDIR)/sysconf touch $(GAMEDIR)/sysconf) @$(subst /,\,if exist $(DOC)/nethack.txt copy $(DOC)/nethack.txt $(GAMEDIR)) ifdef CWSDPMI @$(subst /,\,if exist $(CWSDPMI) copy $(CWSDPMI) $(GAMEDIR)) else @$(subst /,\,echo Could not find a copy of CWSDPMI.EXE to put into $(GAMEDIR)) endif + @$(subst /,\,copy $(MSYS)/fonts/*.psf $(GAMEDIR)) @$(subst /,\,echo install done > $@) #========================================== # The main target. #========================================== -$(GAMEFILE): $(O)obj.tag $(PATCHLEV_H) $(PDCLIB) \ - $(O)utility.tag $(ALLOBJ) $(O)$(GAME).lnk +$(GAMEFILE): $(O)obj.tag $(PATCHLEV_H) $(PDCLIB) $(LUATARGETS) \ + $(O)utility.tag $(ALLOBJ) $(O)hacklib.a @if exist temp.a del temp.a - @ar ru temp.a $(VOBJ01) - @ar ru temp.a $(VOBJ02) - @ar ru temp.a $(VOBJ03) - @ar ru temp.a $(VOBJ04) - @ar ru temp.a $(VOBJ05) - @ar ru temp.a $(VOBJ06) - @ar ru temp.a $(VOBJ07) - @ar ru temp.a $(VOBJ08) - @ar ru temp.a $(VOBJ09) - @ar ru temp.a $(VOBJ10) - @ar ru temp.a $(VOBJ11) - @ar ru temp.a $(VOBJ12) - @ar ru temp.a $(VOBJ13) - @ar ru temp.a $(VOBJ14) - @ar ru temp.a $(VOBJ15) - @ar ru temp.a $(VOBJ16) - @ar ru temp.a $(VOBJ17) - @ar ru temp.a $(VOBJ18) - @ar ru temp.a $(VOBJ19) - @ar ru temp.a $(VOBJ20) - @ar ru temp.a $(VOBJ21) - @ar ru temp.a $(VOBJ22) - @ar ru temp.a $(VOBJ23) - @ar ru temp.a $(VOBJ24) - @ar ru temp.a $(VOBJ25) - @ar ru temp.a $(SOBJ) - @ar ru temp.a $(TILOBJ) - @ar ru temp.a $(TILOBJ2) - @ar ru temp.a $(VVOBJ) + @ar ruS temp.a $(VOBJ01) + @ar ruS temp.a $(VOBJ02) + @ar ruS temp.a $(VOBJ03) + @ar ruS temp.a $(VOBJ04) + @ar ruS temp.a $(VOBJ05) + @ar ruS temp.a $(VOBJ06) + @ar ruS temp.a $(VOBJ07) + @ar ruS temp.a $(VOBJ08) + @ar ruS temp.a $(VOBJ09) + @ar ruS temp.a $(VOBJ10) + @ar ruS temp.a $(VOBJ11) + @ar ruS temp.a $(VOBJ12) + @ar ruS temp.a $(VOBJ13) + @ar ruS temp.a $(VOBJ14) + @ar ruS temp.a $(VOBJ15) + @ar ruS temp.a $(VOBJ16) + @ar ruS temp.a $(VOBJ17) + @ar ruS temp.a $(VOBJ18) + @ar ruS temp.a $(VOBJ19) + @ar ruS temp.a $(VOBJ20) + @ar ruS temp.a $(VOBJ21) + @ar ruS temp.a $(VOBJ22) + @ar ruS temp.a $(VOBJ23) + @ar ruS temp.a $(VOBJ24) + @ar ruS temp.a $(VOBJ25) + @ar ruS temp.a $(VOBJ26) + @ar ruS temp.a $(SOBJ) + @ar ruS temp.a $(TILOBJ) + @ar ruS temp.a $(TILOBJ2) + @ar ruS temp.a $(VVOBJ) + @ar ruS temp.a $(LUAOBJ) ifeq "$(ADD_CURSES)" "Y" - @ar ru temp.a $(CURSESOBJ) + @ar ruS temp.a $(CURSESOBJ) endif + @ranlib temp.a $(LINK) $(LFLAGS) -o$(GAME).exe temp.a \ - $(PDCLIB) $(LIBRARIES) $(ZLIB) + $(PDCLIB) $(LUALIB) $(LIBRARIES) $(ZLIB) @$(subst /,\,stubedit $(GAME).exe minstack=2048K) @$(subst /,\,copy $(GAME).exe $(GAMEFILE)) @$(subst /,\,del $(GAME).exe) -$(O)$(GAME).lnk: $(ALLOBJ) - echo $(VOBJ01) > $(subst /,\,$@) - echo $(VOBJ02) >> $(subst /,\,$@) - echo $(VOBJ03) >> $(subst /,\,$@) - echo $(VOBJ04) >> $(subst /,\,$@) - echo $(VOBJ05) >> $(subst /,\,$@) - echo $(VOBJ06) >> $(subst /,\,$@) - echo $(VOBJ07) >> $(subst /,\,$@) - echo $(VOBJ08) >> $(subst /,\,$@) - echo $(VOBJ09) >> $(subst /,\,$@) - echo $(VOBJ10) >> $(subst /,\,$@) - echo $(VOBJ11) >> $(subst /,\,$@) - echo $(VOBJ12) >> $(subst /,\,$@) - echo $(VOBJ13) >> $(subst /,\,$@) - echo $(VOBJ14) >> $(subst /,\,$@) - echo $(VOBJ15) >> $(subst /,\,$@) - echo $(VOBJ16) >> $(subst /,\,$@) - echo $(VOBJ17) >> $(subst /,\,$@) - echo $(VOBJ18) >> $(subst /,\,$@) - echo $(VOBJ19) >> $(subst /,\,$@) - echo $(VOBJ20) >> $(subst /,\,$@) - echo $(VOBJ21) >> $(subst /,\,$@) - echo $(VOBJ22) >> $(subst /,\,$@) - echo $(VOBJ23) >> $(subst /,\,$@) - echo $(VOBJ24) >> $(subst /,\,$@) - echo $(VOBJ25) >> $(subst /,\,$@) - echo $(SOBJ) >> $(subst /,\,$@) - echo $(TILOBJ) >> $(subst /,\,$@) - echo $(TILOBJ2) >> $(subst /,\,$@) - echo $(VVOBJ) >> $(subst /,\,$@) -ifeq "$(ADD_CURSES)" "Y" - echo $(CURSESOBJ) >> $(subst /,\,$@) -endif - #========================================== #=========== SECONDARY TARGETS ============ #========================================== @@ -670,157 +670,34 @@ $(INCL)/onames.h: $(U)makedefs.exe $(INCL)/pm.h: $(U)makedefs.exe -$(subst /,\,$(U)makedefs -p) -monstr.c: $(U)makedefs.exe - -$(subst /,\,$(U)makedefs -m) - -$(INCL)/vis_tab.h: $(U)makedefs.exe - -$(subst /,\,$(U)makedefs -z) - -vis_tab.c: $(U)makedefs.exe - -$(subst /,\,$(U)makedefs -z) - #========================================== # Makedefs Stuff #========================================== -$(U)makedefs.exe: $(MAKEDEFSOBJS) - $(LINK) $(LFLAGS) -o$@ $(MAKEDEFSOBJS) +$(U)makedefs.exe: $(MAKEDEFSOBJS) $(HACKLIB) + $(LINK) $(LFLAGS) -o$@ $(MAKEDEFSOBJS) $(HACKLIB) $(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/objclass.h \ - $(INCL)/monsym.h $(INCL)/qtext.h $(U)makedefs.c + $(INCL)/sym.h $(INCL)/defsym.h $(U)makedefs.c #========================================== -# Level Compiler Dependencies +# hacklib.a static library #========================================== -$(U)lev_comp.exe: $(SPLEVOBJS) - -rm -f temp.a - @ar ru temp.a $(SPLEVOBJS) - $(LINK) $(LFLAGS) -o$@ temp.a - -ifeq ($(YACC_LEX),Y) - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(U)lev_yacc.c - $(CC) $(cflags) -o$@ $(U)lev_yacc.c - -else - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h $(U)lev_yacc.c - $(CC) $(cflags) -o$@ $(U)lev_yacc.c - -endif - -$(O)lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ - $(U)lev_$(LEX).c - $(CC) $(cflags) -o$@ $(U)lev_$(LEX).c - -$(O)lev_main.o: $(HACK_H) $(INCL)/sp_lev.h $(INCL)/date.h $(U)lev_main.c - -ifeq "$(DO_YACC)" "YACC_ACT" - -$(INCL)/lev_comp.h: $(U)lev_yacc.c - -$(U)lev_yacc.c $(INCL)/lev_comp.h : $(U)lev_comp.y - @$(subst /,\,chdir $(UTIL)) - @$(subst /,\,$(YACC) -d lev_comp.y) - @$(subst /,\,copy $(YTABC) lev_yacc.c) - @$(subst /,\,copy $(YTABH) $(INCL)/lev_comp.h) - @$(subst /,\,@del $(YTABC)) - @$(subst /,\,@del $(YTABH)) - @$(subst /,\,chdir $(SRC)) -else - -$(U)lev_yacc.c: $(SSHR)/lev_yacc.c - @echo --- - @echo For now, we will copy the prebuilt - @echo lev_comp.c from $(SSHR) into $(U) and use that. - @$(subst /,\,copy $(SSHR)/lev_yacc.c $(U)lev_yacc.c) - @$(subst /,\,echo.>>$(U)lev_yacc.c) +$(O)hacklib.a: $(O)hacklibu.o + @ar rcs $@ $(O)hacklibu.o +# @ranlib $@ -$(INCL)/lev_comp.h : $(SSHR)/lev_comp.h - @echo --- - @echo For now, we will copy the prebuilt lev_comp.h - @echo from $(SSHR) into $(INCL) and use that. - @$(subst /,\,copy $(SSHR)/lev_comp.h $(INCL)/lev_comp.h) - @$(subst /,\,echo.>>$(INCL)/lev_comp.h) - -endif - -$(U)lev_$(LEX).c: $(U)lev_comp.l -ifeq "$(DO_LEX)" "LEX_ACT" - @$(subst /,\,chdir $(UTIL)) - @$(subst /,\,$(LEX) $(FLEXSKEL) lev_comp.l) - @$(subst /,\,if exist $@ del $@) - @$(subst /,\,copy $(LEXYYC) $@) - @$(subst /,\,del $(LEXYYC)) - @$(subst /,\,chdir $(SRC)) -else - @echo --- - @echo For now, we will copy the prebuilt lev_lex.c - @echo from $(SSHR) into $(U) and use it. - @$(subst /,\,copy $(SSHR)/lev_lex.c $@) - @$(subst /,\,echo.>>$@) -endif - -#========================================== -# Dungeon Dependencies -#========================================== - -$(U)dgn_comp.exe: $(DGNCOMPOBJS) - $(LINK) $(LFLAGS) -o$@ $(DGNCOMPOBJS) - -ifeq "$(DO_YACC)" "YACC_ACT" -$(U)dgn_yacc.c $(INCL)/dgn_comp.h : $(U)dgn_comp.y - @$(subst /,\,chdir $(UTIL)) - @$(subst /,\,$(YACC) -d dgn_comp.y) - @$(subst /,\,copy $(YTABC) dgn_yacc.c) - @$(subst /,\,copy $(YTABH) $(INCL)/dgn_comp.h) - @$(subst /,\,@del $(YTABC)) - @$(subst /,\,@del $(YTABH)) - @$(subst /,\,chdir $(SRC)) -else -$(U)dgn_yacc.c: $(SSHR)/dgn_yacc.c - @echo --- - @echo For now, we will copy the prebuilt $(U)dgn_yacc.c and - @echo dgn_comp.h from $(SSHR) into $(U) and use that. - @$(subst /,\,copy $(SSHR)/dgn_yacc.c $(U)dgn_yacc.c) - @$(subst /,\,echo.>>$(U)dgn_yacc.c) - -$(INCL)/dgn_comp.h: $(SSHR)/dgn_comp.h - @echo --- - @echo For now, we will copy the prebuilt dgn_comp.h - @echo from $(SSHR) into $(INCL) and use that. - @$(subst /,\,copy $(SSHR)/dgn_comp.h $(INCL)/dgn_comp.h) - @$(subst /,\,echo.>>$(INCL)/dgn_comp.h) - -endif - -ifeq "$(DO_LEX)" "LEX_ACT" - -$(U)dgn_$(LEX).c: $(U)dgn_comp.l $(INCL)/dgn_comp.h - @$(subst /,\,chdir $(UTIL)) - @$(subst /,\,$(LEX) $(FLEXSKEL) dgn_comp.l) - @$(subst /,\,if exist $@ del $@) - @$(subst /,\,copy $(LEXYYC) $@) - @$(subst /,\,del $(LEXYYC)) - @$(subst /,\,chdir $(SRC)) -else - -$(U)dgn_$(LEX).c: $(SSHR)/dgn_lex.c $(INCL)/dgn_comp.h - @echo --- - @echo For now, we will copy the prebuilt dgn_lex.c - @echo from $(SSHR) into $(U) and use it. - @$(subst /,\,copy $(SSHR)/dgn_lex.c $@) - @$(subst /,\,echo.>>$@) - -endif +$(O)hacklibu.o: $(CONFIG_H) $(SRC)/hacklib.c + $(CC) $(cflags) -I$(SRC) -I$(MSYS) \ + -o$@ $(SRC)/hacklib.c #========================================== # Recover Utility #========================================== -$(U)recover.exe: $(RECOVOBJS) - $(LINK) $(LFLAGS) -o$@ $(O)recover.o +$(U)recover.exe: $(RECOVOBJS) $(HACKLIB) + $(LINK) $(LFLAGS) -o$@ $(O)recover.o $(HACKLIB) $(O)recover.o: $(CONFIG_H) $(U)recover.c $(CC) $(cflags) -o$@ $(U)recover.c @@ -840,12 +717,15 @@ $(SRC)/tile.c: $(U)tilemap.exe @$(subst /,\,$(U)tilemap.exe) @echo A new $@ has been created -$(U)tilemap.exe: $(O)tilemap.o - $(LINK) $(LFLAGS) -o$@ $(O)tilemap.o +TILEMAPOBJS = $(O)tilemap.o $(O)monst.o $(O)objects.o $(O)drawing.o + +$(U)tilemap.exe: $(TILEMAPOBJS) $(HACKLIB) + $(LINK) $(LFLAGS) -o$@ $(TILEMAPOBJS) $(HACKLIB) $(O)tilemap.o: $(WSHR)/tilemap.c $(HACK_H) $(TILE_H) $(CC) $(cflags) -I$(WSHR) -I$(MSYS) -o$@ $(WSHR)/tilemap.c +endif #========================================== # Tile Utilities @@ -858,23 +738,23 @@ $(DAT)/nhtiles.bmp: $(TILEFILES) $(U)tile2bmp.exe @$(subst /,\,$(U)tile2bmp.exe $@) @$(subst /,\,chdir $(SRC)) -$(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXTIO) +$(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXTIO) $(HACKLIB) -rm -f temp.a @ar ru temp.a $(TEXTIO) - $(LINK) $(LFLAGS) -o$@ $(O)tile2bmp.o temp.a + $(LINK) $(LFLAGS) -o$@ $(O)tile2bmp.o temp.a $(HACKLIB) -$(U)tile2bin.exe: $(O)tile2bin.o $(TEXTIO) +$(U)tile2bin.exe: $(O)tile2bin.o $(TEXTIO) $(HACKLIB) -rm -f temp.a @ar ru temp.a $(TEXTIO) - $(LINK) $(LFLAGS) -o$@ $(O)tile2bin.o temp.a + $(LINK) $(LFLAGS) -o$@ $(O)tile2bin.o temp.a $(HACKLIB) -$(U)til2bin2.exe: $(O)til2bin2.o $(TEXTIO2) +$(U)til2bin2.exe: $(O)til2bin2.o $(TEXTIO2) $(HACKLIB) -rm -f temp.a @ar ru temp.a $(TEXTIO2) - $(LINK) $(LFLAGS) -o$@ $(O)til2bin2.o temp.a + $(LINK) $(LFLAGS) -o$@ $(O)til2bin2.o temp.a $(HACKLIB) -$(U)thintile.exe: $(O)thintile.o - $(LINK) $(LFLAGS) -o$@ $(O)thintile.o +$(U)thintile.exe: $(O)thintile.o $(HACKLIB) + $(LINK) $(LFLAGS) -o$@ $(O)thintile.o $(HACKLIB) $(O)thintile.o: $(HACK_H) $(WSHR)/tile.h $(WSHR)/thintile.c $(CC) $(cflags) -o$@ $(WSHR)/thintile.c @@ -941,8 +821,6 @@ $(U)viewtib.exe: $(O)viewtib.o $(O)viewtib.o: $(MSYS)/viewtib.c -endif - #========================================== # PDCurses Library #========================================== @@ -967,8 +845,8 @@ $(O)drawing.o: $(CONFIG_H) drawing.c $(MSYS)/pcvideo.h $(O)decl.o: $(CONFIG_H) decl.c $(CC) $(cflags) -o$@ decl.c -$(O)monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/monsym.h \ - $(INCL)/color.h monst.c +$(O)monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/sym.h \ + $(INCL)/defsym.h $(INCL)/color.h monst.c $(CC) $(cflags) -o$@ monst.c $(O)objects.o: $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ @@ -993,9 +871,6 @@ $(DAT)/data: $(O)utility.tag $(DATABASE) $(DAT)/rumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal @$(subst /,\,$(U)makedefs.exe -r) -$(DAT)/quest.dat: $(O)utility.tag $(DAT)/quest.txt - @$(subst /,\,$(U)makedefs.exe -q) - $(DAT)/oracles: $(O)utility.tag $(DAT)/oracles.txt @$(subst /,\,$(U)makedefs.exe -h) @@ -1008,74 +883,69 @@ $(DAT)/engrave: $(O)utility.tag $(DAT)/engrave.txt $(DAT)/epitaph: $(O)utility.tag $(DAT)/epitaph.txt @$(subst /,\,$(U)makedefs.exe -s) -$(O)sp_lev.tag: $(O)utility.tag \ - $(DAT)/bigroom.des $(DAT)/castle.des \ - $(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des \ - $(DAT)/medusa.des $(DAT)/oracle.des $(DAT)/tower.des \ - $(DAT)/yendor.des $(DAT)/arch.des $(DAT)/barb.des \ - $(DAT)/caveman.des $(DAT)/healer.des $(DAT)/knight.des \ - $(DAT)/monk.des $(DAT)/priest.des $(DAT)/ranger.des \ - $(DAT)/rogue.des $(DAT)/samurai.des $(DAT)/tourist.des \ - $(DAT)/valkyrie.des $(DAT)/wizard.des - @$(subst /,\,cd $(DAT)) - @$(subst /,\,$(U)lev_comp bigroom.des) - @$(subst /,\,$(U)lev_comp castle.des) - @$(subst /,\,$(U)lev_comp endgame.des) - @$(subst /,\,$(U)lev_comp gehennom.des) - @$(subst /,\,$(U)lev_comp knox.des) - @$(subst /,\,$(U)lev_comp mines.des) - @$(subst /,\,$(U)lev_comp medusa.des) - @$(subst /,\,$(U)lev_comp oracle.des) - @$(subst /,\,$(U)lev_comp sokoban.des) - @$(subst /,\,$(U)lev_comp tower.des) - @$(subst /,\,$(U)lev_comp yendor.des) - @$(subst /,\,$(U)lev_comp arch.des) - @$(subst /,\,$(U)lev_comp barb.des) - @$(subst /,\,$(U)lev_comp caveman.des) - @$(subst /,\,$(U)lev_comp healer.des) - @$(subst /,\,$(U)lev_comp knight.des) - @$(subst /,\,$(U)lev_comp monk.des) - @$(subst /,\,$(U)lev_comp priest.des) - @$(subst /,\,$(U)lev_comp ranger.des) - @$(subst /,\,$(U)lev_comp rogue.des) - @$(subst /,\,$(U)lev_comp samurai.des) - @$(subst /,\,$(U)lev_comp tourist.des) - @$(subst /,\,$(U)lev_comp valkyrie.des) - @$(subst /,\,$(U)lev_comp wizard.des) - @$(subst /,\,cd $(SRC)) +$(O)sp_lev.tag: $(O)utility.tag @$(subst /,\,echo sp_levs done > $@) -$(DAT)/dungeon: $(O)utility.tag $(DAT)/dungeon.def - @$(subst /,\,$(U)makedefs.exe -e) - @$(subst /,\,cd $(DAT)) - @$(subst /,\,$(U)dgn_comp.exe dungeon.pdf) - @$(subst /,\,cd $(SRC)) - #========================================== # DLB stuff #========================================== #note that dir below assumes bin/dir.exe from djgpp distribution # -$(DAT)/nhdat: $(U)dlb_main.exe $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ - $(DAT)/oracles $(DAT)/quest.dat $(O)sp_lev.tag \ - $(DAT)/bogusmon $(DAT)/engrave $(DAT)/epitaph $(DAT)/tribute +$(DAT)/nhdat: $(U)dlb_main.exe $(DAT)/data $(DAT)/rumors \ + $(DAT)/oracles \ + $(QUEST_DAT) \ + $(O)sp_lev.tag \ + $(DAT)/bogusmon $(DAT)/engrave $(DAT)/epitaph $(DAT)/tribute @$(subst /,\,echo dat done >$(O)dat.tag) @$(subst /,\,cd $(DAT)) @$(subst /,\,copy $(MSYS)/msdoshlp.txt .) - @$(LS) data dungeon oracles options quest.dat rumors help hh >dlb.lst - @$(LS) cmdhelp history opthelp wizhelp license msdoshlp.txt >>dlb.lst + @$(LS) data oracles options rumors help hh >dlb.lst + @$(LS) cmdhelp history opthelp optmenu wizhelp license msdoshlp.txt >>dlb.lst @$(LS) bogusmon engrave epitaph tribute >>dlb.lst - $(LS) $(subst /,\,*.lev) >>dlb.lst + $(LS) $(subst /,\,*.lua) >>dlb.lst @$(subst /,\,$(U)dlb_main cvIf dlb.lst nhdat) @$(subst /,\,cd $(SRC)) -$(U)dlb_main.exe: $(DLBOBJS) - $(LINK) $(LFLAGS) -o$@ $(DLBOBJS) +$(U)dlb_main.exe: $(DLBOBJS) $(HACKLIB) + $(LINK) $(LFLAGS) -o$@ $(DLBOBJS) $(HACKLIB) $(O)dlb_main.o: $(U)dlb_main.c $(INCL)/config.h $(DLB_H) $(CC) $(cflags) -o$@ $(U)dlb_main.c +#============================================================= +# LUA +#============================================================= + +lua.exe: $(O)lua.o $(LUALIB) + $(CC) $(LFLAGS) -o$@ $(O)lua.o $(LUALIB) + +luac.exe: $(O)luac.o $(O)lua$(LUAVER)s.a + $(CC) $(LFLAGSU) -o$@ $(O)luac.o $(LUALIB) + +$(O)lua$(LUAVER)s.a: $(LUAOBJFILES) + ar rcS $@ $(LUAOBJFILES1) + ar rcS $@ $(LUAOBJFILES2) + ar rcs $@ $(LUAOBJFILES3) + +$(O)lua.o: $(LUASRC)/lua.c +$(O)luac.o: $(LUASRC)/luac.c + +#========================================== +# Fonts for Unicode support +#========================================== + +$(O)fonts.tag: lua.exe $(MSYS)/fonts/makefont.lua + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u16b.bdf $(MSYS)/fonts/ter-u16b.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u16v.bdf $(MSYS)/fonts/ter-u16v.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u18b.bdf $(MSYS)/fonts/ter-u18b.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u20b.bdf $(MSYS)/fonts/ter-u20b.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u22b.bdf $(MSYS)/fonts/ter-u22b.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u24b.bdf $(MSYS)/fonts/ter-u24b.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u28b.bdf $(MSYS)/fonts/ter-u28b.psf + lua $(MSYS)/fonts/makefont.lua $(FONTTOP)/ter-u32b.bdf $(MSYS)/fonts/ter-u32b.psf + @echo Fonts done >$(O)fonts.tag + #========================================== # Housekeeping. #========================================== @@ -1083,6 +953,8 @@ $(O)dlb_main.o: $(U)dlb_main.c $(INCL)/config.h $(DLB_H) clean: $(subst /,\,if exist $(O)*.o del $(O)*.o) $(subst /,\,if exist $(O)dat.tag del $(O)dat.tag) + $(subst /,\,if exist $(O)fonts.tag del $(O)fonts.tag) + $(subst /,\,if exist $(MSYS)/fonts/*.psf del $(MSYS)/fonts/*.psf) $(subst /,\,if exist $(O)install.tag del $(O)install.tag) $(subst /,\,if exist $(O)$(GAME).lnk del $(O)$(GAME).lnk) $(subst /,\,if exist $(O)obj.tag del $(O)obj.tag) @@ -1093,10 +965,7 @@ clean: spotless: clean - $(subst /,\,if exist $(U)dgn_flex.c del $(U)dgn_flex.c) - $(subst /,\,if exist $(U)dgn_lex.c del $(U)dgn_lex.c) $(subst /,\,if exist $(U)makedefs.exe del $(U)makedefs.exe) - $(subst /,\,if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe) $(subst /,\,if exist $(U)recover.exe del $(U)recover.exe) $(subst /,\,if exist $(U)tilemap.exe del $(U)tilemap.exe) $(subst /,\,if exist $(U)tile2bmp.exe del $(U)tile2bmp.exe) @@ -1104,32 +973,27 @@ spotless: clean $(subst /,\,if exist $(U)til2bin2.exe del $(U)til2bin2.exe) $(subst /,\,if exist $(U)thintile.exe del $(U)thintile.exe) $(subst /,\,if exist $(U)dlb_main.exe del $(U)dlb_main.exe) - $(subst /,\,if exist $(INCL)/vis_tab.h del $(INCL)/vis_tab.h) $(subst /,\,if exist $(INCL)/onames.h del $(INCL)/onames.h) $(subst /,\,if exist $(INCL)/pm.h del $(INCL)/pm.h) $(subst /,\,if exist $(INCL)/date.h del $(INCL)/date.h) - $(subst /,\,if exist $(INCL)/dgn_comp.h del $(INCL)/dgn_comp.h) - $(subst /,\,if exist $(INCL)/lev_comp.h del $(INCL)/lev_comp.h) - $(subst /,\,if exist $(SRC)/monstr.c del $(SRC)/monstr.c) - $(subst /,\,if exist $(SRC)/vis_tab.c del $(SRC)/vis_tab.c) $(subst /,\,if exist $(SRC)/tile.c del $(SRC)/tile.c) $(subst /,\,if exist $(DAT)/options del $(DAT)/options) $(subst /,\,if exist $(DAT)/data del $(DAT)/data) $(subst /,\,if exist $(DAT)/rumors del $(DAT)/rumors) - $(subst /,\,if exist $(DAT)/dungeon.pdf del $(DAT)/dungeon.pdf) - $(subst /,\,if exist $(DAT)/dungeon del $(DAT)/dungeon) $(subst /,\,if exist $(DAT)/oracles del $(DAT)/oracles) +ifndef LUA_QTEXT_FILE $(subst /,\,if exist $(DAT)/quest.dat del $(DAT)/quest.dat) +endif $(subst /,\,if exist $(DAT)/bogusmon del $(DAT)/bogusmon) $(subst /,\,if exist $(DAT)/engrave del $(DAT)/engrave) $(subst /,\,if exist $(DAT)/epitaph del $(DAT)/epitaph) $(subst /,\,if exist $(DAT)/dlb.lst del $(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/nhdat del $(DAT)/nhdat) - $(subst /,\,if exist $(DAT)/*.lev del $(DAT)/*.lev) $(subst /,\,if exist $(TILE_BMP) del $(TILE_BMP)) $(subst /,\,if exist $(WSHR)/monthin.txt del $(WSHR)/monthin.txt) $(subst /,\,if exist $(WSHR)/objthin.txt del $(WSHR)/objthin.txt) $(subst /,\,if exist $(WSHR)/oththin.txt del $(WSHR)/oththin.txt) + $(subst /,\,if exist $(O)hacklib.a del $(O)hacklib.a) #========================================== # Create directory for holding object files @@ -1160,14 +1024,14 @@ $(O)tty.o: $(HACK_H) $(INCL)/wintty.h $(SSHR)/pctty.c $(O)unix.o: $(HACK_H) $(SSHR)/pcunix.c $(CC) $(cflags) -o$@ $(SSHR)/pcunix.c -$(O)pcsys.o : $(HACK_H) $(SSHR)/pcsys.c - $(CC) $(cflags) -o$@ $(SSHR)/pcsys.c +#$(O)pcsys.o : $(HACK_H) $(SSHR)/pcsys.c +# $(CC) $(cflags) -o$@ $(SSHR)/pcsys.c $(O)posixreg.o : $(HACK_H) $(SSHR)/posixreg.c $(CC) $(cflags) -o$@ $(SSHR)/posixreg.c -$(O)cppregex.o : $(HACK_H) $(SSHR)/cppregex.cpp - gpp $(cflags) -std=c++11 -o$@ $(SSHR)/cppregex.cpp +#$(O)cppregex.o : $(HACK_H) $(SSHR)/cppregex.cpp +# gpp $(cflags) -std=c++11 -o$@ $(SSHR)/cppregex.cpp $(O)pmatchre.o : $(HACK_H) $(SSHR)/pmatchre.c $(CC) $(cflags) -o$@ $(SSHR)/pmatchre.c @@ -1182,9 +1046,6 @@ $(O)pckeys.o : $(HACK_H) $(MSYS)/pckeys.c $(O)pctiles.o : $(HACK_H) $(MSYS)/pctiles.c $(MSYS)/portio.h $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/pctiles.c -$(O)sound.o : $(HACK_H) $(MSYS)/sound.c $(MSYS)/portio.h -# $(CC) $(cflags) -o$@ $(MSYS)/sound.c - $(O)video.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(MSYS)/video.c # $(CC) $(cflags) -o$@ -I$(MSYS) $(MSYS)/video.c @@ -1197,262 +1058,447 @@ $(O)vidvesa.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/ $(O)vidtxt.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidtxt.c # $(CC) $(cflags) -o$@ -I$(MSYS) $(MSYS)/vidtxt.c +$(O)font.o : $(HACK_H) $(MSYS)/font.h $(MSYS)/font.c + $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/font.c + $(O)stubvid.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/video.c $(CC) $(cflags) -I$(MSYS) -DSTUBVIDEO -o$@ $(MSYS)/video.c +# Dependencies -# src dependencies +$(O)pmatchre.o: $(SSHR)/pmatchre.c $(HACK_H) +$(O)tileset.o: $(WSHR)/tileset.c $(HACK_H) +$(O)bmptiles.o: $(WSHR)/bmptiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h +$(O)giftiles.o: $(WSHR)/giftiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h +$(O)dlb.o: dlb.c $(CONFIG_H) $(INCL)/dlb.h + $(CC) $(cflags) -I../sys/msdos -o$@ dlb.c # # The rest are stolen from sys/unix/Makefile.src, # with the following changes: -# o -c (which is included in cflags) substituted with -o$@ , -# o an explicit build instruction for dlb.o because it requires +# * The CONFIG_H and HACK_H sections commented out. +# * dlb.o is commented out because there's a rule above that includes # a .h file in ../sys/msdos. -# o the PATCHLEV_H macro is substitued for $(INCL)/patchlevel.h -# to work around a long filename issue. -# o $(CFLAGS) changed to $(cflags) +# * Window.o for X11 is commented out. # Other than that, these dependencies are untouched. -# That means that there is some irrelevant stuff -# in here, but maintenance should be easier. +# That means that there is some irrelevant stuff in here, but maintenance should be +# easier. # -$(O)tos.o: ../sys/atari/tos.c $(HACK_H) $(INCL)/tcap.h - $(CC) $(cflags) -o$@ ../sys/atari/tos.c -$(O)pcmain.o: ../sys/share/pcmain.c $(HACK_H) $(INCL)/dlb.h \ - #$(INCL)/win32api.h - $(CC) $(cflags) -o$@ ../sys/share/pcmain.c -$(O)pctty.o: ../sys/share/pctty.c $(HACK_H) - $(CC) $(cflags) -o$@ ../sys/share/pctty.c -$(O)pcunix.o: ../sys/share/pcunix.c $(HACK_H) - $(CC) $(cflags) -o$@ ../sys/share/pcunix.c -$(O)random.o: ../sys/share/random.c $(HACK_H) - $(CC) $(cflags) -o$@ ../sys/share/random.c -$(O)ioctl.o: ../sys/share/ioctl.c $(HACK_H) $(INCL)/tcap.h - $(CC) $(cflags) -o$@ ../sys/share/ioctl.c -$(O)unixtty.o: ../sys/share/unixtty.c $(HACK_H) - $(CC) $(cflags) -o$@ ../sys/share/unixtty.c -$(O)unixmain.o: ../sys/unix/unixmain.c $(HACK_H) $(INCL)/dlb.h - $(CC) $(cflags) -o$@ ../sys/unix/unixmain.c -$(O)unixunix.o: ../sys/unix/unixunix.c $(HACK_H) - $(CC) $(cflags) -o$@ ../sys/unix/unixunix.c -$(O)unixres.o: ../sys/unix/unixres.c $(CONFIG_H) - $(CC) $(cflags) -o$@ ../sys/unix/unixres.c -$(O)bemain.o: ../sys/be/bemain.c $(HACK_H) $(INCL)/dlb.h - $(CC) $(cflags) -o$@ ../sys/be/bemain.c -$(O)getline.o: ../win/tty/getline.c $(HACK_H) $(INCL)/func_tab.h - $(CC) $(cflags) -o$@ ../win/tty/getline.c -$(O)termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h - $(CC) $(cflags) -o$@ ../win/tty/termcap.c -$(O)topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h - $(CC) $(cflags) -o$@ ../win/tty/topl.c -$(O)wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/date.h $(PATCHLEV_H) $(INCL)/tcap.h - $(CC) $(cflags) -o$@ ../win/tty/wintty.c -$(O)Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \ - $(CONFIG_H) - $(CC) $(cflags) -o$@ ../win/X11/Window.c -$(O)dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) - $(CC) $(cflags) -o$@ ../win/X11/dialogs.c -$(O)winX.o: ../win/X11/winX.c $(HACK_H) $(INCL)/winX.h $(INCL)/dlb.h \ - $(PATCHLEV_H) ../win/X11/nh72icon \ +TARGETPFX=$(O) +TARGET_CC=$(CC) +TARGET_CFLAGS=$(cflags) +# +# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT + +# config.h timestamp +#$(CONFIG_H): ../include/config.h ../include/config1.h ../include/patchlevel.h \ +# ../include/tradstdc.h ../include/integer.h \ +# ../include/global.h ../include/coord.h ../include/vmsconf.h \ +# ../include/cstd.h ../include/nhlua.h ../include/unixconf.h \ +# ../include/pcconf.h ../include/micro.h ../include/windconf.h \ +# ../include/warnings.h ../include/fnamesiz.h +# touch $(CONFIG_H) +# hack.h timestamp +#$(HACK_H): ../include/hack.h $(CONFIG_H) ../include/lint.h ../include/align.h \ +# ../include/dungeon.h ../include/wintype.h ../include/sym.h \ +# ../include/defsym.h ../include/mkroom.h ../include/artilist.h \ +# ../include/objclass.h ../include/objects.h \ +# ../include/youprop.h ../include/prop.h ../include/permonst.h \ +# ../include/monattk.h ../include/monflag.h \ +# ../include/monsters.h ../include/mondata.h \ +# ../include/context.h ../include/rm.h ../include/botl.h \ +# ../include/rect.h ../include/region.h ../include/trap.h \ +# ../include/display.h ../include/vision.h ../include/color.h \ +# ../include/decl.h ../include/quest.h ../include/spell.h \ +# ../include/obj.h ../include/engrave.h ../include/you.h \ +# ../include/attrib.h ../include/monst.h ../include/mextra.h \ +# ../include/skills.h ../include/timeout.h ../include/flag.h \ +# ../include/winprocs.h ../include/sys.h +# touch $(HACK_H) +# +$(TARGETPFX)pcmain.o: ../sys/share/pcmain.c $(HACK_H) ../include/dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pcmain.c +$(TARGETPFX)pcsys.o: ../sys/share/pcsys.c $(HACK_H) ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pcsys.c +$(TARGETPFX)pctty.o: ../sys/share/pctty.c $(HACK_H) ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pctty.c +$(TARGETPFX)pcunix.o: ../sys/share/pcunix.c $(HACK_H) ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pcunix.c +$(TARGETPFX)pmatchregex.o: ../sys/share/pmatchregex.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pmatchregex.c +$(TARGETPFX)posixregex.o: ../sys/share/posixregex.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/posixregex.c +$(TARGETPFX)random.o: ../sys/share/random.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/random.c +$(TARGETPFX)ioctl.o: ../sys/share/ioctl.c $(HACK_H) ../include/tcap.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/ioctl.c +$(TARGETPFX)unixtty.o: ../sys/share/unixtty.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/unixtty.c +$(TARGETPFX)unixmain.o: ../sys/unix/unixmain.c $(HACK_H) ../include/dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/unix/unixmain.c +$(TARGETPFX)unixunix.o: ../sys/unix/unixunix.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/unix/unixunix.c +$(TARGETPFX)unixres.o: ../sys/unix/unixres.c $(CONFIG_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/unix/unixres.c +$(TARGETPFX)getline.o: ../win/tty/getline.c $(HACK_H) ../include/wintty.h \ + ../include/func_tab.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/getline.c +$(TARGETPFX)termcap.o: ../win/tty/termcap.c $(HACK_H) ../include/wintty.h \ + ../include/tcap.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/termcap.c +$(TARGETPFX)topl.o: ../win/tty/topl.c $(HACK_H) ../include/tcap.h \ + ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/topl.c +$(TARGETPFX)wintty.o: ../win/tty/wintty.c $(HACK_H) ../include/dlb.h \ + ../include/tcap.h ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/wintty.c +$(TARGETPFX)cursmain.o: ../win/curses/cursmain.c $(HACK_H) ../include/wincurs.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursmain.c +$(TARGETPFX)curswins.o: ../win/curses/curswins.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/curswins.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/curswins.c +$(TARGETPFX)cursmisc.o: ../win/curses/cursmisc.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursmisc.h \ + ../include/func_tab.h ../include/dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursmisc.c +$(TARGETPFX)cursdial.o: ../win/curses/cursdial.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursdial.h \ + ../include/func_tab.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursdial.c +$(TARGETPFX)cursstat.o: ../win/curses/cursstat.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursstat.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursstat.c +$(TARGETPFX)cursinit.o: ../win/curses/cursinit.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursinit.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursinit.c +$(TARGETPFX)cursmesg.o: ../win/curses/cursmesg.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursmesg.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursmesg.c +$(TARGETPFX)cursinvt.o: ../win/curses/cursinvt.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursinvt.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursinvt.c +#$(TARGETPFX)Window.o: ../win/X11/Window.c ../include/xwindowp.h \ +# ../include/xwindow.h $(CONFIG_H) ../include/lint.h \ +# ../include/winX.h ../include/color.h ../include/wintype.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/Window.c +$(TARGETPFX)dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) ../include/lint.h \ + ../include/winX.h ../include/color.h ../include/wintype.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/dialogs.c +$(TARGETPFX)winX.o: ../win/X11/winX.c $(HACK_H) ../include/winX.h \ + ../include/dlb.h ../include/xwindow.h ../win/X11/nh72icon \ ../win/X11/nh56icon ../win/X11/nh32icon - $(CC) $(cflags) -o$@ ../win/X11/winX.c -$(O)winmap.o: ../win/X11/winmap.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/winX.h $(INCL)/tile2x11.h - $(CC) $(cflags) -o$@ ../win/X11/winmap.c -$(O)winmenu.o: ../win/X11/winmenu.c $(HACK_H) $(INCL)/winX.h - $(CC) $(cflags) -o$@ ../win/X11/winmenu.c -$(O)winmesg.o: ../win/X11/winmesg.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/winX.h - $(CC) $(cflags) -o$@ ../win/X11/winmesg.c -$(O)winmisc.o: ../win/X11/winmisc.c $(HACK_H) $(INCL)/func_tab.h \ - $(INCL)/winX.h - $(CC) $(cflags) -o$@ ../win/X11/winmisc.c -$(O)winstat.o: ../win/X11/winstat.c $(HACK_H) $(INCL)/winX.h - $(CC) $(cflags) -o$@ ../win/X11/winstat.c -$(O)wintext.o: ../win/X11/wintext.c $(HACK_H) $(INCL)/winX.h $(INCL)/xwindow.h - $(CC) $(cflags) -o$@ ../win/X11/wintext.c -$(O)winval.o: ../win/X11/winval.c $(HACK_H) $(INCL)/winX.h - $(CC) $(cflags) -o$@ ../win/X11/winval.c -$(O)tile.o: tile.c $(HACK_H) -$(O)gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ - ../win/gnome/gnmain.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnaskstr.c -$(O)gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ - ../win/gnome/gnaskstr.h ../win/gnome/gnyesno.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnbind.c -$(O)gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h $(INCL)/tile2x11.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnglyph.c -$(O)gnmain.o: ../win/gnome/gnmain.c ../win/gnome/gnmain.h ../win/gnome/gnsignal.h \ - ../win/gnome/gnbind.h ../win/gnome/gnopts.h $(HACK_H) \ - $(INCL)/date.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmain.c -$(O)gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h $(HACK_H) - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmap.c -$(O)gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ - ../win/gnome/gnbind.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmenu.c -$(O)gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmesg.c -$(O)gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnopts.c -$(O)gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ - ../win/gnome/gnmain.h $(HACK_H) - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnplayer.c -$(O)gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ - ../win/gnome/gnmain.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnsignal.c -$(O)gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ - ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ - ../win/gnome/gnomeprv.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnstatus.c -$(O)gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ - ../win/gnome/gn_rip.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gntext.c -$(O)gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnworn.c -$(O)gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h - $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnyesno.c -$(O)wingem.o: ../win/gem/wingem.c $(HACK_H) $(INCL)/func_tab.h $(INCL)/dlb.h \ - $(PATCHLEV_H) $(INCL)/wingem.h - $(CC) $(cflags) -o$@ ../win/gem/wingem.c -$(O)wingem1.o: ../win/gem/wingem1.c $(INCL)/gem_rsc.h $(INCL)/load_img.h \ - $(INCL)/gr_rect.h $(INCL)/wintype.h $(INCL)/wingem.h - $(CC) $(cflags) -o$@ ../win/gem/wingem1.c -$(O)load_img.o: ../win/gem/load_img.c $(INCL)/load_img.h - $(CC) $(cflags) -o$@ ../win/gem/load_img.c -$(O)gr_rect.o: ../win/gem/gr_rect.c $(INCL)/gr_rect.h - $(CC) $(cflags) -o$@ ../win/gem/gr_rect.c -$(O)tile.o: tile.c $(HACK_H) -$(O)qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) $(INCL)/func_tab.h \ - $(INCL)/dlb.h $(PATCHLEV_H) $(INCL)/tile2x11.h \ - $(INCL)/qt_win.h $(INCL)/qt_clust.h $(INCL)/qt_kde0.h \ - $(INCL)/qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_win.cpp -$(O)qt_clust.o: ../win/Qt/qt_clust.cpp $(INCL)/qt_clust.h - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_clust.cpp -$(O)qttableview.o: ../win/Qt/qttableview.cpp $(INCL)/qttableview.h - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qttableview.cpp -$(O)monstr.o: monstr.c $(CONFIG_H) -$(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h -$(O)allmain.o: allmain.c $(HACK_H) -$(O)alloc.o: alloc.c $(CONFIG_H) -$(O)apply.o: apply.c $(HACK_H) -$(O)artifact.o: artifact.c $(HACK_H) $(INCL)/artifact.h $(INCL)/artilist.h -$(O)attrib.o: attrib.c $(HACK_H) -$(O)ball.o: ball.c $(HACK_H) -$(O)bones.o: bones.c $(HACK_H) $(INCL)/lev.h -$(O)botl.o: botl.c $(HACK_H) -$(O)cmd.o: cmd.c $(HACK_H) $(INCL)/func_tab.h -$(O)dbridge.o: dbridge.c $(HACK_H) -$(O)decl.o: decl.c $(HACK_H) -$(O)detect.o: detect.c $(HACK_H) $(INCL)/artifact.h -$(O)dig.o: dig.c $(HACK_H) -$(O)display.o: display.c $(HACK_H) -$(O)dlb.o: dlb.c $(CONFIG_H) $(INCL)/dlb.h - $(CC) $(cflags) -I../sys/msdos -o$@ dlb.c -$(O)do.o: do.c $(HACK_H) $(INCL)/lev.h -$(O)do_name.o: do_name.c $(HACK_H) -$(O)do_wear.o: do_wear.c $(HACK_H) -$(O)dog.o: dog.c $(HACK_H) -$(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)/mfndpos.h -$(O)dokick.o: dokick.c $(HACK_H) -$(O)dothrow.o: dothrow.c $(HACK_H) -$(O)drawing.o: drawing.c $(HACK_H) $(INCL)/tcap.h -$(O)dungeon.o: dungeon.c $(HACK_H) $(INCL)/dgn_file.h $(INCL)/dlb.h -$(O)eat.o: eat.c $(HACK_H) -$(O)end.o: end.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h -$(O)engrave.o: engrave.c $(HACK_H) $(INCL)/lev.h -$(O)exper.o: exper.c $(HACK_H) -$(O)explode.o: explode.c $(HACK_H) -$(O)extralev.o: extralev.c $(HACK_H) -$(O)files.o: files.c $(HACK_H) $(INCL)/dlb.h -$(O)fountain.o: fountain.c $(HACK_H) -$(O)hack.o: hack.c $(HACK_H) -$(O)hacklib.o: hacklib.c $(HACK_H) -$(O)invent.o: invent.c $(HACK_H) -$(O)light.o: light.c $(HACK_H) $(INCL)/lev.h -$(O)lock.o: lock.c $(HACK_H) -$(O)mail.o: mail.c $(HACK_H) $(INCL)/mail.h -$(O)makemon.o: makemon.c $(HACK_H) -$(O)mapglyph.o: mapglyph.c $(HACK_H) -$(O)mcastu.o: mcastu.c $(HACK_H) -$(O)mhitm.o: mhitm.c $(HACK_H) $(INCL)/artifact.h -$(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)/artifact.h -$(O)minion.o: minion.c $(HACK_H) -$(O)mklev.o: mklev.c $(HACK_H) -$(O)mkmap.o: mkmap.c $(HACK_H) $(INCL)/sp_lev.h -$(O)mkmaze.o: mkmaze.c $(HACK_H) $(INCL)/sp_lev.h $(INCL)/lev.h -$(O)mkobj.o: mkobj.c $(HACK_H) -$(O)mkroom.o: mkroom.c $(HACK_H) -$(O)mon.o: mon.c $(HACK_H) $(INCL)/mfndpos.h -$(O)mondata.o: mondata.c $(HACK_H) -$(O)monmove.o: monmove.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/artifact.h -$(O)monst.o: monst.c $(CONFIG_H) $(INCL)/permonst.h $(INCL)/align.h \ - $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/monsym.h \ - $(INCL)/color.h -$(O)mplayer.o: mplayer.c $(HACK_H) -$(O)mthrowu.o: mthrowu.c $(HACK_H) -$(O)muse.o: muse.c $(HACK_H) -$(O)music.o: music.c $(HACK_H) #interp.c -$(O)o_init.o: o_init.c $(HACK_H) $(INCL)/lev.h -$(O)objects.o: objects.c $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ - $(INCL)/prop.h $(INCL)/skills.h $(INCL)/color.h -$(O)objnam.o: objnam.c $(HACK_H) -$(O)options.o: options.c $(CONFIG_H) $(INCL)/objclass.h $(INCL)/flag.h \ - $(HACK_H) $(INCL)/tcap.h -$(O)pager.o: pager.c $(HACK_H) $(INCL)/dlb.h -$(O)pickup.o: pickup.c $(HACK_H) -$(O)pline.o: pline.c $(HACK_H) -$(O)polyself.o: polyself.c $(HACK_H) -$(O)potion.o: potion.c $(HACK_H) -$(O)pray.o: pray.c $(HACK_H) -$(O)priest.o: priest.c $(HACK_H) $(INCL)/mfndpos.h -$(O)quest.o: quest.c $(HACK_H) $(INCL)/qtext.h -$(O)questpgr.o: questpgr.c $(HACK_H) $(INCL)/dlb.h $(INCL)/qtext.h -$(O)read.o: read.c $(HACK_H) -$(O)rect.o: rect.c $(HACK_H) -$(O)region.o: region.c $(HACK_H) $(INCL)/lev.h -$(O)restore.o: restore.c $(HACK_H) $(INCL)/lev.h $(INCL)/tcap.h -$(O)rip.o: rip.c $(HACK_H) -$(O)rnd.o: rnd.c $(HACK_H) -$(O)role.o: role.c $(HACK_H) -$(O)rumors.o: rumors.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h -$(O)save.o: save.c $(HACK_H) $(INCL)/lev.h -$(O)shk.o: shk.c $(HACK_H) -$(O)shknam.o: shknam.c $(HACK_H) -$(O)sit.o: sit.c $(HACK_H) $(INCL)/artifact.h -$(O)sounds.o: sounds.c $(HACK_H) -$(O)sp_lev.o: sp_lev.c $(HACK_H) $(INCL)/dlb.h $(INCL)/sp_lev.h -$(O)spell.o: spell.c $(HACK_H) -$(O)steal.o: steal.c $(HACK_H) -$(O)steed.o: steed.c $(HACK_H) -$(O)sys.o: sys.c $(HACK_H) -$(O)teleport.o: teleport.c $(HACK_H) -$(O)timeout.o: timeout.c $(HACK_H) $(INCL)/lev.h -$(O)topten.o: topten.c $(HACK_H) $(INCL)/dlb.h $(PATCHLEV_H) -$(O)track.o: track.c $(HACK_H) -$(O)trap.o: trap.c $(HACK_H) -$(O)u_init.o: u_init.c $(HACK_H) -$(O)uhitm.o: uhitm.c $(HACK_H) -$(O)vault.o: vault.c $(HACK_H) -$(O)version.o: version.c $(HACK_H) $(INCL)/date.h $(PATCHLEV_H) -$(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)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) -$(O)write.o: write.c $(HACK_H) -$(O)zap.o: zap.c $(HACK_H) -$(O)pmatchre.o: $(SSHR)/pmatchre.c $(HACK_H) -$(O)tileset.o: $(WSHR)/tileset.c $(HACK_H) -$(O)bmptiles.o: $(WSHR)/bmptiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h -$(O)giftiles.o: $(WSHR)/giftiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h - -# end of file - + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winX.c +$(TARGETPFX)winmap.o: ../win/X11/winmap.c ../include/xwindow.h $(HACK_H) \ + ../include/dlb.h ../include/winX.h ../include/tile2x11.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmap.c +$(TARGETPFX)winmenu.o: ../win/X11/winmenu.c $(HACK_H) ../include/winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmenu.c +$(TARGETPFX)winmesg.o: ../win/X11/winmesg.c ../include/xwindow.h $(HACK_H) \ + ../include/winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmesg.c +$(TARGETPFX)winmisc.o: ../win/X11/winmisc.c $(HACK_H) ../include/func_tab.h \ + ../include/winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmisc.c +$(TARGETPFX)winstat.o: ../win/X11/winstat.c $(HACK_H) ../include/winX.h \ + ../include/xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winstat.c +$(TARGETPFX)wintext.o: ../win/X11/wintext.c $(HACK_H) ../include/winX.h \ + ../include/xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/wintext.c +$(TARGETPFX)winval.o: ../win/X11/winval.c $(HACK_H) ../include/winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winval.c +$(TARGETPFX)tile.o: tile.c $(HACK_H) +$(TARGETPFX)winshim.o: ../win/shim/winshim.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/shim/winshim.c +$(TARGETPFX)cppregex.o: ../sys/share/cppregex.cpp $(CONFIG_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../sys/share/cppregex.cpp +$(TARGETPFX)qt_bind.o: ../win/Qt/qt_bind.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_bind.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_click.h ../win/Qt/qt_delay.h \ + ../win/Qt/qt_xcmd.h ../win/Qt/qt_key.h ../win/Qt/qt_map.h \ + ../win/Qt/qt_win.h ../win/Qt/qt_clust.h ../win/Qt/qt_menu.h \ + ../win/Qt/qt_rip.h ../win/Qt/qt_msg.h ../win/Qt/qt_plsel.h \ + ../win/Qt/qt_svsel.h ../win/Qt/qt_set.h ../win/Qt/qt_stat.h \ + ../win/Qt/qt_icon.h ../win/Qt/qt_streq.h ../win/Qt/qt_line.h \ + ../win/Qt/qt_yndlg.h ../win/Qt/qt_str.h ../include/dlb.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_bind.cpp +$(TARGETPFX)qt_click.o: ../win/Qt/qt_click.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_click.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_click.cpp +$(TARGETPFX)qt_clust.o: ../win/Qt/qt_clust.cpp ../win/Qt/qt_clust.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_clust.cpp +$(TARGETPFX)qt_delay.o: ../win/Qt/qt_delay.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_delay.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_delay.cpp +$(TARGETPFX)qt_glyph.o: ../win/Qt/qt_glyph.cpp $(HACK_H) \ + ../include/tile2x11.h ../win/Qt/qt_pre.h ../win/Qt/qt_post.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_bind.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_set.h ../win/Qt/qt_inv.h \ + ../win/Qt/qt_map.h ../win/Qt/qt_win.h ../win/Qt/qt_clust.h \ + ../win/Qt/qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_glyph.cpp +$(TARGETPFX)qt_icon.o: ../win/Qt/qt_icon.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_icon.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_icon.cpp +$(TARGETPFX)qt_inv.o: ../win/Qt/qt_inv.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_inv.h ../win/Qt/qt_glyph.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_set.h \ + ../win/Qt/qt_bind.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_inv.cpp +$(TARGETPFX)qt_key.o: ../win/Qt/qt_key.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_key.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_key.cpp +$(TARGETPFX)qt_line.o: ../win/Qt/qt_line.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_line.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_line.cpp +$(TARGETPFX)qt_main.o: ../win/Qt/qt_main.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h \ + qt_main.moc ../win/Qt/qt_bind.h ../win/Qt/qt_glyph.h \ + ../win/Qt/qt_inv.h ../win/Qt/qt_key.h ../win/Qt/qt_map.h \ + ../win/Qt/qt_win.h ../win/Qt/qt_clust.h ../win/Qt/qt_msg.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_stat.h ../win/Qt/qt_icon.h \ + ../win/Qt/qt_str.h qt_kde0.moc $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_main.cpp +$(TARGETPFX)qt_map.o: ../win/Qt/qt_map.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_map.h ../win/Qt/qt_win.h \ + ../win/Qt/qt_clust.h qt_map.moc ../win/Qt/qt_click.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_set.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_map.cpp +$(TARGETPFX)qt_menu.o: ../win/Qt/qt_menu.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_menu.h ../win/Qt/qt_win.h \ + ../win/Qt/qt_rip.h qt_menu.moc ../win/Qt/qt_key.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_set.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_streq.h \ + ../win/Qt/qt_line.h ../win/Qt/qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_menu.cpp +$(TARGETPFX)qt_msg.o: ../win/Qt/qt_msg.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_msg.h ../win/Qt/qt_win.h \ + qt_msg.moc ../win/Qt/qt_map.h ../win/Qt/qt_clust.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_bind.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_msg.cpp +$(TARGETPFX)qt_plsel.o: ../win/Qt/qt_plsel.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_plsel.h qt_plsel.moc \ + ../win/Qt/qt_bind.h ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_set.h ../win/Qt/qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_plsel.cpp +$(TARGETPFX)qt_rip.o: ../win/Qt/qt_rip.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_rip.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_rip.cpp +$(TARGETPFX)qt_set.o: ../win/Qt/qt_set.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_set.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h qt_set.moc \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_xcmd.h ../win/Qt/qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_set.cpp +$(TARGETPFX)qt_stat.o: ../win/Qt/qt_stat.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_stat.h ../win/Qt/qt_win.h \ + ../win/Qt/qt_icon.h qt_stat.moc ../win/Qt/qt_set.h \ + ../win/Qt/qt_bind.h ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_str.h ../win/Qt/qt_xpms.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_stat.cpp +$(TARGETPFX)qt_str.o: ../win/Qt/qt_str.cpp ../win/Qt/qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_str.cpp +$(TARGETPFX)qt_streq.o: ../win/Qt/qt_streq.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_streq.h ../win/Qt/qt_line.h \ + ../win/Qt/qt_str.h ../win/Qt/qt_set.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_streq.cpp +$(TARGETPFX)qt_svsel.o: ../win/Qt/qt_svsel.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_svsel.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_svsel.cpp +$(TARGETPFX)qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_win.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_click.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_inv.h ../win/Qt/qt_key.h \ + ../win/Qt/qt_icon.h ../win/Qt/qt_map.h ../win/Qt/qt_clust.h \ + ../win/Qt/qt_menu.h ../win/Qt/qt_rip.h ../win/Qt/qt_msg.h \ + ../win/Qt/qt_set.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_win.cpp +$(TARGETPFX)qt_xcmd.o: ../win/Qt/qt_xcmd.cpp $(HACK_H) ../include/func_tab.h \ + ../win/Qt/qt_pre.h ../win/Qt/qt_post.h ../win/Qt/qt_xcmd.h \ + qt_xcmd.moc ../win/Qt/qt_key.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h ../win/Qt/qt_set.h \ + ../win/Qt/qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_xcmd.cpp +$(TARGETPFX)qt_yndlg.o: ../win/Qt/qt_yndlg.cpp $(HACK_H) ../win/Qt/qt_pre.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_yndlg.h qt_yndlg.moc \ + ../win/Qt/qt_key.h ../win/Qt/qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_yndlg.cpp +qt_kde0.moc: ../win/Qt/qt_kde0.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_kde0.h +qt_main.moc: ../win/Qt/qt_main.h ../win/Qt/qt_kde0.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_main.h +qt_map.moc: ../win/Qt/qt_map.h ../win/Qt/qt_win.h ../win/Qt/qt_clust.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_map.h +qt_menu.moc: ../win/Qt/qt_menu.h ../win/Qt/qt_win.h ../win/Qt/qt_rip.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_menu.h +qt_msg.moc: ../win/Qt/qt_msg.h ../win/Qt/qt_win.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_msg.h +qt_plsel.moc: ../win/Qt/qt_plsel.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_plsel.h +qt_set.moc: ../win/Qt/qt_set.h ../win/Qt/qt_bind.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_kde0.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_set.h +qt_stat.moc: ../win/Qt/qt_stat.h ../win/Qt/qt_win.h ../win/Qt/qt_icon.h \ + $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_stat.h +qt_xcmd.moc: ../win/Qt/qt_xcmd.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_xcmd.h +qt_yndlg.moc: ../win/Qt/qt_yndlg.h $(QTn_H) + $(MOCPATH) -o $@ ../win/Qt/qt_yndlg.h +$(TARGETPFX)wc_chainin.o: ../win/chain/wc_chainin.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/chain/wc_chainin.c +$(TARGETPFX)wc_chainout.o: ../win/chain/wc_chainout.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/chain/wc_chainout.c +$(TARGETPFX)wc_trace.o: ../win/chain/wc_trace.c $(HACK_H) ../include/wintty.h \ + ../include/func_tab.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/chain/wc_trace.c +$(TARGETPFX)allmain.o: allmain.c $(HACK_H) +$(TARGETPFX)alloc.o: alloc.c $(CONFIG_H) +$(TARGETPFX)apply.o: apply.c $(HACK_H) +$(TARGETPFX)artifact.o: artifact.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)attrib.o: attrib.c $(HACK_H) +$(TARGETPFX)ball.o: ball.c $(HACK_H) +$(TARGETPFX)bones.o: bones.c $(HACK_H) +$(TARGETPFX)botl.o: botl.c $(HACK_H) +$(TARGETPFX)cmd.o: cmd.c $(HACK_H) ../include/func_tab.h +$(TARGETPFX)dbridge.o: dbridge.c $(HACK_H) +$(TARGETPFX)decl.o: decl.c $(HACK_H) +$(TARGETPFX)detect.o: detect.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)dig.o: dig.c $(HACK_H) +$(TARGETPFX)display.o: display.c $(HACK_H) +#$(TARGETPFX)dlb.o: dlb.c $(CONFIG_H) ../include/dlb.h +$(TARGETPFX)do.o: do.c $(HACK_H) +$(TARGETPFX)do_name.o: do_name.c $(HACK_H) +$(TARGETPFX)do_wear.o: do_wear.c $(HACK_H) +$(TARGETPFX)dog.o: dog.c $(HACK_H) +$(TARGETPFX)dogmove.o: dogmove.c $(HACK_H) ../include/mfndpos.h +$(TARGETPFX)dokick.o: dokick.c $(HACK_H) +$(TARGETPFX)dothrow.o: dothrow.c $(HACK_H) +$(TARGETPFX)drawing.o: drawing.c $(CONFIG_H) ../include/color.h \ + ../include/rm.h ../include/objclass.h ../include/defsym.h \ + ../include/objects.h ../include/wintype.h ../include/sym.h +$(TARGETPFX)dungeon.o: dungeon.c $(HACK_H) ../include/dgn_file.h \ + ../include/dlb.h +$(TARGETPFX)earlyarg.o: earlyarg.c $(HACK_H) +$(TARGETPFX)eat.o: eat.c $(HACK_H) +$(TARGETPFX)end.o: end.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)engrave.o: engrave.c $(HACK_H) +$(TARGETPFX)exper.o: exper.c $(HACK_H) +$(TARGETPFX)explode.o: explode.c $(HACK_H) +$(TARGETPFX)extralev.o: extralev.c $(HACK_H) +$(TARGETPFX)files.o: files.c $(HACK_H) ../include/dlb.h ../include/wintty.h \ + #zlib.h +$(TARGETPFX)fountain.o: fountain.c $(HACK_H) +$(TARGETPFX)hack.o: hack.c $(HACK_H) +$(TARGETPFX)hacklib.o: hacklib.c $(HACK_H) +$(TARGETPFX)iactions.o: iactions.c $(HACK_H) +$(TARGETPFX)insight.o: insight.c $(HACK_H) +$(TARGETPFX)invent.o: invent.c $(HACK_H) +$(TARGETPFX)isaac64.o: isaac64.c $(CONFIG_H) ../include/isaac64.h +$(TARGETPFX)light.o: light.c $(HACK_H) +$(TARGETPFX)lock.o: lock.c $(HACK_H) +$(TARGETPFX)mail.o: mail.c $(HACK_H) ../include/mail.h +$(TARGETPFX)makemon.o: makemon.c $(HACK_H) +$(TARGETPFX)mcastu.o: mcastu.c $(HACK_H) ../include/mcastu.h +$(TARGETPFX)mdlib.o: mdlib.c $(CONFIG_H) ../include/permonst.h \ + ../include/align.h ../include/monattk.h ../include/monflag.h \ + ../include/monsters.h ../include/objclass.h \ + ../include/defsym.h ../include/objects.h ../include/wintype.h \ + ../include/sym.h ../include/artilist.h ../include/dungeon.h \ + ../include/obj.h ../include/monst.h ../include/mextra.h \ + ../include/you.h ../include/attrib.h ../include/prop.h \ + ../include/skills.h ../include/context.h ../include/flag.h \ + ../include/dlb.h +$(TARGETPFX)mhitm.o: mhitm.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)mhitu.o: mhitu.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)minion.o: minion.c $(HACK_H) +$(TARGETPFX)mklev.o: mklev.c $(HACK_H) +$(TARGETPFX)mkmap.o: mkmap.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)mkmaze.o: mkmaze.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)mkobj.o: mkobj.c $(HACK_H) +$(TARGETPFX)mkroom.o: mkroom.c $(HACK_H) +$(TARGETPFX)mon.o: mon.c $(HACK_H) ../include/mfndpos.h +$(TARGETPFX)mondata.o: mondata.c $(HACK_H) +$(TARGETPFX)monmove.o: monmove.c $(HACK_H) ../include/mfndpos.h \ + ../include/artifact.h +$(TARGETPFX)monst.o: monst.c $(CONFIG_H) ../include/permonst.h \ + ../include/align.h ../include/monattk.h ../include/monflag.h \ + ../include/monsters.h ../include/wintype.h ../include/sym.h \ + ../include/defsym.h ../include/color.h +$(TARGETPFX)mplayer.o: mplayer.c $(HACK_H) +$(TARGETPFX)mthrowu.o: mthrowu.c $(HACK_H) +$(TARGETPFX)muse.o: muse.c $(HACK_H) +$(TARGETPFX)music.o: music.c $(HACK_H) +$(TARGETPFX)nhlua.o: nhlua.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)nhlsel.o: nhlsel.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)nhlobj.o: nhlobj.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)o_init.o: o_init.c $(HACK_H) +$(TARGETPFX)objects.o: objects.c $(CONFIG_H) ../include/obj.h \ + ../include/prop.h ../include/skills.h ../include/color.h \ + ../include/objclass.h ../include/defsym.h ../include/objects.h +$(TARGETPFX)objnam.o: objnam.c $(HACK_H) +$(TARGETPFX)options.o: options.c $(CONFIG_H) ../include/objclass.h \ + ../include/defsym.h ../include/objects.h ../include/flag.h \ + $(HACK_H) ../include/tcap.h ../include/optlist.h +$(TARGETPFX)pager.o: pager.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)pickup.o: pickup.c $(HACK_H) +$(TARGETPFX)pline.o: pline.c $(HACK_H) +$(TARGETPFX)polyself.o: polyself.c $(HACK_H) +$(TARGETPFX)potion.o: potion.c $(HACK_H) +$(TARGETPFX)pray.o: pray.c $(HACK_H) +$(TARGETPFX)priest.o: priest.c $(HACK_H) ../include/mfndpos.h +$(TARGETPFX)quest.o: quest.c $(HACK_H) +$(TARGETPFX)questpgr.o: questpgr.c $(HACK_H) ../include/dlb.h \ + ../include/wintty.h +$(TARGETPFX)read.o: read.c $(HACK_H) +$(TARGETPFX)rect.o: rect.c $(HACK_H) +$(TARGETPFX)region.o: region.c $(HACK_H) +$(TARGETPFX)restore.o: restore.c $(HACK_H) ../include/tcap.h +$(TARGETPFX)rip.o: rip.c $(HACK_H) +$(TARGETPFX)rnd.o: rnd.c $(HACK_H) ../include/isaac64.h +$(TARGETPFX)role.o: role.c $(HACK_H) +$(TARGETPFX)rumors.o: rumors.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)save.o: save.c $(HACK_H) +$(TARGETPFX)sfstruct.o: sfstruct.c $(HACK_H) +$(TARGETPFX)shk.o: shk.c $(HACK_H) +$(TARGETPFX)shknam.o: shknam.c $(HACK_H) +$(TARGETPFX)sit.o: sit.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)sounds.o: sounds.c $(HACK_H) +$(TARGETPFX)sp_lev.o: sp_lev.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)spell.o: spell.c $(HACK_H) +$(TARGETPFX)steal.o: steal.c $(HACK_H) +$(TARGETPFX)steed.o: steed.c $(HACK_H) +$(TARGETPFX)symbols.o: symbols.c $(HACK_H) ../include/tcap.h +$(TARGETPFX)sys.o: sys.c $(HACK_H) +$(TARGETPFX)teleport.o: teleport.c $(HACK_H) +$(TARGETPFX)timeout.o: timeout.c $(HACK_H) +$(TARGETPFX)topten.o: topten.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)track.o: track.c $(HACK_H) +$(TARGETPFX)trap.o: trap.c $(HACK_H) +$(TARGETPFX)u_init.o: u_init.c $(HACK_H) +$(TARGETPFX)utf8map.o: utf8map.c $(HACK_H) +$(TARGETPFX)uhitm.o: uhitm.c $(HACK_H) +$(TARGETPFX)vault.o: vault.c $(HACK_H) +$(TARGETPFX)version.o: version.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)vision.o: vision.c $(HACK_H) +$(TARGETPFX)weapon.o: weapon.c $(HACK_H) +$(TARGETPFX)were.o: were.c $(HACK_H) +$(TARGETPFX)wield.o: wield.c $(HACK_H) +$(TARGETPFX)windows.o: windows.c $(HACK_H) ../include/wintty.h +$(TARGETPFX)wizard.o: wizard.c $(HACK_H) +$(TARGETPFX)worm.o: worm.c $(HACK_H) +$(TARGETPFX)worn.o: worn.c $(HACK_H) +$(TARGETPFX)write.o: write.c $(HACK_H) +$(TARGETPFX)zap.o: zap.c $(HACK_H) +# DEPENDENCIES MUST END AT END OF FILE +# IF YOU PUT STUFF HERE IT WILL GO AWAY diff --git a/sys/msdos/Makefile.MSC b/sys/msdos/Makefile.MSC deleted file mode 100644 index b7d827a95..000000000 --- a/sys/msdos/Makefile.MSC +++ /dev/null @@ -1,1227 +0,0 @@ -# NetHack 3.6 Makefile.MSC $NHDT-Date: 1432512792 2015/05/25 00:13:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.21 $ -# Copyright (c) NetHack PC Development Team 1997 - 2012. -# PC NetHack 3.4x Makefile for MSC V1.52c (16 bit compiler) -# -# For questions or comments: nethack-bugs@nethack.org -# -# In addition to your C compiler, -# -# if you want to change you will need a -# files with suffix workalike for -# .y yacc -# .l lex -# -# - -# Game Installation Variables -# NOTE: Make sure GAMEDIR exists before make is started. - -GAME = nethack -GAMEDIR =..\binary - -# -# Directories -# - -DAT = ..\dat -DOC = ..\doc -INCL = ..\include -MSYS = ..\sys\msdos -SRC = ..\src -SSHR = ..\sys\share -UTIL = ..\util -WIN = ..\win\tty -WSHR = ..\win\share - -# -# Executables. - -CC = cl -LINK = link -MAKEBIN = nmake - -# if you have a uudecode program, add its name here -# otherwise leave blank -UUDECODE = - -# -# Yacc/Lex ... if you got 'em. -# -# If you have yacc/lex or a work-alike set YACC_LEX to Y -# -YACC_LEX = N - -# If YACC_LEX is Y above, set the following to values appropriate for -# your tools. -# -YACC = bison -y -LEX = flex -YTABC = y_tab.c -YTABH = y_tab.h -LEXYYC = lexyy.c - - -# -# Uncomment this line if you want to include support for ALT-numeric -# sequences, such as ALT-2 for toggling #twoweapon mode. -# Note that this code did not get a thorough testing prior to 3.4.x -#NEWALT=/DNEW_ALT - -# -# Uncomment this line if your shell doesn't support FOR bat syntax (DOSBOX). -NO_FOR=Y - -############################################################################# -# -# nothing below this line should have to be changed -# - -LNKOPT = SCHEMA35.DEF - -# -# Controls whether MOVE tracing is enabled in the executable -# This should be left commented unless you are tinkering with the -# overlay structure of NetHack. The executable runs _very_ -# slowly when the movetr.lib is linked in. -# - -#MOVETR= movetr.lib - -# do not change this -! IF ("$(MOVETR)"!="") -MVTRCL = /DMOVE_PROF -! ELSE -MVTRCL = -! ENDIF - -# -# Uncomment the line below if you want to store all the level files, -# help files, etc. in a single library file. - -USE_DLB = Y - -! IF ("$(USE_DLB)"=="Y") -DLBFLG = -DDLB -! ELSE -DLBFLG = -! ENDIF - -LIBRARIES = $(LIBS) $(TERMLIB) - -GAMEFILE = $(GAMEDIR)\$(GAME).exe - -# -# Flags. -# -# Debugging -#CFLAGS = /Zi /DFUNCTION_LEVEL_LINKING /DUSE_TILES /DDLB -#LFLAGS = /CODEVIEW /NOI/MAP /CPARM:1 /INFO - -# Normal -LFLAGS = /NOI/MAP /CPARM:1 /INFO -CFLAGS = /DFUNCTION_LEVEL_LINKING /DUSE_TILES /DDLB -SPECOPTS = -# -# Leaving MACHINE_CODE undefined will allow it to run -# on any Intel 8088 machines and above. -# Set to 1 for 80186 and above only -# Set to 2 for 80286 and above only -# Set to 3 for 80386 and above only -# -MACHINE_CODE = - -# -# Utility Objects. -# -# -# Shorten up the location for some files -# - -O = $(OBJ)\ # comment so \ isn't last char - -U = $(UTIL)\ # comment so \ isn't last char - -SPLEVDES = $(DAT)\Arch.des $(DAT)\Barb.des $(DAT)\bigroom.des \ - $(DAT)\castle.des $(DAT)\Caveman.des $(DAT)\endgame.des \ - $(DAT)\gehennom.des $(DAT)\Healer.des $(DAT)\Knight.des \ - $(DAT)\knox.des $(DAT)\Monk.des $(DAT)\medusa.des \ - $(DAT)\mines.des $(DAT)\oracle.des $(DAT)\Priest.des \ - $(DAT)\Ranger.des $(DAT)\Rogue.des $(DAT)\Samurai.des \ - $(DAT)\Tourist.des $(DAT)\tower.des $(DAT)\Valkyrie.des \ - $(DAT)\Wizard.des $(DAT)\yendor.des - -VGAOBJ = vidvga.o - -MAKESRC = $(U)makedefs.c - -SPLEVSRC = $(U)lev_yacc.c $(U)lev_$(LEX).c $(U)lev_main.c \ - $(U)panic.c - -DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_$(LEX).c $(U)dgn_main.c - -MAKEOBJS = makedefs.o monst.o objects.o - -SPLEVOBJS = lev_yacc.o lev_$(LEX).o lev_main.o alloc.o \ - monst.o objects.o panic.o \ - drawing.o decl.o stubvid.o - -DGNCOMPOBJS = dgn_yacc.o dgn_$(LEX).o dgn_main.o alloc.o \ - panic.o - -RECOVOBJS = recover.o - - -# Tile related object files. - -TILOBJ = tile.o pctiles.o $(VGAOBJ) - -TEXTIO = tiletext.o tiletxt.o drawing.o decl.o monst.o objects.o stubvid.o - -TEXTIO2 = tiletex2.o tiletxt2.o drawing.o decl.o monst.o objects.o stubvid.o - - -PLANAR_TIB = NetHack1.tib - -OVERVIEW_TIB = NetHacko.tib - -TILEUTIL = $(TILOBJ) tile2bin.exe til2bin2.exe $(PLANAR_TIB) $(OVERVIEW_TIB) - -TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt - -TILEFILES2 = $(WSHR)\monthin.txt $(WSHR)\objthin.txt $(WSHR)\oththin.txt - -GIFREADERS = gifread.o alloc.o panic.o - -GIFREAD2 = gifread2.o alloc.o panic.o - -PPMWRITERS = ppmwrite.o alloc.o panic.o - -PPMWRIT2 = ppmwrit2.o alloc.o panic.o - -DLBOBJS = dlb_main.o dlb.o alloc.o panic.o - -# Object files for the game itself. - -VOBJ01 = allmain.o alloc.o apply.o artifact.o attrib.o -VOBJ02 = ball.o bones.o botl.o cmd.o dbridge.o -VOBJ03 = decl.o detect.o display.o do.o do_name.o -VOBJ04 = do_wear.o dog.o dogmove.o dokick.o dothrow.o -VOBJ05 = drawing.o dungeon.o eat.o end.o engrave.o -VOBJ06 = exper.o explode.o extralev.o files.o fountain.o -VOBJ07 = getline.o hack.o hacklib.o invent.o lock.o -VOBJ08 = mail.o main.o makemon.o mapglyph.o mcastu.o mhitm.o -VOBJ09 = mhitu.o minion.o mkmap.o mklev.o mkmaze.o -VOBJ10 = mkobj.o mkroom.o mon.o mondata.o monmove.o -VOBJ11 = monst.o monstr.o mplayer.o mthrowu.o muse.o -VOBJ12 = music.o o_init.o objects.o objnam.o options.o -VOBJ13 = pickup.o pline.o polyself.o potion.o quest.o -VOBJ14 = questpgr.o pager.o pray.o priest.o read.o -VOBJ15 = rect.o restore.o rip.o rnd.o role.o -VOBJ16 = rumors.o save.o shk.o shknam.o sit.o -VOBJ17 = sounds.o sp_lev.o spell.o steal.o steed.o -VOBJ18 = termcap.o timeout.o topl.o topten.o track.o -VOBJ19 = trap.o u_init.o uhitm.o vault.o vision.o -VOBJ20 = vis_tab.o weapon.o were.o wield.o windows.o -VOBJ21 = wintty.o wizard.o worm.o worn.o write.o -VOBJ22 = zap.o light.o dlb.o dig.o teleport.o -VOBJ23 = random.o region.o sys.o - -SOBJ = msdos.o sound.o pcsys.o tty.o unix.o video.o \ - vidtxt.o pckeys.o - -VVOBJ = version.o - -VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ - $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ - $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ - $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ - $(VOBJ21) $(VOBJ22) $(VOBJ23) - -ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(VVOBJ) - -# -# Header Objects. -# - -DGN_FILE_H = $(INCL)\align.h $(INCL)\dgn_file.h -DUNGEON_H = $(INCL)\align.h $(INCL)\dungeon.h -MONDATA_H = $(INCL)\align.h $(INCL)\mondata.h -MONST_H = $(INCL)\mextra.h $(INCL)\align.h $(INCL)\monst.h -PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\align.h \ - $(INCL)\permonst.h -RM_H = $(INCL)\align.h $(INCL)\rm.h -SP_LEV_H = $(INCL)\align.h $(INCL)\sp_lev.h -YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)\prop.h \ - $(INCL)\pm.h $(INCL)\youprop.h -YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)\align.h \ - $(INCL)\attrib.h $(INCL)\you.h -DISPLAY_H = $(MONDATA_H) $(INCL)\vision.h $(INCL)\display.h -PCCONF_H = $(INCL)\micro.h $(INCL)\system.h $(INCL)\pcconf.h \ - $(MSYS)\pcvideo.h -CONFIG_H = $(GLOBAL_H) $(INCL)\tradstdc.h $(INCL)\config1.h \ - $(INCL)\config.h -DECL_H = $(YOU_H) $(INCL)\spell.h $(INCL)\color.h \ - $(INCL)\obj.h $(INCL)\onames.h $(INCL)\pm.h \ - $(INCL)\decl.h -GLOBAL_H = $(PCCONF_H) $(INCL)\coord.h $(INCL)\global.h -HACK_H = $(CONFIG_H) $(INCL)\context.h $(DUNGEON_H) $(DECL_H) \ - $(DISPLAY_H) $(INCL)\monsym.h $(INCL)\mkroom.h \ - $(INCL)\objclass.h $(INCL)\trap.h $(INCL)\flag.h \ - $(RM_H) $(INCL)\vision.h $(INCL)\wintype.h \ - $(INCL)\engrave.h $(INCL)\rect.h $(INCL)\sys.h \ - $(INCL)\trampoli.h $(INCL)\hack.h -DLB_H = $(INCL)\dlb.h -TILE_H = $(WSHR)\tile.h $(MSYS)\pctiles.h - - -# Make Roolz dude. -# Due to the inadequacy of some makes these must accord with a -# topological sort of the generated-from relation... output on -# the left, input on the right. Trust me. -# - -.SUFFIXES: .exe .o .til .uu .c .y .l - -# -# Rules for files in src -# - - -.c{$(OBJ)}.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -.c.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(SRC)}.c{$(OBJ)}.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(SRC)}.c.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -# -# Rules for files in sys\share -# - -{$(SYS)}.c{$(OBJ)}.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(SYS)}.c.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -# -# Rules for files in sys\msdos -# - -{$(MSYS)}.c{$(OBJ)}.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(MSYS)}.c.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(MSYS)}.h{$(INCL)}.h: - @copy $< $@ - -# -# Rules for files in util -# - -{$(UTIL)}.c{$(OBJ)}.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(UTIL)}.c.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -# -# Rules for files in win\share -# - -{$(WSHR)}.c.o: - @@$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(WSHR)}.c{$(OBJ)}.o: - @@$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(WSHR)}.h{$(INCL)}.h: - @copy $< $@ - -{$(WSHR)}.txt{$(DAT)}.txt: - @copy $< $@ - -# -# Rules for files in win\tty -# - -{$(WTTY)}.c{$(OBJ)}.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - -{$(WTTY)}.c.o: - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $< - - -! IF ("$(USE_DLB)"=="Y") -DLB = nhdat -! ELSE -DLB = -! ENDIF - -######################################################## -# -# TARGETS - - -# -# The default make target (so just typing 'nmake' is useful). -# -default : envchk $(GAMEFILE) - -# The default target. - -$(GAME): $(O)utility.tag $(GAMEFILE) - @echo $(GAME) is up to date. - -# -# Everything -# - -all: install - -install: envchk $(GAME) $(O)install.tag - @echo Done. - -$(O)install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ - $(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB) -! IF ("$(USE_DLB)"=="Y") - copy $(SRC)\nhdat $(GAMEDIR) - copy $(DAT)\license $(GAMEDIR) -! ELSE - copy $(DAT)\*. $(GAMEDIR) - copy $(DAT)\*.dat $(GAMEDIR) - copy $(DAT)\*.lev $(GAMEDIR) - if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile -! ENDIF - if exist $(DAT)\symbols copy $(DAT)\symbols $(GAMEDIR) - copy $(SSHR)\termcap $(GAMEDIR) - copy *.tib $(GAMEDIR) - copy $(SSHR)\NetHack.cnf $(GAMEDIR)\defaults.nh - copy $(MSYS)\NHAccess.nh $(GAMEDIR) - copy $(U)recover.exe $(GAMEDIR) - if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) - if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) - if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR) - echo install done > $@ - -$(O)sp_lev.tag: $(O)utility.tag $(SPLEVDES) - cd $(DAT) - $(U)lev_comp bigroom.des - $(U)lev_comp castle.des - $(U)lev_comp endgame.des - $(U)lev_comp gehennom.des - $(U)lev_comp knox.des - $(U)lev_comp mines.des - $(U)lev_comp medusa.des - $(U)lev_comp oracle.des - $(U)lev_comp sokoban.des - $(U)lev_comp tower.des - $(U)lev_comp yendor.des - $(U)lev_comp arch.des - $(U)lev_comp barb.des - $(U)lev_comp caveman.des - $(U)lev_comp healer.des - $(U)lev_comp knight.des - $(U)lev_comp monk.des - $(U)lev_comp priest.des - $(U)lev_comp ranger.des - $(U)lev_comp rogue.des - $(U)lev_comp samurai.des - $(U)lev_comp tourist.des - $(U)lev_comp valkyrie.des - $(U)lev_comp wizard.des - cd $(SRC) -# -@if exist $(O)sp_lev.tag del $(O)sp_lev.tag - @echo sp_levs done >$(O)sp_lev.tag - -$(O)utility.tag: $(INCL)\date.h $(INCL)\trap.h \ - $(INCL)\onames.h $(INCL)\pm.h monstr.c vis_tab.c \ - $(U)lev_comp.exe $(U)dgn_comp.exe $(U)recover.exe $(TILEUTIL) - -@if exist $(O)utility.tag del $(O)utility.tag - @echo utilities made > $@ - -tileutil: gif2txt.exe txt2ppm.exe - @echo Optional tile development utilities are up to date. - -.PHONEY: envchk - -envchk: -! IF ("$(MACHINE_CODE)"!="") - @SET MC=/G$(MACHINE_CODE) -! ELSE - @SET MC= -! ENDIF -! IF ("$(CL)"=="") - @echo CL Environment variable is defined as follows: - SET CL=/AL $(MC) /Oo /Gy /Gs /Gt10 /Gf /Zp1 /W2 /I$(INCL) /I$(MSYS) /I$(WSHR) /nologo /c -! ELSE - @echo Warning CL Environment variable is defined: - @echo CL=$(CL) - @echo Overriding that definition as follows: - SET CL=/AL $(MC) /Oo /Gy /Gs /Gt10 /Gf /Zp1 /W2 /I$(INCL) /I$(MSYS) /I$(WSHR) /nologo /c -! ENDIF - -# The main target. - -$(GAMEFILE) : $(LNKOPT) $(ALLOBJ) - @echo Linking.... - $(LINK) $(LFLAGS) /SE:1000 /DYNAMIC:2650 /NOE /ST:6000 @<<$(GAME).lnk - $(ALLOBJ:^ =+^ - ) - $(GAMEFILE) - $(GAME) - $(TERMLIB) $(MOVETR) $(CLIB) $(BCOVL) $(BCMDL) - $(LNKOPT); -<< - @if exist $(O)install.tag del $(O)install.tag - @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak - -# -# Housekeeping. -# - -clean: - del *.o - del *.map - del $(U)dlb_main.exe - -spotless: clean - if exist $(O)utility.tag del $(O)utility.tag - if exist $(O)install.tag del $(O)install.tag - if exist $(GAME).lnk del $(GAME).lnk - if exist $(U)makedefs.exe del $(U)makedefs.exe - if exist $(U)lev_comp.exe del $(U)lev_comp.exe - if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe - if exist $(SRC)\lev_lex.c del $(SRC)\lev_lex.c - if exist $(SRC)\lev_yacc.c del $(SRC)\lev_yacc.c - if exist $(SRC)\dgn_lex.c del $(SRC)\dgn_lex.c - if exist $(SRC)\dgn_yacc.c del $(SRC)\dgn_yacc.c - if exist $(U)recover.exe del $(U)recover.exe - if exist $(INCL)\onames.h del $(INCL)\onames.h - if exist $(INCL)\pm.h del $(INCL)\pm.h - if exist $(INCL)\vis_tab.h del $(INCL)\vis_tab.h - if exist $(INCL)\pcvideo.h del $(INCL)\pcvideo.h - if exist $(MSYS)\pctiles.h del $(MSYS)\pctiles.h - if exist $(INCL)\portio.h del $(MSYS)\portio.h - if exist $(WSHR)\tile.h del $(WSHR)\tile.h - if exist monstr.c del monstr.c - if exist vis_tab.c del vis_tab.c - if exist $(SRC)\panic.c del $(SRC)\panic.c - if exist $(SRC)\makedefs.c del $(SRC)\makedefs.c - if exist $(SRC)\recover.c del $(SRC)\recover.c - if exist $(SRC)\lev_main.c del $(SRC)\lev_main.c - if exist $(SRC)\dlb_main.c del $(SRC)\dlb_main.c - if exist $(SRC)\dgn_main.c del $(SRC)\dgn_main.c - if exist $(SRC)\wintty.c del $(SRC)\wintty.c - if exist $(SRC)\topl.c del $(SRC)\topl.c - if exist $(SRC)\getline.c del $(SRC)\getline.c - if exist $(SRC)\termcap.c del $(SRC)\termcap.c - if exist $(SRC)\tile2bin.c del $(SRC)\tile2bin.c - if exist $(SRC)\msdos.c del $(SRC)\msdos.c - if exist $(SRC)\pckeys.c del $(SRC)\pckeys.c - if exist $(SRC)\video.c del $(SRC)\video.c - if exist $(SRC)\sound.c del $(SRC)\sound.c - if exist $(SRC)\tilemap.c del $(SRC)\tilemap.c - if exist $(SRC)\gifread.c del $(SRC)\gifread.c - if exist $(SRC)\ppmwrite.c del $(SRC)\ppmwrite.c - if exist $(SRC)\pcmain.c del $(SRC)\pcmain.c - if exist $(SRC)\pcunix.c del $(SRC)\pcunix.c - if exist $(SRC)\pcsys.c del $(SRC)\pcsys.c - if exist $(SRC)\pctty.c del $(SRC)\pctty.c - if exist $(SRC)\tile.c del $(SRC)\tile.c - if exist $(INCL)\date.h del $(INCL)\date.h - if exist $(INCL)\onames.h del $(INCL)\onames.h - if exist $(INCL)\pm.h del $(INCL)\pm.h - if exist $(INCL)\vis_tab.h del $(INCL)\vis_tab.h - if exist vis_tab.c del vis_tab.c - if exist *.lnk del *.lnk - if exist *.def del *.def - if exist *.map del *.map - if exist a.out del a.out - if exist tilemap.exe del tilemap.exe - if exist tile2bin.exe del tile2bin.exe - if exist $(DAT)\data del $(DAT)\data - if exist $(DAT)\*.lev del $(DAT)\*.lev - if exist $(DAT)\data del $(DAT)\data - if exist $(DAT)\dungeon del $(DAT)\dungeon - if exist $(DAT)\options del $(DAT)\options - if exist $(DAT)\oracles del $(DAT)\oracles - if exist $(DAT)\rumors del $(DAT)\rumors - if exist $(DAT)\quest.dat del $(DAT)\quest.dat - if exist $(SRC)\nhdat del $(SRC)\nhdat - if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst - if exist $(DAT)\msdoshlp.txt del $(DAT)\msdoshlp.txt - if exist $(DAT)\dlb_main.exe del $(DAT)\dlb_main.exe - if exist $(DAT)\lev_comp.exe del $(DAT)\lev_comp.exe - if exist $(DAT)\dgn_comp.exe del $(DAT)\dgn_comp.exe - if exist $(O)sp_lev.tag del $(O)sp_lev.tag - if exist $(PLANAR_TIB) del $(PLANAR_TIB) - if exist $(OVERVIEW_TIB) del $(OVERVIEW_TIB) - - -# -# Secondary Targets. -# -# -# Makedefs Stuff -# - -$(U)makedefs.exe: $(MAKEOBJS) - @echo Linking.... - @$(LINK) $(LFLAGS) @<<$(@B).lnk - $(MAKEOBJS:^ =+^ - ) - $@ - $(@B) - ; -<< - -makedefs.o: $(CONFIG_H) $(PERMONST_H) $(INCL)\objclass.h \ - $(INCL)\monsym.h $(INCL)\qtext.h $(UTIL)\makedefs.c - -# The following include files depend on makedefs to be created. -# -# date.h should be remade every time any of the source or include -# files is modified. - - -$(INCL)\date.h : $(U)makedefs.exe - -$(U)makedefs -v - -$(INCL)\onames.h: $(U)makedefs.exe - -$(U)makedefs -o - -$(INCL)\pm.h: $(U)makedefs.exe - -$(U)makedefs -p - -monstr.c: $(U)makedefs.exe - -$(U)makedefs -m - -$(INCL)\vis_tab.h: $(U)makedefs.exe - -$(U)makedefs -z - -vis_tab.c: $(U)makedefs.exe - -$(U)makedefs -z - -# -# Level Compiler Stuff -# - -$(U)lev_comp.exe: $(SPLEVOBJS) - @echo Linking $@... - @$(LINK) $(LFLAGS) @<<$(@B).lnk - $(SPLEVOBJS:^ =+^ - ) - $@ - $(@B) - $(BCMDL); -<< - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c - -$(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ - $(U)lev_$(LEX).c - -$(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) - -$(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y -! IF "$(DO_YACC)"=="YACC_ACT" - $(YACC) -d -l $(U)lev_comp.y - copy $(YTABC) $(U)lev_yacc.c - copy $(YTABH) $(INCL)\lev_comp.h - @del $(YTABC) - @del $(YTABH) -! ELSE - @echo. - @echo $(U)lev_comp.y has changed. - @echo To update $(U)lev_yacc.c and $(INCL)\lev_comp.h run $(YACC). - @echo. - @echo For now, we will copy the prebuilt lev_yacc.c - @echo from $(SSHR) to $(U)lev_yacc.c, and copy the prebuilt - @echo lev_comp.h from $(SYS) to $(UTIL)\lev_comp.h - @echo and use those. - @echo. - copy $(SSHR)\lev_yacc.c $@ >nul - touch $@ - copy $(SSHR)\lev_comp.h $(INCL)\lev_comp.h >nul - touch $(INCL)\lev_comp.h -! ENDIF - -$(U)lev_$(LEX).c: $(U)lev_comp.l -! IF "$(DO_LEX)"=="LEX_ACT" - $(LEX) $(FLEXSKEL) $(U)lev_comp.l - copy $(LEXYYC) $@ - @del $(LEXYYC) -! ELSE - @echo. - @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). - @echo. - @echo For now, we will copy a prebuilt lev_lex.c - @echo from $(SSHR) to $@ and use it. - @echo. - copy $(SSHR)\lev_lex.c $@ >nul - touch $@ -! ENDIF - -# -# Dungeon Stuff -# - -$(U)dgn_comp.exe: $(DGNCOMPOBJS) - @echo Linking $@... - @$(LINK) $(LFLAGS) @<<$(@B).lnk - $(DGNCOMPOBJS:^ =+^ - ) - $@ - $(@B) - $(BCMDL); -<< - -$(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_yacc.c - -$(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_$(LEX).c - -$(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c - -$(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y -! IF "$(DO_YACC)"=="YACC_ACT" - $(YACC) -d -l $(U)dgn_comp.y - copy $(YTABC) $(U)dgn_yacc.c - copy $(YTABH) $(INCL)\dgn_comp.h - @del $(YTABC) - @del $(YTABH) -! ELSE - @echo. - @echo $(U)dgn_comp.y has changed. To update $@ and - @echo $(INCL)\dgn_comp.h run $(YACC). - @echo. - @echo For now, we will copy the prebuilt dgn_yacc.c from - @echo $(SSHR) to $(U)dgn_yacc.c, and copy the prebuilt - @echo dgn_comp.h from $(SSHR) to $(INCL)\dgn_comp.h - @echo and use those. - @echo. - copy $(SSHR)\dgn_yacc.c $@ >nul - touch $@ - copy $(SSHR)\dgn_comp.h $(INCL)\dgn_comp.h >nul - touch $(INCL)\dgn_comp.h -! ENDIF - -$(U)dgn_$(LEX).c: $(U)dgn_comp.l -! IF "$(DO_LEX)"=="LEX_ACT" - $(LEX) $(FLEXSKEL) $(U)dgn_comp.l - copy $(LEXYYC) $@ - @del $(LEXYYC) -! ELSE - @echo. - @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). - @echo. - @echo For now, we will copy a prebuilt dgn_lex.c - @echo from $(SSHR) to $@ and use it. - @echo. - copy $(SSHR)\dgn_lex.c $@ >nul - touch $@ -! ENDIF - -# -# Recover Utility -# - -$(U)recover.exe: $(RECOVOBJS) - @echo Linking.... - @$(LINK) $(LFLAGS) @<<$(@B).lnk - $(RECOVOBJS:^ =+^ - ) - $@ - $(@B) - ; -<< - -recover.o: $(CONFIG_H) $(UTIL)\recover.c - -# -# Header file moves required for tile support -# - -#$(WSHR)\tile.h: $(WSHR)\tile.h -# copy $(WSHR)\tile.h $@ - -#$(MSYS)\pctiles.h: $(MSYS)\pctiles.h -# copy $(MSYS)\pctiles.h $@ - -#$(INCL)\pcvideo.h: $(MSYS)\pcvideo.h -# copy $(MSYS)\pcvideo.h $@ - -#$(MSYS)\portio.h: $(MSYS)\portio.h -# copy $(MSYS)\portio.h $@ - -# -# Tile Mapping -# - -tile.c: tilemap.exe - @tilemap - @echo A new $@ has been created - -tilemap.exe: tilemap.o - @echo Linking.... - @$(LINK) $(LFLAGS) @<<$(@B).lnk - tilemap.o - $@ - $(@B) - ; -<< - -tilemap.c: $(WSHR)\tilemap.c - copy $(WSHR)\tilemap.c . - -tilemap.o: tilemap.c $(HACK_H) $(TILE_H) - -# -# Tile Utilities -# -# -# Required for tile support -# - -NetHack1.tib: $(TILEFILES) tile2bin.exe - @echo Creating binary tile files (this may take some time) - @tile2bin - -NetHacko.tib: thintile.tag $(TILEFILES2) til2bin2.exe - @echo Creating overview binary tile files (this may take some time) - @til2bin2 - -tile2bin.exe: tile2bin.o $(TEXTIO) - @$(LINK) $(LFLAGS) tile2bin.o $(TEXTIO),$@,$(@B); - -til2bin2.exe: til2bin2.o $(TEXTIO2) - @$(LINK) $(LFLAGS) til2bin2.o $(TEXTIO2),$@,$(@B); - -thintile.exe: thintile.o - @$(LINK) $(LFLAGS) thintile.o,$@,$(@B); - -thintile.o: $(HACK_H) $(WSHR)\tile.h $(WSHR)\thintile.c - -thintile.tag: thintile.exe $(TILEFILES) - thintile - @echo thintiles created >thintile.tag - -tile2bin.o: $(HACK_H) $(WSHR)\tile.h $(MSYS)\pctiles.h $(MSYS)\pcvideo.h \ - $(MSYS)\tile2bin.c - -til2bin2.o: $(HACK_H) $(WSHR)\tile.h $(MSYS)\pctiles.h $(MSYS)\pcvideo.h \ - $(MSYS)\tile2bin.c - -@$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 -DOVERVIEW_FILE /Zg $(MSYS)\tile2bin.c >$(@B).pro - @$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 -DOVERVIEW_FILE /Fo$@ $(MSYS)\tile2bin.c - -tiletext.o: $(CONFIG_H) $(WSHR)\tile.h $(WSHR)\tiletext.c - -tiletex2.o: $(CONFIG_H) $(WSHR)\tile.h $(WSHR)\tiletext.c - -@$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 /Zg $(WSHR)\tiletext.c >$(@B).pro - @$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 /Fo$@ $(WSHR)\tiletext.c - -tiletxt.o: $(CONFIG_H) $(WSHR)\tile.h tilemap.c - -@$(CC) $(CFLAGS) $(SPECOPTS) -DTILETEXT /Zg tilemap.c >$(@B).pro - @$(CC) $(CFLAGS) $(SPECOPTS) -DTILETEXT /Fo$@ tilemap.c - -tiletxt2.o: $(CONFIG_H) $(WSHR)\tile.h tilemap.c - -@$(CC) $(CFLAGS) $(SPECOPTS) -DTILETEXT /Zg tilemap.c >$(@B).pro - @$(CC) $(CFLAGS) $(SPECOPTS) -DTILETEXT -DTILE_X=8 /Fo$@ tilemap.c -# -# Optional GIF Utilities (for development) -# - -gif2txt.exe: $(GIFREADERS) $(TEXTIO) - @$(LINK) $(LFLAGS) $(GIFREADERS) $(TEXTIO),$@,$(@B); - -gif2txt2.exe: $(GIFREAD2) $(TEXTIO2) - @$(LINK) $(LFLAGS) $(GIFREAD2) $(TEXTIO2),$@,$(@B); - -txt2ppm.exe: $(PPMWRITERS) $(TEXTIO) - @$(LINK) $(LFLAGS) $(PPMWRITERS) $(TEXTIO),$@,$(@B); - -txt2ppm2.exe: $(PPMWRIT2) $(TEXTIO2) - @$(LINK) $(LFLAGS) $(PPMWRIT2) $(TEXTIO2),$@,$(@B); - -gifread.o: $(CONFIG_H) $(WSHR)\tile.h - -gifread2.o: $(CONFIG_H) $(WSHR)\tile.h $(WSHR)\gifread.c - -@$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 /Zg gifread.c >$(@B).pro - @$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 $(WSHR)\gifread.c - -ppmwrite.o: $(CONFIG_H) $(WSHR)\tile.h $(WSHR)\ppmwrite.c - -ppmwrit2.o: $(CONFIG_H) $(WSHR)\tile.h $(WSHR)\ppmwrite.c - -@$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 /Zg ppmwrite.c >$(@B).pro - @$(CC) $(CFLAGS) $(SPECOPTS) -DTILE_X=8 $(WSHR)\ppmwrite.c - -# -# Optional tile viewer (development sources only) -# - -viewtib.exe: viewtib.o - @$(LINK) $(LFLAGS) -oviewtib.exe viewtib.o $(LIBRARIES) - -viewtib.o: $(MSYS)\viewtib.c - -# -# Other Util Dependencies. -# - -alloc.o: $(CONFIG_H) alloc.c -drawing.o: $(CONFIG_H) drawing.c $(MSYS)\pcvideo.h -decl.o: $(CONFIG_H) decl.c -monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)\monsym.h \ - $(INCL)\color.h monst.c - -objects.o: $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ - $(INCL)\prop.h $(INCL)\color.h objects.c - -panic.o: $(CONFIG_H) $(UTIL)\panic.c - - - -# -# make data.base an 8.3 filename to prevent an nmake warning -# - -DATABASE = $(DAT)\data.bas - -$(DAT)\data: $(O)utility.tag $(DATABASE) - $(U)makedefs -d - -$(DAT)\rumors: $(O)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal - $(U)makedefs -r - -$(DAT)\quest.dat: $(O)utility.tag $(DAT)\quest.txt - $(U)makedefs -q - -$(DAT)\oracles: $(O)utility.tag $(DAT)\oracles.txt - $(U)makedefs -h - -$(DAT)\dungeon: $(O)utility.tag $(DAT)\dungeon.def - $(U)makedefs -e - cd $(DAT) - $(U)dgn_comp dungeon.pdf - cd $(SRC) - -# -# DLB stuff -# -# -nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(DAT)\options \ - $(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \ - $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon \ - $(DAT)\license $(O)sp_lev.tag - @copy $(MSYS)\msdoshlp.txt $(DAT) - @cd $(DAT) - @echo data >dlb.lst - @echo oracles >>dlb.lst - @echo options >>dlb.lst - @echo quest.dat >>dlb.lst - @echo rumors >>dlb.lst - @echo help >>dlb.lst - @echo hh >>dlb.lst - @echo cmdhelp >>dlb.lst - @echo history >>dlb.lst - @echo opthelp >>dlb.lst - @echo wizhelp >>dlb.lst - @echo dungeon >>dlb.lst - @echo license >>dlb.lst - @echo msdoshlp.txt >>dlb.lst -! IF ("$(NO_FOR)"=="Y") - echo AIR.LEV >>dlb.lst - echo ARC-FILA.LEV >>dlb.lst - echo ARC-FILB.LEV >>dlb.lst - echo ARC-GOAL.LEV >>dlb.lst - echo ARC-LOCA.LEV >>dlb.lst - echo ARC-STRT.LEV >>dlb.lst - echo ASMODEUS.LEV >>dlb.lst - echo ASTRAL.LEV >>dlb.lst - echo BAALZ.LEV >>dlb.lst - echo BAR-FILA.LEV >>dlb.lst - echo BAR-FILB.LEV >>dlb.lst - echo BAR-GOAL.LEV >>dlb.lst - echo BAR-LOCA.LEV >>dlb.lst - echo BAR-STRT.LEV >>dlb.lst - echo BIGRM-1.LEV >>dlb.lst - echo BIGRM-2.LEV >>dlb.lst - echo BIGRM-3.LEV >>dlb.lst - echo BIGRM-4.LEV >>dlb.lst - echo BIGRM-5.LEV >>dlb.lst - echo CASTLE.LEV >>dlb.lst - echo CAV-FILA.LEV >>dlb.lst - echo CAV-FILB.LEV >>dlb.lst - echo CAV-GOAL.LEV >>dlb.lst - echo CAV-LOCA.LEV >>dlb.lst - echo CAV-STRT.LEV >>dlb.lst - echo EARTH.LEV >>dlb.lst - echo FAKEWIZ1.LEV >>dlb.lst - echo FAKEWIZ2.LEV >>dlb.lst - echo FIRE.LEV >>dlb.lst - echo HEA-FILA.LEV >>dlb.lst - echo HEA-FILB.LEV >>dlb.lst - echo HEA-GOAL.LEV >>dlb.lst - echo HEA-LOCA.LEV >>dlb.lst - echo HEA-STRT.LEV >>dlb.lst - echo JUIBLEX.LEV >>dlb.lst - echo KNI-FILA.LEV >>dlb.lst - echo KNI-FILB.LEV >>dlb.lst - echo KNI-GOAL.LEV >>dlb.lst - echo KNI-LOCA.LEV >>dlb.lst - echo KNI-STRT.LEV >>dlb.lst - echo KNOX.LEV >>dlb.lst - echo MEDUSA-1.LEV >>dlb.lst - echo MEDUSA-2.LEV >>dlb.lst - echo MINEFILL.LEV >>dlb.lst - echo MINEND-1.LEV >>dlb.lst - echo MINEND-2.LEV >>dlb.lst - echo MINEND-3.LEV >>dlb.lst - echo MINETN-1.LEV >>dlb.lst - echo MINETN-2.LEV >>dlb.lst - echo MINETN-3.LEV >>dlb.lst - echo MINETN-4.LEV >>dlb.lst - echo MINETN-5.LEV >>dlb.lst - echo MINETN-6.LEV >>dlb.lst - echo MINETN-7.LEV >>dlb.lst - echo MON-FILA.LEV >>dlb.lst - echo MON-FILB.LEV >>dlb.lst - echo MON-GOAL.LEV >>dlb.lst - echo MON-LOCA.LEV >>dlb.lst - echo MON-STRT.LEV >>dlb.lst - echo ORACLE.LEV >>dlb.lst - echo ORCUS.LEV >>dlb.lst - echo PRI-FILA.LEV >>dlb.lst - echo PRI-FILB.LEV >>dlb.lst - echo PRI-GOAL.LEV >>dlb.lst - echo PRI-LOCA.LEV >>dlb.lst - echo PRI-STRT.LEV >>dlb.lst - echo RAN-FILA.LEV >>dlb.lst - echo RAN-FILB.LEV >>dlb.lst - echo RAN-GOAL.LEV >>dlb.lst - echo RAN-LOCA.LEV >>dlb.lst - echo RAN-STRT.LEV >>dlb.lst - echo ROG-FILA.LEV >>dlb.lst - echo ROG-FILB.LEV >>dlb.lst - echo ROG-GOAL.LEV >>dlb.lst - echo ROG-LOCA.LEV >>dlb.lst - echo ROG-STRT.LEV >>dlb.lst - echo SAM-FILA.LEV >>dlb.lst - echo SAM-FILB.LEV >>dlb.lst - echo SAM-GOAL.LEV >>dlb.lst - echo SAM-LOCA.LEV >>dlb.lst - echo SAM-STRT.LEV >>dlb.lst - echo SANCTUM.LEV >>dlb.lst - echo SOKO1-1.LEV >>dlb.lst - echo SOKO1-2.LEV >>dlb.lst - echo SOKO2-1.LEV >>dlb.lst - echo SOKO2-2.LEV >>dlb.lst - echo SOKO3-1.LEV >>dlb.lst - echo SOKO3-2.LEV >>dlb.lst - echo SOKO4-1.LEV >>dlb.lst - echo SOKO4-2.LEV >>dlb.lst - echo TOU-FILA.LEV >>dlb.lst - echo TOU-FILB.LEV >>dlb.lst - echo TOU-GOAL.LEV >>dlb.lst - echo TOU-LOCA.LEV >>dlb.lst - echo TOU-STRT.LEV >>dlb.lst - echo TOWER1.LEV >>dlb.lst - echo TOWER2.LEV >>dlb.lst - echo TOWER3.LEV >>dlb.lst - echo VAL-FILA.LEV >>dlb.lst - echo VAL-FILB.LEV >>dlb.lst - echo VAL-GOAL.LEV >>dlb.lst - echo VAL-LOCA.LEV >>dlb.lst - echo VAL-STRT.LEV >>dlb.lst - echo VALLEY.LEV >>dlb.lst - echo WATER.LEV >>dlb.lst - echo WIZ-FILA.LEV >>dlb.lst - echo WIZ-FILB.LEV >>dlb.lst - echo WIZ-GOAL.LEV >>dlb.lst - echo WIZ-LOCA.LEV >>dlb.lst - echo WIZ-STRT.LEV >>dlb.lst - echo WIZARD1.LEV >>dlb.lst - echo WIZARD2.LEV >>dlb.lst - echo WIZARD3.LEV >>dlb.lst -! ELSE - @for %%N in (*.lev) do echo %%N >>dlb.lst -! ENDIF - $(U)dlb_main cvIf dlb.lst $(SRC)\nhdat - @cd $(SRC) - -$(U)dlb_main.exe: $(DLBOBJS) - link $(LFLAGS) /ST:5120 $(DLBOBJS),$@,$(@B); - -dlb_main.o: $(U)dlb_main.c $(INCL)\config.h $(DLB_H) - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(U)dlb_main.c - -# Game Dependencies - -# sys/share -main.o: $(SSHR)\pcmain.c $(HACK_H) $(INCL)\dlb.h \ - #$(INCL)\win32api.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(SSHR)\pcmain.c -pcsys.o: $(SSHR)\pcsys.c $(HACK_H) - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(SSHR)\pcsys.c -tty.o: $(SSHR)\pctty.c $(HACK_H) - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(SSHR)\pctty.c -unix.o: $(SSHR)\pcunix.c $(HACK_H) - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(SSHR)\pcunix.c -random.o: $(SSHR)\random.c $(HACK_H) - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(SSHR)\random.c - -# sys/msdos -msdos.o : $(HACK_H) $(MSYS)\msdos.c - @$(CC) $(CFLAGS) $(SPECOPTS) $(NEWALT) /Fo$@ $(MSYS)\msdos.c -pckeys.o : $(HACK_H) $(MSYS)\pckeys.c - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(MSYS)\pckeys.c -pctiles.o : $(HACK_H) $(MSYS)\pctiles.c $(MSYS)\portio.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(MSYS)\pctiles.c -sound.o : $(HACK_H) $(MSYS)\sound.c $(MSYS)\portio.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(MSYS)\sound.c -video.o : $(HACK_H) $(MSYS)\pcvideo.h $(MSYS)\portio.h $(MSYS)\video.c - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(MSYS)\video.c -vidvga.o : $(HACK_H) $(MSYS)\pcvideo.h $(MSYS)\portio.h $(TILE_H) \ - $(MSYS)\vidvga.c - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(MSYS)\vidvga.c -vidtxt.o : $(HACK_H) $(MSYS)\pcvideo.h $(MSYS)\portio.h $(TILE_H) \ - $(MSYS)\vidtxt.c - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(MSYS)\vidtxt.c -stubvid.o : $(HACK_H) $(MSYS)\video.c - @$(CC) $(CFLAGS) $(SPECOPTS) -DSTUBVIDEO /Fo$@ $(MSYS)\video.c - -# win/tty -getline.o: $(WIN)\getline.c $(HACK_H) $(INCL)\func_tab.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(WIN)\getline.c -termcap.o: $(WIN)\termcap.c $(HACK_H) $(INCL)\tcap.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(WIN)\termcap.c -topl.o: $(WIN)\topl.c $(HACK_H) $(INCL)\tcap.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(WIN)\topl.c -wintty.o: $(WIN)\wintty.c $(HACK_H) $(INCL)\dlb.h \ - $(INCL)\date.h $(INCL)\patchlev.h $(INCL)\tcap.h - @$(CC) $(CFLAGS) $(SPECOPTS) /Fo$@ $(WIN)\wintty.c - -# src dependencies -allmain.o: allmain.c $(HACK_H) -alloc.o: alloc.c $(CONFIG_H) -apply.o: apply.c $(HACK_H) -artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h -attrib.o: attrib.c $(HACK_H) $(INCL)\artifact.h -ball.o: ball.c $(HACK_H) -bones.o: bones.c $(HACK_H) $(INCL)\lev.h -botl.o: botl.c $(HACK_H) -cmd.o: cmd.c $(HACK_H) $(INCL)\func_tab.h -dbridge.o: dbridge.c $(HACK_H) -decl.o: decl.c $(HACK_H) -detect.o: detect.c $(HACK_H) $(INCL)\artifact.h -dig.o: dig.c $(HACK_H) -display.o: display.c $(HACK_H) -dlb.o: dlb.c $(CONFIG_H) $(INCL)\dlb.h -do.o: do.c $(HACK_H) $(INCL)\lev.h -do_name.o: do_name.c $(HACK_H) -do_wear.o: do_wear.c $(HACK_H) -dog.o: dog.c $(HACK_H) -dogmove.o: dogmove.c $(HACK_H) $(INCL)\mfndpos.h -dokick.o: dokick.c $(HACK_H) -dothrow.o: dothrow.c $(HACK_H) -drawing.o: drawing.c $(HACK_H) $(INCL)\tcap.h -dungeon.o: dungeon.c $(HACK_H) $(INCL)\dgn_file.h $(INCL)\dlb.h -eat.o: eat.c $(HACK_H) -end.o: end.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h -engrave.o: engrave.c $(HACK_H) $(INCL)\lev.h -exper.o: exper.c $(HACK_H) -explode.o: explode.c $(HACK_H) -extralev.o: extralev.c $(HACK_H) -files.o: files.c $(HACK_H) $(INCL)\dlb.h -fountain.o: fountain.c $(HACK_H) -hack.o: hack.c $(HACK_H) -hacklib.o: hacklib.c $(HACK_H) -invent.o: invent.c $(HACK_H) $(INCL)\artifact.h -light.o: light.c $(HACK_H) $(INCL)\lev.h -lock.o: lock.c $(HACK_H) -mail.o: mail.c $(HACK_H) $(INCL)\mail.h -makemon.o: makemon.c $(HACK_H) -mapglyph.o: mapglyph.c $(HACK_H) -mcastu.o: mcastu.c $(HACK_H) -mhitm.o: mhitm.c $(HACK_H) $(INCL)\artifact.h -mhitu.o: mhitu.c $(HACK_H) $(INCL)\artifact.h -minion.o: minion.c $(HACK_H) -mklev.o: mklev.c $(HACK_H) -mkmap.o: mkmap.c $(HACK_H) $(INCL)\sp_lev.h -mkmaze.o: mkmaze.c $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev.h -mkobj.o: mkobj.c $(HACK_H) $(INCL)\artifact.h -mkroom.o: mkroom.c $(HACK_H) -mon.o: mon.c $(HACK_H) $(INCL)\mfndpos.h -mondata.o: mondata.c $(HACK_H) -monmove.o: monmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h -monst.o: monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \ - $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\monsym.h \ - $(INCL)\dungeon.h $(INCL)\color.h -mplayer.o: mplayer.c $(HACK_H) -mthrowu.o: mthrowu.c $(HACK_H) -muse.o: muse.c $(HACK_H) -music.o: music.c $(HACK_H) #interp.c -o_init.o: o_init.c $(HACK_H) $(INCL)\lev.h -objects.o: objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ - $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h -objnam.o: objnam.c $(HACK_H) -options.o: options.c $(CONFIG_H) $(INCL)\objclass.h $(INCL)\flag.h \ - $(HACK_H) $(INCL)\tcap.h -pager.o: pager.c $(HACK_H) $(INCL)\dlb.h - @$(CC) $(CFLAGS) $(SPECOPTS) /f- /Od /Fo$@ pager.c -pickup.o: pickup.c $(HACK_H) -pline.o: pline.c $(HACK_H) -polyself.o: polyself.c $(HACK_H) -potion.o: potion.c $(HACK_H) -pray.o: pray.c $(HACK_H) -priest.o: priest.c $(HACK_H) $(INCL)\mfndpos.h -quest.o: quest.c $(HACK_H) $(INCL)\qtext.h -questpgr.o: questpgr.c $(HACK_H) $(INCL)\dlb.h $(INCL)\qtext.h -read.o: read.c $(HACK_H) -rect.o: rect.c $(HACK_H) -region.o: region.c $(HACK_H) -restore.o: restore.c $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h -rip.o: rip.c $(HACK_H) -rnd.o: rnd.c $(HACK_H) -role.o: role.c $(HACK_H) -rumors.o: rumors.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h -save.o: save.c $(HACK_H) $(INCL)\lev.h -shk.o: shk.c $(HACK_H) -shknam.o: shknam.c $(HACK_H) -sit.o: sit.c $(HACK_H) $(INCL)\artifact.h -sounds.o: sounds.c $(HACK_H) -sp_lev.o: sp_lev.c $(HACK_H) $(INCL)\dlb.h $(INCL)\sp_lev.h -spell.o: spell.c $(HACK_H) -steal.o: steal.c $(HACK_H) -steed.o: steed.c $(HACK_H) -sys.o: sys.c $(HACK_H) -teleport.o: teleport.c $(HACK_H) -timeout.o: timeout.c $(HACK_H) $(INCL)\lev.h -topten.o: topten.c $(HACK_H) $(INCL)\dlb.h $(INCL)\patchlev.h -track.o: track.c $(HACK_H) -trap.o: trap.c $(HACK_H) -u_init.o: u_init.c $(HACK_H) -uhitm.o: uhitm.c $(HACK_H) -vault.o: vault.c $(HACK_H) -version.o: version.c $(HACK_H) $(INCL)\date.h $(INCL)\patchlev.h -vision.o: vision.c $(HACK_H) $(INCL)\vis_tab.h -weapon.o: weapon.c $(HACK_H) -were.o: were.c $(HACK_H) -wield.o: wield.c $(HACK_H) -windows.o: windows.c $(HACK_H) $(INCL)\wingem.h -wizard.o: wizard.c $(HACK_H) $(INCL)\qtext.h -worm.o: worm.c $(HACK_H) $(INCL)\lev.h -worn.o: worn.c $(HACK_H) -write.o: write.c $(HACK_H) -zap.o: zap.c $(HACK_H) - -# end of file diff --git a/sys/msdos/Makefile1.cross b/sys/msdos/Makefile1.cross deleted file mode 100644 index e24bbab3f..000000000 --- a/sys/msdos/Makefile1.cross +++ /dev/null @@ -1,709 +0,0 @@ -# NetHack 3.6 Makefile1.cross -# Cross-compile msdos version of NetHack using a -# linux-hosted djgpp cross-compiler. -# -# Makefile1.cross (this file) is for the host-side obj files and -# utilities that will run on the host platform only. -# -# Makefile2.cross is the the target platform obj files -# and utilities. -# -# Makefile2 utilizes the djgpp cross-compiler from Andrew Wu: -# https://github.com/andrewwutw/build-djgpp -# -# Currently, in NetHack 3.6, the cross-compile for msdos cannot be -# used to build the entire game to a playable point but it is useful -# for testing the msdos port build of the evolving NetHack code.0 -# -# The GNU Make has a problem if you include a drive spec below. -GAMEDIR =../binary - -# -#============================================================================== -# This marks the end of the BUILD DECISIONS section. -#============================================================================== -# -# Directories, gcc likes unix style directory specs -# - -OBJ = o -HOBJ = host_o -DAT = ../dat -DOC = ../doc -INCL = ../include -MSYS = ../sys/msdos -SRC = ../src -SSHR = ../sys/share -UTIL = ../util -WIN = ../win/tty -WCURSES = ../win/curses -WSHR = ../win/share - -# -# Executables. -# -HOST_CC = gcc -HOST_LINK = gcc -MAKEBIN = make - -# -# Special libraries and how to link them in. -# -LIBS = -lpc -LIBRARIES = $(LIBS) - -# -# Yacc/Lex off -# -YACC_LEX = N - -# -# Uncomment the line below if you want to store all the level files, -# help files, etc. in a single library file. -# -USE_DLB = Y - -#=============================================== -#======= End of Modification Section =========== -#=============================================== -################################################ -# # -# Nothing below here should have to be changed.# -# # -################################################ - -# Changing this conditional block is not recommended -ifeq "$(USE_DLB)" "Y" -DLBFLG = -DDLB -else -DLBFLG = -endif - -TERMLIB = - -#========================================== -#================ MACROS ================== -#========================================== -# This section creates shorthand macros for many objects -# referenced later on in the Makefile. -# -# Have windows path styles available for use in commands -# -W_OBJ =$(subst /,\, $(OBJ)) -W_INCL =$(subst /,\, $(INCL)) -W_DAT =$(subst /,\, $(DAT)) -W_DOC =$(subst /,\, $(DOC)) -W_UTIL =$(subst /,\, $(UTIL)) -W_SRC =$(subst /,\, $(SRC)) -W_SSYS =$(subst /,\, $(SSYS)) -W_MSWSYS =$(subst /,\, $(MSWSYS)) -W_TTY =$(subst /,\, $(TTY)) -W_MSWIN =$(subst /,\, $(MSWIN)) -ifeq "$(ADD_CURSES)" "Y" -W_WCURSES =$(subst /,\, $(WCURSES)) -endif -W_WSHR =$(subst /,\, $(WSHR)) -W_GAMEDIR =$(subst /,\, $(GAMEDIR)) - -# -# Shorten up the location for some files -# - -O = $(OBJ)/ -HOST_O = $(HOBJ)/ -U = $(UTIL)/ - -#========================================== -# Utility Objects. -#========================================== - -MAKESRC = makedefs.c - -MAKEDEFSOBJS = $(HOST_O)makedefs.o $(HOST_O)monst.o $(HOST_O)objects.o - -#SPLEVSRC = lev_yacc.c lev_$(LEX).c lev_main.c panic.c -#DGNCOMPSRC = dgn_yacc.c dgn_$(LEX).c dgn_main.c -#SPLEVOBJS = $(HOST_O)lev_yacc.o $(HOST_O)lev_$(LEX).o $(HOST_O)lev_main.o $(HOST_O)alloc.o \ -# $(HOST_O)monst.o $(HOST_O)objects.o $(HOST_O)panic.o \ -# $(HOST_O)drawing.o $(HOST_O)decl.o $(HOST_O)stubvid.o -#DGNCOMPOBJS = $(HOST_O)dgn_yacc.o $(HOST_O)dgn_$(LEX).o $(HOST_O)dgn_main.o $(HOST_O)alloc.o \ -# $(HOST_O)panic.o - -#========================================== -# Tile related object files. -#========================================== - -TILOBJ = $(HOST_O)tile.o $(VGAOBJ) - -TILOBJ2 = $(HOST_O)tileset.o $(HOST_O)bmptiles.o $(HOST_O)giftiles.o - -TEXTIO = $(HOST_O)tiletext.o $(HOST_O)tiletxt.o $(HOST_O)drawing.o $(HOST_O)decl.o $(HOST_O)monst.o \ - $(HOST_O)objects.o - -TEXTIO2 = $(HOST_O)tiletex2.o $(HOST_O)tiletxt2.o $(HOST_O)drawing.o $(HOST_O)decl.o $(HOST_O)monst.o \ - $(HOST_O)objects.o - -TILE_BMP = $(DAT)/nhtiles.bmp - -TILEUTIL = $(TILOBJ) $(U)tile2bin $(U)til2bin2 $(TILE_BMP) - -TILEFILES = $(WSHR)/monsters.txt $(WSHR)/objects.txt $(WSHR)/other.txt - -TILEFILES2 = $(WSHR)/monthin.txt $(WSHR)/objthin.txt $(WSHR)/oththin.txt - -GIFREADERS = $(HOST_O)gifread.o $(HOST_O)alloc.o $(HOST_O)panic.o - -GIFREAD2 = $(HOST_O)gifread2.o $(HOST_O)alloc.o $(HOST_O)panic.o - -PPMWRITERS = $(HOST_O)ppmwrite.o $(HOST_O)alloc.o $(HOST_O)panic.o - -PPMWRIT2 = $(HOST_O)ppmwrit2.o $(HOST_O)alloc.o $(HOST_O)panic.o - -#========================================== -# Object files. -#========================================== - -DLBOBJ = $(HOST_O)dlb.o - -ALLOBJ = $(MAKEDEFSOBJS) $(TILOBJ) $(TILOBJ2) $(TEXTIO) $(TEXTIO2) - -#========================================== -# Header file macros -#========================================== - -PATCHLEV_H = $(INCL)/patchlev.h -DGN_FILE_H = $(INCL)/align.h $(INCL)/dgn_file.h -DUNGEON_H = $(INCL)/align.h $(INCL)/dungeon.h -MONDATA_H = $(INCL)/align.h $(INCL)/mondata.h -MONST_H = $(INCL)/align.h $(INCL)/monst.h $(INCL)/mextra.h -PERMONST_H = $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/align.h \ - $(INCL)/permonst.h -REGION_H = $(INCL)/region.h -RM_H = $(INCL)/align.h $(INCL)/rm.h -SKILLS_H = $(INCL)/skills.h -SP_LEV_H = $(INCL)/align.h $(INCL)/sp_lev.h -YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ - $(INCL)/pm.h $(INCL)/youprop.h -YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ - $(INCL)/attrib.h $(INCL)/you.h -DISPLAY_H = $(MONDATA_H) $(INCL)/vision.h $(INCL)/display.h -PCCONF_H = $(INCL)/micro.h $(INCL)/system.h $(INCL)/pcconf.h \ - $(MSYS)/pcvideo.h -CONFIG_H = $(GLOBAL_H) $(INCL)/tradstdc.h $(INCL)/config1.h \ - $(INCL)/config.h -DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ - $(INCL)/obj.h $(INCL)/onames.h $(INCL)/pm.h \ - $(INCL)/decl.h -GLOBAL_H = $(PCCONF_H) $(INCL)/coord.h $(INCL)/global.h -HACK_H = $(CONFIG_H) $(INCL)/context.h $(DUNGEON_H) \ - $(DECL_H) $(DISPLAY_H) $(INCL)/monsym.h \ - $(INCL)/mkroom.h $(INCL)/objclass.h $(INCL)/trap.h \ - $(INCL)/flag.h $(RM_H) $(INCL)/vision.h \ - $(INCL)/wintype.h $(INCL)/engrave.h $(INCL)/rect.h \ - $(INCL)/trampoli.h $(INCL)/hack.h $(REGION_H) \ - $(INCL)/sys.h -DLB_H = $(INCL)/dlb.h - -ifeq ($(SUPPRESS_GRAPHICS),Y) -TILE_H = -else -TILE_H = $(WSHR)/tile.h $(INCL)/tileset.h -endif - -ifeq ($(USE_DLB),Y) -DLB = dlb -DLBOBJS = $(HOST_O)dlb_main.o $(HOST_O)dlb.o $(HOST_O)alloc.o $(HOST_O)panic.o -else -DLB = -DLBOBJS = -endif - -#========================================== -# More compiler setup macros -#========================================== -# -CURSESDEF= -CURSESLIB= -INCLDIR=-I../include -I../sys/msdos -# Debugging -#cflags = -pg -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS -#LFLAGS = -pg -# -cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS -LFLAGS = -# -# Debugging -#cflags = -g -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES -#LFLAGS = -g -# -# Normal -cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES -LFLAGS = - -#========================================== -#================ RULES ================== -#========================================== - -.SUFFIXES: .o .til .uu .c .y .l - -#========================================== -# Rules for host files in src -#========================================== - -$(HOST_O)%.o : $(SRC)/%.c - $(HOST_CC) $(cflags) -o$@ $< - -#========================================== -# Rules for host files in sys/msdos -#========================================== - -$(HOST_O)%.o : $(MSYS)/%.c - $(HOST_CC) $(cflags) -I../sys/msdos -o$@ $< - -#========================================== -# Rules for host files in util -#========================================== - -$(HOST_O)%.o : $(SRC)/%.c - $(HOST_CC) $(cflags) -o$@ $< - -$(HOST_O)%.o : %.c - $(HOST_CC) $(cflags) -o$@ $< - -#========================================== -# Rules for host files in win/share -#========================================== - -$(HOST_O)%.o : $(WSHR)/%.c - $(HOST_CC) $(cflags) -I../win/share -o$@ $< - -#========================================== -# Primary Targets. -#========================================== - -# The default target. - -all : prereq - -prereq: $(HOST_O)prereq.tag - @echo Done. - -default: prereq - -util: $(HOST_O)utility.tag - -$(HOST_O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/onames.h \ - $(INCL)/pm.h vis_tab.c $(TILEUTIL) - echo host utilities made > $@ - -tileutil: $(U)gif2txt $(U)txt2ppm - @echo Optional tile development utilities are up to date. - -$(HOST_O)prereq.tag: hobj.tag $(U)makedefs $(HOST_O)utility.tag \ - $(HOST_O)thintile.tag $(DAT)/nhdat - echo prereq done >$@ - -#========================================== -# Other host targets. -#========================================== - -#note that dir below assumes bin/dir from djgpp distribution -# -$(DAT)/nhdat: $(U)dlb_main $(DAT)/data $(DAT)/rumors \ - $(DAT)/oracles $(DAT)/quest.dat \ - $(DAT)/bogusmon $(DAT)/engrave $(DAT)/epitaph $(DAT)/tribute - cd $(DAT); \ - pwd; \ - cp $(MSYS)/msdoshlp.txt .; \ - ls -1 data oracles options quest.dat rumors help hh >dlb.lst; \ - ls -1 cmdhelp history opthelp wizhelp license >>dlb.lst; \ - ls -1 bogusmon engrave epitaph tribute msdoshlp.txt >>dlb.lst; \ - $(U)dlb_main cvIf dlb.lst nhdat - cd $(SRC) - -$(U)dlb_main: $(DLBOBJS) - $(HOST_LINK) $(LFLAGS) -o$@ $(DLBOBJS) - -$(HOST_O)dlb_main.o: $(U)dlb_main.c $(INCL)/config.h $(DLB_H) - $(HOST_CC) $(cflags) -o$@ $(U)dlb_main.c - - -$(INCL)/date.h : $(U)makedefs - -$(U)makedefs -v - -$(INCL)/onames.h: $(U)makedefs - -$(U)makedefs -o - -$(INCL)/pm.h: $(U)makedefs - -$(U)makedefs -p - -#monstr.c: $(U)makedefs -# -$(U)makedefs -m - -$(INCL)/vis_tab.h: $(U)makedefs - -$(U)makedefs -z - -vis_tab.c: $(U)makedefs - -$(U)makedefs -z - -# make data.base an 8.3 filename to prevent an make warning -DATABASE = $(DAT)/data.bas - -$(DAT)/data: $(HOST_O)utility.tag $(DATABASE) - $(U)makedefs -d - -$(DAT)/rumors: $(HOST_O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal - $(U)makedefs -r - -$(DAT)/quest.dat: $(HOST_O)utility.tag $(DAT)/quest.txt - $(U)makedefs -q - -$(DAT)/oracles: $(HOST_O)utility.tag $(DAT)/oracles.txt - $(U)makedefs -h - -$(DAT)/bogusmon: $(HOST_O)utility.tag $(DAT)/bogusmon.txt - $(U)makedefs -s - -$(DAT)/engrave: $(HOST_O)utility.tag $(DAT)/engrave.txt - $(U)makedefs -s - -$(DAT)/epitaph: $(HOST_O)utility.tag $(DAT)/epitaph.txt - $(U)makedefs -s - -#=============================================== -# Create directory for holding host object files -#=============================================== - -hobj.tag: - mkdir -p ./$(HOBJ) - echo directory ready ./$(HOBJ) - -#========================================== -# Makedefs Stuff -#========================================== - -$(U)makedefs: $(MAKEDEFSOBJS) - $(HOST_LINK) $(LFLAGS) -o$@ $(MAKEDEFSOBJS) - -$(HOST_O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/objclass.h \ - $(INCL)/monsym.h $(INCL)/qtext.h $(U)makedefs.c - $(HOST_CC) $(cflags) -o$@ $(U)makedefs.c - -#========================================== -# Level Compiler Dependencies -#========================================== - -#$(U)lev_comp: $(SPLEVOBJS) -# -rm -f temp.a -# ar r temp.a $(SPLEVOBJS) -# $(HOST_LINK) $(LFLAGS) -o$@ temp.a -# -#$(HOST_O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h $(U)lev_yacc.c -# $(HOST_CC) $(cflags) -o$@ $(U)lev_yacc.c -# -#$(HOST_O)lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ -# $(U)lev_$(LEX).c -# $(HOST_CC) $(cflags) -o$@ $(U)lev_$(LEX).c -# -#$(HOST_O)lev_main.o: $(HACK_H) $(INCL)/sp_lev.h $(INCL)/date.h $(U)lev_main.c -# -#$(U)lev_yacc.c: $(SSHR)/lev_yacc.c -# @echo --- -# @echo For now, we will copy the prebuilt -# @echo lev_comp.c from $(SSHR) into $(U) and use that. -# @cp $(SSHR)/lev_yacc.c $(U)lev_yacc.c -# @echo.>>$(U)lev_yacc.c -# -#$(INCL)/lev_comp.h : $(SSHR)/lev_comp.h -# @echo For now, we will copy the prebuilt lev_comp.h -# @echo from $(SSHR) into $(INCL) and use that. -# @cp $(SSHR)/lev_comp.h $@ -#$(U)lev_lex.c: $(SSHR)/lev_lex.c -# @echo.>>$(INCL)/lev_comp.h -# @echo For now, we will copy the prebuilt lev_lex.c -# @echo from $(SSHR) into $(U) and use it. -# @cp $(SSHR)/lev_lex.c $@ -# @echo.>>$@ - -#========================================== -# Dungeon Dependencies -#========================================== - -#$(U)dgn_comp: $(DGNCOMPOBJS) -# $(HOST_LINK) $(LFLAGS) -o$@ $(DGNCOMPOBJS) -# -#$(U)dgn_yacc.c: $(SSHR)/dgn_yacc.c -# @echo --- -# @echo For now, we will copy the prebuilt $(U)dgn_yacc.c and -# @echo dgn_comp.h from $(SSHR) into $(U) and use that. -# @cp $(SSHR)/dgn_yacc.c $(U)dgn_yacc.c -# @echo.>>$(U)dgn_yacc.c -# -#$(INCL)/dgn_comp.h: $(SSHR)/dgn_comp.h -# @echo --- -# @echo For now, we will copy the prebuilt dgn_comp.h -# @echo from $(SSHR) into $(INCL) and use that. -# @cp $(SSHR)/dgn_comp.h $@ -# @echo.>>$(INCL)/dgn_comp.h -# -#$(U)dgn_$(LEX).c: $(SSHR)/dgn_lex.c $(INCL)/dgn_comp.h -# @echo --- -# @echo For now, we will copy the prebuilt dgn_lex.c -# @echo from $(SSHR) into $(U) and use it. -# @cp $(SSHR)/dgn_lex.c $@ -# @echo.>>$@ - -#========================================== -# Header file moves required for tile support -#========================================== - -ifeq ($(SUPPRESS_GRAPHICS),Y) - -else -# -# Tile Mapping -# - -$(SRC)/tile.c: $(U)tilemap - @$(U)tilemap - @echo A new $@ has been created - -$(U)tilemap: $(HOST_O)tilemap.o - $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)tilemap.o - -$(HOST_O)tilemap.o: $(WSHR)/tilemap.c $(HACK_H) $(TILE_H) - $(HOST_CC) $(cflags) -I$(WSHR) -I$(MSYS) -o$@ $(WSHR)/tilemap.c - - -#========================================== -# Tile Utilities -# Required for tile support -#========================================== - -$(DAT)/nhtiles.bmp: $(TILEFILES) $(U)tile2bmp - @echo Creating binary tile files which may take some time - @cd $(DAT) - @$(U)tile2bmp $@ - @cd $(SRC) - -$(U)tile2bmp: $(HOST_O)tile2bmp.o $(TEXTIO) - -rm -f temp.a - ar r temp.a $(TEXTIO) - $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)tile2bmp.o temp.a - -$(U)tile2bin: $(HOST_O)tile2bin.o $(TEXTIO) - -rm -f temp.a - ar r temp.a $(TEXTIO) - $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)tile2bin.o temp.a - -$(U)til2bin2: $(HOST_O)til2bin2.o $(TEXTIO2) - -rm -f temp.a - ar r temp.a $(TEXTIO2) - $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)til2bin2.o temp.a - -$(U)thintile: $(HOST_O)thintile.o - $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)thintile.o - -#$(HOST_O)thintile.o: $(HACK_H) $(WSHR)/tile.h $(WSHR)/thintile.c -# -rm -f temp.a -# ar r temp.a $(TEXTIO) -# $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)tile2bmp.o temp.a - -$(HOST_O)thintile.o: $(HACK_H) $(WSHR)/tile.h $(WSHR)/thintile.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILE -DOVERVIEW_FILE -o$@ $(WSHR)/thintile.c - -$(HOST_O)thintile.tag: $(U)thintile $(TILEFILES) - $(U)thintile - echo thintiles created >$@ - -$(HOST_O)tile2bmp.o: $(HACK_H) $(TILE_H) $(WSHR)/tile2bmp.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(WSHR)/tile2bmp.c - -$(HOST_O)tile2bin.o: $(HACK_H) $(TILE_H) $(MSYS)/pctiles.h $(MSYS)/pcvideo.h $(MSYS)/tile2bin.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/tile2bin.c - -$(HOST_O)til2bin2.o: $(HACK_H) $(TILE_H) $(MSYS)/pctiles.h $(MSYS)/pcvideo.h $(MSYS)/tile2bin.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILE_X=8 -DOVERVIEW_FILE -o$@ $(MSYS)/tile2bin.c - -$(HOST_O)tiletext.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tiletext.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(WSHR)/tiletext.c - -$(HOST_O)tiletex2.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tiletext.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILE_X=8 -o$@ $(WSHR)/tiletext.c - -$(HOST_O)tiletxt.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tilemap.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILETEXT -o$@ $(WSHR)/tilemap.c - -$(HOST_O)tiletxt2.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tilemap.c - $(HOST_CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILETEXT -DTILE_X=8 -o$@ $(WSHR)/tilemap.c -# -# Optional GIF Utilities (for development) -# - -$(U)gif2txt: $(GIFREADERS) $(TEXTIO) - $(HOST_LINK) $(LFLAGS) -o$@ $(GIFREADERS) $(TEXTIO) - -$(U)gif2txt2: $(GIFREAD2) $(TEXTIO2) - $(HOST_LINK) $(LFLAGS) -o$@ $(GIFREAD2) $(TEXTIO2) - -$(U)txt2ppm: $(PPMWRITERS) $(TEXTIO) - $(HOST_LINK) $(LFLAGS) -o$@ $(PPMWRITERS) $(TEXTIO) - -$(U)txt2ppm2: $(PPMWRIT2) $(TEXTIO2) - $(HOST_LINK) $(LFLAGS) -o$@ $(PPMWRIT2) $(TEXTIO2) - -$(HOST_O)gifread.o: $(CONFIG_H) $(WSHR)/tile.h $(WSHR)/gifread.c - -$(HOST_O)gifread2.o: $(CONFIG_H) $(WSHR)/tile.h $(WSHR)/gifread.c - $(HOST_CC) $(cflags) -DTILE_X=8 -o$@ $(WSHR)/gifread.c - -ppmwrite.c: $(WSHR)/ppmwrite.c - cp $(WSHR)/ppmwrite.c . - -$(HOST_O)ppmwrite.o: $(CONFIG_H) $(WSHR)/tile.h - -$(HOST_O)ppmwrit2.o: $(CONFIG_H) $(WSHR)/tile.h ppmwrite.c - $(HOST_CC) $(cflags) -DTILE_X=8 -o$@ ppmwrite.c - -# -# Optional tile viewer (development sources only) -# - -$(U)viewtib: $(HOST_O)viewtib.o - $(HOST_LINK) $(LFLAGS) -o$@ $(HOST_O)viewtib.o $(LIBRARIES) - -$(HOST_O)viewtib.o: $(MSYS)/viewtib.c - -endif - -#========================================== -# Other host Util Dependencies. -#========================================== - -$(HOST_O)monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/monsym.h \ - $(INCL)/color.h monst.c - $(HOST_CC) $(cflags) -o$@ monst.c - -$(HOST_O)objects.o: $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ - $(INCL)/prop.h $(INCL)/color.h objects.c - $(HOST_CC) $(cflags) -o$@ objects.c - -$(HOST_O)panic.o: $(CONFIG_H) $(U)panic.c - $(HOST_CC) $(cflags) -o$@ $(U)panic.c - -#$(HOST_O)sp_lev.tag: $(HOST_O)utility.tag \ -# $(DAT)/bigroom.des $(DAT)/castle.des \ -# $(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des \ -# $(DAT)/medusa.des $(DAT)/oracle.des $(DAT)/tower.des \ -# $(DAT)/yendor.des $(DAT)/arch.des $(DAT)/barb.des \ -# $(DAT)/caveman.des $(DAT)/healer.des $(DAT)/knight.des \ -# $(DAT)/monk.des $(DAT)/priest.des $(DAT)/ranger.des \ -# $(DAT)/rogue.des $(DAT)/samurai.des $(DAT)/tourist.des \ -# $(DAT)/valkyrie.des $(DAT)/wizard.des -# cd $(DAT) -# $(U)lev_comp bigroom.des -# $(U)lev_comp castle.des -# $(U)lev_comp endgame.des -# $(U)lev_comp gehennom.des -# $(U)lev_comp knox.des -# $(U)lev_comp mines.des -# $(U)lev_comp medusa.des -# $(U)lev_comp oracle.des -# $(U)lev_comp sokoban.des -# $(U)lev_comp tower.des -# $(U)lev_comp yendor.des -# $(U)lev_comp arch.des -# $(U)lev_comp barb.des -# $(U)lev_comp caveman.des -# $(U)lev_comp healer.des -# $(U)lev_comp knight.des -# $(U)lev_comp monk.des -# $(U)lev_comp priest.des -# $(U)lev_comp ranger.des -# $(U)lev_comp rogue.des -# $(U)lev_comp samurai.des -# $(U)lev_comp tourist.des -# $(U)lev_comp valkyrie.des -# $(U)lev_comp wizard.des -# cd $(SRC) -# echo sp_levs done > $@ - -#$(DAT)/dungeon: $(HOST_O)utility.tag $(DAT)/dungeon.def -# $(U)makedefs -e -# cd $(DAT) -# $(U)dgn_comp dungeon.pdf -# cd $(SRC) - -#========================================== -# Housekeeping for host side. -#========================================== - -clean: - rm ./host_o/*.o - if [ -f $(HOST_O)prereq.tag ]; then rm $(HOST_O)prereq.tag; fi; - if [ -f hobj.tag ]; then rm hobj.tag; fi; - if [ -f $(HOST_O)utility.tag ]; then rm $(HOST_O)utility.tag; fi; - if [ -f temp.a ]; then rm temp.a; fi; - -spotless: clean - - if [ -f $(INCL)/pm.h ]; then rm $(INCL)/pm.h; fi; -# if [ -f $(U)dgn_flex.c ]; then rm $(U)dgn_flex.c; fi; -# if [ -f $(U)dgn_lex.c ]; then rm $(U)dgn_lex.c; fi; -# if [ -f $(U)makedefs ]; then rm $(U)makedefs; fi; -# if [ -f $(U)dgn_comp ]; then rm $(U)dgn_comp; fi; -# if [ -f $(U)recover.exe ]; then rm $(U)recover.exe; fi; -# if [ -f $(U)tilemap ]; then rm $(U)tilemap; fi; -# if [ -f $(U)tile2bmp ]; then rm $(U)tile2bmp; fi; -# if [ -f $(U)tile2bin ]; then rm $(U)tile2bin; fi; -# if [ -f $(U)til2bin2 ]; then rm $(U)til2bin2; fi; -# if [ -f $(U)thintile ]; then rm $(U)thintile; fi; -# if [ -f $(U)dlb_main ]; then rm $(U)dlb_main; fi; -# if [ -f $(INCL)/vis_tab.h ]; then rm $(INCL)/vis_tab.h; fi; -# if [ -f $(INCL)/onames.h ]; then rm $(INCL)/onames.h; fi; -# if [ -f $(INCL)/pm.h ]; then rm $(INCL)/pm.h; fi; -# if [ -f $(INCL)/date.h ]; then rm $(INCL)/date.h; fi; -# if [ -f $(INCL)/dgn_comp.h ]; then rm $(INCL)/dgn_comp.h; fi; -# if [ -f $(INCL)/lev_comp.h ]; then rm $(INCL)/lev_comp.h; fi; -# if [ -f $(SRC)/vis_tab.c ]; then rm $(SRC)/vis_tab.c; fi; -# if [ -f $(SRC)/tile.c ]; then rm $(SRC)/tile.c; fi; -# if [ -f $(DAT)/options ]; then rm $(DAT)/options; fi; -# if [ -f $(DAT)/data ]; then rm $(DAT)/data; fi; -# if [ -f $(DAT)/rumors ]; then rm $(DAT)/rumors; fi; -# if [ -f $(DAT)/dungeon.pdf ]; then rm $(DAT)/dungeon.pdf; fi; -# if [ -f $(DAT)/dungeon ]; then rm $(DAT)/dungeon; fi; -# if [ -f $(DAT)/oracles ]; then rm $(DAT)/oracles; fi; -# if [ -f $(DAT)/quest.dat ]; then rm $(DAT)/quest.dat; fi; -# if [ -f $(DAT)/bogusmon ]; then rm $(DAT)/bogusmon; fi; -# if [ -f $(DAT)/engrave ]; then rm $(DAT)/engrave; fi; -# if [ -f $(DAT)/epitaph ]; then rm $(DAT)/epitaph; fi; -# if [ -f $(DAT)/dlb.lst ]; then rm $(DAT)/dlb.lst; fi; -# if [ -f $(DAT)/nhdat ]; then rm $(DAT)/nhdat; fi; -# if [ -f $(DAT)/*.lev ]; then rm $(DAT)/*.lev; fi; -# if [ -f $(TILE_BMP) ]; then rm $(TILE_BMP); fi; -# if [ -f $(WSHR)/monthin.txt ]; then rm $(WSHR)/monthin.txt; fi; -# if [ -f $(WSHR)/objthin.txt ]; then rm $(WSHR)/objthin.txt; fi; -# if [ -f $(WSHR)/oththin.txt ]; then rm $(WSHR)/oththin.txt; fi; - -#========================================== -# Game Dependencies -#========================================== - -# src dependencies - -$(HOST_O)tile.o: tile.c $(HACK_H) -$(HOST_O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h -$(HOST_O)alloc.o: alloc.c $(CONFIG_H) -$(HOST_O)dlb.o: dlb.c $(CONFIG_H) $(INCL)/dlb.h - $(HOST_CC) $(cflags) -I../sys/msdos -o$@ dlb.c -$(HOST_O)monst.o: monst.c $(CONFIG_H) $(INCL)/permonst.h $(INCL)/align.h \ - $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/monsym.h \ - $(INCL)/color.h -$(HOST_O)objects.o: objects.c $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ - $(INCL)/prop.h $(INCL)/skills.h $(INCL)/color.h -$(HOST_O)tileset.o: $(WSHR)/tileset.c $(HACK_H) -$(HOST_O)bmptiles.o: $(WSHR)/bmptiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h -$(HOST_O)giftiles.o: $(WSHR)/giftiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h - -# end of file - diff --git a/sys/msdos/Makefile2.cross b/sys/msdos/Makefile2.cross deleted file mode 100644 index 2d25a3d6b..000000000 --- a/sys/msdos/Makefile2.cross +++ /dev/null @@ -1,1263 +0,0 @@ -# NetHack 3.6 Makefile2.cross -# Cross-compile msdos version of NetHack using a -# linux-hosted djgpp cross-compiler. -# -# Makefile1.cross is for the host-side obj files and utilities that -# will run on the host platform only. -# -# Makefile2.cross (this file) is the the target platform obj files -# and utilities. -# -# Makefile2 utilizes the djgpp cross-compiler from Andrew Wu: -# https://github.com/andrewwutw/build-djgpp -# -# Currently, in NetHack 3.6, the cross-compile for msdos cannot be -# used to build the entire game to a playable point but it is useful -# for testing the msdos port build of the evolving NetHack code. -# - -# Game Installation Variables -# NOTE: Make sure GAMEDIR exists before make is started. - -GAME = nethack -# The GNU Make has a problem if you include a drive spec below (unfortunately). -GAMEDIR =../binary - -# Optional PDCurses support -# Uncomment these and set them appropriately if you want to -# include curses port support alongside TTY support in your -# 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 which must already be resident on -# your machine. -# -ADD_CURSES=Y -PDCURSES_TOP=../../pdcurses - -# Set top of djgpp if not specified through ENV variables prior to make: -#DJGPP_TOP = $(HOME)/djgpp - -# -#============================================================================== -# This marks the end of the BUILD DECISIONS section. -#============================================================================== -# -# Directories, gcc likes unix style directory specs -# - -OBJ = o -HOBJ = host_o -DAT = ../dat -DOC = ../doc -INCL = ../include -MSYS = ../sys/msdos -SRC = ../src -SSHR = ../sys/share -UTIL = ../util -WIN = ../win/tty -WCURSES = ../win/curses -WSHR = ../win/share - -# -# Executables. -ifndef DJGPP_TOP -ifdef TRAVIS_BUILD_DIR -DJGPP_TOP = TRAVIS_BUILD_DIR/djgpp -else -DJGPP_TOP = $(HOME)/djgpp -endif -endif - -TARGET_CC = $(DJGPP_TOP)/i586-pc-msdosdjgpp/bin/gcc -TARGET_LINK = $(DJGPP_TOP)/i586-pc-msdosdjgpp/bin/gcc -TARGET_STUBEDIT = $(DJGPP_TOP)/i586-pc-msdosdjgpp/bin/stubedit -MAKEBIN = make - -# -# Special libraries and how to link them in. - -LIBS = -lpc - -# If TERMLIB is defined in pcconf.h, comment out the upper line and -# uncomment the lower. Note that you must build the termc library -# and place it in djgpp's lib directory. See termcap.zip for details - -TERMLIB = -#TERMLIB = -ltermc - -LIBRARIES = $(LIBS) $(TERMLIB) - -# -# Yacc/Lex ... if you got 'em. -# -# If you have yacc/lex or a work-alike set YACC_LEX to Y -# -YACC_LEX = N - -ifeq "$(YACC_LEX)" "Y" -DO_YACC = YACC_ACT -DO_LEX = LEX_ACT -endif - -# If YACC_LEX is Y above, set the following to values appropriate for -# your tools. -# -YACC = bison -y -LEX = lex -# -# If your flex and bison port mess with the output names directly -# you must set the file names to the appropriate output file names -# here -#YTABC = y_tab.c -#YTABH = y_tab.h -#LEXYYC = lexyy.c -# -# If your flex and bison are able to produce files named -# y.tab.c, y.tab.h or lex.yy.c you might have to set these -# to the short file name equivalent (DIR /X to reveal them): -YTABC = ytab~1.c -YTABH = ytab~1.h -LEXYYC = lexyy~1.c - -# -# Uncomment the line below if you want to store all the level files, -# help files, etc. in a single library file. - -USE_DLB = Y - -# djgpp includes ls.exe and touch.exe in fil41b.zip from the v2gnu -# folder so be sure to include that when downloading djgpp. Doing -# so will make changing this unnecessary. - -LS = ls -1 # ls.exe from djgpp distribution -#LS = dir /l/b # DOS command - -# To build a binary without any graphics -# suitable for blind players, -# set SUPPRESS_GRAPHICS to Y -# (Note: binary will require ANSI.SYS driver or equivalent loaded) -# SUPPRESS_GRAPHICS = Y -SUPPRESS_GRAPHICS = - -# ZLIB Support -# To support zlib compression in bones and save files, you must -# define ZLIB_COMP in include/config.h. -# You must also have a zlib library to link NetHack with, and -# for the djgpp build, you need one compatible with djgpp. -# At the time that this was written (post-NetHack 3.4.3) the -# following URL was a valid place to get a pre-built djgpp library -# to add to your djgpp tools directory tree. -# http://www.delorie.com/pub/djgpp/current/v2tk/zlib114b.zip -# -# If you defined ZLIB_COMP in include/config.h to build in support -# for ZLIB compression, you need to uncomment the line below. -#ZLIB= -lz - -#=============================================== -#======= End of Modification Section =========== -#=============================================== -################################################ -# # -# Nothing below here should have to be changed.# -# # -################################################ - -GAMEFILE = $(GAMEDIR)/$(GAME).exe - -# Changing this conditional block is not recommended -ifeq "$(USE_DLB)" "Y" -DLBFLG = -DDLB -else -DLBFLG = -endif - -TERMLIB = -# Build NetHack suitable for blind players - -#========================================== -#================ MACROS ================== -#========================================== -# This section creates shorthand macros for many objects -# referenced later on in the Makefile. -# -# Have windows path styles available for use in commands -# -W_OBJ =$(subst /,\, $(OBJ)) -W_INCL =$(subst /,\, $(INCL)) -W_DAT =$(subst /,\, $(DAT)) -W_DOC =$(subst /,\, $(DOC)) -W_UTIL =$(subst /,\, $(UTIL)) -W_SRC =$(subst /,\, $(SRC)) -W_SSYS =$(subst /,\, $(SSYS)) -W_MSWSYS =$(subst /,\, $(MSWSYS)) -W_TTY =$(subst /,\, $(TTY)) -W_MSWIN =$(subst /,\, $(MSWIN)) -ifeq "$(ADD_CURSES)" "Y" -W_WCURSES =$(subst /,\, $(WCURSES)) -endif -W_WSHR =$(subst /,\, $(WSHR)) -W_GAMEDIR =$(subst /,\, $(GAMEDIR)) - -# -# Shorten up the location for some files -# - -O = $(OBJ)/ -HOST_O = $(HOBJ)/ -U = $(UTIL)/ - -#========================================== -# Utility Objects. -#========================================== - -VGAOBJ = $(O)vidvga.o $(O)vidvesa.o - -MAKESRC = makedefs.c - -#SPLEVSRC = lev_yacc.c lev_$(LEX).c lev_main.c panic.c - -#DGNCOMPSRC = dgn_yacc.c dgn_$(LEX).c dgn_main.c - -MAKEDEFSOBJS = $(HOST_O)makedefs.o $(HOST_O)monst.o $(HOST_O)objects.o - -#SPLEVOBJS = $(HOST_O)lev_yacc.o $(HOST_O)lev_$(LEX).o $(HOST_O)lev_main.o $(HOST_O)alloc.o \ -# $(HOST_O)monst.o $(HOST_O)objects.o $(HOST_O)panic.o \ -# $(HOST_O)drawing.o $(HOST_O)decl.o $(O)stubvid.o - -#DGNCOMPOBJS = $(HOST_O)dgn_yacc.o $(HOST_O)dgn_$(LEX).o $(HOST_O)dgn_main.o $(HOST_O)alloc.o \ -# $(HOST_O)panic.o - -RECOVOBJS = $(O)recover.o - - -#========================================== -# Tile related object files. -#========================================== - -ifeq ($(SUPPRESS_GRAPHICS),Y) -TILOBJ = -TILOBJ2 = -TEXTIO = -TEXTIO2 = -TILE_BMP = -TILEUTIL = -TILEFILES = -TILEFILES2 = -GIFREADERS = -GIFREAD2 = -PPMWRITERS = -PPMWRIT2 = - -else - -TILOBJ = $(O)tile.o $(VGAOBJ) - -TILOBJ2 = $(O)tileset.o $(O)bmptiles.o $(O)giftiles.o - -TEXTIO = $(HOST_O)tiletext.o $(HOST_O)tiletxt.o $(HOST_O)drawing.o $(HOST_O)decl.o $(HOST_O)monst.o \ - $(HOST_O)objects.o $(HOST_O)stubvid.o - -TEXTIO2 = $(HOST_O)tiletex2.o $(HOST_O)tiletxt2.o $(HOST_O)drawing.o $(HOST_O)decl.o $(HOST_O)monst.o \ - $(HOST_O)objects.o $(HOST_O)stubvid.o - -TILE_BMP = $(DAT)/nhtiles.bmp - -TILEUTIL = $(TILOBJ) $(U)tile2bin $(U)til2bin2 $(TILE_BMP) - -TILEFILES = $(WSHR)/monsters.txt $(WSHR)/objects.txt $(WSHR)/other.txt - -TILEFILES2 = $(WSHR)/monthin.txt $(WSHR)/objthin.txt $(WSHR)/oththin.txt - -GIFREADERS = $(HOST_O)gifread.o $(HOST_O)alloc.o $(HOST_O)panic.o - -GIFREAD2 = $(HOST_O)gifread2.o $(HOST_O)alloc.o $(HOST_O)panic.o - -PPMWRITERS = $(HOST_O)ppmwrite.o $(HOST_O)alloc.o $(HOST_O)panic.o - -PPMWRIT2 = $(HOST_O)ppmwrit2.o $(HOST_O)alloc.o $(HOST_O)panic.o -endif - -#REGEX = $(O)pmatchregex.o -#REGEX = $(O)cppregex.o -REGEX = $(O)posixreg.o - -DLBOBJ = $(O)dlb.o - -# Object files for the game itself. - - -VOBJ01 = $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o $(O)attrib.o -VOBJ02 = $(O)ball.o $(O)bones.o $(O)botl.o $(O)cmd.o $(O)dbridge.o -VOBJ03 = $(O)decl.o $(O)detect.o $(O)display.o $(O)do.o $(O)do_name.o -VOBJ04 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o $(O)dothrow.o -VOBJ05 = $(O)drawing.o $(O)dungeon.o $(O)eat.o $(O)end.o $(O)engrave.o -VOBJ06 = $(O)exper.o $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o -VOBJ07 = $(O)getline.o $(O)hack.o $(O)hacklib.o $(O)invent.o $(O)lock.o -VOBJ08 = $(O)mail.o $(O)main.o $(O)makemon.o $(O)mapglyph.o $(O)mcastu.o $(O)mhitm.o -VOBJ09 = $(O)mhitu.o $(O)minion.o $(O)mkmap.o $(O)mklev.o $(O)mkmaze.o -VOBJ10 = $(O)mkobj.o $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o -VOBJ11 = $(O)monst.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o -VOBJ12 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o $(O)options.o -VOBJ13 = $(O)pickup.o $(O)pline.o $(O)polyself.o $(O)potion.o $(O)quest.o -VOBJ14 = $(O)questpgr.o $(O)pager.o $(O)pray.o $(O)priest.o $(O)read.o -VOBJ15 = $(O)rect.o $(O)restore.o $(O)rip.o $(O)rnd.o $(O)role.o -VOBJ16 = $(O)rumors.o $(O)save.o $(O)shk.o $(O)shknam.o $(O)sit.o -VOBJ17 = $(O)sounds.o $(O)sp_lev.o $(O)spell.o $(O)steal.o $(O)steed.o -VOBJ18 = $(O)termcap.o $(O)timeout.o $(O)topl.o $(O)topten.o $(O)track.o -VOBJ19 = $(O)trap.o $(O)u_init.o $(O)uhitm.o $(O)vault.o $(O)vision.o -VOBJ20 = $(O)vis_tab.o $(O)weapon.o $(O)were.o $(O)wield.o $(O)windows.o -VOBJ21 = $(O)wintty.o $(O)wizard.o $(O)worm.o $(O)worn.o $(O)write.o -VOBJ22 = $(O)zap.o $(O)light.o $(O)dlb.o $(O)dig.o $(O)teleport.o -VOBJ23 = $(O)region.o $(O)sys.o $(REGEX) $(O)isaac64.o - -SOBJ = $(O)msdos.o $(O)sound.o $(O)pcsys.o $(O)tty.o $(O)unix.o \ - $(O)video.o $(O)vidtxt.o $(O)pckeys.o - -VVOBJ = $(O)version.o - -ifeq "$(ADD_CURSES)" "Y" -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 -else -CURSESOBJ= -endif - -VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ - $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ - $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ - $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ - $(VOBJ21) $(VOBJ22) $(VOBJ23) \ - $(CURSESOBJ) - -ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(TILOBJ2) $(VVOBJ) - -ifeq "$(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) -PDCSRC = $(PDCURSES_TOP)/pdcurses -PDCDOS = $(PDCURSES_TOP)/dos -PDCLIBOBJS1 = $(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)getch.o -PDCLIBOBJS2 = $(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 -PDCLIBOBJS3 = $(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 -PDCLIBOBJS4 = $(O)touch.o $(O)util.o $(O)window.o $(O)debug.o -PDCLIBOBJS = $(PDCLIBOBJS1) $(PDCLIBOBJS2) $(PDCLIBOBJS3) $(PDCLIBOBJS4) - -PDCOBJS = $(O)pdcclip.o $(O)pdcdisp.o $(O)pdcgetsc.o $(O)pdckbd.o \ - $(O)pdcscrn.o $(O)pdcsetsc.o $(O)pdcutil.o - -#PDCOBJS = $(O)pdcclip.o $(O)pdcdisp.o $(O)pdcgetsc.o $(O)pdckbd.o $(O)pdcscrn.o \ -# $(O)pdcsetsc.o $(O)pdcutil.o - -PDCLIB = $(O)pdcurses.a - -#PDCINCL = -I$(PDCURSES_TOP) -I$(PDCSRC) -I$(PDCDOS) -PDCINCL = -I$(PDCURSES_TOP) -I$(PDCDOS) -else -PDCLIB = -endif - -#========================================== -# Header file macros -#========================================== - -PATCHLEV_H = $(INCL)/patchlev.h -DGN_FILE_H = $(INCL)/align.h $(INCL)/dgn_file.h -DUNGEON_H = $(INCL)/align.h $(INCL)/dungeon.h -MONDATA_H = $(INCL)/align.h $(INCL)/mondata.h -MONST_H = $(INCL)/align.h $(INCL)/monst.h $(INCL)/mextra.h -PERMONST_H = $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/align.h \ - $(INCL)/permonst.h -REGION_H = $(INCL)/region.h -RM_H = $(INCL)/align.h $(INCL)/rm.h -SKILLS_H = $(INCL)/skills.h -SP_LEV_H = $(INCL)/align.h $(INCL)/sp_lev.h -YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ - $(INCL)/pm.h $(INCL)/youprop.h -YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ - $(INCL)/attrib.h $(INCL)/you.h -DISPLAY_H = $(MONDATA_H) $(INCL)/vision.h $(INCL)/display.h -PCCONF_H = $(INCL)/micro.h $(INCL)/system.h $(INCL)/pcconf.h \ - $(MSYS)/pcvideo.h -CONFIG_H = $(GLOBAL_H) $(INCL)/tradstdc.h $(INCL)/config1.h \ - $(INCL)/config.h -DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ - $(INCL)/obj.h $(INCL)/onames.h $(INCL)/pm.h \ - $(INCL)/decl.h -GLOBAL_H = $(PCCONF_H) $(INCL)/coord.h $(INCL)/global.h -HACK_H = $(CONFIG_H) $(INCL)/context.h $(DUNGEON_H) \ - $(DECL_H) $(DISPLAY_H) $(INCL)/monsym.h \ - $(INCL)/mkroom.h $(INCL)/objclass.h $(INCL)/trap.h \ - $(INCL)/flag.h $(RM_H) $(INCL)/vision.h \ - $(INCL)/wintype.h $(INCL)/engrave.h $(INCL)/rect.h \ - $(INCL)/trampoli.h $(INCL)/hack.h $(REGION_H) \ - $(INCL)/sys.h -DLB_H = $(INCL)/dlb.h - -ifeq ($(SUPPRESS_GRAPHICS),Y) -TILE_H = -else -TILE_H = $(WSHR)/tile.h $(INCL)/tileset.h -endif - -ifeq ($(USE_DLB),Y) -DLB = dlb -DLBOBJS = $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o -else -DLB = -DLBOBJS = -endif - -ifdef DJGPP -DJ1 = $(dir $(DJGPP)) -CWSDPMI = $(subst /,\,$(DJ1))bin\CWSDPMI.* -endif - -#========================================== -# More compiler setup macros -#========================================== -# -ifeq "$(ADD_CURSES)" "Y" -CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" -else -CURSESDEF= -CURSESLIB= -endif - -INCLDIR=-I../include -I../sys/msdos - -# Debugging -#cflags = -pg -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS -#LFLAGS = -pg - -cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS -LFLAGS = - -# Debugging -#cflags = -g -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES -#LFLAGS = -g - -# Normal -cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES -LFLAGS = - -#========================================== -#================ RULES ================== -#========================================== - -.SUFFIXES: .o .til .uu .c .y .l - -#========================================== -# Rules for files in src -#========================================== - -$(OBJ)/%.o : %.c - $(TARGET_CC) $(cflags) -o$@ $< - -$(OBJ)/%.o : $(SRC)/%.c - $(TARGET_CC) $(cflags) -o$@ $< - -#========================================== -# Rules for files in sys/share -#========================================== - -$(OBJ)/%.o : $(SSHR)/%.c - $(TARGET_CC) $(cflags) -o$@ $< - -#========================================== -# Rules for files in sys/msdos -#========================================== - -$(OBJ)/%.o : $(MSYS)/%.c - $(TARGET_CC) $(cflags) -I../sys/msdos -o$@ $< - -#========================================== -# Rules for files in util -#========================================== - -$(OBJ)/%.o : $(UTIL)/%.c - $(TARGET_CC) $(cflags) -o$@ $< - -#========================================== -# Rules for files in win/share -#========================================== - -$(OBJ)/%.o : $(WSHR)/%.c - $(TARGET_CC) $(cflags) -I../win/share -o$@ $< - -#========================================== -# Rules for files in win/tty -#========================================== - -$(OBJ)/%.o : $(TTY)/%.c - $(TARGET_CC) $(cflags) -o$@ $< - -#========================================== -# Rules for files in win/curses -#========================================== - -$(OBJ)/%.o : $(WCURSES)/%.c - $(TARGET_CC) -DPDC_NCMOUSE $(PDCINCL) $(cflags) -o$@ $< - -#========================================== -# Rules for files in PDCurses -#========================================== - -$(OBJ)/%.o : $(PDCURSES_TOP)/%.c - $(TARGET_CC) $(PDCINCL) $(cflags) -o$@ $< - -$(OBJ)/%.o : $(PDCSRC)/%.c - $(TARGET_CC) $(PDCINCL) $(cflags) -o$@ $< - -$(OBJ)/%.o : $(PDCDOS)/%.c - $(TARGET_CC) $(PDCINCL) $(cflags) -o$@ $< - -#========================================== -# Primary Targets. -#========================================== - -# The default target. - -all : install - -install: $(GAMEFILE) $(O)install.tag - @echo Done. - -default: $(GAMEFILE) - -util: $(O)utility.tag - -#LEVCOMPEXE = $(U)lev_comp - -$(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/onames.h \ - $(INCL)/pm.h vis_tab.c $(TILEUTIL) - echo utilities made > $@ - -tileutil: $(U)gif2txt $(U)txt2ppm - @echo Optional tile development utilities are up to date. - -recover.exe: $(U)recover -# @$(subst /,\,if exist $(U)recover copy $(U)recover $(GAMEDIR)) -# @$(subst /,\,if exist $(DOC)/recover.txt copy $(DOC)/recover.txt $(GAMEDIR)) - -$(O)install.tag: $(DAT)/nhdat $(GAMEFILE) -ifeq ($(USE_DLB),Y) - cp $(DAT)/nhdat $(GAMEDIR) - cp $(DAT)/license $(GAMEDIR) -else - cp $(DAT)/*. $(GAMEDIR) - cp $(DAT)/*.dat $(GAMEDIR) - cp $(DAT)/*.lev $(GAMEDIR) - cp $(MSYS)/msdoshlp.txt $(GAMEDIR)) -endif -ifdef TERMLIB - cp $(SSHR)/termcap $(GAMEDIR)) -endif -# if [ -f $(TILE_BMP) ]; then rm $(TILE_BMP); fi; - if [ -f $(TILE_BMP) ]; then cp $(TILE_BMP) $(GAMEDIR); fi; - if [ -f $(DAT)/symbols ]; then cp $(DAT)/symbols $(GAMEDIR); fi; - if [ -f $(SSHR)/NetHack.cnf ]; then cp $(SSHR)/NetHack.cnf $(GAMEDIR); fi; - -touch $(GAMEDIR)/record - if [ -f ../sys/winnt/sysconf ]; then cp ../sys/winnt/sysconf $(GAMEDIR); fi; - if [ -f $(DOC)/nethack.txt ]; then cp $(DOC)/nethack.txt $(GAMEDIR); fi; -ifdef CWSDPMI - if [ -f $(CWSDPMI) ]; then cp $(CWSDPMI) $(GAMEDIR); fi; -else - @echo Could not find a copy of CWSDPMI.EXE to put into $(GAMEDIR) -endif - @echo install done > $@ - -#========================================== -# The main target. -#========================================== - -$(GAMEFILE): $(O)obj.tag $(PATCHLEV_H) $(PDCLIB) \ - $(O)utility.tag $(ALLOBJ) $(O)$(GAME).lnk - if [ -f temp.a ]; then rm temp.a; fi; - @ar r temp.a $(VOBJ01) - @ar r temp.a $(VOBJ02) - @ar r temp.a $(VOBJ03) - @ar r temp.a $(VOBJ04) - @ar r temp.a $(VOBJ05) - @ar r temp.a $(VOBJ06) - @ar r temp.a $(VOBJ07) - @ar r temp.a $(VOBJ08) - @ar r temp.a $(VOBJ09) - @ar r temp.a $(VOBJ10) - @ar r temp.a $(VOBJ11) - @ar r temp.a $(VOBJ12) - @ar r temp.a $(VOBJ13) - @ar r temp.a $(VOBJ14) - @ar r temp.a $(VOBJ15) - @ar r temp.a $(VOBJ16) - @ar r temp.a $(VOBJ17) - @ar r temp.a $(VOBJ18) - @ar r temp.a $(VOBJ19) - @ar r temp.a $(VOBJ20) - @ar r temp.a $(VOBJ21) - @ar r temp.a $(VOBJ22) - @ar r temp.a $(VOBJ23) - @ar r temp.a $(VOBJ24) - @ar r temp.a $(VOBJ25) - @ar r temp.a $(SOBJ) - @ar r temp.a $(TILOBJ) - @ar r temp.a $(TILOBJ2) - @ar r temp.a $(VVOBJ) -ifeq "$(ADD_CURSES)" "Y" - @ar r temp.a $(CURSESOBJ) -endif - $(TARGET_LINK) $(LFLAGS) -o$(GAME).exe temp.a $(PDCLIB) $(LIBRARIES) $(ZLIB) - $(TARGET_STUBEDIT) $(GAME).exe minstack=2048K - cp $(GAME).exe $(GAMEFILE) - rm $(GAME).exe - -$(O)$(GAME).lnk: $(ALLOBJ) - echo $(VOBJ01) > $(subst /,\,$@) - echo $(VOBJ02) >> $(subst /,\,$@) - echo $(VOBJ03) >> $(subst /,\,$@) - echo $(VOBJ04) >> $(subst /,\,$@) - echo $(VOBJ05) >> $(subst /,\,$@) - echo $(VOBJ06) >> $(subst /,\,$@) - echo $(VOBJ07) >> $(subst /,\,$@) - echo $(VOBJ08) >> $(subst /,\,$@) - echo $(VOBJ09) >> $(subst /,\,$@) - echo $(VOBJ10) >> $(subst /,\,$@) - echo $(VOBJ11) >> $(subst /,\,$@) - echo $(VOBJ12) >> $(subst /,\,$@) - echo $(VOBJ13) >> $(subst /,\,$@) - echo $(VOBJ14) >> $(subst /,\,$@) - echo $(VOBJ15) >> $(subst /,\,$@) - echo $(VOBJ16) >> $(subst /,\,$@) - echo $(VOBJ17) >> $(subst /,\,$@) - echo $(VOBJ18) >> $(subst /,\,$@) - echo $(VOBJ19) >> $(subst /,\,$@) - echo $(VOBJ20) >> $(subst /,\,$@) - echo $(VOBJ21) >> $(subst /,\,$@) - echo $(VOBJ22) >> $(subst /,\,$@) - echo $(VOBJ23) >> $(subst /,\,$@) - echo $(VOBJ24) >> $(subst /,\,$@) - echo $(VOBJ25) >> $(subst /,\,$@) - echo $(SOBJ) >> $(subst /,\,$@) - echo $(TILOBJ) >> $(subst /,\,$@) - echo $(TILOBJ2) >> $(subst /,\,$@) - echo $(VVOBJ) >> $(subst /,\,$@) -ifeq "$(ADD_CURSES)" "Y" - echo $(CURSESOBJ) >> $(subst /,\,$@) -endif - -#========================================== -#=========== SECONDARY TARGETS ============ -#========================================== -# -# The following include files depend on makedefs to be created. -# -# date.h should be remade every time any of the source or include -# files is modified. -# -# -#$(INCL)/date.h : $(U)makedefs -# -$(U)makedefs -v -# -#$(INCL)/onames.h: $(U)makedefs -# -$(U)makedefs -o -# -#$(INCL)/pm.h: $(U)makedefs -# -$(U)makedefs -p -# -#monstr.c: $(U)makedefs -# -$(U)makedefs -m -# -#$(INCL)/vis_tab.h: $(U)makedefs -# -$(U)makedefs -z -# -#vis_tab.c: $(U)makedefs -# -$(U)makedefs -z -# -#========================================== -# Level Compiler Dependencies -#========================================== -# -#$(U)lev_comp: $(SPLEVOBJS) -# -rm -f temp.a -# @ar ru temp.a $(SPLEVOBJS) -# $(HOST_LINK) $(LFLAGS) -o$@ temp.a -# -#$(HOST_O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h $(U)lev_yacc.c -# $(HOST_CC) $(cflags) -o$@ $(U)lev_yacc.c -# -#$(HOST_O)lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ -# $(U)lev_$(LEX).c -# $(HOST_CC) $(cflags) -o$@ $(U)lev_$(LEX).c -# -#$(HOST_O)lev_main.o: $(HACK_H) $(INCL)/sp_lev.h $(INCL)/date.h $(U)lev_main.c -# -#$(U)lev_yacc.c: $(SSHR)/lev_yacc.c -# @echo --- -# @echo For now, we will copy the prebuilt -# @echo lev_comp.c from $(SSHR) into $(U) and use that. -# @cp $(SSHR)/lev_yacc.c $(U)lev_yacc.c -# @echo.>>$(U)lev_yacc.c -# -#$(INCL)/lev_comp.h : $(SSHR)/lev_comp.h -# @echo For now, we will copy the prebuilt lev_comp.h -# @echo from $(SSHR) into $(INCL) and use that. -# @cp $(SSHR)/lev_comp.h $@ -#$(U)lev_lex.c: $(SSHR)/lev_lex.c -# @echo.>>$(INCL)/lev_comp.h -# @echo For now, we will copy the prebuilt lev_lex.c -# @echo from $(SSHR) into $(U) and use it. -# @cp $(SSHR)/lev_lex.c $@ -# @echo.>>$@ -# -#========================================== -# Dungeon Dependencies -#========================================== -# -#$(U)dgn_comp: $(DGNCOMPOBJS) -# $(HOST_LINK) $(LFLAGS) -o$@ $(DGNCOMPOBJS) -# -#$(U)dgn_yacc.c: $(SSHR)/dgn_yacc.c -# @echo --- -# @echo For now, we will copy the prebuilt $(U)dgn_yacc.c and -# @echo dgn_comp.h from $(SSHR) into $(U) and use that. -# @cp $(SSHR)/dgn_yacc.c $(U)dgn_yacc.c -# @echo.>>$(U)dgn_yacc.c -# -#$(INCL)/dgn_comp.h: $(SSHR)/dgn_comp.h -# @echo --- -# @echo For now, we will copy the prebuilt dgn_comp.h -# @echo from $(SSHR) into $(INCL) and use that. -# @cp $(SSHR)/dgn_comp.h $@ -# @echo.>>$(INCL)/dgn_comp.h -# -#$(U)dgn_$(LEX).c: $(SSHR)/dgn_lex.c $(INCL)/dgn_comp.h -# @echo --- -# @echo For now, we will copy the prebuilt dgn_lex.c -# @echo from $(SSHR) into $(U) and use it. -# @cp $(SSHR)/dgn_lex.c $@ -# @echo.>>$@ - -#========================================== -# Recover Utility -#========================================== - -$(U)recover.exe: $(RECOVOBJS) - $(TARGET_LINK) $(LFLAGS) -o$@ $(O)recover.o - -$(O)recover.o: $(CONFIG_H) $(U)recover.c - $(TARGET_CC) $(cflags) -o$@ $(U)recover.c - -#========================================== -# Header file moves required for tile support -#========================================== - -ifeq ($(SUPPRESS_GRAPHICS),Y) - -else -# -# Tile Mapping -# - -#$(SRC)/tile.c: $(U)tilemap -# @$(U)tilemap -# @echo A new $@ has been created - -endif - -#========================================== -# PDCurses Library -#========================================== - -$(O)pdcurses.a : $(PDCLIBOBJS) $(PDCOBJS) - ar rcS $@ $(PDCLIBOBJS1) - ar rcS $@ $(PDCLIBOBJS2) - ar rcS $@ $(PDCLIBOBJS3) - ar rcS $@ $(PDCLIBOBJS4) - ar rcs $@ $(PDCOBJS) - -#========================================== -# Other Util Dependencies. -#========================================== - -$(O)alloc.o: $(CONFIG_H) alloc.c - $(TARGET_CC) $(cflags) -o$@ alloc.c - -$(O)drawing.o: $(CONFIG_H) drawing.c $(MSYS)/pcvideo.h - $(TARGET_CC) $(cflags) -I$(MSYS) -o$@ drawing.c - -$(O)decl.o: $(CONFIG_H) decl.c - $(TARGET_CC) $(cflags) -o$@ decl.c - -$(O)monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/monsym.h \ - $(INCL)/color.h monst.c - $(TARGET_CC) $(cflags) -o$@ monst.c - -$(O)objects.o: $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ - $(INCL)/prop.h $(INCL)/color.h objects.c - $(TARGET_CC) $(cflags) -o$@ objects.c - -$(O)dat.tag: $(DAT)/nhdat - @echo dat done >$@ - -#$(HOST_O)monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/monsym.h \ -# $(INCL)/color.h monst.c -# $(HOST_CC) $(cflags) -o$@ monst.c - -#$(HOST_O)objects.o: $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ -# $(INCL)/prop.h $(INCL)/color.h objects.c -# $(HOST_CC) $(cflags) -o$@ objects.c - -#$(O)panic.o: $(CONFIG_H) $(U)panic.c - -# make data.base an 8.3 filename to prevent an make warning -#DATABASE = $(DAT)/data.bas -# -# -# -#$(DAT)/data: $(O)utility.tag $(DATABASE) -# $(U)makedefs -d -# -#$(DAT)/rumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal -# $(U)makedefs -r -# -#$(DAT)/quest.dat: $(O)utility.tag $(DAT)/quest.txt -# $(U)makedefs -q -# -#$(DAT)/oracles: $(O)utility.tag $(DAT)/oracles.txt -# $(U)makedefs -h -# -#$(DAT)/bogusmon: $(O)utility.tag $(DAT)/bogusmon.txt -# $(U)makedefs -s -# -#$(DAT)/engrave: $(O)utility.tag $(DAT)/engrave.txt -# $(U)makedefs -s -# -#$(DAT)/epitaph: $(O)utility.tag $(DAT)/epitaph.txt -# $(U)makedefs -s -# -#$(O)sp_lev.tag: $(O)utility.tag \ -# $(DAT)/bigroom.des $(DAT)/castle.des \ -# $(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des \ -# $(DAT)/medusa.des $(DAT)/oracle.des $(DAT)/tower.des \ -# $(DAT)/yendor.des $(DAT)/arch.des $(DAT)/barb.des \ -# $(DAT)/caveman.des $(DAT)/healer.des $(DAT)/knight.des \ -# $(DAT)/monk.des $(DAT)/priest.des $(DAT)/ranger.des \ -# $(DAT)/rogue.des $(DAT)/samurai.des $(DAT)/tourist.des \ -# $(DAT)/valkyrie.des $(DAT)/wizard.des -# cd $(DAT) -# $(U)lev_comp bigroom.des -# $(U)lev_comp castle.des -# $(U)lev_comp endgame.des -# $(U)lev_comp gehennom.des -# $(U)lev_comp knox.des -# $(U)lev_comp mines.des -# $(U)lev_comp medusa.des -# $(U)lev_comp oracle.des -# $(U)lev_comp sokoban.des -# $(U)lev_comp tower.des -# $(U)lev_comp yendor.des -# $(U)lev_comp arch.des -# $(U)lev_comp barb.des -# $(U)lev_comp caveman.des -# $(U)lev_comp healer.des -# $(U)lev_comp knight.des -# $(U)lev_comp monk.des -# $(U)lev_comp priest.des -# $(U)lev_comp ranger.des -# $(U)lev_comp rogue.des -# $(U)lev_comp samurai.des -# $(U)lev_comp tourist.des -# $(U)lev_comp valkyrie.des -# $(U)lev_comp wizard.des -# cd $(SRC) -# echo sp_levs done > $@ -# -#$(DAT)/dungeon: $(O)utility.tag $(DAT)/dungeon.def -# $(U)makedefs -e -# cd $(DAT) -# $(U)dgn_comp dungeon.pdf -# cd $(SRC) - -#========================================== -# DLB stuff -#========================================== - -#note that dir below assumes bin/dir from djgpp distribution -# -#$(DAT)/nhdat: $(U)dlb_main $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ -# $(DAT)/oracles $(DAT)/quest.dat $(O)sp_lev.tag \ -# $(DAT)/bogusmon $(DAT)/engrave $(DAT)/epitaph $(DAT)/tribute -# echo dat done >$(O)dat.tag -# cd $(DAT) -# copy $(MSYS)/msdoshlp.txt . -# @$(LS) data dungeon oracles options quest.dat rumors help hh >dlb.lst -# @$(LS) cmdhelp history opthelp wizhelp license msdoshlp.txt >>dlb.lst -# @$(LS) bogusmon engrave epitaph tribute >>dlb.lst -# $(LS) $(subst /,\,*.lev) >>dlb.lst -# $(U)dlb_main cvIf dlb.lst nhdat -# cd $(SRC) -# -#$(U)dlb_main: $(DLBOBJS) -# $(HOST_LINK) $(LFLAGS) -o$@ $(DLBOBJS) -# -#$(HOST_O)dlb_main.o: $(U)dlb_main.c $(INCL)/config.h $(DLB_H) -# $(HOST_CC) $(cflags) -o$@ $(U)dlb_main.c - -#========================================== -# Housekeeping. -#========================================== - -clean: - rm ./o/*.o - if [ -f $(O)install.tag ]; then rm $(O)install.tag; fi; - if [ -f $(O)obj.tag ]; then rm $(O)obj.tag; fi; - if [ -f $(O)$(GAME).lnk ]; then rm temp.a; fi; - if [ -f temp.a ]; then rm temp.a; fi; - -spotless: clean - - if [ -f dgn_flex.c ]; then rm dgn_flex.c; fi; - if [ -f dgn_lex.c ]; then rm dgn_lex.c; fi; - if [ -f $(U)dgn_comp.exe ]; then rm $(U)dgn_comp.exe; fi; - if [ -f $(U)recover.exe ]; then rm $(U)recover.exe; fi; - if [ -f $(INCL)/vis_tab.h ]; then rm $(INCL)/vis_tab.h; fi; - if [ -f $(INCL)/onames.h ]; then rm $(INCL)/onames.h; fi; - if [ -f $(INCL)/pm.h ]; then rm $(INCL)/pm.h; fi; - if [ -f $(INCL)/date.h ]; then rm $(INCL)/date.h; fi; - if [ -f $(INCL)/dgn_comp.h ]; then rm $(INCL)/dgn_comp.h; fi; - if [ -f $(INCL)/lev_comp.h ]; then rm $(INCL)/lev_comp.h; fi; -# if [ -f $(SRC)/monstr.c ]; then rm $(SRC)/monstr.c; fi; - if [ -f $(SRC)/vis_tab.c ]; then rm $(SRC)/vis_tab.c; fi; - if [ -f $(SRC)/tile.c ]; then rm $(SRC)/tile.c; fi; - if [ -f $(DAT)/options ]; then rm $(DAT)/options; fi; - if [ -f $(DAT)/data ]; then rm $(DAT)/data; fi; - if [ -f $(DAT)/rumors ]; then rm $(DAT)/rumors; fi; - if [ -f $(DAT)/dungeon.pdf ]; then rm $(DAT)/dungeon.pdf; fi; - if [ -f $(DAT)/dungeon ]; then rm $(DAT)/dungeon; fi; - if [ -f $(DAT)/oracles ]; then rm $(DAT)/oracles; fi; - if [ -f $(DAT)/quest.dat ]; then rm $(DAT)/quest.dat; fi; - if [ -f $(DAT)/bogusmon ]; then rm $(DAT)/bogusmon; fi; - if [ -f $(DAT)/engrave ]; then rm $(DAT)/engrave; fi; - if [ -f $(DAT)/epitaph ]; then rm $(DAT)/epitaph; fi; - if [ -f $(DAT)/dlb.lst ]; then rm $(DAT)/dlb.lst; fi; - if [ -f $(TILE_BMP) ]; then rm $(TILE_BMP); fi; - if [ -f $(WSHR)/monthin.txt ]; then rm $(WSHR)/monthin.txt; fi; - if [ -f $(WSHR)/objthin.txt ]; then rm $(WSHR)/objthin.txt; fi; - if [ -f $(WSHR)/oththin.txt ]; then rm $(WSHR)/oththin.txt; fi; - -rm $(DAT)/*.lev - -#========================================== -# Create directory for holding object files -#========================================== - -$(O)obj.tag: - -mkdir -p $(OBJ) - @echo directory ready $(OBJ) - -#========================================== -# Game Dependencies -#========================================== - -# sys/share -$(O)main.o: $(HACK_H) $(DLB_H) $(SSHR)/pcmain.c - $(TARGET_CC) $(cflags) -o$@ $(SSHR)/pcmain.c - -$(O)tty.o: $(HACK_H) $(INCL)/wintty.h $(SSHR)/pctty.c - $(TARGET_CC) $(cflags) -o$@ $(SSHR)/pctty.c - -$(O)unix.o: $(HACK_H) $(SSHR)/pcunix.c - $(TARGET_CC) $(cflags) -o$@ $(SSHR)/pcunix.c - -$(O)pcsys.o : $(HACK_H) $(SSHR)/pcsys.c - $(TARGET_CC) $(cflags) -o$@ $(SSHR)/pcsys.c - -$(O)posixreg.o : $(HACK_H) $(SSHR)/posixreg.c - $(TARGET_CC) $(cflags) -o$@ $(SSHR)/posixreg.c - -$(O)cppregex.o : $(HACK_H) $(SSHR)/cppregex.cpp - gpp $(cflags) -std=c++11 -o$@ $(SSHR)/cppregex.cpp - -$(O)pmatchre.o : $(HACK_H) $(SSHR)/pmatchre.c - $(TARGET_CC) $(cflags) -o$@ $(SSHR)/pmatchre.c - -# sys/msdos -$(O)msdos.o : $(HACK_H) $(MSYS)/msdos.c -$(O)pckeys.o : $(HACK_H) $(MSYS)/pckeys.c -$(O)pctiles.o : $(HACK_H) $(MSYS)/pctiles.c $(MSYS)/portio.h - $(TARGET_CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/pctiles.c -$(O)sound.o : $(HACK_H) $(MSYS)/sound.c $(MSYS)/portio.h -$(O)video.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(MSYS)/video.c -$(O)vidvga.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidvga.c - $(TARGET_CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/vidvga.c -$(O)vidvesa.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidvesa.c - $(TARGET_CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/vidvesa.c -$(O)vidtxt.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidtxt.c -$(O)stubvid.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/video.c - $(TARGET_CC) $(cflags) -I$(MSYS) -DSTUBVIDEO -o$@ $(MSYS)/video.c -# -# The rest are stolen from sys/unix/Makefile.src, -# with the following changes: -# o -c (which is included in cflags) substituted with -o$@ , -# o an explicit build instruction for dlb.o because it requires -# a .h file in ../sys/msdos. -# o the PATCHLEV_H macro is substitued for $(INCL)/patchlevel.h -# to work around a long filename issue. -# o $(CFLAGS) changed to $(cflags) -# Other than that, these dependencies are untouched. -# That means that there is some irrelevant stuff -# in here, but maintenance should be easier. -# -# -# src dependencies -#$(O)tos.o: ../sys/atari/tos.c $(HACK_H) $(INCL)/tcap.h - $(TARGET_CC) $(cflags) -o$@ ../sys/atari/tos.c -$(O)pcmain.o: ../sys/share/pcmain.c $(HACK_H) $(INCL)/dlb.h \ - #$(INCL)/win32api.h - $(TARGET_CC) $(cflags) -o$@ ../sys/share/pcmain.c -$(O)pctty.o: ../sys/share/pctty.c $(HACK_H) - $(TARGET_CC) $(cflags) -o$@ ../sys/share/pctty.c -$(O)pcunix.o: ../sys/share/pcunix.c $(HACK_H) - $(TARGET_CC) $(cflags) -o$@ ../sys/share/pcunix.c -$(O)random.o: ../sys/share/random.c $(HACK_H) - $(TARGET_CC) $(cflags) -o$@ ../sys/share/random.c -$(O)ioctl.o: ../sys/share/ioctl.c $(HACK_H) $(INCL)/tcap.h - $(TARGET_CC) $(cflags) -o$@ ../sys/share/ioctl.c -$(O)unixtty.o: ../sys/share/unixtty.c $(HACK_H) - $(TARGET_CC) $(cflags) -o$@ ../sys/share/unixtty.c -$(O)unixmain.o: ../sys/unix/unixmain.c $(HACK_H) $(INCL)/dlb.h - $(TARGET_CC) $(cflags) -o$@ ../sys/unix/unixmain.c -$(O)unixunix.o: ../sys/unix/unixunix.c $(HACK_H) - $(TARGET_CC) $(cflags) -o$@ ../sys/unix/unixunix.c -$(O)unixres.o: ../sys/unix/unixres.c $(CONFIG_H) - $(TARGET_CC) $(cflags) -o$@ ../sys/unix/unixres.c -$(O)bemain.o: ../sys/be/bemain.c $(HACK_H) $(INCL)/dlb.h - $(TARGET_CC) $(cflags) -o$@ ../sys/be/bemain.c -$(O)getline.o: ../win/tty/getline.c $(HACK_H) $(INCL)/func_tab.h - $(TARGET_CC) $(cflags) -o$@ ../win/tty/getline.c -$(O)termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h - $(TARGET_CC) $(cflags) -o$@ ../win/tty/termcap.c -$(O)topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h - $(TARGET_CC) $(cflags) -o$@ ../win/tty/topl.c -$(O)wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/date.h $(PATCHLEV_H) $(INCL)/tcap.h - $(TARGET_CC) $(cflags) -o$@ ../win/tty/wintty.c -$(O)Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \ - $(CONFIG_H) - $(TARGET_CC) $(cflags) -o$@ ../win/X11/Window.c -$(O)dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) - $(TARGET_CC) $(cflags) -o$@ ../win/X11/dialogs.c -$(O)winX.o: ../win/X11/winX.c $(HACK_H) $(INCL)/winX.h $(INCL)/dlb.h \ - $(PATCHLEV_H) ../win/X11/nh72icon \ - ../win/X11/nh56icon ../win/X11/nh32icon - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winX.c -$(O)winmap.o: ../win/X11/winmap.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/winX.h $(INCL)/tile2x11.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winmap.c -$(O)winmenu.o: ../win/X11/winmenu.c $(HACK_H) $(INCL)/winX.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winmenu.c -$(O)winmesg.o: ../win/X11/winmesg.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/winX.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winmesg.c -$(O)winmisc.o: ../win/X11/winmisc.c $(HACK_H) $(INCL)/func_tab.h \ - $(INCL)/winX.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winmisc.c -$(O)winstat.o: ../win/X11/winstat.c $(HACK_H) $(INCL)/winX.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winstat.c -$(O)wintext.o: ../win/X11/wintext.c $(HACK_H) $(INCL)/winX.h $(INCL)/xwindow.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/wintext.c -$(O)winval.o: ../win/X11/winval.c $(HACK_H) $(INCL)/winX.h - $(TARGET_CC) $(cflags) -o$@ ../win/X11/winval.c -$(O)tile.o: tile.c $(HACK_H) -$(HOST_O)tile.o: tile.c $(HACK_H) -$(O)gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ - ../win/gnome/gnmain.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnaskstr.c -$(O)gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ - ../win/gnome/gnaskstr.h ../win/gnome/gnyesno.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnbind.c -$(O)gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h $(INCL)/tile2x11.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnglyph.c -$(O)gnmain.o: ../win/gnome/gnmain.c ../win/gnome/gnmain.h ../win/gnome/gnsignal.h \ - ../win/gnome/gnbind.h ../win/gnome/gnopts.h $(HACK_H) \ - $(INCL)/date.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmain.c -$(O)gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h $(HACK_H) - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmap.c -$(O)gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ - ../win/gnome/gnbind.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmenu.c -$(O)gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmesg.c -$(O)gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnopts.c -$(O)gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ - ../win/gnome/gnmain.h $(HACK_H) - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnplayer.c -$(O)gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ - ../win/gnome/gnmain.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnsignal.c -$(O)gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ - ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ - ../win/gnome/gnomeprv.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnstatus.c -$(O)gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ - ../win/gnome/gn_rip.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gntext.c -$(O)gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnworn.c -$(O)gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h - $(TARGET_CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnyesno.c -$(O)wingem.o: ../win/gem/wingem.c $(HACK_H) $(INCL)/func_tab.h $(INCL)/dlb.h \ - $(PATCHLEV_H) $(INCL)/wingem.h - $(TARGET_CC) $(cflags) -o$@ ../win/gem/wingem.c -$(O)wingem1.o: ../win/gem/wingem1.c $(INCL)/gem_rsc.h $(INCL)/load_img.h \ - $(INCL)/gr_rect.h $(INCL)/wintype.h $(INCL)/wingem.h - $(TARGET_CC) $(cflags) -o$@ ../win/gem/wingem1.c -$(O)load_img.o: ../win/gem/load_img.c $(INCL)/load_img.h - $(TARGET_CC) $(cflags) -o$@ ../win/gem/load_img.c -$(O)gr_rect.o: ../win/gem/gr_rect.c $(INCL)/gr_rect.h - $(TARGET_CC) $(cflags) -o$@ ../win/gem/gr_rect.c -$(O)tile.o: tile.c $(HACK_H) -$(O)qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) $(INCL)/func_tab.h \ - $(INCL)/dlb.h $(PATCHLEV_H) $(INCL)/tile2x11.h \ - $(INCL)/qt_win.h $(INCL)/qt_clust.h $(INCL)/qt_kde0.h \ - $(INCL)/qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_win.cpp -$(O)qt_clust.o: ../win/Qt/qt_clust.cpp $(INCL)/qt_clust.h - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_clust.cpp -$(O)qttableview.o: ../win/Qt/qttableview.cpp $(INCL)/qttableview.h - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qttableview.cpp -#$(O)monstr.o: monstr.c $(CONFIG_H) -$(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h -$(O)allmain.o: allmain.c $(HACK_H) -$(O)alloc.o: alloc.c $(CONFIG_H) -$(O)apply.o: apply.c $(HACK_H) -$(O)artifact.o: artifact.c $(HACK_H) $(INCL)/artifact.h $(INCL)/artilist.h -$(O)attrib.o: attrib.c $(HACK_H) -$(O)ball.o: ball.c $(HACK_H) -$(O)bones.o: bones.c $(HACK_H) $(INCL)/lev.h -$(O)botl.o: botl.c $(HACK_H) -$(O)cmd.o: cmd.c $(HACK_H) $(INCL)/func_tab.h -$(O)dbridge.o: dbridge.c $(HACK_H) -$(O)decl.o: decl.c $(HACK_H) -$(O)detect.o: detect.c $(HACK_H) $(INCL)/artifact.h -$(O)dig.o: dig.c $(HACK_H) -$(O)display.o: display.c $(HACK_H) -$(O)dlb.o: dlb.c $(CONFIG_H) $(INCL)/dlb.h - $(TARGET_CC) $(cflags) -I../sys/msdos -o$@ dlb.c -$(O)do.o: do.c $(HACK_H) $(INCL)/lev.h -$(O)do_name.o: do_name.c $(HACK_H) -$(O)do_wear.o: do_wear.c $(HACK_H) -$(O)dog.o: dog.c $(HACK_H) -$(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)/mfndpos.h -$(O)dokick.o: dokick.c $(HACK_H) -$(O)dothrow.o: dothrow.c $(HACK_H) -$(O)drawing.o: drawing.c $(HACK_H) $(INCL)/tcap.h -$(O)dungeon.o: dungeon.c $(HACK_H) $(INCL)/dgn_file.h $(INCL)/dlb.h -$(O)eat.o: eat.c $(HACK_H) -$(O)end.o: end.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h -$(O)engrave.o: engrave.c $(HACK_H) $(INCL)/lev.h -$(O)exper.o: exper.c $(HACK_H) -$(O)explode.o: explode.c $(HACK_H) -$(O)extralev.o: extralev.c $(HACK_H) -$(O)files.o: files.c $(HACK_H) $(INCL)/dlb.h -$(O)fountain.o: fountain.c $(HACK_H) -$(O)hack.o: hack.c $(HACK_H) -$(O)hacklib.o: hacklib.c $(HACK_H) -$(O)invent.o: invent.c $(HACK_H) -$(O)light.o: light.c $(HACK_H) $(INCL)/lev.h -$(O)lock.o: lock.c $(HACK_H) -$(O)mail.o: mail.c $(HACK_H) $(INCL)/mail.h -$(O)makemon.o: makemon.c $(HACK_H) -$(O)mapglyph.o: mapglyph.c $(HACK_H) -$(O)mcastu.o: mcastu.c $(HACK_H) -$(O)mhitm.o: mhitm.c $(HACK_H) $(INCL)/artifact.h -$(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)/artifact.h -$(O)minion.o: minion.c $(HACK_H) -$(O)mklev.o: mklev.c $(HACK_H) -$(O)mkmap.o: mkmap.c $(HACK_H) $(INCL)/sp_lev.h -$(O)mkmaze.o: mkmaze.c $(HACK_H) $(INCL)/sp_lev.h $(INCL)/lev.h -$(O)mkobj.o: mkobj.c $(HACK_H) -$(O)mkroom.o: mkroom.c $(HACK_H) -$(O)mon.o: mon.c $(HACK_H) $(INCL)/mfndpos.h -$(O)mondata.o: mondata.c $(HACK_H) -$(O)monmove.o: monmove.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/artifact.h -$(O)monst.o: monst.c $(CONFIG_H) $(INCL)/permonst.h $(INCL)/align.h \ - $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/monsym.h \ - $(INCL)/color.h -$(O)mplayer.o: mplayer.c $(HACK_H) -$(O)mthrowu.o: mthrowu.c $(HACK_H) -$(O)muse.o: muse.c $(HACK_H) -$(O)music.o: music.c $(HACK_H) #interp.c -$(O)o_init.o: o_init.c $(HACK_H) $(INCL)/lev.h -$(O)objects.o: objects.c $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ - $(INCL)/prop.h $(INCL)/skills.h $(INCL)/color.h -$(O)objnam.o: objnam.c $(HACK_H) -$(O)options.o: options.c $(CONFIG_H) $(INCL)/objclass.h $(INCL)/flag.h \ - $(HACK_H) $(INCL)/tcap.h -$(O)pager.o: pager.c $(HACK_H) $(INCL)/dlb.h -$(O)pickup.o: pickup.c $(HACK_H) -$(O)pline.o: pline.c $(HACK_H) -$(O)polyself.o: polyself.c $(HACK_H) -$(O)potion.o: potion.c $(HACK_H) -$(O)pray.o: pray.c $(HACK_H) -$(O)priest.o: priest.c $(HACK_H) $(INCL)/mfndpos.h -$(O)quest.o: quest.c $(HACK_H) $(INCL)/qtext.h -$(O)questpgr.o: questpgr.c $(HACK_H) $(INCL)/dlb.h $(INCL)/qtext.h -$(O)read.o: read.c $(HACK_H) -$(O)rect.o: rect.c $(HACK_H) -$(O)region.o: region.c $(HACK_H) $(INCL)/lev.h -$(O)restore.o: restore.c $(HACK_H) $(INCL)/lev.h $(INCL)/tcap.h -$(O)rip.o: rip.c $(HACK_H) -$(O)rnd.o: rnd.c $(HACK_H) -$(O)role.o: role.c $(HACK_H) -$(O)rumors.o: rumors.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h -$(O)save.o: save.c $(HACK_H) $(INCL)/lev.h -$(O)shk.o: shk.c $(HACK_H) -$(O)shknam.o: shknam.c $(HACK_H) -$(O)sit.o: sit.c $(HACK_H) $(INCL)/artifact.h -$(O)sounds.o: sounds.c $(HACK_H) -$(O)sp_lev.o: sp_lev.c $(HACK_H) $(INCL)/dlb.h $(INCL)/sp_lev.h -$(O)spell.o: spell.c $(HACK_H) -$(O)steal.o: steal.c $(HACK_H) -$(O)steed.o: steed.c $(HACK_H) -$(O)sys.o: sys.c $(HACK_H) -$(O)teleport.o: teleport.c $(HACK_H) -$(O)timeout.o: timeout.c $(HACK_H) $(INCL)/lev.h -$(O)topten.o: topten.c $(HACK_H) $(INCL)/dlb.h $(PATCHLEV_H) -$(O)track.o: track.c $(HACK_H) -$(O)trap.o: trap.c $(HACK_H) -$(O)u_init.o: u_init.c $(HACK_H) -$(O)uhitm.o: uhitm.c $(HACK_H) -$(O)vault.o: vault.c $(HACK_H) -$(O)version.o: version.c $(HACK_H) $(INCL)/date.h $(PATCHLEV_H) -$(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)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) -$(O)write.o: write.c $(HACK_H) -$(O)zap.o: zap.c $(HACK_H) -$(O)pmatchre.o: $(SSHR)/pmatchre.c $(HACK_H) -$(O)tileset.o: $(WSHR)/tileset.c $(HACK_H) -$(O)bmptiles.o: $(WSHR)/bmptiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h -$(O)giftiles.o: $(WSHR)/giftiles.c $(INCL)/config.h $(INCL)/tileset.h $(INCL)/integer.h - -# end of file - diff --git a/sys/msdos/SCHEMA35.MSC b/sys/msdos/SCHEMA35.MSC deleted file mode 100644 index 9f9c37d31..000000000 --- a/sys/msdos/SCHEMA35.MSC +++ /dev/null @@ -1,520 +0,0 @@ -; Copyright (c) NetHack PC Development Team, 2000 -; -; NetHack Overlay Schema -; This overlay schema is for use only when NetHack is built -; using packaged-functions for function-level linking. -; -; Overlay tuning level: 0 -; -functions:0 _main _dosave0 _moveloop _bwrite _random _rn2 _newsym _show_glyph _on_level _txt_gotoxy _txt_get_cursor -functions:0 _xputc _txt_xputc _t_at _tty_curs _acurr _dist2 _tty_print_glyph _isok _back_to_glyph -functions:0 _show_map_spot _adjust_cursor_flags _lowc _g_putch _has_color _is_pool _mread -functions:0 _is_lava _welded _magic_map_background _end_glyphout _visible_region_at _domove -functions:0 _engr_at _rnd _run_regions _mcalcmove _depth _done _distmin _does_block _eos -functions:0 _move _move_bc _in_rooms _map_background _map_invisible _map_location _alloc -functions:0 _impossible _in_container _in_fcorridor _In_hell _In_mines _in_or_out_menu _In_quest -functions:0 _do_positionbar _iswall _iswall_or_stone _itimeout _is_solid _Is_special -functions:0 _is_swallow_sym _check_here _check_leash _check_map_spot _check_pos -functions:0 _monsndx _m_move _lcase _tty_create_nhwindow _tty_delay_output _tty_destroy_nhwindow -functions:0 _tty_dismiss_nhwindow _gender _genl_outrip _get_cost _get_free_room_loc _get_level -functions:0 _get_location _get_map _get_mleash -; -functions:1 _move_update _movebubbles _movecmd _movemon _moverock _movobj _mpickgold -functions:1 _doaltarobj _doapply _dobreathe _docall _docast -; -functions:2 _do_vicinity_map -functions:3 _pcmain -functions:4 _spell_let_to_idx _cursed_book _deadbook _learn _getspell _spelltypemnemonic -functions:5 _dospellmenu _percent_success _throwspell _cast_protection _isqrt -; -functions:6 _a_gname _a_gname_at _a_monnam _abon _abuse_dog _accessible _activate_statue_trap -functions:7 _add_branch _add_damage _add_debug_extended_commands _add_door _add_id_mapping _add_level -functions:8 _add_menu_cmd_alias _add_one_tobill _add_rect _add_room _add_subroom _add_to_billobjs _add_to_buried _add_to_container -functions:9 _add_to_migration _add_to_minv _add_valid_menu_class _add_weapon_skill _addinv _addtobill _addtopl _addupbill -functions:10 _Adjmonnam -functions:11 _align_gname -functions:12 _altar_wrath _Amonnam _amulet _Amulet_off _Amulet_on _An _an _angry_guards -functions:13 _angry_priest _angry_shk_exists _any_light_source _aobjnam _append_slash _append_str _Armor_gone _Armor_off -functions:14 _Armor_on _armor_to_dragon _armoroff _arti_invoke _artifact_exists _artifact_hit _artifact_name _artiname -functions:15 _artitouch _askchain _assign_graphics _assign_level _assign_rnd_level _assign_soundcard _assign_video -functions:16 _assign_videocolors _assign_videoshades _assigninvlet _at_dgn_entrance _attach_egg_hatch_timeout _attack _attack_checks _attacks -functions:17 _awaken_monsters _awaken_soldiers -functions:18 _backfire _backsp _bad_location _bad_negation _bad_rock _badoption _bail _ballfall -functions:19 _bc_order _bclose _bcsign _beg _begin_burn _bflush _bhit _bhitm -functions:20 _bhito _bhitpile _big_to_little _bill_box_content _bill_dummy_object _bite _bless _blessorcurse -functions:21 _Blindf_off _Blindf_on _block_door _block_entry _block_point _blow_up_landmine _body_part -functions:22 _boomhit _Boots_off _Boots_on _bot _boulder_hits_pool _bound_digging -functions:23 _boxlock _br_string _break_armor _break_statue _breakarm _breakmsg -functions:24 _breakobj _breaks _breaksink _breaktest _breamu _bribe _bufoff _bufon -functions:25 _build_room _burn_floor_paper _burn_object _burnarmor _bury_an_obj _bury_objs _buzz _buzzmu -functions:26 _Can_dig_down -functions:27 _Can_fall_thru _can_make_bones _can_ooze _can_pray _can_reach_floor _Can_rise_up _can_track -functions:28 _cancel_bonesfile _cancel_don _cancel_item _cancel_monst _candle_light_range _canletgo _canwearobj -functions:29 _carry_count _carrying _castmu _ceiling _center _change_inv_order _change_luck _change_sex -functions:30 _charm_monsters _charm_snakes _chat_with_guardian _chat_with_leader _chat_with_nemesis _chdirx _chdrive _cheapest_item -functions:31 _check_capacity _check_contained _check_credit _check_recordfile -functions:32 _check_room _check_shop_obj _check_special_room _check_unpaid _check_unpaid_usage _check_version _checkfile _chest_shatter_msg -functions:33 _chest_trap _choke _choke_dialogue _choose_classes_menu _choose_windows _christen_monst _chwepon _ck_bag -functions:34 _ckmailstatus _ckunpaid _cl_end _cl_eos _classmon _clear_fcorr _clear_glyph_buffer -functions:35 _clear_id_mapping _clear_level_structures _clear_path _clear_screen _clear_stale_map _clear_unpaid _clearlocks _clearpriests -functions:36 _click_to_cmd _Cloak_off _Cloak_on _clone_mon _cloneu _clonewiz _close_drawbridge _close_library -functions:37 _closed_door _CloseTileFile _cls _cmov _cnv_trap_obj _co_false _collect_obj_classes _com_pager -functions:38 _commit_bonesfile _compactify _compress_bonesfile _compress_str _comspec_exists _confdir _construct_qtlist -functions:39 _consume_offering _contained _contained_cost _contained_gold _container_contents _container_weight _convert_arg _convert_line -functions:40 _copybones _copyfile _corpse_chance _corpse_xname _corr _correct_branch_type _cost _cost_per_charge -functions:41 _costly_gold _costly_spot _could_seduce _count_categories _count_obj _count_unpaid _count_wsegs -functions:42 _counter_were _courtmon _cpostfx _cprefx _create_altar _create_bonesfile _create_corridor _create_critters -functions:43 _create_door _create_drawbridge _create_engraving _create_feature _create_gold _create_levelfile _create_monster _create_mplayers -functions:44 _create_object _create_particular _create_polymon _create_room _create_savefile _create_secret_door _create_stairs _create_subroom -functions:45 _create_trap _create_worm_tail _curr_mon_load _currentlevel_rewrite _curs_on_u _curse _cursed _cursed_object_at -functions:46 _cursetxt _cuss _cutworm _cvt_sdoor_to_door _d _damageum _dbon -functions:47 _ddoinv _dead_species _dealloc_obj _decl_init _deepest_lev_reached _def_char_to_monclass _def_char_to_objclass _def_raw_print -functions:48 _defends _deferred_goto _del_engr _del_engr_at _del_light_source _delallobj _delete_bonesfile _delete_contents -functions:49 _delete_levelfile _delete_savefile _delfloortrap _deliver_by_pline _deliver_by_window _delobj _deltrap _demon_talk -functions:50 _demonpet _destroy_arm _destroy_drawbridge _destroy_item _destroy_mitem _dev_name _dig -functions:51 _dig_check _dig_corridor _dig_point _dig_typ _digactualhole _dighole _digit _dipfountain -functions:52 _disable_ctrlP _disarm_landmine _disarm_shooting_trap _disarm_squeaky_board _discard_minvent _disclose _discover_object -functions:53 _diseasemu _display_binventory _display_cinventory _display_gamewindows _display_inventory _display_minventory -functions:54 _distant_name _distfleeck _disturb _djinni_from_bottle _dlb_cleanup _dlb_fclose -functions:55 _dlb_fgets _dlb_fopen _dlb_fread _dlb_fseek _dlb_ftell _dlb_init _dlord _dmgtype -functions:56 _dmgval _dmonsfree _dmore _dname_to_dnum _do_break_wand _do_clear_area _do_comp _do_dknown_of -functions:57 _do_earthquake _do_entity _do_genocide _do_improvisation _do_light_sources _do_look _do_mapping _do_mname -functions:57 _vga_xputg _vga_xputs _video_update_positionbar _view_from _view_init _visctrl _vision_init _vision_recalc -functions:58 _do_oname _do_osshock _do_play_instrument _do_reset_eat _do_room_or_subroom _do_storms _do_takeoff -functions:60 _doclose _doconsult _docorner _docrt _doddoremarm _doddrop _dodip -functions:61 _adjust_prefix _build_plselection_prompt _duplicate_opt_detection _enter_explore_mode _maybe_wail -functions:62 _doextcmd _doextlist _doextversion _dofindgem _dofiretrap _doforce _dog_eat _dog_goal -functions:63 _dog_hunger _dog_invent _dog_move _dog_nutrition _dogfood _dogushforth _dohelp _dohide -functions:64 _dohistory _doidtrap _doinvbill _doinvoke _dojump _dokick _dolook _doloot -functions:65 _domagicportal -functions:66 _done_eating _done_in_by _done_intr _done1 _done2 _donning _donull _doopen -functions:67 _doorganize _doorlock _dopay _dopayobj _dopickup _dopotion _dopramulet _doprarm -functions:68 _dopray _doprev_message _doprgold _doprring _doprtool _doprwep _doputon _doquickwhatis -functions:69 _doread _dorecover _doredraw _doremove _doremring _dorub _dosacrifice _dosave -functions:70 _dosdoor _dosearch _dosearch0 _doseduce _doset _doset_add_menu _dosh -functions:71 _dosinkfall _dosinkring _dosit _dosounds _dospinweb _dospit _dosummon _dotakeoff -functions:72 _dotalk _dotele _dothrow _dotogglepickup _dotrap _doturn _dotypeinv _dounpaid -functions:73 _dountrap _doup _doversion _dovspell _dowaterdemon _dowaternymph _dowatersnakes _dowear -functions:74 _dowhatdoes _dowhatis _dowield _dowipe _down_gate _dowrite _dozap _dprince -functions:75 _drag_ball _drag_down _drain_en _DrawCursor _drinkfountain _drinksink _drop _drop_ball -functions:76 _drop_throw _drop_to _drop_upon_death _drop_weapon _dropped_container _dropx _dropy -functions:77 _drown _dryup _dtoxy _dungeon_branch _dunlev _dunlevs_in_dungeon _e_at _e_died -functions:78 _e_jumps _e_missed _e_nam _E_phrase _e_survives_at _eataccessory _eatcorpse _eaten_stat -functions:79 _eatfood _eatmdone _eatspecial _egg_type_from_parent _emergency_disrobe _enable_ctrlP _encumber_msg _end_burn -functions:80 _end_engulf -;functions:81 -functions:82 _exclam _exepath _exerchk _exercise _exerper _exist_artifact _expels _experience -functions:83 _explmm _explmu _explode _explum _expulsion _ext_cmd_getlin_hook _extend_spine _extract_nexthere -functions:84 _extract_nobj _fall_asleep _fall_through _feel_cockatrice _feel_location _fightm _filesize_nh _fill_pit -functions:85 _nh_getenv _promptsep _rigid_role_checks _set_duplicate_opt_detection _tool_in_use -functions:86 _find_drawbridge _find_hell _find_lev_obj _find_level _find_mac _find_mid _find_misc _find_offensive -functions:87 _find_oid _find_roll_to_hit _find_skates _find_unpaid _finddpos _findfirst_file _findgd _findit -functions:88 _findnext_file _findone _findpriest _finish_map _finish_paybill _fix_stair_rooms _fix_worst_trouble _fixup_special -functions:89 _flash_hits_mon _float_down _float_up _floating_above _flood_fill_rm _flooreffects _floorfood _flush_screen _term_start_color -functions:90 _flushout _fmt_ptr _food_detect _food_disappears _food_xname _foodword _fopen_config_file _fopen_datafile -functions:91 _fopenp _forcelock _forget_levels _forget_map _forget_objects _forget_traps _foundfile_buffer _fpostfx -functions:92 _fprefx _fracture_rock _free_dungeons _free_rooms _free_ttlist _free_window_info _freediskspace _freedynamicdata -functions:93 _freefruitchn _freehand _freeinv _friday_13th _fruitadd _fry_by_god _fully_identify_obj _g_at -functions:94 _gainstr _gameDiskPrompt _gazemm _gazemu _gd_move _gd_sound _gem_accept -functions:95 _display_warning _dlb_fgetc _doattributes _dochug _dochugw -functions:96 _fill_point _fill_room _fill_zoo _fillholetyp _find_ac _find_branch _find_branch_room _find_defensive -functions:96 _get_mon_location _get_mplname _get_obj_location _get_rect _get_rect_ind _get_room_loc _get_scr_size _get_shop_item -functions:97 _get_uchars _get_unused_cs _get_valuables _get_wall_for_db _get_wet _get_wormno _getbones _getdir -functions:98 _gethungry -functions:99 _gettty _getversionstring _getyear _ggetobj _ghitm _ghod_hitsu _ghost_from_bottle _ghostfruit -functions:100 _givit _glibr _Gloves_off _Gloves_on _glyph_at _god_zaps_you _gods_angry _gods_upset -functions:101 _godvoice _gold_detect _golemeffects _golemhp _goodfruit _goodpos _goto_hell _goto_level -functions:102 _gr_finish _gr_init _grddead _grease_protect _grow_up _growl _growl_sound -functions:103 _guardname _gulpmm _gulpmu _gulpum _gush _hack_artifacts _has_dnstairs -functions:104 _has_shrine _has_upstairs _hatch_egg _hates_silver _have_lizard _hcolor _heal_legs _healup -functions:105 _Hear_again _Helmet_off _Helmet_on _help_menu _help_monster_out _hero_breaks _hidden_gold _HideCursor -functions:106 _highc _histemple_at _hit _hitfloor _hitmm _hitmsg _hitmu _hitum -functions:107 _hitval _hmon _hmon_hitmon _hmonas _hold_another_object _holetime _home _home_shk -functions:108 _homebase _hooked_tty_getlin _hot_pursuit _hurtarmor _hurtle _identify _identify_pack _impact_drop -functions:110 _in_trouble _In_V_tower _In_W_tower _in_your_sanctuary _incr_itimeout _induced_align _inherits _inhishop -functions:111 _init_artifacts _init_attr _init_dungeons _init_fill _init_level _init_map _init_objects -functions:112 _init_oracles _init_rect _init_rumors _init_ttycolor _init_uhunger _initedog _initoptions _initrack -functions:113 _initworm _insert_branch _insert_timer _inside_room _inside_shop _instapetrify _intemple _interesting_to_discover -functions:114 _intermed _intervene _intrinsic_possible _inv_cnt _inv_weight _invault _invdisp_nothing _inven_inuse -functions:115 _invert_all _invert_all_on_page _Invocation_lev _invocation_message _invocation_pos _Is_botlevel _Is_branchlev _is_chargeable -functions:116 _is_db_wall _is_drawbridge_wall _is_edible _is_fainted _is_flammable _is_fshk _is_home_elemental _is_ice -;functions:117 -functions:118 _is_worn _is_worn_by_type _isbig _isclearpath -functions:119 _itimeout_incr _its_dead _itsstuck _Japanese_item_name _join _join_map _jump _keepdogs -functions:119 _sticks _still_chewing _stock_room _stolen_container _stolen_value _stone_luck _stoned_dialogue _stop_occupation -functions:120 _kick_monster _kick_object _kickdmg _kickstr _kill_egg _kill_eggs _kill_genocided_monsters _killed -functions:121 _kind_name _known_hitum _kops_gone _l_monnam _lantern_message _launch_obj _lava_effects -functions:122 _ldrname _leader_speaks _learn_egg_type _ledger_no _ledger_to_dlev _ledger_to_dnum -functions:123 _left_side _lesshungry _let_to_name _letter _lev_by_name _level_difficulty _level_distance _level_range -functions:124 _level_tele _level_tele_trap _levl_follower _lifesaved_monster _lift_object _light_cocktail _light_region _lined_up -functions:125 _linedup _list_genocided _list_vanquished _litroom _litter _little_to_big _llord _lminion -functions:126 _load_common_data _load_maze _load_one_engraving _load_one_monster _load_one_object _load_qtlist _load_rooms _load_special -functions:127 _loadfruitchn _lock_action _lock_file _locomotion _lookaround _lookat _lookup_id_mapping _lose_weapon_skill -functions:128 _losedogs _losehp _losespells _losestr _losexp _m_arrival -functions:129 _m_carrying _m_detach _m_dowear _m_dowear_type _m_initgrp _m_initinv _m_initthrow _m_initweap -functions:130 _m_lose_armor -functions:131 _m_useup _make_angry_shk _make_blinded _make_confused _make_corpse _make_engr_at _make_familiar _make_hallucinated -functions:132 _make_happy_shk _make_lockname _make_niches _make_sick _make_stunned _make_vomiting _makecorridors _makedog -functions:133 _makekops _makelevel _makemaz _makemon _makeniche _makeplural _makerogueghost _makeroguerooms -functions:134 _makerooms -functions:135 _map_menu_cmd _map_object _map_trap _match_optname _mattackm _mattacku _max_capacity _max_mon_load -functions:136 _max_passive_dmg _max_rank_sz _maxledgerno _may_dig _may_passwall _maybe_write_ls _maybe_write_timer _mayberem -functions:137 _maze0xy _maze1xy _mazexy _mb_trapped _mbag_explodes _mbhit _mbhitm _mcalcdistress -functions:138 _md_rush _md_start _md_stop _mdig_tunnel -functions:139 _meatobj _melt_ice _menu_drop _menu_identify _menu_loot _menu_remarm _mergable _merge_choice -functions:140 _merged _mfndpos _midnight _migrate_to_level _mineralize _minit _miniwalk _minstapetrify -functions:140 _On_stairs _on_start _On_W_tower_level _oname _onbill _online2 _only_here _onlyspace -functions:141 _mintrap -functions:142 _mk_bubble _mk_knox_portal _mk_mplayer _mk_named_object _mk_roamer _mk_tt_object _mkaltar _mkbox_cnts -functions:143 _mkcavearea _mkcavepos _mkclass _mkcorpstat _mkfount _mkgold _mkgoldobj _mkinvokearea -functions:144 _mkinvpos _mklev _mkmap _mkobj _mkobj_at _mkportal _mkroll_launch _mkroom -functions:145 _mkshobj_at _mkshop _mksink _mksobj _mksobj_at _mkstairs _mkswamp _mktemple -functions:146 _mktrap _mkundead _mkzoo _mlevel_tele_trap _mlifesaver _mnearto _mnexto _mon_arrive -functions:147 _mon_break_armor _mon_catchup_elapsed_time _mon_chain _mon_has_amulet _mon_has_arti _mon_has_special _mon_invent_chain _mon_is_local -functions:148 _mon_nam _mon_nam_too _mon_owns _mon_reflects _mon_regen _mon_set_minvis _mon_to_stone _mon_wield_item -functions:149 _mondead _mondied _mongets _mongone _monkilled _Monnam _monnear -functions:150 _monst_init _monster_detect _monster_nearby _monstinroom _monstone _monstr_init _more _more_experienced -functions:151 _morehungry _morguemon _move_gold _move_into_trap _move_special -functions:153 _mpickobj -functions:154 _mselftouch _msg_in _msleep _msmsg _mstatusline _msummon _mswings _mswingsm -functions:155 _mtele_trap _mungspaces _munstone _mv_bubble _mvault_tele _mzapmsg _n_or_more _name_to_mon -functions:156 _nameshk _nartifact_exist _nasty _ndemon _near_capacity _nemdead _nemesis_speaks _neminame -functions:157 _nethack_exit _new_light_source _new_were _newcham _newexplevel _newgame _newhp _newmail -functions:158 _newman _newuexp _newuhs _next_level _next_opt _next_shkp _next_to_u -functions:159 _nexttodoor _nh_timeout _nhusage _night _nmcpy _no_bones_level _noattacks _nocmov -functions:160 _nohandglow _noises _nomul _Norep _not_capable _not_fully_identified _number_leashed _o_in -functions:161 _o_on _o_unleash _obfree _obj_chain _obj_delivery _obj_extract_self _obj_here _obj_ice_effects -functions:162 _obj_is_burning _obj_is_local _obj_is_pname _obj_merge_light_sources _obj_move_light_source _obj_move_timers _obj_resists _obj_sanity_check -functions:163 _obj_sheds_light _obj_shudders _obj_split_light_source _obj_split_timers _obj_stop_timers _obj_to_let _object_detect _objects_init -functions:164 _observable_depth _obstructed _oc_to_str _occupied _off_msg _ohitmon _oinit _ok_to_quest -functions:165 _okay -functions:167 _onquest _onscary _open_bonesfile _open_drawbridge _open_levelfile _open_library _open_savefile _openit -functions:168 _openone _OpenTileFile _opentin _option_help _oselect _other_mon_has_arti _otransit_msg -functions:169 _out_container _outentry _outheader _outoracle _outrumor _p_coaligned _pacify_guards _pacify_shk -functions:170 _panic _parent_dlevel _parent_dnum _parse _parse_config_line _parseoptions _pass_one _pass_three -functions:171 _pass_two _passive _passivemm _passiveum _pay _pay_for_damage _paybill _paygd -functions:172 _pckeys _peace_minded _peek_at_iced_corpse_age _peffects _pet_type _pgetchar _phase_of_the_moon -functions:173 _pick_level _pick_lock _pick_obj _pick_room _picked_container _picking_at _picking_lock _picklock -functions:174 _pickup _pickup_object _place_branch _place_level _place_lregion _place_niche _place_object _place_worm_tail_randomly -functions:175 _place_wsegs _placebc _playwoRAMdisk _pleased _pline _pline_The _plnamesuffix _pluslvl -functions:176 _pmatch _poisoned _poisontell _poly_gender _poly_obj _poly_when_stoned _polyman _polymon -functions:177 _polyself _polyuse _port_help _pos_to_room _positionbar _possible_places _possibly_unwield _potionbreathe -functions:178 _potionhit _prayer_done _precheck _prev_level _pri_move _price_quote _priest_talk _priestini -functions:179 _priestname _print_branch _print_dungeon _print_queue _prinv _probe_monster _process_menu_window _process_text_window -functions:180 _pronoun_gender _protects _prscore _punish _pushch _put_monsters_to_sleep _putsyms -functions:181 _qt_montype _qt_pager _query_category _query_classes _query_objlist _quest_chat _quest_info -functions:182 _quest_stat_check _quest_talk _random_dir _random_engraving _random_teleport_level _ranged_attk -functions:183 _rank _rank_of _raw_printf _read_config_file _read_engr_at _readchar _readentry -functions:184 _readmail _readobjnam _ReadPlanarTileFile _ReadPlanarTileFile_O _ReadTileFileHeader _reassign _recalc_wt _recharge -functions:185 _record_exists _redist_attr _redotoplin _regularize _rehumanize _rejectoption _relink_light_sources _relink_timers -functions:186 _relmon _remember_topl _remove_damage _remove_object _remove_rect _remove_timer _remove_worm -functions:187 _removetopl _reorder_invent _repair_damage _replmon _replshk _rescham -functions:188 _reset_eat _reset_faint _reset_hostility _reset_occupations _reset_pick _reset_remarm _reset_rndmonst _reset_trapset -functions:189 _resetobjs _resist _resists_blnd _resists_drli _resists_magm _rest_engravings _rest_room _rest_rooms -functions:190 _rest_worm _restartcham _restdamage _restfakecorr _restgamestate _restlevchn _restlevelfile _restlevelstate -functions:191 _restmonchn _restnames _restobjchn _restore_artifacts _restore_attrib _restore_dungeon _restore_light_sources _restore_oracles -functions:192 _restore_saved_game _restore_timers _restore_waterlevel _restpriest _restrap _restrict_name _restshk _resurrect -functions:193 _reverse _revive _revive_corpse _revive_egg _revive_mon _revive_nasty _reward_untrap _rhack -functions:194 _right_side _rile_shk _Ring_gone _Ring_off _Ring_off_or_gone _Ring_on _rloc _rloc_engr -functions:195 _rloc_pos_ok _rloc_to _rloco _rm_waslit _rnd_class _rnd_defensive_item -functions:196 _rnd_misc_item _rnd_offensive_item _rnd_rect _rndcurse _rnddoor _rndexp _rndghostname _rndmonnam -functions:197 _rndmonnum _rndmonst _rndtrap _rne _rnl _rnz _rogue_vision _roguecorr -functions:198 _roguejoin _roguename _rot_corpse _rot_organic _rottenfood _rounddiv _row_refresh _run_timers -functions:199 _rust_dmg _s_suffix _safe_teleds _saleable _same_price _sanity_check _save_artifacts _save_currentstate -functions:200 _save_dungeon _save_engravings _save_light_sources _save_oracles _save_room _save_rooms _save_savefile_name _save_timers -functions:201 _save_waterlevel _save_worm _savebones _savech _savedamage _saveDiskPrompt _savefruitchn _savegamestate -functions:202 _savelev _savelev0 _savelevchn _savelife _savemonchn _savenames _saveobjchn _savestateinlock -functions:203 _savetrapchn _scatter _schedule_goto _score_wanted _search_door _search_special _searches_for_item _see_lamp_flicker -functions:204 _see_monsters _see_objects _see_traps _see_wsegs _seemimic _seetrap _seffects _select_hwep -functions:205 _select_off _select_rwep _selftouch _sellobj _sellobj_state _sengr_at _sense_trap -functions:206 _set_all_on_page _set_apparxy _set_artifact_intrinsic _set_bc _set_bonesfile_name _set_bonestemp_name _set_corn _set_cost -functions:207 _set_crosswall _set_entity _set_item_state _set_itimeout _set_levelfile_name _set_lit _set_lock_and_bones _set_malign -functions:208 _set_mimic_blocking _set_mimic_sym _set_mon_data _set_moreluck _set_occupation _set_repo_loc _set_residency _set_savefile_name -functions:209 _set_seenv _set_trap _set_twall _set_uasmon _set_wall _set_wall_property _set_wall_state _set_wear -functions:210 _set_wounded_legs _set_wportal _setclipped _setftty _setgemprobs _setmangry _setnotworn _setpaid -functions:211 _setrandom _settrack _settty _setup_waterlevel _setuwep _setworn _sgn _Shield_off -functions:212 _shieldeff _ship_object _shk_chat _shk_embellish _shk_move _shk_names_obj _shk_owns _shk_your -functions:213 _Shk_Your _shkcatch _shkgone _shkinit _shkname _sho_obj_return_to_u _shop_debt _shop_keeper -functions:214 _shop_object _shopdig _shopper_financial_report _shrine_pos _shrink_worm _shuffle -functions:215 _shuffle_all _shuffle_tiles _simple_look _singular _sitoa _skill_advance _skill_init _skill_level_name -functions:216 _skinback _sleep_monst _slept_monst _slip_or_trip _sliparm _slots_required _snuff_candle _snuff_light_source -functions:217 _snuff_lit _sobj_at _some_armor _somegold _somex _somexy _somey _sort_rooms -functions:218 _sort_valuables _sp_lev_shuffle _spec_ability _spec_abon _spec_applies _spec_dbon _spell_damage_bonus _spell_hit_bonus -functions:219 _spell_skilltype _spelleffects _spitmu _splatter_burning_oil _split_mon _split_rects _splitbill _splitobj -functions:220 _spoteffects _squadmon _srandom _stackobj _standoutbeg _standoutend _start_corpse_timeout _start_eating -functions:221 _start_engulf _start_timer _start_tin _steal _steal_it _stealamulet _stealarm _stealgold -functions:223 _stop_timer _store_version _strange_feeling _strategy _string_for_env_opt _string_for_opt _strncmpi _strprepend -functions:224 _strstri _study_book _stumble_onto_mimic _sub_one_frombill _subfrombill _substitute_tiles _summon_minion _surface -functions:225 _swallow_to_glyph _swapin_file _swapout_oldest _switchar _t_warn -functions:226 _tabexpand _tactics _take_gold _take_off _tamedog _target_on _tele _tele_jump_ok -functions:227 _tele_restrict _tele_trap _teleds _teleok _teleport_pet _temple_occupied _tended_shop _term_end_attr -functions:228 _term_end_color -functions:229 _The _this_type_only _thitm _thitmonst _thitu _throw_gold _throwing_weapon _throwit -functions:230 _thrwmu _tileview _timed_occupation _timer_is_local _timer_sanity_check _tinnable _title_to_mon _tmp_at -functions:231 _topl_putsym _topologize _topten _topten_print _topten_print_bold _toss_up _toss_wsegs _touch_artifact -functions:232 _touchfood _trap_detect _trickery _try_disarm _try_lift _trycall _tt_oname _tty_add_menu -functions:233 _tty_askname _tty_clear_nhwindow _tty_cliparound -functions:234 _tty_display_file _tty_display_nhwindow _tty_doprev_message _tty_end_menu _tty_end_screen _tty_exit_nhwindows _tty_get_ext_cmd _tty_get_nh_event -functions:235 _tty_getlin _tty_init_nhwindows _tty_mark_synch _tty_message_menu _tty_nh_poskey _tty_nhbell _tty_nhgetch _tty_number_pad -functions:236 _tty_player_selection _tty_raw_print _tty_raw_print_bold _tty_resume_nhwindows _tty_select_menu -functions:237 _tty_start_menu _tty_start_screen _tty_startup _tty_suspend_nhwindows _tty_update_inventory _tty_yn_function -functions:238 _txt_backsp _txt_cl_end _txt_cl_eos _txt_clear_screen _txt_get_scr_size _txt_monoadapt_check -functions:239 _txt_nhbell _txt_startup _u_entered_shop _u_gname _u_init -functions:240 _u_left_shop _u_on_dnstairs _u_on_newpos _u_on_sstairs _u_on_upstairs _u_slip_free _u_slow_down _u_teleport_mon -functions:241 _u_to_e _u_wipe_engr _ugolemeffects _um_dist _unbless _unblock_point _uncommon -functions:242 _unconscious _uncurse _undead_to_corpse _under_ground _under_water _undiscover_object _unearth_objs _unfaint -functions:243 _unleash_all _unload_qtlist _unlock_file _unmap_object _unmul _unpaid_cost _unplacebc _unpunish -functions:244 _unrestrict_weapon_skill _unset_all_on_page _unsetup_waterlevel _unstuck _untrap _untrap_prob _unturn_dead _update_mon_intrinsics -functions:245 _update_topl _uptodate _urustm _use_bell _use_camera _use_candelabrum _use_candle _use_container -functions:246 _use_crystal_ball _use_defensive _use_figurine _use_grease _use_lamp _use_leash _use_magic_whistle _use_mirror -functions:247 _use_misc _use_offensive _use_pick_axe _use_skill _use_stethoscope _use_tinning_kit _use_towel _use_trap -functions:248 _use_unicorn_horn _use_whip _use_whistle _useup _useupall _useupf _ustatusline _uunstick -functions:249 _uwepgone _vault_occupied _vault_tele _verbalize _vga_backsp _vga_cl_end _vga_cl_eos _vga_clear_screen -functions:250 _vga_cliparound _vga_detect _vga_DisplayCell _vga_DisplayCell_O _vga_DrawCursor _vga_Finish _vga_FontPtrs _vga_get_scr_size -functions:251 _vga_gotoloc _vga_HideCursor _vga_Init _vga_overview _vga_redrawmap _vga_refresh _vga_SetPalette _vga_SwitchMode -functions:252 _vga_traditional _vga_tty_end_screen _vga_tty_startup _vga_update_positionbar _vga_userpan _vga_WriteChar _vga_WriteStr _vga_xputc -functions:254 _vision_reset _dodiscovered _dodoor _dodown _dodrink _dodrop _doeat _doengrave -functions:255 _wallification _wallify_map _wallify_vault _wantdoor _watch_on_duty _water_damage _water_friction -functions:256 _water_prayer _weapon_dam_bonus _weapon_hit_bonus _weapon_type _wearing_armor _weffects _weight -functions:257 _weight_cap -functions:258 _whimper _wield_tool _wildmiss _win_tty_init _wipe_engr_at _wipeoff _wipeout_text -functions:259 _wiz_detect _wiz_genesis _wiz_identify _wiz_level_tele _wiz_light_sources _wiz_map _wiz_show_seenv _wiz_show_vision -functions:260 _wiz_show_wmodes _wiz_timeout_queue _wiz_where _wiz_wish _wizdead _worm_known _worm_move _worm_nomove -functions:261 _wormgone _wormhitu _worn_wield_only _write_ls _writeentry _wrong_elem_type _x_monnam _xcrypt _xkilled _xlev_to_rank _xname _xprname -functions:263 _xytod _yelp _yname _Yname2 _You _you_aggravate _You_cant _You_feel _you_have _You_hear _you_unwere _you_were _Your _zap_dig -functions:265 _zap_hit _zap_over_floor _zap_updown _zapdir_to_glyph _zapnodir _zappable _zapyourself _zhitm _zhitu _put_lregion_here _role_init -; tuning -; this was 23 -functions:266 _bp_to_obj -; the next two were 238 -functions:268 _aggravate -; the following were 118 -;functions:269 -; the following were 261 -;functions:270 -functions:271 _xputg -functions:272 _xputs _xwaitforspace -; the following were 158 -functions:273 _enermod _enlightenment -; the following was 214 -;functions:274 _enter_explore_mode -; the following were 26 -functions:275 _bydoor -functions:276 _calc_capacity _call_kops _calm_nymphs -functions:277 _can_advance _can_be_hatched -functions:278 _can_carry -; the following were 239 -functions:279 _equipname -functions:280 _txt_xputs -; the following were 80 -functions:281 _enexto -;functions:282 -functions:283 _enhance_weapon_skill -; the following were 165 -functions:284 _okdoor -functions:285 _omon_adj -functions:286 _on_goal -functions:287 _on_ground -functions:288 _b_trapped -functions:289 _on_locate -functions:290 _on_msg -; the following were 182 -functions:291 _y_monnam -; the following were 195 -;functions:293 -; the following were 225 -functions:294 _erode_armor -functions:295 _swallowed -; the following were 7 -functions:298 _acurrstr -; the following were 17 -functions:299 _attacktype -functions:300 _attrcurse -functions:301 _automiss -functions:302 _autopick -; the following were 10 -functions:303 _adj_abon -functions:304 _adj_lev -functions:305 _adjabil -functions:306 _adjalign -functions:307 _adjattrib -; was 53 -functions:308 _display_monster -functions:309 _error -; was 117 -;functions:310 -functions:311 _is_ok_location -;functions:312 -functions:313 _is_pure -functions:314 _is_quest_artifact -; was 236 -functions:316 _tty_putstr _tty_putsym -; was 81 -functions:318 _escapes -functions:319 _erase_menu_or_text -functions:320 _eraseall -; tuning 2 -; was 269 -functions:321 _weldmsg _were_change _were_summon -functions:322 _where_name _which_armor _which_arti -functions:325 _term_end_raw_bold -functions:326 _term_start_attr -;functions:327 -functions:328 _term_start_raw_bold -functions:329 _terminate -functions:330 _tgetch -functions:331 _the -functions:332 _m_monnam -functions:333 _domagictrap _domindblast _domonability -functions:334 _m_respond -functions:335 _m_slips_free -functions:336 _m_throw -functions:337 _m_to_e -functions:338 _m_unleash -functions:339 _mpickstuff -functions:340 _mplayer_talk -functions:341 _mpoisons_subj -functions:342 _mquaffmsg -functions:343 _miss -functions:344 _mreadmsg -functions:345 _mrustm -functions:346 _vomit _vomiting_dialogue -functions:347 _wake_nearby -functions:348 _wake_nearto -functions:349 _wakeup -functions:350 _walkfrom -functions:351 _wall_angle -functions:352 _able_to_loot _add_mon_to_reg _add_rect_to_reg _add_region _addinv_core1 -functions:352 _addinv_core2 _age_spells _align_gtitle _align_shift _align_str _all_but_uchain -functions:353 _allow_all _allow_category _already_wearing _already_wearing2 _angrygods -functions:354 _animate_statue _antholemon _arti_speak _assign_warnings _attach_fig_transform_timeout _blocked_boulder -functions:355 _book_substitution _burn_away_slime _can_blnd _can_ride _can_saddle _can_twoweapon -functions:356 _carry_obj_effects _clear_regions _container_at _coyotename _create_gas_cloud _create_region -functions:357 _describe_level _dfeature_at _dig_up_grave _discover_artifact _dismount_steed _disp_artifact_discoveries -functions:359 _doconduct _dofire _doprinuse _doride _doswapweapon _dotwoweapon -functions:360 _dowieldquiver _drain_item _exercise_steed _expire_gas_cloud _extcmd_via_menu _feature_alert_opts -functions:361 _fig_transform _figurine_location_checks _final_level _find_trap _finish_quest _fix_petrification -functions:362 _food_substitution _fqname _free_invbuf _free_region _free_youbuf _freeinv_core -functions:363 _fuzzymatch _get_compopt_value _get_current_feature_ver _get_feature_notice_ver _get_mtraits _getlev -functions:364 _getlock _getobj _getpos _give_may_advance_msg _Goodbye _halu_gname -functions:365 _Hello _hurtle_step _hurtmarmor _in_out_region _initialspell _inside_gas_cloud -functions:366 _inside_rect _inside_region _kick_steed _look_here _m_in_out_region _make_grave -functions:367 _mbodypart _mdamagem _mdamageu _mk_mplayer_armor _mm_aggression -functions:368 _mon_adjust_speed _mon_animal_list _mon_beside _mon_in_region _montraits _mount_steed -functions:369 _noit_mon_nam _noit_Monnam _noncoalignment _num_genocides _obj_attach_mid _obj_timer_checks -functions:370 _obj_typename _ok_align _ok_gend _ok_race _ok_role _ordin -functions:371 _pick_align _pick_animal _pick_gend _pick_nasty _pick_race _pick_role -functions:372 _place_monster _pm_to_cham _prisoner_speaks _process_options _randalign _randgend -functions:373 _randrace _randrole _relobj _remove_mon_from_reg _remove_region -functions:374 _remove_worn_item _replace_object _reset_oattached_mids _rest_regions _restore_cham _rnd_treefruit_at -functions:375 _save_regions _select_newcham_form _self_invis_message _setuqwep _setuswapwep _show_conduct -functions:376 _show_region _simple_typename _slime_dialogue _sokoban_detect _spec_m2 _special_handling -functions:377 _str2align _str2gend _str2race _str2role _There _throw_obj -functions:378 _tmiss _tty_update_positionbar _tty_wait_synch _undiscovered_artifact _untwoweapon _update_mlstmv -functions:379 _update_monster_region _update_player_regions _uqwepgone _ureflects _use_grapple _use_pole -functions:380 _use_saddle _uswapwepgone _uwep_skill_type _validalign _validgend _validrace -functions:381 _validrole _violated_vegetarian _walk_path _warning_opts _wary_dog _welcome -functions:382 _write_timer _yyyymmdd _zap_steed -functions:383 _getprice _getreturn _getrumor _gettrack -functions:384 _ini_inv _knows_object _knows_class _restricted_spell_discipline _ready_weapon -functions:385 _doname _Doname2 -functions:386 _minliquid -functions:387 _missmm -functions:388 _missmu -functions:389 _missum -functions:390 _mixtype _mk_artifact -functions:391 _makesingular -functions:392 _maketrap _makevtele _makewish -; -; added but not tuned whatsoever -; -functions:393 _abil_to_adtyp _abil_to_spfx _accept_menu_prefix _accept_newcham_form _accessory_has_effect _add_autopickup_exception -functions:394 _add_class _add_erosion_words _adj_pit_checks _after_shk_move _alter_cost _ansimpleoname _anything_to_s -functions:395 _arti_cost _arti_immune _arti_light_description _arti_light_radius _arti_reflects _artifact_has_invprop _artifact_light _artifact_score -functions:396 _assign_hilite _attacktype_fordmg _attk_protection _attributes_enlightenment _attrval _authorize_wizard_mode _background_enlightenment -functions:397 _bagotricks _bane_applies _bare_artifactname _billable _blackout _bogon_is_pname _book_disappears _bottlename -functions:398 _bounded_increase _br_string2 _breakchestlock _build_english_list _bypass_obj -functions:399 _buried_ball _buried_ball_to_freedom _buried_ball_to_punishment -functions:400 _cad _can_be_strangled _can_blow _can_fog _can_reach_location _cant_reach_floor _cant_revive _cant_squeeze_thru _cant_wield_corpse _cantvomit -functions:401 _cast_cleric_spell _cast_wizard_spell _catch_lit _cause_known _characteristics_enlightenment -functions:402 _check_caitiff _check_innate_abil _check_strangling _choose_clerical_spell _choose_magic_spell _chrcasecpy -functions:403 _ckvalidcat _clear_bypasses _clear_conjoined_pits _clear_status_hilites _clear_symsetentry _climb_pit _cloak_simple_name _closeholdingtrap -functions:404 _clridx_to_s _cmap_to_type _cmd_from_func _compare_blstats _complain_about_duplicate _confers_luck _confused_book -functions:405 _conjoined_pits _consume_obj_charge _consume_oeaten _consume_tin _container_gone _container_impact_dmg _copy_mextra _copy_oextra _copy_of -;functions:406 _copynchars _copyright_banner_line _corpse_revive_type _costly_alteration _costly_tin _could_advance _could_reach_item _count_ape_maps -;functions:407 _count_buc _count_contents _critically_low_hp _cures_sliming _cures_stoning _currency _cxname _dealloc_killer -functions:408 _dealloc_mextra _dealloc_monst _dealloc_oextra -functions:409 _decal_planar _decide_to_shapeshift _def_bclose _def_bflush _def_bufoff _def_bufon _def_bwrite _def_minit _def_mread -functions:410 _defends_when_carried _delayed_killer _deliver_splev_message _detect_obj_traps _detect_wsegs _detecting -functions:411 _disarm_holdingtrap _discardexcess _disintegrate_mon _display_pickinv _display_used_invlets _distant_monnam _dmgtype_fromattack _do_class_genocide -functions:412 _docallcmd _dochat _doclassdisco _docontact _dogaze _domonnoise _donamelevel _doorless_door _dooverview _dooverview_or_wiz_where -functions:413 _dopoly _doterrain _dotip _dotravel _dovanquished _dowhatdoes_core _drop_uswapwep _dxdy_moveok _eat_brains _eatmupdate -functions:414 _edibility_prompts _encglyph _endmultishot _enexto_core _engulf_target _enlght_halfdmg _erode_obj _explain_container_prompt _extremeattr -functions:415 _find_delayed_killer _find_file _find_mapseen _findtravelpath _finesse_ahriman _finish_meating _fire_damage -functions:416 _flashburn _float_vs_flight _fopen_sym_file _fopen_wizkit_file _force_launch_placement _forget _forget_mapseen _forget_single_object _forget_temple_entry -functions:417 _free_epri _free_mname _free_msghistory_snapshot _free_omailcmd _free_omid _free_omonst _free_oname _freemcorpsenm -functions:418 _from_what _fruitname _gain_guardian_angel _gcrownu _genl_can_suspend_yes _genl_preference_update _genl_putmixed _genl_status_enablefield _genl_status_finish -functions:419 _genl_status_init _genl_status_threshold _genl_status_update _genus -functions:420 _get_adjacent_loc _get_container_location _get_plname_from_file _get_status_hilites _getlt _getmattk _getnow _getpos_help -functions:421 _green_mon _gulp_blnd_check _H2Opotion_dip _has_ceiling _helm_simple_name _help_dir _hhmmss _hide_monst _hideunder _hits_bars -functions:422 _hornoplenty _howmonseen _in_town _inaccessible_equipment _inhistemple -functions:423 _init_blstats _init_l_symbols _init_mapseen _init_r_symbols _init_showsyms _init_symbols _initoptions_finish _initoptions_init -functions:424 _innately _insane_object _insert_gold_into_invent _interest_mapseen _intersect -functions:425 _is_autopickup_exception _is_digging _is_innate _is_izchak _is_rottable _is_undirected_spell _is_unpaid _is_wc_option _is_wc2_option _isspecmon -functions:426 _joust _keep_saddle_with_steedcorpse _killer_xname _label_known _landing_spot _launch_in_progress -functions:427 _learn_unseen_invent _learnring _learnscroll _learnscrolltyp _learnwand -functions:428 _lib_dlb_cleanup _lib_dlb_fclose _lib_dlb_fgetc _lib_dlb_fgets _lib_dlb_fopen _lib_dlb_fread _lib_dlb_fseek _lib_dlb_ftell _lib_dlb_init -functions:429 _light_hits_gremlin _lightdamage _liquid_flow _load_mapseen _load_symset _long_to_any _loot_mon _lose_guardian_angel _m_bad_boulder_spot _m_useupall -functions:430 _magic_negation _make_glyphs_vanilla _make_happy_shoppers _make_slimed _make_stoned _mapglyph _match_sym -functions:431 _maybe_absorb_item _maybe_adjust_light _maybe_cannibal _maybe_finish_sokoban _maybe_finished_meal _maybe_mnexto _maybe_tame _maybewakesteed -functions:432 _Mb_hit _mbag_item_gone _mbirth_limit _mcould_eat_tin _mdisplacem _mdrop_obj _mdrop_special_objs _meatmetal _melt_ice_away -functions:433 _mhurtle _mhurtle_step _mimic_hit_msg _mimic_obj_name _mk_gen_ok _mkclass_poly _mkveggy_at _mm_displacement -functions:434 _mon_aligntyp _mon_consume_unstone _mon_hates_silver _mon_in_room _mon_is_gecko _mon_obj_sanity _monflee -functions:435 _mongrantswish _monhaskey _monhp_per_lvl _monst_to_any _monster_census _msghistory_snapshot -functions:436 _mshot_xname _munslime _muse_unslime _mwelded _mwepgone _name_to_monclass _new_book_description _new_mname -functions:437 _new_omailcmd _new_oname _newedog _newegd _newemin _newepri _neweshk _newmcorpsenm -functions:438 _newmextra _newmonhp _newoextra _newolong _newomid _newomonst -functions:439 _newpw _nextmbuf _nextobuf _nh_compress _nh_uncompress _noarmor _num_horns -functions:440 _nxtobj _o_material _obj_adjust_light_radius _obj_has_timer _obj_no_longer_held _obj_shuffle_range _obj_to_any _objlist_sanity _objtyp_is_callable -functions:441 _observe_quantum_cat _oclass_to_name _odds_and_ends _ok_to_throw _olfaction _on_fire _one_characteristic -functions:442 _openfallingtrap _openholdingtrap _otense _p_glow1 _p_glow2 -;functions:443 _paniclog _paralyze_monst _paranoid_query _parse_sym_line _parsesymbols _passes_bars _passive_obj _peaked_skill _peek_timer _percentage -;functions:444 _pick_pick _pickvampshape _pit_flow _pooleffects _popch _Popeye _postadjabil _print_mapseen _propagate _put_gold_back -functions:445 _putting_on _qtext_pronoun _quickmimic _race_alignmentcount _raceptr _racial_exception -functions:446 _randomize _read_sym_file _read_wizkit _readlibdir _really_kick_object _recalc_mapseen _recbranch_mapseen _redraw_cmd -functions:447 _release_hero _releaseobuf _remdun_mapseen _remote_burglary -functions:448 _remove_autopickup_exception _remove_gold_from_invent _remove_room _remove_rooms -functions:449 _rename_disco _reset_commands _reset_region_mids _reset_restpref -functions:450 _rest_levl _restmon _restobj _restore_killers _restore_msghistory _time_from_yyyymmddhhmmss -functions:451 _retouch_equipment _retouch_object _reveal_terrain _reverse_loot _rider_cant_reach _rider_corpse_revival -functions:452 _rndcolor -functions:453 _rob_shop _role_gendercount _role_menu_extra _role_selection_prolog _root_plselection_prompt _rouse_shk _rumor_check -functions:454 _s_to_anything _safe_oname _safe_qbuf _safeq_shortxprname _safeq_xprname _same_race -functions:455 _sanitize_engravings _sanitize_name _save_killers _save_mapseen _save_msghistory _savelevl _savemon _saveobj -functions:456 _scrolltele _seen_string _self_lookat _set_corpsenm _set_option_mod_status _set_playmode _set_restpref _set_status_hilites _set_symhandling -functions:457 _set_tin_variety _setapplyclasses _setmnotwielded _setrolefilter _shade_aware _shade_glare _Shield_on _Shirt_off _Shirt_on -functions:458 _shkname_is_pname _shkveg _shop_string _short_oname _should_displace _should_query_disclose_option _silly_thing _simpleonames -functions:459 _singplur_compound _singplur_lookup _sink_into_lava _size_monst _size_obj _skip_pager _skiprange _sokoban_guilt -functions:460 _sortspells _special_stock _spell_backfire _spell_cmp _spell_would_be_useless _spellretention _spellsortmenu _splittable -functions:461 _spot_stop_timers _spot_time_expires _spot_time_left _stagger _start_melt_ice_timeout -functions:462 _status_enlightenment _status_finish _status_hilite_menu _status_initialize _steedintrap _Sting_effects _stone_to_flesh_obj -functions:463 _store_plname_in_file _store_savefileinfo _strcasecpy _stripspe _strkitten _strsubst _stuck_ring _stucksteed -functions:464 _stuff_prevents_passage _suit_simple_name _switch_symbols _switch_terrain _sym_val _sys_early_init -functions:465 _sysopt_seduce_set _taking_off _test_move _the_unique_obj _the_unique_pm _theft_petrifies _thesimpleoname -functions:466 _tin_details _tin_variety _tin_variety_txt _tipcontainer _Tobjnam _toggle_displacement _toggle_stealth -functions:467 _traditional_loot _trapmove _trapnote -;functions:468 _tty_destroy_nhwindow _tty_getmsghistory _tty_putmsghistory -;functions:469 _u_on_rndspot _ubreatheu _uchangealign _unchanger _undesirable_disp _unfixable_trouble_count _unplaced_floater _unreachable_level -functions:470 _unset_seenv _untouchable _update_l_symset _update_r_symset _upstart _use_cream_pie _use_pick_axe2 _use_stone -functions:471 _usmellmon _uteetering_at_seen_pit _validate _validate_prefix_locations _validspecmon _validvamp _vamp_shift -functions:472 _vault_gd_watching _veggy_item _version_string _vtense _walking_on_water _wand_explode _watch_dig -functions:473 _waterbody_name _wc_set_font_name _wc_set_window_colors _wc_supported _wc2_supported _weapon_descr -functions:474 _wearslot _were_beastie _what_gives _wielding_corpse _will_feel_cockatrice _wishcmdassist _wishymatch -functions:475 _wiz_level_change _wiz_levltyp_legend _wiz_map_levltyp _wiz_mon_polycontrol _wiz_panic _wiz_polyself _wiz_rumor_check _wiz_smell _wizkit_addinv -functions:476 _worm_cross _worst_cursed_item _xdrainenergym _yn_function _yobjnam -functions:477 _Yobjnam2 _You_see _ysimple_name _Ysimple_name2 _yyyymmddhhmmss -functions:478 _zapsetup _zapwrapup _comp_times _directionname _fname_decode _fname_encode _free_autopickup_exceptions -;functions:479 _free_edog _free_egd _free_emin _free_eshk _free_olong _free_saved_games -;functions:480 _genl_can_suspend_no _genl_getmsghistory _genl_message_menu _genl_putmsghistory -;functions:481 _get_saved_games _initstate _set_savepref _set_wc_option_mod_status _set_wc2_option_mod_status _setstate _uint_to_any - diff --git a/sys/msdos/exceptn.S.patch b/sys/msdos/exceptn.S.patch new file mode 100644 index 000000000..3092e604a --- /dev/null +++ b/sys/msdos/exceptn.S.patch @@ -0,0 +1,20 @@ +source https://www.vogons.org/viewtopic.php?f=61&t=71459 +--- orig/src/libc/go32/exceptn.S 2002-12-21 21:08:39.000000000 -0800 ++++ ./src/libc/go32/exceptn.S 2020-01-18 18:37:27.397176800 -0800 +@@ -337,6 +337,15 @@ + je 6f + orb $2,%ah /* If RShift is set, set LShift as well */ + 6: ++ movb %ah,%al ++ andb %cs:___djgpp_sigint_mask, %ah /* Mask off irrelevant bits */ ++ cmpb %cs:___djgpp_sigint_key+1, %ah /* Test for SIGINT */ ++ je 60f ++ movb %al,%ah ++ andb %cs:___djgpp_sigquit_mask, %ah /* Mask off irrelevant bits */ ++ cmpb %cs:___djgpp_sigquit_key+1, %ah /* Test for SIGQUIT*/ ++ jne Lkbd_chain ++60: + inb $0x60,%al /* Read the scan code */ + 99: + movb %ah,%bh /* Save KB status */ + diff --git a/sys/msdos/fetch-cross-compiler.sh b/sys/msdos/fetch-cross-compiler.sh new file mode 100755 index 000000000..d9e7677ac --- /dev/null +++ b/sys/msdos/fetch-cross-compiler.sh @@ -0,0 +1,246 @@ +#!/bin/bash + +if [ ! -z "${TF_BUILD}" ]; then + set -x +fi + +if [ -z "$CI_BUILD_DIR" ]; then + export DJGPP_TOP=$(pwd)/lib/djgpp +else + export DJGPP_TOP="$CI_BUILD_DIR/lib/djgpp" +fi + +if [ -z "$GCCVER" ]; then + export GCCVER=gcc1220 +fi + +if [ -z "$LUA_VERSION" ]; then + export LUA_VERSION=5.4.8 +fi + +if [ ! -d "$(pwd)/lib" ]; then + echo "Set up for Unix build and 'make fetch-lua' first." + exit 1 +fi + +#DJGPP_URL="https://github.com/andrewwutw/build-djgpp/releases/download/v2.9/" +#DJGPP_URL="https://github.com/andrewwutw/build-djgpp/releases/download/v3.0/" +#DJGPP_URL="https://github.com/andrewwutw/build-djgpp/releases/download/v3.1/" +#DJGPP_URL="https://github.com/andrewwutw/build-djgpp/releases/download/v3.1/" +#DJGPP_URL="https://github.com/andrewwutw/build-djgpp/releases/download/v3.3/" +DJGPP_URL="https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/" + +if [ "$(uname)" = "Darwin" ]; then + #Mac + DJGPP_FILE="djgpp-osx-$GCCVER.tar.bz2" + if [ -z "HINTS" ]; then + export HINTS=macOS.500 + fi +elif [ "$(expr substr $(uname -s) 1 5)" = "Linux" ]; then + #Linux + DJGPP_FILE="djgpp-linux64-$GCCVER.tar.bz2" + if [ -z "$HINTS" ]; then + export HINTS=linux.500 + fi +elif [ "$(expr substr $(uname -s) 1 10)" = "MINGW32_NT" ]; then + #mingw + DJGPP_FILE="djgpp-mingw-$GCCVER-standalone.zip" +else + echo "No DJGPP release for you, sorry." + exit 1 +fi + +DJGPP_URL="$DJGPP_URL$DJGPP_FILE" + +# export + +if [ ! -d lib ]; then +mkdir -p lib +fi + +cd lib +if [ ! -f "$DJGPP_FILE" ]; then + echo "fetching djgpp cross-compiler int lib/djgpp" + if [ "$(uname)" = "Darwin" ]; then + #Mac + curl -L $DJGPP_URL -o $DJGPP_FILE + else + wget --quiet --no-hsts "$DJGPP_URL" + fi +fi + +if [ ! -d djgpp/i586-pc-msdosdjgpp ]; then + echo "extracting djgpp from $DJGPP_FILE" + tar xjf "$DJGPP_FILE" + #rm -f $DJGPP_FILE +fi + +# DOS-extender for use with djgpp +if [ ! -d djgpp/cwsdpmi ]; then + echo "fetching DOS extender for use with djgpp" + if [ "$(uname)" = "Darwin" ]; then + #Mac + curl http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip -o csdpmi7b.zip + else + wget --quiet --no-hsts https://www.delorie.com/pub/djgpp/current/v2misc/csdpmi7b.zip + if [ $? -ne 0 ]; then + wget --quiet --no-hsts --timeout=20 http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip + fi + fi + cd djgpp + mkdir -p cwsdpmi + cd cwsdpmi + unzip ../../csdpmi7b.zip + cd ../../ + rm csdpmi7b.zip +fi + +# PDCurses (non-Unicode build uses this) +if [ ! -d "pdcurses" ]; then + echo "fetching ../pdcurses from https://github.com/wmcbrine/PDCurses.git" ; \ + git clone --depth 1 https://github.com/wmcbrine/PDCurses.git pdcurses +fi + +# PDCursesMod (Unicode build uses this) +if [ ! -d "pdcursesmod" ]; then + echo "fetching ../pdcursesmod from https://github.com/Bill-Gray/PDCursesMod.git" ; \ + git clone --depth 1 https://github.com/Bill-Gray/PDCursesMod.git pdcursesmod +fi + +if [ ! -d djgpp/djgpp-patch ]; then + echo "fetching djlsr205.zip" ; + cd djgpp + mkdir -p djgpp-patch + cd djgpp-patch + if [ "$(uname)" = "Darwin" ]; then + #Mac + curl --output djlsr205.zip http://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2/djlsr205.zip + export cmdstatus=$? + else + wget --quiet --no-hsts http://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2/djlsr205.zip + export cmdstatus=$? + fi + ls -l + if [ $cmdstatus -eq 0 ]; then + echo "fetch of djgpp-patch was successful" + else + if [ -z "${TF_BUILD}" ]; then + echo "Unable to complete the build, exiting..." + else + set +x + echo "##vso[task.logissue type=warning;]Trouble downloading djgpp-patch" + fi + exit 121 + fi + mkdir -p src/libc/go32 + unzip -p djlsr205.zip src/libc/go32/exceptn.S >src/libc/go32/exceptn.S + patch -p0 -l -i ../../../sys/msdos/exceptn.S.patch + echo "djgpp patch applied" + cd ../../ +fi + +# create a directories to hold some native DOS pieces that might get deployed +if [ ! -d djgpp/target ]; then + cd djgpp + mkdir -p target + cd ../ +fi +if [ ! -d djgpp/target/bin ]; then + mkdir -p djgpp/target/bin +fi +if [ ! -d djgpp/target/lib ]; then + mkdir -p djgpp/target/lib +fi +if [ ! -d djgpp/target/include ]; then + mkdir -p djgpp/target/include +fi + + +# These 4 arrays must have their elements kept in synch. +# +# full URL for the remote zip file to fetch +zipurl=( + "http://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2/djdev205.zip" + "http://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2gnu/gdb801b.zip" +) +# name of zip file upon landing here +ziplocal=( + "djdev205.zip" + "gdb801b.zip" +) +# name of file after extraction from zip file +exesought=( + "bin/symify.exe" + "bin/gdb.exe" + +) +# stored full path inside zip file +exepathinzip=( + "bin/symify.exe" + "bin/gdb.exe" +) + +if [ -d djgpp/target ]; then + cd djgpp/target + count=0 + while [ "x${zipurl[count]}" != "x" ] + do + if [ ! -f ${exesought[count]} ]; then + if [ ! -f ${ziplocal[count]} ]; then + echo "Getting ${ziplocal[count]}" ; + if [ "$(uname)" = "Darwin" ]; then + #Mac + curl --output ${ziplocal[count]} ${zipurl[count]} + export cmdstatus=$? + else + wget --quiet --no-hsts ${zipurl[count]} + export cmdstatus=$? + fi + if [ $cmdstatus -eq 0 ]; then + echo "fetch of ${ziplocal[count]} was successful" + fi + fi + if [ -f ${ziplocal[count]} ]; then + echo "unzipping ${ziplocal[count]}" + unzip -p ${ziplocal[count]} ${exepathinzip[count]} >./${exesought[count]} + fi + fi + count=$(( $count + 1 )) + done + + echo "Native DOS executables in lib/djgpp/target:" + ls -l bin/*.exe + # + cd ../../ +fi + + +FONT_VERSION="4.49" +FONT_FILE="terminus-font-$FONT_VERSION" +FONT_LFILE="$FONT_FILE.1" +FONT_RFILE="$FONT_LFILE.tar.gz" +FONT_URL="https://sourceforge.net/projects/terminus-font/files/$FONT_FILE/$FONT_RFILE" + +# fonts +if [ ! -d "$FONT_LFILE" ]; then + echo "Getting terminus fonts" + if [ "$(uname)" = "Darwin" ]; then + #Mac + curl -L $FONT_URL --output $FONT_RFILE + else + wget --quiet --no-hsts $FONT_URL + fi + tar -xvf $FONT_RFILE + rm $FONT_RFILE +else + echo "terminus fonts are already available in lib/$FONT_LFILE" +fi + +cd ../ + +# Don't fail the build if lua fetch failed because we cannot do anything about it +# but don't bother proceeding forward either +if [ ! -d "lib/lua-$LUA_VERSION/src" ]; then + exit 0 +fi + diff --git a/sys/msdos/font.c b/sys/msdos/font.c new file mode 100755 index 000000000..f3dfe7d10 --- /dev/null +++ b/sys/msdos/font.c @@ -0,0 +1,275 @@ +/* Maintain a data structure describing a monospaced bitmap font */ + +#include "hack.h" +#include "font.h" + +static uint32 read_u32(const unsigned char *); +static void add_unicode_index( + struct BitmapFont *font, + uint32 ch, + unsigned index); +static uint32 *uni_8to32(const char *); + +struct BitmapFont * +load_font(const char *filename) +{ + FILE *fp; + struct BitmapFont *font = NULL; + unsigned char header[32]; + size_t size; + uint32 magic; + uint32 version; + uint32 headersize; + uint32 fontflags; + uint32 length; + uint32 charsize; + uint32 height; + uint32 width; + uint32 bwidth, memsize; + uint32 i; + + fp = fopen(filename, "rb"); + if (fp == NULL) goto error; + + /* Read the PSF header */ + size = fread(header, 1, sizeof(header), fp); + if (size != sizeof(header)) goto error; + + /* Convert from little endian order */ + magic = read_u32(header + 0); + if (magic != 0x864AB572) goto error; + version = read_u32(header + 4); + if (version != 0) goto error; + headersize = read_u32(header + 8); + if (headersize < sizeof(header)) goto error; + fontflags = read_u32(header + 12); + length = read_u32(header + 16); + charsize = read_u32(header + 20); + height = read_u32(header + 24); + width = read_u32(header + 28); + + /* Check that the declared character size can hold the declared width + and height */ + bwidth = (width + 7) / 8; + memsize = bwidth * height; + if (memsize > charsize) goto error; + + /* Allocate a font structure */ + font = (struct BitmapFont *) alloc(sizeof(struct BitmapFont)); + memset(font, 0, sizeof(struct BitmapFont)); + + /* Dimensions of the font */ + font->width = width; + font->height = height; + font->num_glyphs = length; + + /* The glyph array */ + font->glyphs = (unsigned char **) alloc(length * sizeof(unsigned char *)); + memset(font->glyphs, 0, length * sizeof(unsigned char *)); + + /* Read the glyphs */ + fseek(fp, headersize, SEEK_SET); + for (i = 0; i < length; ++i) { + font->glyphs[i] = (unsigned char *) alloc(memsize); + size = fread(font->glyphs[i], 1, memsize, fp); + if (size != memsize) goto error; + fseek(fp, charsize - memsize, SEEK_CUR); + } + + if (fontflags & 0x01) { + /* Read the Unicode table */ + char buf[128], buf2[128+1]; + unsigned bufsize, strsize; + char *p; + uint32 *codepoints; + + bufsize = 0; + i = 0; + while (i < length) { + unsigned j; + + size = fread(buf + bufsize, 1, sizeof(buf) - bufsize, fp); + if (ferror(fp)) goto error; + bufsize += size; + if (bufsize == 0) goto error; /* unexpected EOF */ + + p = memchr(buf, 0xFF, bufsize); + if (p != NULL) { /* end marker found */ + strsize = p - buf; + memcpy(buf2, buf, strsize); + buf2[strsize] = '\0'; + bufsize -= strsize + 1; + memmove(buf, buf + strsize + 1, bufsize); + } else { /* partial string */ + strsize = bufsize - 1; + /* Roll back to character boundary in case of partial character */ + while (strsize != 0 && (buf[strsize] & 0xC0) == 0x80) + --strsize; + if (strsize == 0) /* avoid infinite loop */ + strsize = (bufsize < 4) ? bufsize : 4; + memcpy(buf2, buf, strsize); + buf2[strsize] = '\0'; + bufsize -= strsize; + memmove(buf, buf + strsize, bufsize); + } + codepoints = uni_8to32(buf2); + for (j = 0; codepoints[j] != 0; ++j) { + add_unicode_index(font, codepoints[j], i); + } + free(codepoints); + if (p != NULL) + ++i; + } + } else { + /* Fake a Unicode table, assuming that ASCII glyphs are in the + expected places */ + for (i = 0x20; i <= 0x7E; ++i) { + add_unicode_index(font, i, i); + } + } + + fclose(fp); + return font; + +error: + if (fp != NULL) fclose(fp); + free_font(font); + return NULL; +} + +void +free_font(struct BitmapFont *font) +{ + unsigned i, j; + + if (font == NULL) return; + + if (font->glyphs != NULL) { + for (i = 0; i < font->num_glyphs; ++i) + free(font->glyphs[i]); + free(font->glyphs); + } + + for (i = 0; i < SIZE(font->unicode); ++i) { + if (font->unicode[i] == NULL) continue; + for (j = 0; j < 256; ++j) + free(font->unicode[i][j]); + free(font->unicode[i]); + } + + free(font); +} + +const unsigned char * +get_font_glyph(struct BitmapFont *font, uint32 ch, boolean unicode) +{ + unsigned index; + + if (unicode) { + index = 0; + if (ch <= 0x10FFFF && (ch & 0xFFFFD800) != 0xD800) { + unsigned i, j, k; + + i = (unsigned) (ch >> 16); + j = (unsigned) ((ch >> 8) & 0xFF); + k = (unsigned) (ch & 0xFF); + if (font->unicode[i] != NULL + && font->unicode[i][j] != NULL) { + index = font->unicode[i][j][k]; + } + } + } else { + index = ch; + } + + if (index >= font->num_glyphs) + index = 0; + + return font->glyphs[index]; +} + +static void +add_unicode_index(struct BitmapFont *font, uint32 ch, unsigned index) +{ + unsigned i, j, k; + + i = (unsigned) (ch >> 16); + j = (unsigned) ((ch >> 8) & 0xFF); + k = (unsigned) (ch & 0xFF); + + if (font->unicode[i] == NULL) { + /* Create the second level node */ + font->unicode[i] = (unsigned **) alloc(256 * sizeof(unsigned *)); + memset(font->unicode[i], 0, 256 * sizeof(unsigned *)); + } + if (font->unicode[i][j] == NULL) { + /* Create the third level node */ + font->unicode[i][j] = (unsigned *) alloc(256 * sizeof(unsigned)); + memset(font->unicode[i][j], 0, 256 * sizeof(unsigned)); + } + font->unicode[i][j][k] = index; +} + +static uint32 +read_u32(const unsigned char *buf) +{ + return ((uint32) buf[0] << 0) + | ((uint32) buf[1] << 8) + | ((uint32) buf[2] << 16) + | ((uint32) buf[3] << 24); +} + +static uint32 * +uni_8to32(const char *inp) +{ + size_t i, j; + uint32 *out; + + /* Output string */ + out = (uint32 *) alloc((strlen(inp) + 1) * sizeof(out[0])); + + i = 0; + j = 0; + while (inp[i] != 0) { + unsigned char byte = inp[i++]; + uint32 ch32; + uint32 min = 0; + unsigned count = 0; + + if (byte < 0x80) { + ch32 = byte; + } else if (byte < 0xC0) { + ch32 = 0xFFFD; + } else if (byte < 0xE0) { + ch32 = byte & 0x1F; + min = 0x80; + count = 1; + } else if (byte < 0xF0) { + ch32 = byte & 0x0F; + min = 0x800; + count = 2; + } else if (byte < 0xF5) { + ch32 = byte & 0x07; + min = 0x10000; + count = 3; + } else { + ch32 = 0xFFFD; + } + + for (; count != 0; --count) { + byte = inp[i]; + if ((byte & 0xC0) != 0x80) { + break; + } + ++i; + ch32 = (ch32 << 6) | (byte & 0x3F); + } + if (count != 0 || ch32 < min || ((ch32 & 0xFFFFF800) == 0xD800)) { + ch32 = 0xFFFD; + } + out[j++] = ch32; + } + + out[j] = 0; + return out; +} diff --git a/sys/msdos/font.h b/sys/msdos/font.h new file mode 100755 index 000000000..97868e37a --- /dev/null +++ b/sys/msdos/font.h @@ -0,0 +1,51 @@ +/* Maintain a data structure describing a monospaced bitmap font */ + +#ifndef FONT_H +#define FONT_H + +/* + * The file format is Linux PSF, version 2. Version 1 is not supported. + * Actual Linux fonts are restricted to 256 or 512 glyphs; for NetHack, the + * font can have any number of glyphs. The Unicode map is expected to be + * present, but combining sequences are not supported. + * The fonts supplied for use with this data structure have the first 256 + * glyphs arranged according to IBM code page 437, for simpler support of + * the IBM handling mode for the map. + */ + +/* For Unicode lookup, a three level tree provides constant-time access to + the glyphs without using an excessive amount of memory. + The root has seventeen entries, one for each plane of Unicode. Most fonts + will populate only plane 0, and Unicode defines only planes 0, 1, 2, 3, 15 + and 16. + The second level has 256 entries, each pointing to a third level node with + 256 entries. Each third level entry has type unsigned, and gives the index + of the glyph. + Given the Unicode code point, we can use bits 20 through 16 to index the + root, bits 15 through 8 for the second level and bits 7 through 0 for the + third level. */ + +struct BitmapFont { + /* Dimensions of a single glyph */ + unsigned width; + unsigned height; + + /* The glyphs, in the order that they appear in the font */ + /* IBM handling will index the glyphs this way */ + /* glyph points to an allocated array, each element of which points to + another allocated array */ + unsigned num_glyphs; + unsigned char **glyphs; + + /* The root node of the Unicode tree */ + unsigned **unicode[17]; +}; + +extern struct BitmapFont *load_font(const char *filename); +extern void free_font(struct BitmapFont *font); +extern const unsigned char *get_font_glyph( + struct BitmapFont *font, + uint32 ch, + boolean unicode); + +#endif diff --git a/sys/msdos/fonts/.gitignore b/sys/msdos/fonts/.gitignore new file mode 100644 index 000000000..967cbdca1 --- /dev/null +++ b/sys/msdos/fonts/.gitignore @@ -0,0 +1 @@ +*.psf diff --git a/sys/msdos/fonts/README.txt b/sys/msdos/fonts/README.txt new file mode 100644 index 000000000..52848f525 --- /dev/null +++ b/sys/msdos/fonts/README.txt @@ -0,0 +1,7 @@ +The script makefont.lua converts the Terminus fonts from the BDF sources to +PSF version 2 for use by the MS-DOS NetHack. The directory sys/msdos/fonts +receives the converted fonts. + +makefont.lua is specifically meant for use with NetHack; it rearranges the +input glyphs so the first 256 positions conform to IBM437. The fonts can then +support IBMGraphics without using the Unicode table. diff --git a/sys/msdos/fonts/makefont.lua b/sys/msdos/fonts/makefont.lua new file mode 100755 index 000000000..78ec760dd --- /dev/null +++ b/sys/msdos/fonts/makefont.lua @@ -0,0 +1,228 @@ +#!/usr/bin/env lua +-- Copyright (c) 2016, 2022 Ray Chason +-- NetHack may be freely redistributed. See license for details. + +-- IBM437 order as NetHack expects +ibm437 = { + 0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, + 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, + 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302, + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +} + +-- As ibm437, but mapping Unicode back to the IBM437 position +ibm437_rev = {} +for i = 1, #ibm437 do + ibm437_rev[ibm437[i]] = i +end + +-- Information about a single glyph in the font +function new_glyph(width, height) + local g = {} + g.width = width + g.height = height + g.bytes = "" + g.code = {} + return g +end + +-- This converts an unsigned integer to four little endian bytes +function write_u32(x) + return string.pack(" [...] \n") + os.exit(1) +end + +for inp = 1, #arg-1 do + + fp = io.open(arg[inp], "r") + if fp == nil then + io.stderr:write("Could not open: " .. arg[inp] .. "\n") + os.exit(1) + end + + while true do + line = fp:read() + if (line == fail) then + break + end + if start_with(line, 'FONTBOUNDINGBOX ') then + -- Width and height of a glyph + rec = split(line) + if inp == 1 then + -- First input file sets the dimensions + width = tonumber(rec[2]) + height = tonumber(rec[3]) + bwidth = math.floor((width + 7) / 8) + else + -- Any others must match, or an error results + if width ~= tonumber(rec[2]) or height ~= tonumber(rec[3]) then + io.stderr:write(arg[inp] .. " bounding box does not match that of " .. arg[1] .. "\n") + os.exit(1) + end + end + elseif start_with(line, 'STARTCHAR ') then + -- A glyph begins here + glyph = new_glyph(width, height) + elseif start_with(line, 'ENCODING ') then + -- This line provides the Unicode code point + rec = split(line) + glyph.code[#glyph.code+1] = tonumber(rec[2]) + elseif start_with(line, 'BITMAP') then + -- Bitmap data appears on following lines + bitmap = true + elseif start_with(line, 'ENDCHAR') then + -- End of bitmap data + -- Position will be according to IBM437 if the code point is in + -- IBM437, else matching any prior occurrence if the same glyph has + -- appeared before, else as a new glyph + pos = ibm437_rev[glyph.code[1]] or font_by_bytes[glyph.bytes] + if pos == nil then + pos = next_pos + next_pos = next_pos + 1 + end + if font[pos] == nil then + font[pos] = glyph + font_by_bytes[glyph.bytes] = pos + else + for i = 1, #glyph.code do + font[pos].code[#font[pos].code+1] = glyph.code[i] + end + end + font_by_code[glyph.code[1]] = pos + glyph = nil + bitmap = false + elseif bitmap then + -- Hex data after BITMAP and before ENDCHAR + for i = 1, bwidth do + byte = string.sub(line, i*2-1, i*2) + glyph.bytes = glyph.bytes .. string.char(tonumber(byte, 16)) + end + end + end + + fp:close() +end + +-- The provided BDFs code positions 16 and 17 differently from what NetHack +-- expects +if font[ibm437_rev[0x25BA]] == nil and font_by_code[0x25B6] ~= nil then + pos1 = font_by_code[0x25B6] + pos2 = ibm437_rev[0x25BA] + font[pos2] = font[pos1] + font[pos2].code[#font[pos2].code+1] = 0x25BA + font[pos1] = nil +end +if font[ibm437_rev[0x25C4]] == nil and font_by_code[0x25C0] ~= nil then + pos1 = font_by_code[0x25C0] + pos2 = ibm437_rev[0x25C4] + font[pos2] = font[pos1] + font[pos2].code[#font[pos2].code+1] = 0x25C4 + font[pos1] = nil +end + +-- Fill any empty slots and warn +for i = 1, 256 do + if font[i] == nil then + if next_pos > 257 then + next_pos = next_pos - 1 + font[i] = font[next_pos] + font[next_pos] = nil + end + end +end + +outfile = io.open(arg[#arg], "wb") + +-- Write the PSF header +outfile:write("\x72\xB5\x4A\x86") -- magic +outfile:write(write_u32(0)) -- version +outfile:write(write_u32(32)) -- headersize +outfile:write(write_u32(0x01)) -- flags (Unicode table present) +outfile:write(write_u32(next_pos-1)) -- length +outfile:write(write_u32(bwidth * height)) -- charsize +outfile:write(write_u32(height)) -- height +outfile:write(write_u32(width)) -- width + +-- Write the glyphs +for i = 1, next_pos-1 do + glyph = font[i] + outfile:write(glyph.bytes) +end + +-- Write the Unicode mappings +for i = 1, next_pos-1 do + glyph = font[i] + for j = 1, #glyph.code do + outfile:write(utf8.char(glyph.code[j])) + end + outfile:write("\xFF") +end + +outfile:close() diff --git a/sys/msdos/fonts/nh-u16b.bdf b/sys/msdos/fonts/nh-u16b.bdf new file mode 100644 index 000000000..a4b9cb633 --- /dev/null +++ b/sys/msdos/fonts/nh-u16b.bdf @@ -0,0 +1,68 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 8 16 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u16b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +00 +00 +00 +00 +32 +4C +00 +32 +4C +00 +32 +4C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FF +FF +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u16v.bdf b/sys/msdos/fonts/nh-u16v.bdf new file mode 100644 index 000000000..7bd2669e0 --- /dev/null +++ b/sys/msdos/fonts/nh-u16v.bdf @@ -0,0 +1,68 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 8 16 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u16v.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +00 +00 +00 +00 +32 +4C +00 +32 +4C +00 +32 +4C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FF +FF +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u18b.bdf b/sys/msdos/fonts/nh-u18b.bdf new file mode 100644 index 000000000..11a4b1176 --- /dev/null +++ b/sys/msdos/fonts/nh-u18b.bdf @@ -0,0 +1,74 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 10 18 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u18b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +0000 +0000 +0000 +3100 +4900 +4600 +0000 +3100 +4900 +4600 +0000 +3100 +4900 +4600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FFC0 +FFC0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u20b.bdf b/sys/msdos/fonts/nh-u20b.bdf new file mode 100644 index 000000000..702269414 --- /dev/null +++ b/sys/msdos/fonts/nh-u20b.bdf @@ -0,0 +1,80 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 10 20 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u20b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +0000 +0000 +0000 +0000 +3100 +4900 +4600 +0000 +3100 +4900 +4600 +0000 +3100 +4900 +4600 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FFC0 +FFC0 +FFC0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u22b.bdf b/sys/msdos/fonts/nh-u22b.bdf new file mode 100644 index 000000000..15de8d761 --- /dev/null +++ b/sys/msdos/fonts/nh-u22b.bdf @@ -0,0 +1,86 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 11 22 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u22b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +0000 +0000 +0000 +0000 +0000 +3080 +4C80 +4300 +0000 +3080 +4C80 +4300 +0000 +3080 +4C80 +4300 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FFE0 +FFE0 +FFE0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u24b.bdf b/sys/msdos/fonts/nh-u24b.bdf new file mode 100644 index 000000000..bea34cc68 --- /dev/null +++ b/sys/msdos/fonts/nh-u24b.bdf @@ -0,0 +1,92 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 12 24 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u24b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3C60 +6660 +63C0 +0000 +3C60 +6660 +63C0 +0000 +3C60 +6660 +63C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FFF0 +FFF0 +FFF0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u28b.bdf b/sys/msdos/fonts/nh-u28b.bdf new file mode 100644 index 000000000..2b3954771 --- /dev/null +++ b/sys/msdos/fonts/nh-u28b.bdf @@ -0,0 +1,104 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 14 28 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u28b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1C30 +3630 +6360 +61C0 +0000 +1C30 +3630 +6360 +61C0 +0000 +1C30 +3630 +6360 +61C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FFFC +FFFC +FFFC +FFFC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +000C +ENDCHAR +ENDFONT diff --git a/sys/msdos/fonts/nh-u32b.bdf b/sys/msdos/fonts/nh-u32b.bdf new file mode 100644 index 000000000..e5cf7f2a8 --- /dev/null +++ b/sys/msdos/fonts/nh-u32b.bdf @@ -0,0 +1,116 @@ +STARTFONT 2.1 +FONTBOUNDINGBOX 16 32 +STARTPROPERTIES 3 +NOTICE "Additional characters to use with ter-u32b.bdf" +COPYRIGHT "Copyright 2022 Ray Chason." +NOTICE "NetHack may be freely redistributed. See license for details." +ENDPROPERTIES +STARTCHAR tripletilde +ENCODING 8779 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1F0C +3F9C +39FC +30F8 +0000 +0000 +1F0C +3F9C +39FC +30F8 +0000 +0000 +1F0C +3F9C +39FC +30F8 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR uppereighth +ENCODING 9620 +BITMAP +FFFF +FFFF +FFFF +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR righteighth +ENCODING 9621 +BITMAP +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +0002 +ENDCHAR +ENDFONT diff --git a/sys/msdos/moveinit.pat b/sys/msdos/moveinit.pat deleted file mode 100644 index fc8ab0c40..000000000 --- a/sys/msdos/moveinit.pat +++ /dev/null @@ -1,37 +0,0 @@ - These are patches for MOVEINIT.C, supplied - with the MSVC compiler in the compiler's SOURCE\MOVE - subdirectory. (Copy that and the MOVEAPI.H - file into your NetHack src directory and apply this patch) - - -*** ../linc/src/moveinit.c Tue Nov 23 08:01:00 1993 ---- src/moveinit.c Sun Mar 13 10:13:10 1994 -*************** -*** 13,18 **** ---- 13,19 ---- - *******************************************************************************/ - - #include "moveapi.h" -+ extern unsigned memavail(unsigned); - - #ifndef MOVE_ENV - -*************** -*** 125,132 **** - /* attempt to allocate the overlay heap. ignore return value (heap size). - * note that MOVE will abort if not enough memory to alloc minimum size. - */ -! -! _movesetheap ($$COVL, cparaLarge, cparaMax); - - /* get available cache ressource amount */ - ---- 126,133 ---- - /* attempt to allocate the overlay heap. ignore return value (heap size). - * note that MOVE will abort if not enough memory to alloc minimum size. - */ -! cparaMax = memavail(cparaMin); -! _movesetheap ($$COVL, cparaMin, cparaMax); - - /* get available cache ressource amount */ - diff --git a/sys/msdos/msdos.c b/sys/msdos/msdos.c index 69f994be6..e2787b020 100644 --- a/sys/msdos/msdos.c +++ b/sys/msdos/msdos.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 msdos.c $NHDT-Date: 1432512792 2015/05/25 00:13:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ +/* NetHack 5.0 msdos.c $NHDT-Date: 1596498269 2020/08/03 23:44:29 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.15 $ */ /* Copyright (c) NetHack PC Development Team 1990 */ /* NetHack may be freely redistributed. See license for details. */ @@ -15,7 +15,6 @@ #include "pcvideo.h" #include -#include /* * MS-DOS functions @@ -43,27 +42,35 @@ */ #define READCHAR 0x00 /* Read Character from Keyboard */ #define GETKEYFLAGS 0x02 /* Get Keyboard Flags */ -/*#define KEY_DEBUG */ /* print values of unexpected key codes - devel*/ +/*#define KEY_DEBUG */ /* print values of unexpected key codes - devel*/ -void FDECL(get_cursor, (int *, int *)); +void get_cursor(int *, int *); /* direct bios calls are used only when iflags.BIOS is set */ -STATIC_DCL char NDECL(DOSgetch); -STATIC_DCL char NDECL(BIOSgetch); +static char DOSgetch(void); +static char BIOSgetch(void); +/* static long freediskspace(char *path); */ +unsigned long sys_random_seed(void); + #ifndef __GO32__ -STATIC_DCL char *NDECL(getdta); +static char *getdta(void); #endif -STATIC_DCL unsigned int FDECL(dos_ioctl, (int, int, unsigned)); -#ifdef USE_TILES -extern boolean FDECL(pckeys, (unsigned char, unsigned char)); /* pckeys.c */ +static unsigned int dos_ioctl(int, int, unsigned); +#ifdef TILES_IN_GLYPHMAP +extern boolean pckeys(unsigned char, unsigned char); /* pckeys.c */ #endif int -tgetch() +tgetch(void) { char ch; +#ifdef SCREEN_VESA + if (iflags.usevesa) { + vesa_flush_text(); + } +#endif /*SCREEN_VESA*/ /* BIOSgetch can use the numeric key pad on IBM compatibles. */ #ifdef SIMULATE_CURSOR if (iflags.grmode && cursor_flag) @@ -193,7 +200,7 @@ static const struct pad { * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII * meaning unless assigned one by a keyboard conversion table, so the * keyboard BIOS normally does not return a character code when Alt-letter - * is pressed. So, to interpret unassigned Alt-letters, we must use a + * is pressed. So, to interpret unassigned Alt-letters, we must use a * scan code table to translate the scan code into a letter, then set the * "meta" bit for it. -3. */ @@ -243,8 +250,8 @@ static const char numeric_scanmap[] = { /* ... */ #define ALT 0x8 #endif /* PC9800 */ -STATIC_OVL char -BIOSgetch() +static char +BIOSgetch(void) { unsigned char scan, shift, ch = 0; const struct pad *kpad; @@ -273,7 +280,7 @@ BIOSgetch() else ch = kpad[scan - KEYPADLO].normal; } -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP /* Check for special interface manipulation keys */ if (pckeys(scan, shift)) { ch = 0xFF; @@ -289,7 +296,7 @@ BIOSgetch() if ((shift & ALT) && !ch) { #endif #if 0 - pline("Scan code: %d 0x%03X", scan, scan); + pline("Scan code: %d 0x%03X", scan, scan); #endif if (inmap(scan)) ch = scanmap[scan - SCANLO]; @@ -303,8 +310,8 @@ BIOSgetch() return ch; } -STATIC_OVL char -DOSgetch() +static char +DOSgetch(void) { union REGS regs; char ch; @@ -343,7 +350,7 @@ DOSgetch() } char -switchar() +switchar(void) { union REGS regs; @@ -352,9 +359,9 @@ switchar() return regs.h.dl; } -long -freediskspace(path) -char *path; +#if 0 +static long +freediskspace(char *path) { union REGS regs; @@ -369,14 +376,14 @@ char *path; else return ((long) regs.x.bx * regs.x.cx * regs.x.ax); } +#endif /* 0 */ #ifndef __GO32__ /* * Functions to get filenames using wildcards */ int -findfirst_file(path) -char *path; +findfirst_file(char *path) { union REGS regs; struct SREGS sregs; @@ -390,7 +397,7 @@ char *path; } int -findnext_file() +findnext_file(void) { union REGS regs; @@ -400,14 +407,14 @@ findnext_file() } char * -foundfile_buffer() +foundfile_buffer(void) { return (getdta() + 30); } /* Get disk transfer area */ -STATIC_OVL char * -getdta() +static char * +getdta(void) { union REGS regs; struct SREGS sregs; @@ -425,8 +432,7 @@ getdta() } long -filesize_nh(file) -char *file; +filesize_nh(char *file) { char *dta; @@ -443,15 +449,14 @@ char *file; * Chdrive() changes the default drive. */ void -chdrive(str) -char *str; +chdrive(const char *str) { #define SELECTDISK 0x0E char *ptr; union REGS inregs; char drive; - if ((ptr = index(str, ':')) != (char *) 0) { + if ((ptr = strchr(str, ':')) != (char *) 0) { drive = toupper(*(ptr - 1)); inregs.h.ah = SELECTDISK; inregs.h.dl = drive - 'A'; @@ -477,7 +482,7 @@ char *str; static unsigned int old_stdin, old_stdout; void -disable_ctrlP() +disable_ctrlP(void) { if (!iflags.rawio) return; @@ -492,7 +497,7 @@ disable_ctrlP() } void -enable_ctrlP() +enable_ctrlP(void) { if (!iflags.rawio) return; @@ -503,10 +508,8 @@ enable_ctrlP() return; } -STATIC_OVL unsigned int -dos_ioctl(handle, mode, setvalue) -int handle, mode; -unsigned setvalue; +static unsigned int +dos_ioctl(int handle, int mode, unsigned setvalue) { union REGS regs; @@ -520,7 +523,7 @@ unsigned setvalue; } unsigned long -sys_random_seed(VOID_ARGS) +sys_random_seed(void) { unsigned long ourseed = 0UL; time_t datetime = 0; diff --git a/sys/msdos/msdoshlp.txt b/sys/msdos/msdoshlp.txt index cad9a17fb..b255f6f45 100644 --- a/sys/msdos/msdoshlp.txt +++ b/sys/msdos/msdoshlp.txt @@ -1,4 +1,4 @@ - MSDOS specific help file for NetHack 3.6 + MSDOS specific help file for NetHack 5.0 (Last Revision: December 4, 1999) Copyright (c) NetHack PC Development Team 1993-1999. @@ -47,7 +47,7 @@ OPTIONS=VIDEO ie: OPTIONS=video:autodetect - Possible values are: AUTODETECT, DEFAULT, VGA + Possible values are: AUTODETECT, DEFAULT, VGA, VESA AUTODETECT Checks for a supported hi-res video adaptor, and if it detects one, NetHack @@ -62,6 +62,9 @@ OPTIONS=VIDEO potential to cause machine lock-ups if the specified video hardware is not present. + VESA Forces use of VESA specific video routines. + Reverts to TTY mode if no VESA BIOS is found. + OPTIONS=VIDEOSHADES (defaults.nh only) Players may wish to add this option because one of their @@ -101,7 +104,7 @@ OPTIONS=VIDEOCOLORS (defaults.nh only) This option is only provided because some people on r.g.r.n mentioned how they liked to modify the color - values from the default ANSI.SYS behaviour, and were + values from the default ANSI.SYS behavior, and were "upset" to find out that they could no longer do so under 3.1.2. The color map is as accurate as possible on standard PC video hardware as it stands, and any diff --git a/sys/msdos/nhlua.h b/sys/msdos/nhlua.h new file mode 100644 index 000000000..992f2ad64 --- /dev/null +++ b/sys/msdos/nhlua.h @@ -0,0 +1,6 @@ +/* nhlua.h - generated by top Makefile */ +#include "../lib/lua544/src/lua.h" +LUA_API int (lua_error) (lua_State *L) NORETURN; +#include "../lib/lua544/src/lualib.h" +#include "../lib/lua544/src/lauxlib.h" +/*nhlua.h*/ diff --git a/sys/msdos/ovlinit.c b/sys/msdos/ovlinit.c deleted file mode 100644 index bc18134ad..000000000 --- a/sys/msdos/ovlinit.c +++ /dev/null @@ -1,156 +0,0 @@ -/* NetHack 3.6 ovlinit.c $NHDT-Date: 1432512792 2015/05/25 00:13:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (c) NetHack PC Development Team 1995 */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include -#include - -#ifdef _MSC_VER - -#define RESERVED_PARAGRAPHS 5120 /* leave 80K for malloc and inits */ - /* subject to change before release */ - -/* - * memavail() Returns the amount of RAM available (in paragraphs which are 16 - * bytes) - the amount to be reserved for heap allocations. - * - */ -unsigned -memavail(minovl) -unsigned minovl; /* minimum size of overlay heap */ -{ - unsigned available; - - unsigned farparaavail; - unsigned tmp; - - /* - * _dos_allocmem will return the maximum block size available. - * It uses DOS (int 21h) service 0x48. - */ - - _dos_allocmem(0xFFFF, &farparaavail); - available = farparaavail - RESERVED_PARAGRAPHS; - tmp = RESERVED_PARAGRAPHS + minovl; - if (farparaavail < tmp) { - panic("Not enough free RAM to begin a game of NetHack (%ld bytes)", - (long) ((long) tmp * 16L)); - } - return available; -} -#endif /*_MSC_VER*/ - -#ifdef __BORLANDC__ - -#define RSRVD_MALLOC 65 * 1024L /* malloc() calls use about 65K */ -#define RSRVD_CRTL 50 * 1024L /* C runtime library uses 50K */ -#define RSRVD_TOTAL 115 * 1024L /* reserved for use in malloc() */ - /* as well as by C runtime library */ - /* routines which allocate memory */ - /* after this routine runs. */ -#define MIN_OVRBUF 30 * 1024L /* Overlay buffer gets minimum of */ -#define MAX_OVRBUF 200 * 1024L /* 30K and maximum of 200K. */ - -#define RESIZE_OVL -#ifdef RESIZE_OVL - -extern unsigned _ovrbuffer = 0; /* Use default size initially */ -unsigned appFail = 0; /* Fail flag if not enough RAM */ -unsigned memAlloc = 0; -unsigned long ProgramSize; -unsigned long runAlloc; -unsigned far *mem_top; -unsigned total; -signed long tmpbuffer; -int emsstatus; -int xmsstatus; - -void NDECL(_resizeOvrBuffer); - -void -_resizeOvrBuffer() -{ - mem_top = (unsigned far *) MK_FP(_psp, 0x02); - total = *mem_top - _psp; - - ProgramSize = *(unsigned far *) MK_FP(_psp - 1, 0x03); - tmpbuffer = total - ProgramSize - RSRVD_TOTAL / 16; - memAlloc = min(MAX_OVRBUF / 16, tmpbuffer); - if (tmpbuffer >= MIN_OVRBUF / 16) - _ovrbuffer = memAlloc; - else { - _ovrbuffer = 1; - appFail = 1; - }; - - /* - * Remember, when inside this code, nothing has been setup on - * the system, so do NOT call any RTL functions for I/O or - * anything else that might rely on a startup function. This - * includes accessing any global objects as their constructors - * have not been called yet. - */ -} - -#pragma startup _resizeOvrBuffer 0 /* Put function in table */ - -void -startup() -{ - if (appFail) { - printf("NetHack fits in memory, but it cannot allocate memory"); - printf(" for the overlay buffer\nand the runtime functions. "); - printf("Please free up just %ld more bytes.", - (long) (MIN_OVRBUF - tmpbuffer * 16L)); - exit(-1); - } else { - /* Now try to use expanded memory for the overlay manager */ - /* If that doesn't work, we revert to extended memory */ - - emsstatus = _OvrInitEms(0, 0, 0); -#ifdef RECOGNIZE_XMS - xmsstatus = (emsstatus) ? _OvrInitExt(0, 0) : -1; -#endif - } -} - -void -show_borlandc_stats(win) -winid win; -{ - char buf[BUFSZ]; - - putstr(win, 0, ""); - putstr(win, 0, ""); - putstr(win, 0, "Memory usage stats"); - putstr(win, 0, ""); - putstr(win, 0, ""); - Sprintf(buf, "Overlay buffer memory allocation: %ld bytes.", - memAlloc * 16L); - putstr(win, 0, buf); - Sprintf(buf, "_ovrbuffer = %u.", _ovrbuffer); - putstr(win, 0, buf); - Sprintf(buf, "Startup memory usage: 0x%X", ProgramSize); - putstr(win, 0, buf); - runAlloc = *(unsigned far *) MK_FP(_psp - 1, 0x03); - Sprintf(buf, "Current memory usage: 0x%X", runAlloc); - putstr(win, 0, buf); - if (emsstatus) - Sprintf(buf, "EMS search failed (%d).", emsstatus); - else - Sprintf(buf, "EMS search successful."); - putstr(win, 0, buf); -#ifdef RECOGNIZE_XMS - if (xmsstatus) - Sprintf(buf, "XMS search failed (%d).", xmsstatus); - else - Sprintf(buf, "XMS search successful."); - putstr(win, 0, buf); -#endif -} - -#endif /* #ifdef RESIZE_OVL */ -#endif /* #ifdef __BORLANDC__ */ - -/*ovlinit.c*/ diff --git a/sys/msdos/pckeys.c b/sys/msdos/pckeys.c index ec59b999d..51eb0cf0c 100644 --- a/sys/msdos/pckeys.c +++ b/sys/msdos/pckeys.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pckeys.c $NHDT-Date: 1501465420 2017/07/31 01:43:40 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.12 $ */ +/* NetHack 5.0 pckeys.c $NHDT-Date: 1596498270 2020/08/03 23:44:30 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.14 $ */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ @@ -9,15 +9,15 @@ #include "hack.h" #ifdef MSDOS -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP #include "wintty.h" #include "pcvideo.h" -boolean FDECL(pckeys, (unsigned char, unsigned char)); -static void FDECL(userpan, (BOOLEAN_P)); -static void FDECL(overview, (BOOLEAN_P)); -static void FDECL(traditional, (BOOLEAN_P)); -static void NDECL(refresh); +boolean pckeys(unsigned char, unsigned char); +static void userpan(boolean); +static void overview(boolean); +static void traditional(boolean); +static void refresh(void); extern struct WinDesc *wins[MAXWIN]; /* from wintty.c */ extern boolean inmap; /* from video.c */ @@ -32,13 +32,11 @@ extern boolean inmap; /* from video.c */ * */ boolean -pckeys(scancode, shift) -unsigned char scancode; -unsigned char shift; +pckeys(unsigned char scancode, unsigned char shift) { boolean opening_dialog; - opening_dialog = pl_character[0] ? FALSE : TRUE; + opening_dialog = svp.pl_character[0] ? FALSE : TRUE; switch (scancode) { #ifdef SIMULATE_CURSOR case 0x3d: /* F3 = toggle cursor type */ @@ -78,8 +76,7 @@ unsigned char shift; } static void -userpan(on) -boolean on; +userpan(boolean on) { #ifdef SCREEN_VGA if (iflags.usevga) @@ -92,8 +89,7 @@ boolean on; } static void -overview(on) -boolean on; +overview(boolean on) { #ifdef SCREEN_VGA if (iflags.usevga) @@ -106,8 +102,7 @@ boolean on; } static void -traditional(on) -boolean on; +traditional(boolean on) { #ifdef SCREEN_VGA if (iflags.usevga) @@ -120,7 +115,7 @@ boolean on; } static void -refresh() +refresh(void) { #ifdef SCREEN_VGA if (iflags.usevga) @@ -131,7 +126,7 @@ refresh() vesa_refresh(); #endif } -#endif /* USE_TILES */ +#endif /* TILES_IN_GLYPHMAP */ #endif /* MSDOS */ /*pckeys.c*/ diff --git a/sys/msdos/pctiles.c b/sys/msdos/pctiles.c index 1a8a53aad..9103c6d61 100644 --- a/sys/msdos/pctiles.c +++ b/sys/msdos/pctiles.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pctiles.c $NHDT-Date: 1432512791 2015/05/25 00:13:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ +/* NetHack 5.0 pctiles.c $NHDT-Date: 1596498271 2020/08/03 23:44:31 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.13 $ */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ @@ -12,7 +12,7 @@ #include "hack.h" -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP #if defined(__GO32__) || defined(__DJGPP__) #include @@ -33,8 +33,8 @@ #include "tile.h" #include "pctiles.h" -STATIC_VAR FILE *tilefile; -STATIC_VAR FILE *tilefile_O; +static FILE *tilefile; +static FILE *tilefile_O; extern short glyph2tile[]; /* in tile.c (made from tilemap.c) */ #ifdef TILES_IN_RAM @@ -54,9 +54,7 @@ extern int total_tiles_used; /* tile.c */ * */ int -ReadTileFileHeader(tibhdr, filestyle) -struct tibhdr_struct *tibhdr; -boolean filestyle; +ReadTileFileHeader(struct tibhdr_struct *tibhdr, boolean filestyle) { FILE *x; x = filestyle ? tilefile_O : tilefile; @@ -85,9 +83,7 @@ boolean filestyle; * */ int -OpenTileFile(tilefilename, filestyle) -char *tilefilename; -boolean filestyle; +OpenTileFile(char *tilefilename, boolean filestyle) { #ifdef TILES_IN_RAM int k; @@ -150,8 +146,7 @@ boolean filestyle; } void -CloseTileFile(filestyle) -boolean filestyle; +CloseTileFile(boolean filestyle) { fclose(filestyle ? tilefile_O : tilefile); #ifdef TILES_IN_RAM @@ -191,9 +186,7 @@ struct overview_planar_cell_struct oplancell; */ #ifdef PLANAR_FILE int -ReadPlanarTileFile(tilenum, gp) -int tilenum; -struct planar_cell_struct **gp; +ReadPlanarTileFile(int tilenum, struct planar_cell_struct **gp) { long fpos; @@ -214,9 +207,7 @@ struct planar_cell_struct **gp; return 0; } int -ReadPlanarTileFile_O(tilenum, gp) -int tilenum; -struct overview_planar_cell_struct **gp; +ReadPlanarTileFile_O(int tilenum, struct overview_planar_cell_struct **gp) { long fpos; @@ -242,9 +233,7 @@ struct overview_planar_cell_struct **gp; #ifdef PACKED_FILE int -ReadPackedTileFile(tilenum, pta) -int tilenum; -char (*pta)[TILE_X]; +ReadPackedTileFile(int tilenum, char (*pta)[TILE_X]) { long fpos; @@ -258,6 +247,6 @@ char (*pta)[TILE_X]; return 0; } #endif -#endif /* USE_TILES */ +#endif /* TILES_IN_GLYPHMAP */ /* pctiles.c */ diff --git a/sys/msdos/pctiles.h b/sys/msdos/pctiles.h index e56812371..44707c686 100644 --- a/sys/msdos/pctiles.h +++ b/sys/msdos/pctiles.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 pctiles.h $NHDT-Date: 1457207040 2016/03/05 19:44:00 $ $NHDT-Branch: chasonr $:$NHDT-Revision: 1.9 $ */ +/* NetHack 5.0 pctiles.h $NHDT-Date: 1596498272 2020/08/03 23:44:32 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.10 $ */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ @@ -10,7 +10,7 @@ * */ -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP #ifndef TILE_X #define TILE_X 16 #endif @@ -45,24 +45,20 @@ struct tibhdr_struct { * char packtile[TILE_Y][TILE_X]; */ -extern void FDECL(CloseTileFile, (BOOLEAN_P)); -extern int FDECL(OpenTileFile, (char *, BOOLEAN_P)); -extern int FDECL(ReadTileFileHeader, (struct tibhdr_struct *, BOOLEAN_P)); +extern void CloseTileFile(boolean); +extern int OpenTileFile(char *, boolean); +extern int ReadTileFileHeader(struct tibhdr_struct *, boolean); #ifdef PLANAR_FILE #ifdef SCREEN_VGA -extern int FDECL(ReadPlanarTileFile, (int, struct planar_cell_struct **)); -extern int FDECL(ReadPlanarTileFile_O, - (int, struct overview_planar_cell_struct **)); +extern int ReadPlanarTileFile(int, struct planar_cell_struct **); +extern int ReadPlanarTileFile_O(int, struct overview_planar_cell_struct **); #endif #endif #ifdef PACKED_FILE -extern int FDECL(ReadPackedTileFile, (int, char (*)[TILE_X])); +extern int ReadPackedTileFile(int, char (*)[TILE_X]); #endif - -extern short glyph2tile[MAX_GLYPH]; /* in tile.c (made from tilemap.c) */ - -#endif /* USE_TILES */ +#endif /* TILES_IN_GLYPHMAP */ /* pctiles.h */ diff --git a/sys/msdos/pcvideo.h b/sys/msdos/pcvideo.h index bc2f876fd..a9cce2bbb 100644 --- a/sys/msdos/pcvideo.h +++ b/sys/msdos/pcvideo.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 pcvideo.h $NHDT-Date: 1457207040 2016/03/05 19:44:00 $ $NHDT-Branch: chasonr $:$NHDT-Revision: 1.9 $ */ +/* NetHack 5.0 pcvideo.h $NHDT-Date: 1596498273 2020/08/03 23:44:33 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.11 $ */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ @@ -22,7 +22,7 @@ #endif #ifdef SCREEN_DJGPPFAST -/*# define MONO_CHECK /* djgpp should be able to do check */ +/*# define MONO_CHECK */ /* djgpp should be able to do check */ #endif /* @@ -55,6 +55,7 @@ #endif #define GETCURPOS 0x03 /* Get Cursor Position */ +#define SETCURTYP 0x01 /* Set Cursor Type */ #define GETMODE 0x0f /* Get Video Mode */ #define SETMODE 0x00 /* Set Video Mode */ #define SETPAGE 0x05 /* Set Video Page */ @@ -66,14 +67,14 @@ * VGA Specific Stuff */ #ifdef SCREEN_VGA -/* #define HW_PANNING /* Hardware panning enabled */ +/* #define HW_PANNING */ /* Hardware panning enabled */ #define USHORT unsigned short #define MODE640x480 0x0012 /* Switch to VGA 640 x 480 Graphics mode */ #define MODETEXT 0x0003 /* Switch to Text mode 3 */ #ifdef HW_PANNING #define PIXELINC 16 /* How much to increment by when panning */ -/*#define PIXELINC 1 /* How much to increment by when panning */ +/*#define PIXELINC 1 */ /* How much to increment by when panning */ #define SCREENBYTES 128 #define CharRows 30 #define VERT_RETRACE \ @@ -181,6 +182,10 @@ struct overview_planar_cell_struct { #define ATTRIB_VGA_INTENSE 14 /* Intense White 94/06/07 palette chg*/ #endif /*SCREEN_VGA || SCREEN_8514*/ +#if defined(SCREEN_VESA) +#define BACKGROUND_VESA_COLOR 240 +#endif /*SCREEN_VESA*/ + #if defined(PC9800) static unsigned char attr98[CLR_MAX] = { 0xe1, /* 0 white */ @@ -223,94 +228,98 @@ extern int cursor_color; * */ -#define E extern - /* ### video.c ### */ #ifdef SIMULATE_CURSOR -E void NDECL(DrawCursor); -E void NDECL(HideCursor); +extern void DrawCursor(void); +extern void HideCursor(void); #endif /* ### vidtxt.c ### */ #ifdef NO_TERMS -E void NDECL(txt_backsp); -E void NDECL(txt_clear_screen); -E void FDECL(txt_cl_end, (int, int)); -E void NDECL(txt_cl_eos); -E void NDECL(txt_get_scr_size); -E void FDECL(txt_gotoxy, (int, int)); -E int NDECL(txt_monoadapt_check); -E void NDECL(txt_nhbell); -E void FDECL(txt_startup, (int *, int *)); -E void FDECL(txt_xputs, (const char *, int, int)); -E void FDECL(txt_xputc, (CHAR_P, int)); +extern void txt_backsp(void); +extern void txt_clear_screen(void); +extern void txt_cl_end(int, int); +extern void txt_cl_eos(void); +extern void txt_get_scr_size(void); +extern void txt_gotoxy(int, int); +extern int txt_monoadapt_check(void); +extern void txt_nhbell(void); +extern void txt_startup(int *, int *); +extern void txt_xputs(const char *, int, int); +extern void txt_xputc(char, int); +extern void txt_hide_cursor(void); +extern void txt_show_cursor(void); /* ### vidvga.c ### */ +enum vga_pan_direction { pan_left, pan_up, pan_right, pan_down }; #ifdef SCREEN_VGA -E void NDECL(vga_backsp); -E void FDECL(vga_clear_screen, (int)); -E void FDECL(vga_cl_end, (int, int)); -E void FDECL(vga_cl_eos, (int)); -E int NDECL(vga_detect); +extern void vga_backsp(void); +extern void vga_clear_screen(int); +extern void vga_cl_end(int, int); +extern void vga_cl_eos(int); +extern int vga_detect(void); +extern void vga_hide_cursor(void); +extern void vga_show_cursor(void); #ifdef SIMULATE_CURSOR -E void NDECL(vga_DrawCursor); +extern void vga_DrawCursor(void); #endif -E void NDECL(vga_Finish); -E char __far *NDECL(vga_FontPtrs); -E void NDECL(vga_get_scr_size); -E void FDECL(vga_gotoloc, (int, int)); +extern void vga_Finish(void); +extern char __far *vga_FontPtrs(void); +extern void vga_get_scr_size(void); +extern void vga_gotoloc(int, int); #ifdef POSITIONBAR -E void FDECL(vga_update_positionbar, (char *)); +extern void vga_update_positionbar(char *); #endif #ifdef SIMULATE_CURSOR -E void NDECL(vga_HideCursor); +extern void vga_HideCursor(void); #endif -E void NDECL(vga_Init); -E void NDECL(vga_tty_end_screen); -E void FDECL(vga_tty_startup, (int *, int *)); -E void FDECL(vga_xputs, (const char *, int, int)); -E void FDECL(vga_xputc, (CHAR_P, int)); -E void FDECL(vga_xputg, (int, int, unsigned)); -E void FDECL(vga_userpan, (BOOLEAN_P)); -E void FDECL(vga_overview, (BOOLEAN_P)); -E void FDECL(vga_traditional, (BOOLEAN_P)); -E void NDECL(vga_refresh); +extern void vga_Init(void); +extern void vga_term_end_screen(void); +extern void vga_term_startup(int *, int *); +extern void vga_xputs(const char *, int, int); +extern void vga_xputc(char, int); +extern void vga_xputg(const glyph_info *, const glyph_info *); +extern void vga_userpan(enum vga_pan_direction); +extern void vga_overview(boolean); +extern void vga_traditional(boolean); +extern void vga_refresh(void); #endif /* SCREEN_VGA */ #ifdef SCREEN_VESA -E void NDECL(vesa_backsp); -E void FDECL(vesa_clear_screen, (int)); -E void FDECL(vesa_cl_end, (int, int)); -E void FDECL(vesa_cl_eos, (int)); -E int NDECL(vesa_detect); +extern void vesa_backsp(void); +extern void vesa_clear_screen(int); +extern void vesa_cl_end(int, int); +extern void vesa_cl_eos(int); +extern int vesa_detect(void); +extern void vesa_hide_cursor(void); +extern void vesa_show_cursor(void); #ifdef SIMULATE_CURSOR -E void NDECL(vesa_DrawCursor); +extern void vesa_DrawCursor(void); #endif -E void NDECL(vesa_Finish); -E void NDECL(vesa_get_scr_size); -E void FDECL(vesa_gotoloc, (int, int)); +extern void vesa_Finish(void); +extern void vesa_get_scr_size(void); +extern void vesa_gotoloc(int, int); #ifdef POSITIONBAR -E void FDECL(vesa_update_positionbar, (char *)); +extern void vesa_update_positionbar(char *); #endif #ifdef SIMULATE_CURSOR -E void NDECL(vesa_HideCursor); +extern void vesa_HideCursor(void); #endif -E void NDECL(vesa_Init); -E void NDECL(vesa_tty_end_screen); -E void FDECL(vesa_tty_startup, (int *, int *)); -E void FDECL(vesa_xputs, (const char *, int, int)); -E void FDECL(vesa_xputc, (CHAR_P, int)); -E void FDECL(vesa_xputg, (int, int, unsigned)); -E void FDECL(vesa_userpan, (BOOLEAN_P)); -E void FDECL(vesa_overview, (BOOLEAN_P)); -E void FDECL(vesa_traditional, (BOOLEAN_P)); -E void NDECL(vesa_refresh); +extern void vesa_Init(void); +extern void vesa_term_end_screen(void); +extern void vesa_term_startup(int *, int *); +extern void vesa_xputs(const char *, int, int); +extern void vesa_xputc(char, int); +extern void vesa_xputg(const glyph_info *, const glyph_info *); +extern void vesa_userpan(enum vga_pan_direction); +extern void vesa_overview(boolean); +extern void vesa_traditional(boolean); +extern void vesa_refresh(void); +extern void vesa_flush_text(void); #endif /* SCREEN_VESA */ #endif /* NO_TERMS */ -#undef E - #endif /* PCVIDEO_H */ /* pcvideo.h */ diff --git a/sys/msdos/portio.h b/sys/msdos/portio.h index 97e023b6e..0e6f53515 100644 --- a/sys/msdos/portio.h +++ b/sys/msdos/portio.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 portio.h $NHDT-Date: 1432512791 2015/05/25 00:13:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ +/* NetHack 5.0 portio.h $NHDT-Date: 1596498273 2020/08/03 23:44:33 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.10 $ */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* */ diff --git a/sys/msdos/schema1.BC b/sys/msdos/schema1.BC deleted file mode 100644 index 084c6a2f9..000000000 --- a/sys/msdos/schema1.BC +++ /dev/null @@ -1,252 +0,0 @@ -/* NetHack 3.6 schema1.BC $NHDT-Date: 1432512791 2015/05/25 00:13:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (c) Yitzhak Sapir, 1999 */ -/* */ -/* NetHack Overlay Schema */ -/* Minimal extended memory available, lots of 640K base RAM free */ -/* Overlay buffer size will be (20 + 20 + 19) = 59K (sum of 3 largest overlays). */ -/* Requires about 490K (for exe load plus overlay buffer), but */ -/* an additional 70K free (minimum) will be needed for malloc calls, */ -/* bringing the total requirement to about 560K. */ -/* Optimized for minimal overlay turns. */ -/* */ - - --zCallmain_0 -zAOVLY -zCOVL1 --zCallmain_1 -zAOVLY -zCOVL2 --zCallmain_b -zAOVLY -zCOVL3 --zCalloc_o --zCapply_0 -zAOVLY -zCOVL4 --zCapply_1 -zAOVLY -zCOVL5 --zCapply_b -zAOVLY -zCOVL6 --zCartifact_0 -zAOVLY -zCOVL7 --zCartifact_1 -zAOVLY -zCOVL8 --zCartifact_b -zAOVLY -zCOVL9 --zCattrib_0 --zCattrib_1 -zAOVLY -zCOVL10 --zCattrib_2 -zAOVLY -zCOVL11 --zCattrib_b -zAOVLY -zCOVL12 --zCball_o -zAOVLY -zCOVL13 --zCbones_o -zAOVLY -zCOVL14 --zCbotl_0 --zCbotl_1 -zAOVLY -zCOVL15 --zCbotl_b -zAOVLY -zCOVL16 --zCcmd_0 --zCcmd_1 -zAOVLY -zCOVL17 --zCcmd_b -zAOVLY -zCOVL18 --zCdbridge_0 --zCdbridge_1 -zAOVLY -zCOVL19 --zCdbridge_b -zAOVLY -zCOVL20 --zCdecl_o -zAOVLY -zCOVL21 --zCdetect_o --zCdig_o -zAOVLY -zCOVL22 --zCdisplay_o --zCdlb_o -zAOVLY -zCOVL23 --zCdo_0 -zAOVLY -zCOVL24 --zCdo_1 -zAOVLY -zCOVL25 --zCdo_2 -zAOVLY -zCOVL26 --zCdo_3 -zAOVLY -zCOVL27 --zCdo_b -zAOVLY -zCOVL28 --zCdo_name_0 -zAOVLY -zCOVL29 --zCdo_name_2 -zAOVLY -zCOVL30 --zCdo_name_b -zAOVLY -zCOVL31 --zCdo_wear_0 -zAOVLY -zCOVL32 --zCdo_wear_1 -zAOVLY -zCOVL33 --zCdo_wear_2 -zAOVLY -zCOVL34 --zCdo_wear_b -zAOVLY -zCOVL35 --zCdog_1 -zAOVLY -zCOVL36 --zCdog_2 -zAOVLY -zCOVL37 --zCdog_b -zAOVLY -zCOVL38 --zCdogmove_0 -zAOVLY -zCOVL39 --zCdogmove_b --zCdokick_o -zAOVLY -zCOVL40 --zCdothrow_o -zAOVLY -zCOVL41 --zCdrawing_o -zAOVLY -zCOVL42 --zCdungeon_0 --zCdungeon_1 -zAOVLY -zCOVL43 --zCeat_0 -zAOVLY -zCOVL44 --zCeat_1 -zAOVLY -zCOVL45 --zCeat_b -zAOVLY -zCOVL46 --zCend_o -zAOVLY -zCOVL47 --zCengrave_0 --zCengrave_1 -zAOVLY -zCOVL48 --zCengrave_2 -zAOVLY -zCOVL49 --zCengrave_b -zAOVLY -zCOVL50 --zCexper_o -zAOVLY -zCOVL51 --zCexplode_0 -zAOVLY -zCOVL52 --zCexplode_1 -zAOVLY -zCOVL53 --zCextralev_o -zAOVLY -zCOVL54 --zCfiles_o -zAOVLY -zCOVL55 --zCfountain_o -zAOVLY -zCOVL56 --zCgetline_1 -zAOVLY -zCOVL57 --zCgetline_2 -zAOVLY -zCOVL58 --zChack_1 --zChack_2 -zAOVLY -zCOVL59 --zChack_3 --zChack_b -zAOVLY -zCOVL60 --zChacklib_0 --zChacklib_1 --zChacklib_2 --zChacklib_b -zAOVLY -zCOVL61 --zCinvent_0 --zCinvent_1 -zAOVLY -zCOVL62 --zCinvent_2 -zAOVLY -zCOVL63 --zCinvent_3 -zAOVLY -zCOVL64 --zCinvent_b -zAOVLY -zCOVL65 --zClight_3 -zAOVLY -zCOVL66 --zClock_0 -zAOVLY -zCOVL67 --zClock_b -zAOVLY -zCOVL68 --zCmail_0 -zAOVLY -zCOVL68 --zCmail_b -zAOVLY -zCOVL69 --zCmakemon_0 -zAOVLY -zCOVL70 --zCmakemon_1 -zAOVLY -zCOVL71 --zCmakemon_2 -zAOVLY -zCOVL72 --zCmakemon_b -zAOVLY -zCOVL73 --zCmcastu_0 -zAOVLY -zCOVL74 --zCmcastu_b -zAOVLY -zCOVL75 --zCmhitm_0 -zAOVLY -zCOVL76 --zCmhitm_b -zAOVLY -zCOVL77 --zCmhitu_0 -zAOVLY -zCOVL78 --zCmhitu_1 -zAOVLY -zCOVL79 --zCmhitu_b -zAOVLY -zCOVL80 --zCminion_o -zAOVLY -zCOVL81 --zCmklev_o -zAOVLY -zCOVL82 --zCmkmap_o -zAOVLY -zCOVL83 --zCmkmaze_o -zAOVLY -zCOVL84 --zCmkobj_0 -zAOVLY -zCOVL85 --zCmkobj_1 -zAOVLY -zCOVL86 --zCmkobj_b -zAOVLY -zCOVL87 --zCmkroom_0 -zAOVLY -zCOVL88 --zCmkroom_b -zAOVLY -zCOVL89 --zCmon_0 --zCmon_1 -zAOVLY -zCOVL90 --zCmon_2 -zAOVLY -zCOVL91 --zCmon_b -zAOVLY -zCOVL92 --zCmondata_0 --zCmondata_1 -zAOVLY -zCOVL93 --zCmondata_2 -zAOVLY -zCOVL94 --zCmondata_b -zAOVLY -zCOVL95 --zCmonmove_0 --zCmonmove_1 --zCmonmove_2 --zCmonmove_b -zAOVLY -zCOVL96 --zCmonst_o -zAOVLY -zCOVL97 --zCmonstr_o -zAOVLY -zCOVL98 --zCmplayer_o -zAOVLY -zCOVL99 --zCmsdos_0 --zCmsdos_b -zAOVLY -zCOVL100 --zCmthrowu_0 -zAOVLY -zCOVL101 --zCmthrowu_1 -zAOVLY -zCOVL102 --zCmthrowu_b -zAOVLY -zCOVL103 --zCmuse_o -zAOVLY -zCOVL104 --zCmusic_o -zAOVLY -zCOVL105 --zCo_init_o -zAOVLY -zCOVL106 --zCobjects_o -zAOVLY -zCOVL107 --zCobjnam_0 -zAOVLY -zCOVL108 --zCobjnam_1 -zAOVLY -zCOVL109 --zCobjnam_b -zAOVLY -zCOVL110 --zCoptions_o -zAOVLY -zCOVL111 --zCovlinit_o --zCpager_o -zAOVLY -zCOVL112 --zCpckeys_o --zCpcmain_0 --zCpcmain_1 -zAOVLY -zCOVL113 --zCpcmain_b -zAOVLY -zCOVL114 --zCpctiles_0 --zCpctiles_b --zCpcunix_b -zAOVLY -zCOVL115 --zCpickup_o -zAOVLY -zCOVL116 --zCpline_b -zAOVLY -zCOVL117 --zCpolyself_0 -zAOVLY -zCOVL118 --zCpolyself_1 -zAOVLY -zCOVL119 --zCpolyself_b -zAOVLY -zCOVL120 --zCpotion_b -zAOVLY -zCOVL121 --zCpray_o -zAOVLY -zCOVL122 --zCpriest_0 -zAOVLY -zCOVL123 --zCpriest_b -zAOVLY -zCOVL124 --zCquest_o -zAOVLY -zCOVL125 --zCquestpgr_o -zAOVLY -zCOVL126 --zCrandom_o --zCread_b -zAOVLY -zCOVL127 --zCrect_o -zAOVLY -zCOVL128 --zCregion_o -zAOVLY -zCOVL129 --zCrestore_o -zAOVLY -zCOVL130 --zCrip_o -zAOVLY -zCOVL131 --zCrnd_0 --zCrnd_1 -zAOVLY -zCOVL132 --zCrnd_b -zAOVLY -zCOVL133 --zCrole_o -zAOVLY -zCOVL113 --zCrumors_o -zAOVLY -zCOVL134 --zCsave_o -zAOVLY -zCOVL135 --zCshk_0 -zAOVLY -zCOVL136 --zCshk_1 -zAOVLY -zCOVL137 --zCshk_2 -zAOVLY -zCOVL138 --zCshk_3 -zAOVLY -zCOVL139 --zCshk_b -zAOVLY -zCOVL140 --zCshknam_0 -zAOVLY -zCOVL141 --zCshknam_b -zAOVLY -zCOVL142 --zCsit_o -zAOVLY -zCOVL143 --zCsound_o --zCsounds_0 -zAOVLY -zCOVL144 --zCsounds_b -zAOVLY -zCOVL145 --zCsp_lev_o -zAOVLY -zCOVL146 --zCspell_o -zAOVLY -zCOVL147 --zCsteal_0 -zAOVLY -zCOVL148 --zCsteal_1 -zAOVLY -zCOVL149 --zCsteal_b -zAOVLY -zCOVL150 --zCsteed_o -zAOVLY -zCOVL188 --zCpcsys_o -zAOVLY -zCOVL151 --zCteleport_o -zAOVLY -zCOVL152 --zCtermcap_0 -zAOVLY -zCOVL153 --zCtermcap_1 -zAOVLY -zCOVL154 --zCtermcap_b -zAOVLY -zCOVL155 --zCtile_o --zCtimeout_0 -zAOVLY -zCOVL156 --zCtimeout_1 -zAOVLY -zCOVL157 --zCtimeout_b -zAOVLY -zCOVL158 --zCtopl_1 -zAOVLY -zCOVL159 --zCtopl_2 -zAOVLY -zCOVL160 --zCtopl_b -zAOVLY -zCOVL161 --zCtopten_o -zAOVLY -zCOVL162 --zCtrack_0 -zAOVLY -zCOVL163 --zCtrack_1 -zAOVLY -zCOVL164 --zCtrack_b -zAOVLY -zCOVL165 --zCtrap_0 --zCtrap_1 -zAOVLY -zCOVL166 --zCtrap_2 -zAOVLY -zCOVL167 --zCtrap_3 -zAOVLY -zCOVL168 --zCtrap_b -zAOVLY -zCOVL169 --zCtty_o -zAOVLY -zCOVL170 --zCu_init_o -zAOVLY -zCOVL171 --zCuhitm_o -zAOVLY -zCOVL172 --zCvault_0 -zAOVLY -zCOVL173 --zCvault_b -zAOVLY -zCOVL174 --zCversion_o -zAOVLY -zCOVL175 --zCvideo_0 --zCvideo_1 --zCvideo_b --zCvidtxt_0 --zCvidtxt_b --zCvidvga_0 --zCvidvga_1 --zCvidvga_2 -zAOVLY -zCOVL176 --zCvidvga_b --zCvis_tab_o -zAOVLY -zCOVL177 --zCvision_o --zCweapon_0 -zAOVLY -zCOVL178 --zCweapon_1 -zAOVLY -zCOVL179 --zCweapon_b -zAOVLY -zCOVL180 --zCwere_0 -zAOVLY -zCOVL181 --zCwere_b -zAOVLY -zCOVL182 --zCwield_o -zAOVLY -zCOVL183 --zCwindows_o -zAOVLY -zCOVL184 --zCwintty_o --zCwizard_0 -zAOVLY -zCOVL185 --zCwizard_b -zAOVLY -zCOVL186 --zCworm_o -zAOVLY -zCOVL187 --zCworn_o -zAOVLY -zCOVL188 --zCwrite_o -zAOVLY -zCOVL189 --zCzap_0 -zAOVLY -zCOVL190 --zCzap_1 -zAOVLY -zCOVL191 --zCzap_2 -zAOVLY -zCOVL192 --zCzap_3 -zAOVLY -zCOVL193 --zCzap_b -zAOVLY -zCOVL194 diff --git a/sys/msdos/schema2.BC b/sys/msdos/schema2.BC deleted file mode 100644 index 9787a1912..000000000 --- a/sys/msdos/schema2.BC +++ /dev/null @@ -1,248 +0,0 @@ -/* NetHack 3.6 schema2.BC $NHDT-Date: 1432512792 2015/05/25 00:13:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (c) Yitzhak Sapir, 1999 */ -/* */ -/* NetHack Overlay Schema */ -/* Small Root footprint, with extended memory available for caching. */ -/* Almost everything is overlaid. */ -/* */ - - --zCallmain_0 -zAOVLY -zCOVL1 --zCallmain_1 -zAOVLY -zCOVL2 --zCallmain_b -zAOVLY -zCOVL3 --zCalloc_o --zCapply_0 -zAOVLY -zCOVL4 --zCapply_1 -zAOVLY -zCOVL5 --zCapply_b -zAOVLY -zCOVL6 --zCartifact_0 -zAOVLY -zCOVL7 --zCartifact_1 -zAOVLY -zCOVL8 --zCartifact_b -zAOVLY -zCOVL9 --zCattrib_0 -zAOVLY -zCOVL10 --zCattrib_1 -zAOVLY -zCOVL11 --zCattrib_2 -zAOVLY -zCOVL12 --zCattrib_b -zAOVLY -zCOVL13 --zCball_o -zAOVLY -zCOVL14 --zCbones_o -zAOVLY -zCOVL15 --zCbotl_0 -zAOVLY -zCOVL16 --zCbotl_1 -zAOVLY -zCOVL17 --zCbotl_b -zAOVLY -zCOVL18 --zCcmd_0 -zAOVLY -zCOVL19 --zCcmd_1 -zAOVLY -zCOVL20 --zCcmd_b -zAOVLY -zCOVL21 --zCdbridge_0 -zAOVLY -zCOVL22 --zCdbridge_1 -zAOVLY -zCOVL23 --zCdbridge_b -zAOVLY -zCOVL24 --zCdecl_o -zAOVLY -zCOVL25 --zCdetect_o -zAOVLY -zCOVL26 --zCdig_o -zAOVLY -zCOVL27 --zCdisplay_o -zAOVLY -zCOVL28 --zCdlb_o -zAOVLY -zCOVL29 --zCdo_0 -zAOVLY -zCOVL30 --zCdo_1 -zAOVLY -zCOVL31 --zCdo_2 -zAOVLY -zCOVL32 --zCdo_3 -zAOVLY -zCOVL33 --zCdo_b -zAOVLY -zCOVL34 --zCdo_name_0 -zAOVLY -zCOVL35 --zCdo_name_2 -zAOVLY -zCOVL36 --zCdo_name_b -zAOVLY -zCOVL37 --zCdo_wear_0 -zAOVLY -zCOVL38 --zCdo_wear_1 -zAOVLY -zCOVL39 --zCdo_wear_2 -zAOVLY -zCOVL40 --zCdo_wear_b -zAOVLY -zCOVL41 --zCdog_1 -zAOVLY -zCOVL42 --zCdog_2 -zAOVLY -zCOVL43 --zCdog_b -zAOVLY -zCOVL44 --zCdogmove_0 -zAOVLY -zCOVL45 --zCdogmove_b -zAOVLY -zCOVL46 --zCdokick_o -zAOVLY -zCOVL47 --zCdothrow_o -zAOVLY -zCOVL48 --zCdrawing_o -zAOVLY -zCOVL49 --zCdungeon_0 -zAOVLY -zCOVL50 --zCdungeon_1 -zAOVLY -zCOVL51 --zCeat_0 -zAOVLY -zCOVL52 --zCeat_1 -zAOVLY -zCOVL53 --zCeat_b -zAOVLY -zCOVL54 --zCend_o -zAOVLY -zCOVL55 --zCengrave_0 -zAOVLY -zCOVL56 --zCengrave_1 -zAOVLY -zCOVL57 --zCengrave_2 -zAOVLY -zCOVL58 --zCengrave_b -zAOVLY -zCOVL59 --zCexper_o -zAOVLY -zCOVL60 --zCexplode_0 -zAOVLY -zCOVL61 --zCexplode_1 -zAOVLY -zCOVL62 --zCextralev_o -zAOVLY -zCOVL63 --zCfiles_o -zAOVLY -zCOVL64 --zCfountain_o -zAOVLY -zCOVL65 --zCgetline_1 -zAOVLY -zCOVL66 --zCgetline_2 -zAOVLY -zCOVL67 --zChack_1 -zAOVLY -zCOVL68 --zChack_2 -zAOVLY -zCOVL69 --zChack_3 --zChack_b -zAOVLY -zCOVL70 --zChacklib_0 -zAOVLY -zCOVL71 --zChacklib_1 -zAOVLY -zCOVL72 --zChacklib_2 -zAOVLY -zCOVL73 --zChacklib_b -zAOVLY -zCOVL74 --zCinvent_0 -zAOVLY -zCOVL75 --zCinvent_1 -zAOVLY -zCOVL76 --zCinvent_2 -zAOVLY -zCOVL77 --zCinvent_3 -zAOVLY -zCOVL78 --zCinvent_b -zAOVLY -zCOVL79 --zClight_3 -zAOVLY -zCOVL80 --zClock_0 -zAOVLY -zCOVL81 --zClock_b -zAOVLY -zCOVL82 --zCmail_0 -zAOVLY -zCOVL82 --zCmail_b -zAOVLY -zCOVL83 --zCmakemon_0 -zAOVLY -zCOVL84 --zCmakemon_1 -zAOVLY -zCOVL85 --zCmakemon_2 -zAOVLY -zCOVL86 --zCmakemon_b -zAOVLY -zCOVL87 --zCmcastu_0 -zAOVLY -zCOVL88 --zCmcastu_b -zAOVLY -zCOVL89 --zCmhitm_0 -zAOVLY -zCOVL90 --zCmhitm_b -zAOVLY -zCOVL91 --zCmhitu_0 -zAOVLY -zCOVL92 --zCmhitu_1 -zAOVLY -zCOVL93 --zCmhitu_b -zAOVLY -zCOVL94 --zCminion_o -zAOVLY -zCOVL95 --zCmklev_o -zAOVLY -zCOVL96 --zCmkmap_o -zAOVLY -zCOVL97 --zCmkmaze_o -zAOVLY -zCOVL98 --zCmkobj_0 -zAOVLY -zCOVL99 --zCmkobj_1 -zAOVLY -zCOVL100 --zCmkobj_b -zAOVLY -zCOVL101 --zCmkroom_0 -zAOVLY -zCOVL102 --zCmkroom_b -zAOVLY -zCOVL103 --zCmon_0 -zAOVLY -zCOVL104 --zCmon_1 -zAOVLY -zCOVL105 --zCmon_2 -zAOVLY -zCOVL106 --zCmon_b -zAOVLY -zCOVL107 --zCmondata_0 -zAOVLY -zCOVL108 --zCmondata_1 -zAOVLY -zCOVL109 --zCmondata_2 -zAOVLY -zCOVL110 --zCmondata_b -zAOVLY -zCOVL111 --zCmonmove_0 -zAOVLY -zCOVL112 --zCmonmove_1 -zAOVLY -zCOVL113 --zCmonmove_2 -zAOVLY -zCOVL114 --zCmonmove_b -zAOVLY -zCOVL115 --zCmonst_o -zAOVLY -zCOVL116 --zCmonstr_o -zAOVLY -zCOVL117 --zCmplayer_o -zAOVLY -zCOVL118 --zCmsdos_0 -zAOVLY -zCOVL119 --zCmsdos_b -zAOVLY -zCOVL120 --zCmthrowu_0 -zAOVLY -zCOVL121 --zCmthrowu_1 -zAOVLY -zCOVL122 --zCmthrowu_b -zAOVLY -zCOVL123 --zCmuse_o -zAOVLY -zCOVL124 --zCmusic_o -zAOVLY -zCOVL125 --zCo_init_o -zAOVLY -zCOVL126 --zCobjects_o -zAOVLY -zCOVL127 --zCobjnam_0 -zAOVLY -zCOVL128 --zCobjnam_1 -zAOVLY -zCOVL129 --zCobjnam_b -zAOVLY -zCOVL130 --zCoptions_o -zAOVLY -zCOVL131 --zCovlinit_o --zCpager_o -zAOVLY -zCOVL132 --zCpckeys_o -zAOVLY -zCOVL119 --zCpcmain_0 --zCpcmain_1 -zAOVLY -zCOVL133 --zCpcmain_b -zAOVLY -zCOVL134 --zCpctiles_0 --zCpctiles_b --zCpcunix_b -zAOVLY -zCOVL135 --zCpickup_o -zAOVLY -zCOVL136 --zCpline_b -zAOVLY -zCOVL137 --zCpolyself_0 -zAOVLY -zCOVL138 --zCpolyself_1 -zAOVLY -zCOVL139 --zCpolyself_b -zAOVLY -zCOVL140 --zCpotion_b -zAOVLY -zCOVL141 --zCpray_o -zAOVLY -zCOVL142 --zCpriest_0 -zAOVLY -zCOVL143 --zCpriest_b -zAOVLY -zCOVL144 --zCquest_o -zAOVLY -zCOVL145 --zCquestpgr_o -zAOVLY -zCOVL146 --zCrandom_o -zAOVLY -zCOVL147 --zCread_b -zAOVLY -zCOVL148 --zCrect_o -zAOVLY -zCOVL149 --zCregion_o -zAOVLY -zCOVL150 --zCrestore_o -zAOVLY -zCOVL151 --zCrip_o -zAOVLY -zCOVL152 --zCrnd_0 -zAOVLY -zCOVL153 --zCrnd_1 -zAOVLY -zCOVL154 --zCrnd_b -zAOVLY -zCOVL155 --zCrole_o -zAOVLY -zCOVL133 --zCrumors_o -zAOVLY -zCOVL156 --zCsave_o -zAOVLY -zCOVL157 --zCshk_0 -zAOVLY -zCOVL158 --zCshk_1 -zAOVLY -zCOVL159 --zCshk_2 -zAOVLY -zCOVL160 --zCshk_3 -zAOVLY -zCOVL161 --zCshk_b -zAOVLY -zCOVL162 --zCshknam_0 -zAOVLY -zCOVL163 --zCshknam_b -zAOVLY -zCOVL164 --zCsit_o -zAOVLY -zCOVL165 --zCsound_o --zCsounds_0 -zAOVLY -zCOVL166 --zCsounds_b -zAOVLY -zCOVL167 --zCsp_lev_o -zAOVLY -zCOVL168 --zCspell_o -zAOVLY -zCOVL169 --zCsteal_0 -zAOVLY -zCOVL170 --zCsteal_1 -zAOVLY -zCOVL171 --zCsteal_b -zAOVLY -zCOVL172 --zCsteed_o -zAOVLY -zCOVL173 --zCpcsys_o -zAOVLY -zCOVL174 --zCteleport_o -zAOVLY -zCOVL175 --zCtermcap_0 -zAOVLY -zCOVL176 --zCtermcap_1 -zAOVLY -zCOVL177 --zCtermcap_b -zAOVLY -zCOVL178 --zCtile_o --zCtimeout_0 -zAOVLY -zCOVL179 --zCtimeout_1 -zAOVLY -zCOVL180 --zCtimeout_b -zAOVLY -zCOVL181 --zCtopl_1 -zAOVLY -zCOVL182 --zCtopl_2 -zAOVLY -zCOVL183 --zCtopl_b -zAOVLY -zCOVL184 --zCtopten_o -zAOVLY -zCOVL185 --zCtrack_0 -zAOVLY -zCOVL186 --zCtrack_1 -zAOVLY -zCOVL187 --zCtrack_b -zAOVLY -zCOVL188 --zCtrap_0 -zAOVLY -zCOVL189 --zCtrap_1 -zAOVLY -zCOVL190 --zCtrap_2 -zAOVLY -zCOVL191 --zCtrap_3 -zAOVLY -zCOVL192 --zCtrap_b -zAOVLY -zCOVL193 --zCtty_o -zAOVLY -zCOVL194 --zCu_init_o -zAOVLY -zCOVL195 --zCuhitm_o -zAOVLY -zCOVL196 --zCvault_0 -zAOVLY -zCOVL197 --zCvault_b -zAOVLY -zCOVL198 --zCversion_o -zAOVLY -zCOVL199 --zCvideo_0 --zCvideo_1 --zCvideo_b --zCvidtxt_0 --zCvidtxt_b --zCvidvga_0 --zCvidvga_1 --zCvidvga_2 -zAOVLY -zCOVL200 --zCvidvga_b --zCvis_tab_o -zAOVLY -zCOVL201 --zCvision_o -zAOVLY -zCOVL202 --zCweapon_0 -zAOVLY -zCOVL203 --zCweapon_1 -zAOVLY -zCOVL204 --zCweapon_b -zAOVLY -zCOVL205 --zCwere_0 -zAOVLY -zCOVL206 --zCwere_b -zAOVLY -zCOVL207 --zCwield_o -zAOVLY -zCOVL208 --zCwindows_o -zAOVLY -zCOVL209 --zCwintty_o -zAOVLY -zCOVL210 --zCwizard_0 -zAOVLY -zCOVL211 --zCwizard_b -zAOVLY -zCOVL212 --zCworm_o -zAOVLY -zCOVL213 --zCworn_o -zAOVLY -zCOVL173 --zCwrite_o -zAOVLY -zCOVL214 --zCzap_0 -zAOVLY -zCOVL215 --zCzap_1 -zAOVLY -zCOVL216 --zCzap_2 -zAOVLY -zCOVL217 --zCzap_3 -zAOVLY -zCOVL218 --zCzap_b -zAOVLY -zCOVL219 diff --git a/sys/msdos/schema3.MSC b/sys/msdos/schema3.MSC deleted file mode 100644 index 33ad97bff..000000000 --- a/sys/msdos/schema3.MSC +++ /dev/null @@ -1,667 +0,0 @@ -; Copyright (c) NetHack PC Development Team, 2000 -; -; NetHack Overlay Schema -; This overlay schema is for use only when NetHack is built -; using packaged-functions for function-level linking. -; -; Overlay tuning level: 0 -; -functions:0 _main _dosave0 _moveloop _bwrite _random _rn2 _newsym _show_glyph _on_level _txt_gotoxy _txt_get_cursor -functions:0 _xputc _txt_xputc _t_at _tty_curs _acurr _dist2 _tty_print_glyph _isok _back_to_glyph -functions:0 _show_map_spot _adjust_cursor_flags _lowc _g_putch _has_color _is_pool _mread -functions:0 _is_lava _welded _magic_map_background _end_glyphout _visible_region_at _domove -functions:0 _engr_at _rnd _run_regions _mcalcmove _depth _done _distmin _does_block _eos -functions:0 _move _move_bc _in_rooms _map_background _map_invisible _map_location _alloc -functions:0 _impossible _in_container _in_fcorridor _In_hell _In_mines _in_or_out_menu _In_quest -functions:0 _do_positionbar _iswall _iswall_or_stone _itimeout _is_solid _Is_special -functions:0 _is_swallow_sym _check_here _check_leash _check_map_spot _check_pos -functions:0 _monsndx _m_move _lcase _tty_create_nhwindow _tty_delay_output _tty_destroy_nhwindow -functions:0 _tty_dismiss_nhwindow _gender _genl_outrip _get_cost _get_free_room_loc _get_level -functions:0 _get_location _get_map _get_mleash -; -functions:1 _move_update _movebubbles _movecmd _movemon _moverock _movobj _mpickgold -functions:1 _doaltarobj _doapply _dobreathe _docall _docast -; -functions:2 _do_vicinity_map -functions:3 _pcmain -functions:4 _spell_let_to_idx _cursed_book _deadbook _learn _getspell _spelltypemnemonic -functions:5 _dospellmenu _percent_success _throwspell _cast_protection _isqrt -; -functions:6 _a_gname _a_gname_at _a_monnam _abon _abuse_dog _accessible _activate_statue_trap -functions:7 _add_branch _add_damage _add_debug_extended_commands _add_door _add_id_mapping _add_level -functions:8 _add_menu_cmd_alias _add_one_tobill _add_rect _add_room _add_subroom _add_to_billobjs _add_to_buried _add_to_container -functions:9 _add_to_migration _add_to_minv _add_valid_menu_class _add_weapon_skill _addinv _addtobill _addtopl _addupbill -functions:10 _Adjmonnam -functions:11 _align_gname -functions:12 _altar_wrath _Amonnam _amulet _Amulet_off _Amulet_on _An _an _angry_guards -functions:13 _angry_priest _angry_shk_exists _any_light_source _aobjnam _append_slash _append_str _Armor_gone _Armor_off -functions:14 _Armor_on _armor_to_dragon _armoroff _arti_invoke _artifact_exists _artifact_hit _artifact_name _artiname -functions:15 _artitouch _askchain _assign_level _assign_rnd_level _assign_graphics _assign_soundcard _assign_video -functions:16 _assign_videocolors _assign_videoshades _assigninvlet _at_dgn_entrance _attach_egg_hatch_timeout _attack _attack_checks _attacks -functions:17 _awaken_monsters _awaken_soldiers -functions:18 _backfire _backsp _bad_location _bad_negation _bad_rock _badoption _bail _ballfall -functions:19 _bc_order _bclose _bcsign _beg _begin_burn _bflush _bhit _bhitm -functions:20 _bhito _bhitpile _big_to_little _bill_box_content _bill_dummy_object _bite _bless _blessorcurse -functions:21 _Blindf_off _Blindf_on _block_door _block_entry _block_point _blow_up_landmine _body_part -functions:22 _boomhit _Boots_off _Boots_on _bot _boulder_hits_pool _bound_digging -functions:23 _boxlock _br_string _break_armor _break_statue _breakarm _breakmsg -functions:24 _breakobj _breaks _breaksink _breaktest _breamu _bribe _bufoff _bufon -functions:25 _build_room _burn_floor_paper _burn_object _burnarmor _bury_an_obj _bury_objs _buzz _buzzmu -functions:26 _Can_dig_down -functions:27 _Can_fall_thru _can_make_bones _can_ooze _can_pray _can_reach_floor _Can_rise_up _can_track -functions:28 _cancel_bonesfile _cancel_don _cancel_item _cancel_monst _candle_light_range _canletgo _canwearobj -functions:29 _carry_count _carrying _castmu _ceiling _center _change_inv_order _change_luck _change_sex -functions:30 _charm_monsters _charm_snakes _chat_with_guardian _chat_with_leader _chat_with_nemesis _chdirx _chdrive _cheapest_item -functions:31 _check_capacity _check_contained _check_credit _check_recordfile -functions:32 _check_room _check_shop_obj _check_special_room _check_unpaid _check_unpaid_usage _check_version _checkfile _chest_shatter_msg -functions:33 _chest_trap _choke _choke_dialogue _choose_classes_menu _choose_windows _christen_monst _chwepon _ck_bag -functions:34 _ckmailstatus _ckunpaid _cl_end _cl_eos _classmon _clear_fcorr _clear_glyph_buffer -functions:35 _clear_id_mapping _clear_level_structures _clear_path _clear_screen _clear_stale_map _clear_unpaid _clearlocks _clearpriests -functions:36 _click_to_cmd _Cloak_off _Cloak_on _clone_mon _cloneu _clonewiz _close_drawbridge _close_library -functions:37 _closed_door _CloseTileFile _cls _cmov _cnv_trap_obj _co_false _collect_obj_classes _com_pager -functions:38 _commit_bonesfile _compactify _compress_bonesfile _compress_str _comspec_exists _confdir _construct_qtlist -functions:39 _consume_offering _contained _contained_cost _contained_gold _container_contents _container_weight _convert_arg _convert_line -functions:40 _copybones _copyfile _corpse_chance _corpse_xname _corr _correct_branch_type _cost _cost_per_charge -functions:41 _costly_gold _costly_spot _could_seduce _count_categories _count_obj _count_unpaid _count_wsegs -functions:42 _counter_were _courtmon _cpostfx _cprefx _create_altar _create_bonesfile _create_corridor _create_critters -functions:43 _create_door _create_drawbridge _create_engraving _create_feature _create_gold _create_levelfile _create_monster _create_mplayers -functions:44 _create_object _create_particular _create_polymon _create_room _create_savefile _create_secret_door _create_stairs _create_subroom -functions:45 _create_trap _create_worm_tail _curr_mon_load _currentlevel_rewrite _curs_on_u _curse _cursed _cursed_object_at -functions:46 _cursetxt _cuss _cutworm _cvt_sdoor_to_door _d _damageum _dbon _ddocall -functions:47 _ddoinv _dead_species _dealloc_obj _decl_init _deepest_lev_reached _def_char_to_monclass _def_char_to_objclass _def_raw_print -functions:48 _defends _deferred_goto _del_engr _del_engr_at _del_light_source _delallobj _delete_bonesfile _delete_contents -functions:49 _delete_levelfile _delete_savefile _delfloortrap _deliver_by_pline _deliver_by_window _delobj _deltrap _demon_talk -functions:50 _demonpet _destroy_arm _destroy_drawbridge _destroy_item _destroy_mitem _dev_name _dig -functions:51 _dig_check _dig_corridor _dig_point _dig_typ _digactualhole _dighole _digit _dipfountain -functions:52 _disable_ctrlP _disarm_landmine _disarm_shooting_trap _disarm_squeaky_board _discard_minvent _disclose _discover_object -functions:53 _diseasemu _display_binventory _display_cinventory _display_gamewindows _display_inventory _display_minventory -functions:54 _distant_name _distfleeck _disturb _djinni_from_bottle _dlb_cleanup _dlb_fclose -functions:55 _dlb_fgets _dlb_fopen _dlb_fread _dlb_fseek _dlb_ftell _dlb_init _dlord _dmgtype -functions:56 _dmgval _dmonsfree _dmore _dname_to_dnum _do_break_wand _do_clear_area _do_comp _do_dknown_of -functions:57 _do_earthquake _do_entity _do_genocide _do_improvisation _do_light_sources _do_look _do_mapping _do_mname -functions:57 _vga_xputg _vga_xputs _video_update_positionbar _view_from _view_init _visctrl _vision_init _vision_recalc -functions:58 _do_oname _do_osshock _do_play_instrument _do_reset_eat _do_room_or_subroom _do_storms _do_takeoff -functions:60 _doclose _doconsult _docorner _docrt _doddoremarm _doddrop _dodip -functions:61 _adjust_prefix _build_plselection_prompt _duplicate_opt_detection _enter_explore_mode _maybe_wail -functions:62 _doextcmd _doextlist _doextversion _dofindgem _dofiretrap _doforce _dog_eat _dog_goal -functions:63 _dog_hunger _dog_invent _dog_move _dog_nutrition _dogfood _dogushforth _dohelp _dohide -functions:64 _dohistory _doidtrap _doinvbill _doinvoke _dojump _dokick _dolook _doloot -functions:65 _domagicportal -functions:66 _done_eating _done_in_by _done_intr _done1 _done2 _donning _donull _doopen -functions:67 _doorganize _doorlock _dopay _dopayobj _dopickup _dopotion _dopramulet _doprarm -functions:68 _dopray _doprev_message _doprgold _doprring _doprtool _doprwep _doputon _doquickwhatis -functions:69 _doread _dorecover _doredraw _doremove _doremring _dorub _dosacrifice _dosave -functions:70 _dosdoor _dosearch _dosearch0 _doseduce _doset _doset_add_menu _dosh -functions:71 _dosinkfall _dosinkring _dosit _dosounds _dospinweb _dospit _dosummon _dotakeoff -functions:72 _dotalk _dotele _dothrow _dotogglepickup _dotrap _doturn _dotypeinv _dounpaid -functions:73 _dountrap _doup _doversion _dovspell _dowaterdemon _dowaternymph _dowatersnakes _dowear -functions:74 _dowhatdoes _dowhatis _dowield _dowipe _down_gate _dowrite _dozap _dprince -functions:75 _drag_ball _drag_down _drain_en _DrawCursor _drinkfountain _drinksink _drop _drop_ball -functions:76 _drop_throw _drop_to _drop_upon_death _drop_weapon _dropped_container _dropx _dropy -functions:77 _drown _dryup _dtoxy _dungeon_branch _dunlev _dunlevs_in_dungeon _e_at _e_died -functions:78 _e_jumps _e_missed _e_nam _E_phrase _e_survives_at _eataccessory _eatcorpse _eaten_stat -functions:79 _eatfood _eatmdone _eatspecial _egg_type_from_parent _emergency_disrobe _enable_ctrlP _encumber_msg _end_burn -functions:80 _end_engulf -;functions:81 -functions:82 _exclam _exepath _exerchk _exercise _exerper _exist_artifact _expels _experience -functions:83 _explmm _explmu _explode _explum _expulsion _ext_cmd_getlin_hook _extend_spine _extract_nexthere -functions:84 _extract_nobj _fall_asleep _fall_through _feel_cockatrice _feel_location _fightm _filesize_nh _fill_pit -functions:85 _nh_getenv _promptsep _rigid_role_checks _set_duplicate_opt_detection _tool_in_use -functions:86 _find_drawbridge _find_hell _find_lev_obj _find_level _find_mac _find_mid _find_misc _find_offensive -functions:87 _find_oid _find_roll_to_hit _find_skates _find_unpaid _finddpos _findfirst_file _findgd _findit -functions:88 _findnext_file _findone _findpriest _finish_map _finish_paybill _fix_stair_rooms _fix_worst_trouble _fixup_special -functions:89 _flash_hits_mon _float_down _float_up _floating_above _flood_fill_rm _flooreffects _floorfood _flush_screen _term_start_color -functions:90 _flushout _fmt_ptr _food_detect _food_disappears _food_xname _foodword _fopen_config_file _fopen_datafile -functions:91 _fopenp _forcelock _forget_levels _forget_map _forget_objects _forget_traps _foundfile_buffer _fpostfx -functions:92 _fprefx _fracture_rock _free_dungeons _free_rooms _free_ttlist _free_window_info _freediskspace _freedynamicdata -functions:93 _freefruitchn _freehand _freeinv _friday_13th _fruitadd _fry_by_god _fully_identify_obj _g_at -functions:94 _gainstr _gameDiskPrompt _gazemm _gazemu _gd_move _gd_sound _gem_accept -functions:95 _display_warning _dlb_fgetc _doattributes _dochug _dochugw -functions:96 _fill_point _fill_room _fill_zoo _fillholetyp _find_ac _find_branch _find_branch_room _find_defensive -functions:96 _get_mon_location _get_mplname _get_obj_location _get_rect _get_rect_ind _get_room_loc _get_scr_size _get_shop_item -functions:97 _get_uchars _get_unused_cs _get_valuables _get_wall_for_db _get_wet _get_wormno _getbones _getdir -functions:98 _gethungry -functions:99 _gettty _getversionstring _getyear _ggetobj _ghitm _ghod_hitsu _ghost_from_bottle _ghostfruit -functions:100 _givit _glibr _Gloves_off _Gloves_on _glyph_at _god_zaps_you _gods_angry _gods_upset -functions:101 _godvoice _gold_detect _golemeffects _golemhp _goodfruit _goodpos _goto_hell _goto_level -functions:102 _gr_finish _gr_init _graphics_opts _grddead _grease_protect _grow_up _growl _growl_sound -functions:103 _guardname _gulpmm _gulpmu _gulpum _gush _hack_artifacts _has_dnstairs -functions:104 _has_shrine _has_upstairs _hatch_egg _hates_silver _have_lizard _hcolor _heal_legs _healup -functions:105 _Hear_again _Helmet_off _Helmet_on _help_menu _help_monster_out _hero_breaks _hidden_gold _HideCursor -functions:106 _highc _histemple_at _hit _hitfloor _hitmm _hitmsg _hitmu _hitum -functions:107 _hitval _hmon _hmon_hitmon _hmonas _hold_another_object _holetime _home _home_shk -functions:108 _homebase _hooked_tty_getlin _hot_pursuit _hurtarmor _hurtle _identify _identify_pack _impact_drop -functions:110 _in_trouble _In_V_tower _In_W_tower _in_your_sanctuary _incr_itimeout _induced_align _inherits _inhishop -functions:111 _init_artifacts _init_attr _init_dungeons _init_fill _init_level _init_map _init_objects -functions:112 _init_oracles _init_rect _init_rumors _init_ttycolor _init_uhunger _initedog _initoptions _initrack -functions:113 _initworm _insert_branch _insert_timer _inside_room _inside_shop _instapetrify _intemple _interesting_to_discover -functions:114 _intermed _intervene _intrinsic_possible _inv_cnt _inv_weight _invault _invdisp_nothing _inven_inuse -functions:115 _invert_all _invert_all_on_page _Invocation_lev _invocation_message _invocation_pos _Is_botlevel _Is_branchlev _is_chargeable -functions:116 _is_db_wall _is_drawbridge_wall _is_edible _is_fainted _is_flammable _is_fshk _is_home_elemental _is_ice -;functions:117 -functions:118 _is_worn _is_worn_by_type _isbig _isclearpath -functions:119 _itimeout_incr _its_dead _itsstuck _Japanese_item_name _join _join_map _jump _keepdogs -functions:119 _sticks _still_chewing _stock_room _stolen_container _stolen_value _stone_luck _stoned_dialogue _stop_occupation -functions:120 _kick_monster _kick_object _kickdmg _kickstr _kill_egg _kill_eggs _kill_genocided_monsters _killed -functions:121 _kind_name _known_hitum _kops_gone _l_monnam _lantern_message _launch_obj _lava_effects -functions:122 _ldrname _leader_speaks _learn_egg_type _ledger_no _ledger_to_dlev _ledger_to_dnum -functions:123 _left_side _lesshungry _let_to_name _letter _lev_by_name _level_difficulty _level_distance _level_range -functions:124 _level_tele _level_tele_trap _levl_follower _lifesaved_monster _lift_object _light_cocktail _light_region _lined_up -functions:125 _linedup _list_genocided _list_vanquished _litroom _litter _little_to_big _llord _lminion -functions:126 _load_common_data _load_maze _load_one_engraving _load_one_monster _load_one_object _load_qtlist _load_rooms _load_special -functions:127 _loadfruitchn _lock_action _lock_file _locomotion _lookaround _lookat _lookup_id_mapping _lose_weapon_skill -functions:128 _losedogs _losehp _losespells _losestr _losexp _m_arrival -functions:129 _m_carrying _m_detach _m_dowear _m_dowear_type _m_initgrp _m_initinv _m_initthrow _m_initweap -functions:130 _m_lose_armor -functions:131 _m_useup _make_angry_shk _make_blinded _make_confused _make_corpse _make_engr_at _make_familiar _make_hallucinated -functions:132 _make_happy_shk _make_lockname _make_niches _make_sick _make_stunned _make_vomiting _makecorridors _makedog -functions:133 _makekops _makelevel _makemaz _makemon _makeniche _makeplural _makerogueghost _makeroguerooms -functions:134 _makerooms -functions:135 _map_menu_cmd _map_object _map_trap _match_optname _mattackm _mattacku _max_capacity _max_mon_load -functions:136 _max_passive_dmg _max_rank_sz _maxledgerno _may_dig _may_passwall _maybe_write_ls _maybe_write_timer _mayberem -functions:137 _maze0xy _maze1xy _mazexy _mb_trapped _mbag_explodes _mbhit _mbhitm _mcalcdistress -functions:138 _md_rush _md_start _md_stop _mdig_tunnel -functions:139 _meatobj _melt_ice _menu_drop _menu_identify _menu_loot _menu_remarm _mergable _merge_choice -functions:140 _merged _mfndpos _midnight _migrate_to_level _mineralize _minit _miniwalk _minstapetrify -functions:140 _On_stairs _on_start _On_W_tower_level _oname _onbill _online2 _only_here _onlyspace -functions:141 _mintrap -functions:142 _mk_bubble _mk_knox_portal _mk_mplayer _mk_named_object _mk_roamer _mk_tt_object _mkaltar _mkbox_cnts -functions:143 _mkcavearea _mkcavepos _mkclass _mkcorpstat _mkfount _mkgold _mkgoldobj _mkinvokearea -functions:144 _mkinvpos _mklev _mkmap _mkobj _mkobj_at _mkportal _mkroll_launch _mkroom -functions:145 _mkshobj_at _mkshop _mksink _mksobj _mksobj_at _mkstairs _mkswamp _mktemple -functions:146 _mktrap _mkundead _mkzoo _mlevel_tele_trap _mlifesaver _mnearto _mnexto _mon_arrive -functions:147 _mon_break_armor _mon_catchup_elapsed_time _mon_chain _mon_has_amulet _mon_has_arti _mon_has_special _mon_invent_chain _mon_is_local -functions:148 _mon_nam _mon_nam_too _mon_owns _mon_reflects _mon_regen _mon_set_minvis _mon_to_stone _mon_wield_item -functions:149 _mondead _mondied _mongets _mongone _monkilled _Monnam _monnear -functions:150 _monst_init _monster_detect _monster_nearby _monstinroom _monstone _monstr_init _more _more_experienced -functions:151 _morehungry _morguemon _move_gold _move_into_trap _move_special -functions:153 _mpickobj -functions:154 _mselftouch _msg_in _msleep _msmsg _mstatusline _msummon _mswings _mswingsm -functions:155 _mtele_trap _mungspaces _munstone _mv_bubble _mvault_tele _mzapmsg _n_or_more _name_to_mon -functions:156 _nameshk _nartifact_exist _nasty _ndemon _near_capacity _nemdead _nemesis_speaks _neminame -functions:157 _nethack_exit _new_light_source _new_were _newcham _newexplevel _newgame _newhp _newmail -functions:158 _newman _newuexp _newuhs _next_level _next_opt _next_shkp _next_to_u -functions:159 _nexttodoor _nh_timeout _nhusage _night _nmcpy _no_bones_level _noattacks _nocmov -functions:160 _nohandglow _noises _nomul _Norep _not_capable _not_fully_identified _number_leashed _o_in -functions:161 _o_on _o_unleash _obfree _obj_chain _obj_delivery _obj_extract_self _obj_here _obj_ice_effects -functions:162 _obj_is_burning _obj_is_local _obj_is_pname _obj_merge_light_sources _obj_move_light_source _obj_move_timers _obj_resists _obj_sanity_check -functions:163 _obj_sheds_light _obj_shudders _obj_split_light_source _obj_split_timers _obj_stop_timers _obj_to_let _object_detect _objects_init -functions:164 _observable_depth _obstructed _oc_to_str _occupied _off_msg _ohitmon _oinit _ok_to_quest -functions:165 _okay -functions:167 _onquest _onscary _open_bonesfile _open_drawbridge _open_levelfile _open_library _open_savefile _openit -functions:168 _openone _OpenTileFile _opentin _option_help _oselect _other_mon_has_arti _otransit_msg -functions:169 _out_container _outentry _outheader _outoracle _outrumor _p_coaligned _pacify_guards _pacify_shk -functions:170 _panic _parent_dlevel _parent_dnum _parse _parse_config_line _parseoptions _pass_one _pass_three -functions:171 _pass_two _passive _passivemm _passiveum _pay _pay_for_damage _paybill _paygd -functions:172 _pckeys _peace_minded _peek_at_iced_corpse_age _peffects _pet_type _pgetchar _phase_of_the_moon -functions:173 _pick_level _pick_lock _pick_obj _pick_room _picked_container _picking_at _picking_lock _picklock -functions:174 _pickup _pickup_object _place_branch _place_level _place_lregion _place_niche _place_object _place_worm_tail_randomly -functions:175 _place_wsegs _placebc _playwoRAMdisk _pleased _pline _pline_The _plnamesuffix _pluslvl -functions:176 _pmatch _poisoned _poisontell _poly_gender _poly_obj _poly_when_stoned _polyman _polymon -functions:177 _polyself _polyuse _port_help _pos_to_room _positionbar _possible_places _possibly_unwield _potionbreathe -functions:178 _potionhit _prayer_done _precheck _prev_level _pri_move _price_quote _priest_talk _priestini -functions:179 _priestname _print_branch _print_dungeon _print_queue _prinv _probe_monster _process_menu_window _process_text_window -functions:180 _pronoun_gender _protects _prscore _punish _pushch _put_monsters_to_sleep _putsyms -functions:181 _qt_montype _qt_pager _query_category _query_classes _query_objlist _quest_chat _quest_info -functions:182 _quest_stat_check _quest_talk _random_dir _random_engraving _random_teleport_level _ranged_attk -functions:183 _rank _rank_of _raw_printf _read_config_file _read_engr_at _readchar _readentry -functions:184 _readmail _readobjnam _ReadPlanarTileFile _ReadPlanarTileFile_O _ReadTileFileHeader _reassign _recalc_wt _recharge -functions:185 _record_exists _redist_attr _redotoplin _regularize _rehumanize _rejectoption _relink_light_sources _relink_timers -functions:186 _relmon _remember_topl _remove_damage _remove_object _remove_rect _remove_timer _remove_worm -functions:187 _removetopl _reorder_invent _repair_damage _replmon _replshk _rescham -functions:188 _reset_eat _reset_faint _reset_hostility _reset_occupations _reset_pick _reset_remarm _reset_rndmonst _reset_trapset -functions:189 _resetobjs _resist _resists_blnd _resists_drli _resists_magm _rest_engravings _rest_room _rest_rooms -functions:190 _rest_worm _restartcham _restdamage _restfakecorr _restgamestate _restlevchn _restlevelfile _restlevelstate -functions:191 _restmonchn _restnames _restobjchn _restore_artifacts _restore_attrib _restore_dungeon _restore_light_sources _restore_oracles -functions:192 _restore_saved_game _restore_timers _restore_waterlevel _restpriest _restrap _restrict_name _restshk _resurrect -functions:193 _reverse _revive _revive_corpse _revive_egg _revive_mon _revive_nasty _reward_untrap _rhack -functions:194 _right_side _rile_shk _Ring_gone _Ring_off _Ring_off_or_gone _Ring_on _rloc _rloc_engr -functions:195 _rloc_pos_ok _rloc_to _rloco _rm_waslit _rnd_class _rnd_defensive_item -functions:196 _rnd_misc_item _rnd_offensive_item _rnd_rect _rndcurse _rnddoor _rndexp _rndghostname _rndmonnam -functions:197 _rndmonnum _rndmonst _rndtrap _rne _rnl _rnz _rogue_vision _roguecorr -functions:198 _roguejoin _roguename _rot_corpse _rot_organic _rottenfood _rounddiv _row_refresh _run_timers -functions:199 _rust_dmg _s_suffix _safe_teleds _saleable _same_price _sanity_check _save_artifacts _save_currentstate -functions:200 _save_dungeon _save_engravings _save_light_sources _save_oracles _save_room _save_rooms _save_savefile_name _save_timers -functions:201 _save_waterlevel _save_worm _savebones _savech _savedamage _saveDiskPrompt _savefruitchn _savegamestate -functions:202 _savelev _savelev0 _savelevchn _savelife _savemonchn _savenames _saveobjchn _savestateinlock -functions:203 _savetrapchn _scatter _schedule_goto _score_wanted _search_door _search_special _searches_for_item _see_lamp_flicker -functions:204 _see_monsters _see_objects _see_traps _see_wsegs _seemimic _seetrap _seffects _select_hwep -functions:205 _select_off _select_rwep _selftouch _sellobj _sellobj_state _sengr_at _sense_trap -functions:206 _set_all_on_page _set_apparxy _set_artifact_intrinsic _set_bc _set_bonesfile_name _set_bonestemp_name _set_corn _set_cost -functions:207 _set_crosswall _set_entity _set_item_state _set_itimeout _set_levelfile_name _set_lit _set_lock_and_bones _set_malign -functions:208 _set_mimic_blocking _set_mimic_sym _set_mon_data _set_moreluck _set_occupation _set_repo_loc _set_residency _set_savefile_name -functions:209 _set_seenv _set_trap _set_twall _set_uasmon _set_wall _set_wall_property _set_wall_state _set_wear -functions:210 _set_wounded_legs _set_wportal _setclipped _setftty _setgemprobs _setmangry _setnotworn _setpaid -functions:211 _setrandom _settrack _settty _setup_waterlevel _setuwep _setworn _sgn _Shield_off -functions:212 _shieldeff _ship_object _shk_chat _shk_embellish _shk_move _shk_names_obj _shk_owns _shk_your -functions:213 _Shk_Your _shkcatch _shkgone _shkinit _shkname _sho_obj_return_to_u _shop_debt _shop_keeper -functions:214 _shop_object _shopdig _shopper_financial_report _shrine_pos _shrink_worm _shuffle -functions:215 _shuffle_all _shuffle_tiles _simple_look _singular _sitoa _skill_advance _skill_init _skill_level_name -functions:216 _skinback _sleep_monst _slept_monst _slip_or_trip _sliparm _slots_required _snuff_candle _snuff_light_source -functions:217 _snuff_lit _sobj_at _some_armor _somegold _somex _somexy _somey _sort_rooms -functions:218 _sort_valuables _sp_lev_shuffle _spec_ability _spec_abon _spec_applies _spec_dbon _spell_damage_bonus _spell_hit_bonus -functions:219 _spell_skilltype _spelleffects _spitmu _splatter_burning_oil _split_mon _split_rects _splitbill _splitobj -functions:220 _spoteffects _squadmon _srandom _stackobj _standoutbeg _standoutend _start_corpse_timeout _start_eating -functions:221 _start_engulf _start_timer _start_tin _steal _steal_it _stealamulet _stealarm _stealgold -functions:223 _stop_timer _store_version _strange_feeling _strategy _string_for_env_opt _string_for_opt _strncmpi _strprepend -functions:224 _strstri _study_book _stumble_onto_mimic _sub_one_frombill _subfrombill _substitute_tiles _summon_minion _surface -functions:225 _swallow_to_glyph _swapin_file _swapout_oldest _switch_symbols _switchar _t_warn -functions:226 _tabexpand _tactics _take_gold _take_off _tamedog _target_on _tele _tele_jump_ok -functions:227 _tele_restrict _tele_trap _teleds _teleok _teleport_pet _temple_occupied _tended_shop _term_end_attr -functions:228 _term_end_color -functions:229 _The _this_type_only _thitm _thitmonst _thitu _throw_gold _throwing_weapon _throwit -functions:230 _thrwmu _tileview _timed_occupation _timer_is_local _timer_sanity_check _tinnable _title_to_mon _tmp_at -functions:231 _topl_putsym _topologize _topten _topten_print _topten_print_bold _toss_up _toss_wsegs _touch_artifact -functions:232 _touchfood _trap_detect _trickery _try_disarm _try_lift _trycall _tt_oname _tty_add_menu -functions:233 _tty_askname _tty_clear_nhwindow _tty_cliparound -functions:234 _tty_display_file _tty_display_nhwindow _tty_doprev_message _tty_end_menu _tty_end_screen _tty_exit_nhwindows _tty_get_ext_cmd _tty_get_nh_event -functions:235 _tty_getlin _tty_init_nhwindows _tty_mark_synch _tty_message_menu _tty_nh_poskey _tty_nhbell _tty_nhgetch _tty_number_pad -functions:236 _tty_player_selection _tty_raw_print _tty_raw_print_bold _tty_resume_nhwindows _tty_select_menu -functions:237 _tty_start_menu _tty_start_screen _tty_startup _tty_suspend_nhwindows _tty_update_inventory _tty_yn_function -functions:238 _txt_backsp _txt_cl_end _txt_cl_eos _txt_clear_screen _txt_get_scr_size _txt_monoadapt_check -functions:239 _txt_nhbell _txt_startup _u_entered_shop _u_gname _u_init -functions:240 _u_left_shop _u_on_dnstairs _u_on_newpos _u_on_sstairs _u_on_upstairs _u_slip_free _u_slow_down _u_teleport_mon -functions:241 _u_to_e _u_wipe_engr _ugolemeffects _um_dist _unbless _unblock_point _uncommon -functions:242 _unconscious _uncurse _undead_to_corpse _under_ground _under_water _undiscover_object _unearth_objs _unfaint -functions:243 _unleash_all _unload_qtlist _unlock_file _unmap_object _unmul _unpaid_cost _unplacebc _unpunish -functions:244 _unrestrict_weapon_skill _unset_all_on_page _unsetup_waterlevel _unstuck _untrap _untrap_prob _unturn_dead _update_mon_intrinsics -functions:245 _update_topl _uptodate _urustm _use_bell _use_camera _use_candelabrum _use_candle _use_container -functions:246 _use_crystal_ball _use_defensive _use_figurine _use_grease _use_lamp _use_leash _use_magic_whistle _use_mirror -functions:247 _use_misc _use_offensive _use_pick_axe _use_skill _use_stethoscope _use_tinning_kit _use_towel _use_trap -functions:248 _use_unicorn_horn _use_whip _use_whistle _useup _useupall _useupf _ustatusline _uunstick -functions:249 _uwepgone _vault_occupied _vault_tele _verbalize _vga_backsp _vga_cl_end _vga_cl_eos _vga_clear_screen -functions:250 _vga_cliparound _vga_detect _vga_DisplayCell _vga_DisplayCell_O _vga_DrawCursor _vga_Finish _vga_FontPtrs _vga_get_scr_size -functions:251 _vga_gotoloc _vga_HideCursor _vga_Init _vga_overview _vga_redrawmap _vga_refresh _vga_SetPalette _vga_SwitchMode -functions:252 _vga_traditional _vga_tty_end_screen _vga_tty_startup _vga_update_positionbar _vga_userpan _vga_WriteChar _vga_WriteStr _vga_xputc -functions:254 _vision_reset _dodiscovered _dodoor _dodown _dodrink _dodrop _doeat _doengrave -functions:255 _wallification _wallify_map _wallify_vault _wantdoor _watch_on_duty _water_damage _water_friction -functions:256 _water_prayer _weapon_dam_bonus _weapon_hit_bonus _weapon_type _wearing_armor _weffects _weight -functions:257 _weight_cap -functions:258 _whimper _wield_tool _wildmiss _win_tty_init _wipe_engr_at _wipeoff _wipeout_text -functions:259 _wiz_detect _wiz_genesis _wiz_identify _wiz_level_tele _wiz_light_sources _wiz_map _wiz_show_seenv _wiz_show_vision -functions:260 _wiz_show_wmodes _wiz_timeout_queue _wiz_where _wiz_wish _wizdead _worm_known _worm_move _worm_nomove -functions:261 _wormgone _wormhitu _worn_wield_only _write_ls _writeentry _wrong_elem_type _x_monnam _xcrypt _xkilled _xlev_to_rank _xname _xprname -functions:263 _xytod _yelp _yname _Yname2 _You _you_aggravate _You_cant _You_feel _you_have _You_hear _you_unwere _you_were _Your _zap_dig -functions:265 _zap_hit _zap_over_floor _zap_updown _zapdir_to_glyph _zapnodir _zappable _zapyourself _zhitm _zhitu _put_lregion_here _role_init -; tuning -; this was 23 -functions:266 _bp_to_obj -; the next two were 238 -functions:268 _aggravate -; the following were 118 -;functions:269 -; the following were 261 -;functions:270 -functions:271 _xputg -functions:272 _xputs _xwaitforspace -; the following were 158 -functions:273 _enermod _enlightenment -; the following was 214 -;functions:274 _enter_explore_mode -; the following were 26 -functions:275 _bydoor -functions:276 _calc_capacity _call_kops _calm_nymphs -functions:277 _can_advance _can_be_hatched -functions:278 _can_carry -; the following were 239 -functions:279 _equipname -functions:280 _txt_xputs -; the following were 80 -functions:281 _enexto -;functions:282 -functions:283 _enhance_weapon_skill -; the following were 165 -functions:284 _okdoor -functions:285 _omon_adj -functions:286 _on_goal -functions:287 _on_ground -functions:288 _b_trapped -functions:289 _on_locate -functions:290 _on_msg -; the following were 182 -functions:291 _y_monnam -; the following were 195 -;functions:293 -; the following were 225 -functions:294 _erode_armor -functions:295 _swallowed -; the following were 7 -functions:298 _acurrstr -; the following were 17 -functions:299 _attacktype -functions:300 _attrcurse -functions:301 _automiss -functions:302 _autopick -; the following were 10 -functions:303 _adj_abon -functions:304 _adj_lev -functions:305 _adjabil -functions:306 _adjalign -functions:307 _adjattrib -; was 53 -functions:308 _display_monster -functions:309 _error -; was 117 -;functions:310 -functions:311 _is_ok_location -;functions:312 -functions:313 _is_pure -functions:314 _is_quest_artifact -; was 236 -functions:316 _tty_putstr _tty_putsym -; was 81 -functions:318 _escapes -functions:319 _erase_menu_or_text -functions:320 _eraseall -; tuning 2 -; was 269 -functions:321 _weldmsg _were_change _were_summon -functions:322 _where_name _which_armor _which_arti -functions:325 _term_end_raw_bold -functions:326 _term_start_attr -;functions:327 -functions:328 _term_start_raw_bold -functions:329 _terminate -functions:330 _tgetch -functions:331 _the -functions:332 _m_monnam -functions:333 _domagictrap _domindblast _domonability -functions:334 _m_respond -functions:335 _m_slips_free -functions:336 _m_throw -functions:337 _m_to_e -functions:338 _m_unleash -functions:339 _mpickstuff -functions:340 _mplayer_talk -functions:341 _mpoisons_subj -functions:342 _mquaffmsg -functions:343 _miss -functions:344 _mreadmsg -functions:345 _mrustm -functions:346 _vomit _vomiting_dialogue -functions:347 _wake_nearby -functions:348 _wake_nearto -functions:349 _wakeup -functions:350 _walkfrom -functions:351 _wall_angle -functions:352 _able_to_loot _add_mon_to_reg _add_rect_to_reg _add_region _addinv_core1 -functions:352 _addinv_core2 _age_spells _align_gtitle _align_shift _align_str _all_but_uchain -functions:353 _allow_all _allow_category _already_wearing _already_wearing2 _angrygods -functions:354 _animate_statue _antholemon _arti_speak _assign_warnings _attach_fig_transform_timeout _blocked_boulder -functions:355 _book_substitution _burn_away_slime _can_blnd _can_ride _can_saddle _can_twoweapon -functions:356 _carry_obj_effects _clear_regions _container_at _coyotename _create_gas_cloud _create_region -functions:357 _describe_level _dfeature_at _dig_up_grave _discover_artifact _dismount_steed _disp_artifact_discoveries -functions:359 _doconduct _dofire _doprinuse _doride _doswapweapon _dotwoweapon -functions:360 _dowieldquiver _drain_item _exercise_steed _expire_gas_cloud _extcmd_via_menu _feature_alert_opts -functions:361 _fig_transform _figurine_location_checks _final_level _find_trap _finish_quest _fix_petrification -functions:362 _food_substitution _fqname _free_invbuf _free_region _free_youbuf _freeinv_core -functions:363 _fuzzymatch _get_compopt_value _get_current_feature_ver _get_feature_notice_ver _get_mtraits _getlev -functions:364 _getlock _getobj _getpos _give_may_advance_msg _Goodbye _halu_gname -functions:365 _Hello _hurtle_step _hurtmarmor _in_out_region _initialspell _inside_gas_cloud -functions:366 _inside_rect _inside_region _kick_steed _look_here _m_in_out_region _make_grave -functions:367 _mbodypart _mdamagem _mdamageu _minimal_enlightenment _mk_mplayer_armor _mm_aggression -functions:368 _mon_adjust_speed _mon_animal_list _mon_beside _mon_in_region _montraits _mount_steed -functions:369 _noit_mon_nam _noit_Monnam _noncoalignment _num_genocides _obj_attach_mid _obj_timer_checks -functions:370 _obj_typename _ok_align _ok_gend _ok_race _ok_role _ordin -functions:371 _pick_align _pick_animal _pick_gend _pick_nasty _pick_race _pick_role -functions:372 _place_monster _pm_to_cham _prisoner_speaks _process_options _randalign _randgend -functions:373 _randrace _randrole _relobj _remove_mon_from_reg _remove_region -functions:374 _remove_worn_item _replace_object _reset_oattached_mids _rest_regions _restore_cham _rnd_treefruit_at -functions:375 _save_regions _select_newcham_form _self_invis_message _setuqwep _setuswapwep _show_conduct -functions:376 _show_region _simple_typename _slime_dialogue _sokoban_detect _spec_m2 _special_handling -functions:377 _str2align _str2gend _str2race _str2role _There _throw_obj -functions:378 _tmiss _tty_update_positionbar _tty_wait_synch _undiscovered_artifact _untwoweapon _update_mlstmv -functions:379 _update_monster_region _update_player_regions _uqwepgone _ureflects _use_grapple _use_pole -functions:380 _use_saddle _uswapwepgone _uwep_skill_type _validalign _validgend _validrace -functions:381 _validrole _violated_vegetarian _walk_path _warning_opts _wary_dog _welcome -functions:382 _write_timer _yyyymmdd _zap_steed -functions:383 _getprice _getreturn _getrumor _gettrack -functions:384 _ini_inv _knows_object _knows_class _restricted_spell_discipline _ready_weapon -functions:385 _doname _Doname2 -functions:386 _minliquid -functions:387 _missmm -functions:388 _missmu -functions:389 _missum -functions:390 _mixtype _mk_artifact -functions:391 _makesingular -functions:392 _maketrap _makevtele _makewish -functions:393 _add_erosion_words -; -functions:395 _display_pickinv -functions:396 _do_class_genocide -functions:397 _dochat -functions:398 _domonnoise -; -; -; -; -functions:403 _find_file -functions:404 _forget -functions:405 _forget_single_object -functions:406 _getlt -functions:407 _getpos_help -; -; -; -functions:411 _lib_dlb_cleanup -functions:412 _lib_dlb_fclose -functions:413 _lib_dlb_fgetc -functions:414 _lib_dlb_fgets -functions:415 _lib_dlb_fopen -functions:416 _lib_dlb_fread -functions:417 _lib_dlb_fseek -functions:418 _lib_dlb_ftell -functions:419 _lib_dlb_init -functions:420 _maybe_tame -; -functions:422 _mon_in_room -functions:423 _nextobuf -functions:424 _p_glow1 -functions:425 _p_glow2 -functions:426 _popch -functions:427 _randomize -functions:428 _readlibdir -functions:429 _reset_region_mids -functions:430 _rob_shop -functions:431 _stripspe -; -; -; -functions:435 _wand_explode -functions:436 _wishymatch - -functions:437 _abil_to_adtyp -functions:438 _abil_to_spfx -functions:439 _accessory_has_effect -functions:440 _add_autopickup_exception -functions:441 _add_class -functions:442 _adj_pit_checks -functions:443 _after_shk_move -functions:444 _alter_cost -functions:445 _anything_to_s -functions:446 _arti_cost -functions:447 _arti_immune -functions:448 _arti_reflects -functions:449 _artifact_has_invprop -functions:450 _artifact_light -functions:451 _artifact_score -functions:452 _assign_hilite -functions:453 _attacktype_fordmg -functions:454 _attk_protection -functions:455 _bagotricks -functions:456 _bare_artifactname -functions:457 _billable -functions:458 _bogon_is_pname -functions:459 _book_disappears -functions:460 _bottlename -functions:461 _bounded_increase -functions:461 _br_string2 -functions:463 _buried_ball -functions:464 _buried_ball_to_freedom -functions:465 _buried_ball_to_punishment -functions:466 _bypass_obj -functions:467 _can_blow -functions:468 _can_fog -functions:469 _can_reach_location -functions:470 _cant_reach_floor -; -functions:471 _cant_revive -functions:472 _cant_squeeze_thru -functions:473 _cant_wield_corpse -functions:474 _cast_cleric_spell -functions:475 _cast_wizard_spell -functions:476 _catch_lit -functions:477 _check_caitiff -functions:478 _check_innate_abil -functions:479 _choose_clerical_spell -functions:480 _choose_magic_spell -functions:481 _ckvalidcat -functions:482 _clear_bypasses -functions:483 _clear_conjoined_pits -functions:484 _clear_status_hilites -functions:485 _climb_pit -functions:486 _cloak_simple_name -functions:487 _clridx_to_s -functions:488 _cmd_from_func -functions:489 _compare_blstats -functions:490 _complain_about_duplicate -functions:491 _confers_luck -functions:492 _confused_book -functions:493 _conjoined_pits -functions:494 _consume_obj_charge -functions:495 _consume_oeaten -functions:496 _container_gone -functions:497 _container_impact_dmg -functions:498 _copy_mextra -functions:499 _copy_oextra -functions:500 _corpse_revive_type -functions:501 _costly_alteration -functions:502 _costly_tin -functions:503 _could_advance -functions:504 _could_reach_item -functions:505 _count_ape_maps -functions:506 _count_buc -functions:507 _critically_low_hp -functions:508 _currency -functions:509 _cxname -functions:510 _dealloc_killer -functions:511 _dealloc_mextra -functions:512 _dealloc_monst -functions:513 _dealloc_oextra -functions:514 _decal_planar -functions:515 _decide_to_shapeshift -functions:516 _def_bclose -functions:517 _def_bflush -functions:518 _def_bufoff -functions:519 _def_bufon -functions:520 _def_bwrite -functions:521 _def_minit -functions:522 _def_mread -functions:523 _delayed_killer -functions:524 _deliver_splev_message -functions:525 _detect_obj_traps -functions:526 _detect_wsegs -functions:527 _disarm_holdingtrap -functions:528 _disintegrate_mon -functions:529 _display_used_invlets -functions:530 _distant_monnam -functions:531 _dmgtype_fromattack -functions:532 _dogaze -functions:533 _donamelevel -functions:534 _doorless_door -functions:535 _dooverview -functions:536 _dooverview_or_wiz_where -functions:537 _dopoly -functions:538 _dotip -functions:539 _dotravel -functions:540 _dowhatdoes_core -functions:541 _drop_uswapwep -functions:542 _droppables -functions:543 _eat_brains -functions:544 _edibility_prompts -functions:545 _enexto_core -functions:546 _erode_obj -functions:547 _fatal_corpse_mistake -functions:548 _feeltrap -functions:549 _find_delayed_killer -functions:550 _find_mapseen -functions:551 _finish_meating -functions:552 _fire_damage -functions:553 _flashburn -functions:554 _fopen_wizkit_file -functions:555 _force_launch_placement -functions:556 _forget_mapseen -functions:557 _forget_temple_entry -functions:558 _free_epri -functions:559 _free_mname -functions:560 _free_omailcmd -functions:561 _free_omid -functions:562 _free_omonst -functions:563 _free_oname -functions:564 _from_what _fruitname _gain_guardian_angel _gcrownu -functions:565 _genl_preference_update _genl_status_enablefield _genl_status_finish _genl_status_init -functions:566 _genl_status_threshold _genl_status_update _genus _get_adjacent_loc -functions:567 _get_container_location _get_plname_from_file _get_status_hilites _getmattk -functions:568 _gold_in _gulp_blnd_check _helm_simple_name _help_dir -functions:569 _hideunder _hits_bars _hornoplenty _in_town -functions:570 _inhistemple _init_blstats _init_mapseen _innately -functions:571 _interest_mapseen _intersect _is_autopickup_exception _is_digging -functions:572 _is_innate _is_izchak _is_rottable _is_undirected_spell -functions:573 _is_wc_option _is_wc2_option _joust _keep_saddle_with_steedcorpse -functions:574 _killer_xname _landing_spot _launch_in_progress _learnscroll -functions:575 _learnscrolltyp _learnwand _liquid_flow _load_mapseen -functions:576 _long_to_any _loot_mon _lose_guardian_angel _m_useupall -functions:577 _magic_negation _make_slimed _make_stoned _mapglyph -functions:578 _maybe_cannibal _maybe_finished_meal _Mb_hit _mbag_item_gone -functions:579 _mbirth_limit _mcould_eat_tin _mdisplacem _mdrop_obj -functions:580 _mdrop_special_objs _meatmetal _melt_ice_away _mhurtle -functions:581 _mhurtle_step _mimic_hit_msg _mimic_obj_name _mkveggy_at -functions:582 _mm_displacement _mon_aligntyp _mon_consume_unstone _mon_hates_silver -functions:583 _monflee _mongrantswish _monhaskey _monhp_per_lvl -functions:584 _monst_to_any _mshot_xname _new_mname _new_omailcmd -functions:585 _new_oname _newedog _newegd _newemin -functions:586 _newepri _neweshk _newmextra _newmonhp -functions:587 _newoextra _newolong _newomid _newomonst -functions:588 _newpw _nextmbuf _nh_compress _nh_uncompress -functions:589 _num_horns _nxtobj _o_material _obj_has_timer -functions:590 _obj_no_longer_held _obj_shuffle_range _obj_to_any _observe_quantum_cat -functions:591 _odds_and_ends _olfaction _on_fire _otense -functions:592 _paniclog _paralyze_monst _passes_bars _passive_obj -functions:593 _peaked_skill _peek_timer _percentage _pit_flow -functions:594 _Popeye _postadjabil _print_mapseen _propagate -functions:595 _put_gold_back _putting_on _quickmimic _race_alignmentcount -functions:596 _raceptr _racial_exception _read_wizkit _recalc_mapseen -functions:597 _recbranch_mapseen _redraw_cmd _remdun_mapseen _remote_burglary -functions:598 _remove_autopickup_exception _remove_room _remove_rooms _reset_commands -functions:599 _reset_restpref _rest_levl _restmon _restobj -functions:600 _restore_killers _restore_msghistory _rider_cant_reach _rndcolor -functions:601 _role_gendercount _root_plselection_prompt _rouse_shk _rumor_check -functions:602 _s_to_anything _safe_oname _safe_qbuf _same_race -functions:603 _save_killers _save_mapseen _save_msghistory _savelevl -functions:604 _savemon _saveobj _seen_string _set_corpsenm -functions:605 _set_option_mod_status _set_restpref _set_status_hilites _set_tin_variety -functions:606 _setmnotwielded _setrolefilter _shade_aware _Shield_on -functions:607 _Shirt_off _Shirt_on _shkname_is_pname _shkveg -functions:608 _shop_string _should_displace _should_query_disclose_option _silly_thing -functions:609 _size_monst _size_obj _skip_pager _skiprange -functions:610 _sortspells _special_stock _spell_backfire _spell_cmp -functions:611 _spell_would_be_useless _spellretention _spellsortmenu _spot_stop_timers -functions:612 _spot_time_expires _spot_time_left _stagger _start_melt_ice_timeout -functions:613 _status_finish _status_hilite_menu _status_initialize _steedintrap -functions:614 _Sting_effects _store_plname_in_file _store_savefileinfo _strkitten -functions:615 _strsubst _stuck_ring _stuff_prevents_passage _taking_off -functions:616 _test_move _the_unique_obj _the_unique_pm _theft_petrifies -functions:617 _tin_details _tin_variety _tin_variety_txt _tipcontainer -functions:618 _Tobjnam _tty_getmsghistory _tty_putmsghistory _uhave_graystone -functions:619 _unchanger _undesirable_disp _unfixable_trouble_count _unplaced_floater -functions:620 _unreachable_level _upstart _use_cream_pie _use_pick_axe2 -functions:621 _use_stone _usmellmon _uteetering_at_seen_pit _validate -functions:622 _validate_prefix_locations _vamp_shift _vault_gd_watching _veggy_item -functions:623 _version_string _vtense _watch_dig _waterbody_name -functions:624 _wc_set_font_name _wc_set_window_colors _wc_supported _wc2_supported -functions:625 _weapon_descr _what_gives _wielding_corpse _will_feel_cockatrice -functions:626 _wiz_level_change _wiz_map_terrain _wiz_mon_polycontrol _wiz_panic -functions:627 _wiz_polyself _wiz_rumor_check _wiz_smell _worst_cursed_item -functions:628 _yn_function _yobjnam _Yobjnam2 _You_see -functions:629 _ysimple_name - diff --git a/sys/msdos/setup.bat b/sys/msdos/setup.bat index b5c9c9c0b..f2f983ba6 100755 --- a/sys/msdos/setup.bat +++ b/sys/msdos/setup.bat @@ -1,5 +1,5 @@ @echo off -REM NetHack 3.6 setup.bat $NHDT-Date: 1432512792 2015/05/25 00:13:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ +REM NetHack 5.0 setup.bat $NHDT-Date: 1596498274 2020/08/03 23:44:34 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.18 $ REM Copyright (c) NetHack PC Development Team 1990 - 2019 REM NetHack may be freely redistributed. See license for details. @@ -16,7 +16,7 @@ goto err_set echo Checking to see if directories are set up properly ... if not exist ..\..\include\hack.h goto err_dir if not exist ..\..\src\hack.c goto err_dir -if not exist ..\..\dat\wizard.des goto err_dir +if not exist ..\..\dat\wizard1.lua goto err_dir if not exist ..\..\util\makedefs.c goto err_dir if not exist ..\..\win\tty\wintty.c goto err_dir echo Directories OK. @@ -125,8 +125,9 @@ echo distribution. echo The following files need to exist under the names on the echo right in order to build NetHack: echo. -echo ..\..\dat\data.base needs to be copied to ..\..\dat\data.bas -echo ..\..\include\patchlevel.h needs to be copied to ..\..\include\patchlev.h +echo ..\..\dat\data.base needs to be copied to ..\..\dat\data.bas +echo ..\..\include\patchlevel.h needs to be copied to ..\..\include\patchlev.h +echo ..\..\sys\share\posixregex.c needs to be copied to ..\..\sys\share\posixreg.c echo. echo setup.bat was unable to perform the necessary changes because at least echo one of the files doesn't exist under its short name, and the diff --git a/sys/msdos/sound.c b/sys/msdos/sound.c deleted file mode 100644 index 8a9f6b65a..000000000 --- a/sys/msdos/sound.c +++ /dev/null @@ -1,364 +0,0 @@ -/* NetHack 3.6 sound.c $NHDT-Date: 1432512792 2015/05/25 00:13:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (c) NetHack PC Development Team 1993,1995 */ -/* NetHack may be freely redistributed. See license for details. */ -/* */ -/* - * sound.c - Hardware sound support - * - *Edit History: - * Initial Creation 93/10/01 - * Added PC Speaker Support for BC compilers 95/06/14 - * Completed various fixes 96/02/19 - * - */ - -#include "hack.h" -#include -#include "portio.h" - -#include -#include - -#ifndef TESTING - -#define printf pline - -int -assign_soundcard(sopt) -char *sopt; -{ - iflags.hassound = 0; -#ifdef PCMUSIC - iflags.usepcspeaker = 0; -#endif - - if (strncmpi(sopt, "def", 3) == 0) { /* default */ - /* do nothing - default */ - } -#ifdef PCMUSIC - else if (strncmpi(sopt, "speaker", 7) == 0) { /* pc speaker */ - iflags.usepcspeaker = 1; - } -#endif - else if (strncmpi(sopt, "auto", 4) == 0) { /* autodetect */ - /* - * Auto-detect Priorities (arbitrary for now): - * Just pcspeaker - */ - if (0) - ; -#ifdef PCMUSIC - else - iflags.usepcspeaker = 1; -#endif - } else { - return 0; - } - return 1; -} -#endif - -#ifdef PCMUSIC - -/* 8254/3 Control Word Defines */ - -#define CTR0SEL (0 << 6) -#define CTR1SEL (1 << 6) -#define CTR2SEL (2 << 6) -#define RDBACK (3 << 6) - -#define LATCH (0 << 4) -#define RW_LSB (1 << 4) -#define RW_MSB (2 << 4) /* If both LSB and MSB are read, LSB is done first \ - */ - -#define MODE0 (0 << 1) /* Interrupt on terminal count */ -#define MODE1 (1 << 1) /* Hardware One-Shot */ -#define MODE2 (2 << 1) /* Pulse Generator */ -#define MODE3 (3 << 1) /* Square Wave Generator */ -#define MODE4 (4 << 1) /* Software Triggered Strobe */ -#define MODE5 (5 << 1) /* Hardware Triggered Strobe */ - -#define BINARY (0 << 0) /* Binary counter (16 bits) */ -#define BCD (1 << 0) /* Binary Coded Decimal (BCD) Counter (4 Decades) */ - -/* Misc 8254/3 Defines */ - -#define TIMRFRQ (1193180UL) /* Input frequency to the clock (Hz) */ - -/* Speaker Defines */ - -#define TIMER (1 << 0) /* Timer 2 Output connected to Speaker */ -#define SPKR_ON (1 << 1) /* Turn on/off Speaker */ - -/* Port Definitions */ - -/* 8254/3 Ports */ - -#define CTR0 0x40 -#define CTR1 0x41 -#define CTR2 0x42 -#define CTRL 0x43 - -/* Speaker Port */ - -#define SPEAKER 0x61 - -void -startsound(unsigned freq) -{ - /* To start a sound on the PC: - * - * First, set the second counter to have the correct frequency: - */ - - unsigned count; - - if (freq == 0) - freq = 523; - - count = TIMRFRQ / freq; /* Divide frequencies to get count. */ - -#ifdef TESTING - printf("freq = %u, count = %u\n", freq, count); -#endif - - outportb(CTRL, CTR2SEL | RW_LSB | RW_MSB | MODE3 | BINARY); - outportb(CTR2, count & 0x0FF); - outportb(CTR2, count / 0x100); - - /* Next, turn on the speaker */ - - outportb(SPEAKER, inportb(SPEAKER) | TIMER | SPKR_ON); -} - -void -stopsound(void) -{ - outportb(SPEAKER, inportb(SPEAKER) & ~(TIMER | SPKR_ON)); -} - -static unsigned tempo, length, octave, mtype; - -/* The important numbers here are 287700UL for the factors and 4050816000UL - * which gives the 440 Hz for the A below middle C. "middle C" is assumed to - * be the C at octave 3. The rest are computed by multiplication/division of - * 2^(1/12) which came out to 1.05946 on my calculator. It is assumed that - * no one will request an octave beyond 6 or below 0. (At octave 7, some - * notes still come out ok, but by the end of the octave, the "notes" that - * are produced are just ticks. - - * These numbers were chosen by a process based on the C64 tables (which - * weren't standardized) and then were 'standardized' by giving them the - * closest value. That's why they don't seem to be based on any sensible - * number. - */ - -unsigned long notefactors[12] = { 483852, 456695, 431063, 406869, - 384033, 362479, 342135, 322932, - 304808, 287700, 271553, 256312 }; - -void -note(long notenum) -{ - startsound((unsigned) (4050816000UL / notefactors[notenum % 12] - >> (7 - notenum / 12))); -} - -int notes[7] = { 9, 11, 0, 2, 4, 5, 7 }; - -char * -startnote(char *c) -{ - long n; - - n = notes[toupper(*c++) - 'A'] + octave * 12; - if (*c == '#' || *c == '+') { - n++; - c++; - } else if (*c == '-') { - if (n) - n--; - c++; - } - - note(n); - - return --c; -} - -void -delaytime(unsigned time) -{ - /* time and twait are in units of milliseconds */ - - unsigned twait; - - switch (toupper(mtype)) { - case 'S': - twait = time / 4; - break; - case 'L': - twait = 0; - break; - default: - twait = time / 8; - break; - } - - msleep(time - twait); - stopsound(); - msleep(twait); -} - -char * -delaynote(char *c) -{ - unsigned time = 0; - - while (isdigit(*c)) - time = time * 10 + (*c++ - '0'); - - if (!time) - time = length; - - time = (unsigned) (240000 / time / tempo); - - while (*c == '.') { - time = time * 3 / 2; - c++; - } - - delaytime(time); - - return c; -} - -void -initspeaker(void) -{ - tempo = 120, length = 4, octave = 3, mtype = 'N'; -} - -void -play(char *tune) -{ - char *c, *n; - unsigned num; - - for (c = tune; *c;) { - sscanf(c + 1, "%u", &num); - for (n = c + 1; isdigit(*n); n++) /* do nothing */ - ; - if (isspace(*c)) - c++; - else - switch (toupper(*c)) { - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - c = startnote(c); - case 'P': - c = delaynote(++c); - break; -#if 0 - case 'M': c++; mtype = *c; c++; break; - case 'T': - if (num) tempo = num; - else printf ("Zero Tempo (%s)!\n", c); - c = n; - break; - case 'L': - if (num) length = num; - else printf ("Zero Length (%s)!\n", c); - c = n; - break; - case 'O': - if (num <= 7) - octave = num; - c = n; - break; - case 'N': - note (num); - delaytime ((240000/length/tempo)); - c = n; - break; - case '>': if (octave < 7) octave++; c++; break; - case '<': if (octave) octave--; c++; break; -#endif - case ' ': - c++; - break; - default: - printf("Unrecognized play value (%s)!\n", c); - return; - } - } -} - -#ifndef TESTING -void -pc_speaker(struct obj *instr, char *tune) -{ - if (!iflags.usepcspeaker) - return; - initspeaker(); - switch (instr->otyp) { - case WOODEN_FLUTE: - case MAGIC_FLUTE: - octave = 5; /* up one octave */ - break; - case TOOLED_HORN: - case FROST_HORN: - case FIRE_HORN: - octave = 2; /* drop two octaves */ - break; - case BUGLE: - break; - case WOODEN_HARP: - case MAGIC_HARP: - length = 8; - mtype = 'L'; /* fast, legato */ - break; - } - play(tune); -} - -#else - -main() -{ - char s[80]; - int tool; - - initspeaker(); - printf("1) flute\n2) horn\n3) harp\n4) other\n"); - fgets(s, 80, stdin); - sscanf(s, "%d", &tool); - switch (tool) { - case 1: - octave = 5; - break; - case 2: - octave = 2; - break; - case 3: - length = 8; - mtype = 'L'; - break; - default: - break; - } - printf("Enter tune:"); - fgets(s, 80, stdin); - play(s); -} -#endif - -#endif /* PCMUSIC */ - -/* sound.c */ diff --git a/sys/winnt/sysconf.template b/sys/msdos/sysconf similarity index 81% rename from sys/winnt/sysconf.template rename to sys/msdos/sysconf index bec41ced3..779e437bd 100644 --- a/sys/winnt/sysconf.template +++ b/sys/msdos/sysconf @@ -1,11 +1,11 @@ # -# NetHack 3.6 sysconf $NHDT-Date: 1524689357 2018/04/25 20:49:17 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.22 $ +# NetHack 5.0 sysconf $NHDT-Date: 1524689357 2018/04/25 20:49:17 $ $NHDT-Branch: NetHack-5.0.0 $:$NHDT-Revision: 1.22 $ # Copyright (c) 2015 by Michael Allison # NetHack may be freely redistributed. See license for details. # # Sample sysconf file. # The sysconf file is only used if NetHack is compiled with SYSCF defined. -# This file uses the same syntax as nethack.cf. +# This file uses the same syntax as nethack.cnf. # Which users can use WIZARD (debugging) mode (the -D flag). # A value of * allows anyone to enter debugging mode. @@ -24,7 +24,7 @@ WIZARDS=* # Only available if NetHack was compiled with DUMPLOG # Allows following placeholders: # %% literal '%' -# %v version (eg. "3.6.6-0") +# %v version (eg. "5.0.0-0") # %u game UID # %t game start time, UNIX timestamp format # %T current time, UNIX timestamp format @@ -70,6 +70,12 @@ WIZARDS=* # numeric (1) user id. #PERS_IS_UID=1 +# Help menu control; 0 - include "command line usage" entry in help menu; +# 1 - suppress it from the menu. Does not affect 'nethack --usage' when +# player has access to the command line. The usage feedback describes +# command line handling for UNIX so enabling it won't be much use here. +HIDEUSAGE=1 + # Maximum number of score file entries to use for random statue names #MAX_STATUENAME_RANK=10 @@ -77,30 +83,27 @@ WIZARDS=* # IMPORTANT: If you change any of these locations, the directories they # point at must exist. NetHack will not create them for you. # -# Before adjusting, you can verify the default locations for files with: -# nethack --showpaths -# # The location that users can adjust their config file startup options -#CONFIGDIR=%USERPROFILE%\NetHack +#CONFIGDIR=C:\NETHACK # # The location that a record of game aborts and self-diagnosed game problems # is kept (default=HACKDIR, writeable) -#TROUBLEDIR=%USERPROFILE%\NetHack\3.6 +#TROUBLEDIR=C:\NETHACK # # The location that documentation and helps files are placed -#HACKDIR=%USERPROFILE%\NetHack\3.6 +#HACKDIR=C:\NETHACK # # The location that level files in progress are stored (writeable) -#LEVELDIR=%USERPROFILE%\AppData\Local\NetHack\3.6 +#LEVELDIR=C:\NETHACK\LEVELS # # The location where saved games are kept (writeable) -#SAVEDIR=%USERPROFILE%\AppData\Local\NetHack\3.6 +#SAVEDIR=C:\NETHACK\SAVES # # The location that bones files are kept (writeable) -#BONESDIR=c:\ProgramData\NetHack\3.6 +#BONESDIR=C:\NETHACK\BONES # # The location that score files are kept (writeable) -#SCOREDIR=c:\ProgramData\NetHack\3.6 +#SCOREDIR=C:\NETHACK # # The location that file synchronization locks are stored (writeable) -#LOCKDIR=c:\ProgramData\NetHack\3.6 +#LOCKDIR=C:\NETHACK diff --git a/sys/msdos/tile2bin.c b/sys/msdos/tile2bin.c index 4c7a3228d..cc43bb3dc 100644 --- a/sys/msdos/tile2bin.c +++ b/sys/msdos/tile2bin.c @@ -1,14 +1,14 @@ -/* NetHack 3.6 tile2bin.c $NHDT-Date: 1457207041 2016/03/05 19:44:01 $ $NHDT-Branch: chasonr $:$NHDT-Revision: 1.9 $ */ +/* NetHack 5.0 tile2bin.c $NHDT-Date: 1596498275 2020/08/03 23:44:35 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.11 $ */ /* Copyright (c) NetHack PC Development Team 1993, 1994, 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * Edit History: * - * Initial Creation M.Allison 93/10/21 - * ifndef MONITOR_HEAP for heaputil.c P.Winner 94/03/12 - * added Borland C _stklen variable Y.Sapir 94/05/01 - * fixed to use text tiles from win/share M.Allison 95/01/31 + * Initial Creation M.Allison 1993/10/21 + * ifndef MONITOR_HEAP for heaputil.c P.Winner 1994/03/12 + * added Borland C _stklen variable Y.Sapir 1994/05/01 + * fixed to use text tiles from win/share M.Allison 1995/01/31 * */ @@ -17,11 +17,7 @@ #include "tile.h" #include "pctiles.h" -#include -#ifndef MONITOR_HEAP -#include -#endif -#include +/* #include */ #ifdef __GO32__ #include @@ -44,7 +40,7 @@ extern unsigned _stklen = STKSIZ; #undef PACKED_FILE #endif -extern char *FDECL(tilename, (int, int)); +extern char *tilename(int, int); #ifdef PLANAR_FILE char masktable[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; @@ -66,10 +62,10 @@ int num_colors; pixel pixels[TILE_Y][TILE_X]; struct tibhdr_struct tibheader; -static void FDECL(write_tibtile, (int)); -static void FDECL(write_tibheader, (FILE *, struct tibhdr_struct *)); -static void FDECL(build_tibtile, (pixel(*) [TILE_X], BOOLEAN_P)); -static void NDECL(remap_colors); +static void write_tibtile(int); +static void write_tibheader(FILE *, struct tibhdr_struct *); +static void build_tibtile(pixel(*) [TILE_X], boolean); +static void remap_colors(void); #ifndef OVERVIEW_FILE char *tilefiles[] = { "../win/share/monsters.txt", "../win/share/objects.txt", @@ -84,9 +80,7 @@ int filenum; int paletteflag; int -main(argc, argv) -int argc; -char *argv[]; +main(int argc, char *argv[]) { int i; struct tm *newtime; @@ -191,8 +185,13 @@ char *argv[]; tibheader.compiler = OTHER_COMP; #endif - strncpy(tibheader.ident, "NetHack 3.6 MSDOS Port binary tile file", 80); + strncpy(tibheader.ident, "NetHack 5.0 MSDOS Port binary tile file", 80); +#if !defined(NOSTRFTIME) + (void) strftime(tibheader.timestamp, + sizeof tibheader.timestamp, "%c", newtime); +#else strncpy(tibheader.timestamp, asctime(newtime), 24); +#endif tibheader.timestamp[25] = '\0'; tibheader.tilecount = tilecount; tibheader.numcolors = num_colors; @@ -223,9 +222,7 @@ char *argv[]; } static void -write_tibheader(fileptr, tibhdr) -FILE *fileptr; -struct tibhdr_struct *tibhdr; +write_tibheader(FILE *fileptr, struct tibhdr_struct *tibhdr) { if (fseek(fileptr, 0L, SEEK_SET)) { Fprintf(stderr, "Error writing header to tile file\n"); @@ -234,9 +231,7 @@ struct tibhdr_struct *tibhdr; } static void -build_tibtile(pixels, statues) -pixel (*pixels)[TILE_X]; -boolean statues; +build_tibtile(pixel (*pixels)[TILE_X], boolean statues) { static int graymappings[] = { /* . A B C D E F G H I J K L M N O P */ @@ -314,8 +309,7 @@ boolean statues; } static void -write_tibtile(recnum) -int recnum; +write_tibtile(int recnum) { long fpos; @@ -352,7 +346,7 @@ int recnum; } static void -remap_colors() +remap_colors(void) { char swap; diff --git a/sys/msdos/vesa.h b/sys/msdos/vesa.h index 1184a42ca..9549a2bd1 100644 --- a/sys/msdos/vesa.h +++ b/sys/msdos/vesa.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 vesa.h $NHDT-Date: 1507161296 2017/10/04 23:54:56 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.0 $ */ +/* NetHack 5.0 vesa.h $NHDT-Date: 1596498276 2020/08/03 23:44:36 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.0 $ */ /* VESA structures from the VESA BIOS Specification, retrieved 15 Jan 2016 * from http://flint.cs.yale.edu/cs422/readings/hardware/vbe3.pdf diff --git a/sys/msdos/video.c b/sys/msdos/video.c index 2076c3489..7d2a91ef5 100644 --- a/sys/msdos/video.c +++ b/sys/msdos/video.c @@ -1,19 +1,20 @@ -/* NetHack 3.6 video.c $NHDT-Date: 1554215931 2019/04/02 14:38:51 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.12 $ */ -/* Copyright (c) NetHack PC Development Team 1993, 1994, 2001 */ +/* NetHack 5.0 video.c $NHDT-Date: 1596498277 2020/08/03 23:44:37 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.16 $ */ +/* Copyright (c) NetHack PC Development Team 1993, 1994, 2001 */ /* NetHack may be freely redistributed. See license for details. */ -/* */ + /* * video.c - Hardware video support front-ends * *Edit History: - * Initial Creation M. Allison 1993/04/04 - * Add djgpp support K. Smolkowski 1993/04/26 + * Initial Creation M. Allison 1993/04/04 + * Add djgpp support K. Smolkowski 1993/04/26 * Add txt/graphics mode support M. Allison 1993/10/30 * Add graphics mode cursor sim. M. Allison 1994/02/19 * Add hooks for decals on vga M. Allison 2001/04/07 */ #include "hack.h" +#include "wintty.h" #ifndef STUBVIDEO #include "pcvideo.h" @@ -73,7 +74,7 @@ */ void -get_scr_size() +get_scr_size(void) { #ifdef SCREEN_VGA if (iflags.usevga) { @@ -88,6 +89,14 @@ get_scr_size() txt_get_scr_size(); } +#ifdef ENHANCED_SYMBOLS +void g_pututf8(uint8 *utf8str) +{ + /* not implemented for msdos (yet) */ + nhUse(utf8str); +} +#endif + /* * -------------------------------------------------------------- * The rest of this file is only compiled if NO_TERMS is defined. @@ -96,7 +105,6 @@ get_scr_size() #ifdef NO_TERMS -#include #include "wintty.h" #ifdef __GO32__ @@ -111,35 +119,90 @@ typedef long clock_t; #include /* needed for delay() */ #endif -#ifdef SCREEN_DJGPPFAST /* parts of this block may be unecessary now */ +#ifdef SCREEN_DJGPPFAST /* parts of this block may be unnecessary now */ #define get_cursor(x, y) ScreenGetCursor(y, x) #endif #ifdef SCREEN_BIOS -void FDECL(get_cursor, (int *, int *)); +void get_cursor(int *, int *); #endif -void FDECL(adjust_cursor_flags, (struct WinDesc *)); -void FDECL(cmov, (int, int)); -void FDECL(nocmov, (int, int)); -STATIC_DCL void NDECL(init_ttycolor); +void adjust_cursor_flags(struct WinDesc *); +void cmov(int, int); +void nocmov(int, int); +static void init_ttycolor(void); int savevmode; /* store the original video mode in here */ int curcol, currow; /* graphics mode current cursor locations */ int g_attribute; /* Current attribute to use */ int monoflag; /* 0 = not monochrome, else monochrome */ +int inversed; int attrib_text_normal; /* text mode normal attribute */ int attrib_gr_normal; /* graphics mode normal attribute */ int attrib_text_intense; /* text mode intense attribute */ int attrib_gr_intense; /* graphics mode intense attribute */ -boolean traditional = FALSE; /* traditonal TTY character mode */ +uint32 curframecolor = NO_COLOR; /* current background text color */ +boolean traditional = FALSE; /* traditional TTY character mode */ boolean inmap = FALSE; /* in the map window */ -#ifdef TEXTCOLOR char ttycolors[CLR_MAX]; /* also used/set in options.c */ -#endif /* TEXTCOLOR */ + +/* for linkage from wintty.c */ + +void +term_shutdown(void) +{ +} + +#ifdef ASCIIGRAPH +void +graph_on(void) +{ +} + +void +graph_off(void) +{ +} +#endif + +void +term_curs_set(int visibility) +{ + static int vis = -1; + + if (vis == visibility) + return; + + if (!visibility) { + if (!iflags.grmode) { + txt_hide_cursor(); +#ifdef SCREEN_VGA + } else if (iflags.usevga) { + vga_hide_cursor(); +#endif +#ifdef SCREEN_VESA + } else if (iflags.usevesa) { + vesa_hide_cursor(); + } +#endif + } else if (visibility) { + if (!iflags.grmode) { + txt_show_cursor(); +#ifdef SCREEN_VGA + } else if (iflags.usevga) { + vga_show_cursor(); +#endif +#ifdef SCREEN_VESA + } else if (iflags.usevesa) { + vesa_show_cursor(); + } +#endif + } + vis = visibility; +} void -backsp() +backsp(void) { if (!iflags.grmode) { txt_backsp(); @@ -155,7 +218,7 @@ backsp() } void -clear_screen() +term_clear_screen(void) { if (!iflags.grmode) { txt_clear_screen(); @@ -165,12 +228,12 @@ clear_screen() #endif #ifdef SCREEN_VESA } else if (iflags.usevesa) { - vesa_clear_screen(BACKGROUND_VGA_COLOR); + vesa_clear_screen(BACKGROUND_VESA_COLOR); #endif } } -void cl_end() /* clear to end of line */ +void cl_end(void) /* clear to end of line */ { int col, row; @@ -190,7 +253,7 @@ void cl_end() /* clear to end of line */ tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1, (int) ttyDisplay->cury); } -void cl_eos() /* clear to end of screen */ +void cl_eos(void) /* clear to end of screen */ { int cy = (int) ttyDisplay->cury + 1; @@ -209,8 +272,7 @@ void cl_eos() /* clear to end of screen */ } void -cmov(col, row) -register int col, row; +cmov(int col, int row) { ttyDisplay->cury = (uchar) row; ttyDisplay->curx = (uchar) col; @@ -232,16 +294,12 @@ int has_color(int color) { ++color; /* prevents compiler warning (unref. param) */ -#ifdef TEXTCOLOR return (monoflag) ? 0 : 1; -#else - return 0; -#endif } #endif void -home() +home(void) { tty_curs(BASE_WINDOW, 1, 0); ttyDisplay->curx = ttyDisplay->cury = (uchar) 0; @@ -259,8 +317,7 @@ home() } void -nocmov(col, row) -int col, row; +nocmov(int col, int row) { if (!iflags.grmode) { txt_gotoxy(col, row); @@ -276,13 +333,13 @@ int col, row; } void -standoutbeg() +standoutbeg(void) { g_attribute = iflags.grmode ? attrib_gr_intense : attrib_text_intense; } void -standoutend() +standoutend(void) { g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; } @@ -297,19 +354,24 @@ void term_end_attr(int attr) { switch (attr) { + case ATR_INVERSE: + inversed = 0; + FALLTHROUGH; + /*FALLTHRU*/ case ATR_ULINE: case ATR_BOLD: case ATR_BLINK: - case ATR_INVERSE: default: g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; } + curframecolor = NO_COLOR; } void term_end_color(void) { g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; + curframecolor = NO_COLOR; } void @@ -342,13 +404,9 @@ term_start_attr(int attr) } break; case ATR_INVERSE: - if (monoflag) { - g_attribute = ATTRIB_MONO_REVERSE; - } else { - g_attribute = - iflags.grmode ? attrib_gr_intense : attrib_text_intense; - } - break; + inversed = 1; + FALLTHROUGH; + /*FALLTHRU*/ default: g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; break; @@ -358,18 +416,40 @@ term_start_attr(int attr) void term_start_color(int color) { -#ifdef TEXTCOLOR if (monoflag) { g_attribute = attrib_text_normal; } else { - if (color >= 0 && color < CLR_MAX) { + if (color == NO_COLOR) { /* 5.0 behave like term_end_color() */ + g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; + curframecolor = NO_COLOR; + } else if (color >= 0 && color < CLR_MAX) { if (iflags.grmode) g_attribute = color; else g_attribute = ttycolors[color]; } } -#endif +} + +void +term_start_bgcolor(int bgcolor) +{ + // pline("before bgcolor = %d, curframecolor = %d", bgcolor, curframecolor); + if (!monoflag) { + if (bgcolor >= 0 && bgcolor < CLR_MAX) + curframecolor = bgcolor; + } + // pline("after bgcolor = %d, curframecolor = %d", bgcolor, curframecolor); +} + +void +term_start_extracolor(uint32 nhcolor UNUSED, uint16 color256idx UNUSED) +{ +} + +void +term_end_extracolor(void) +{ } void @@ -379,7 +459,7 @@ term_start_raw_bold(void) } void -tty_delay_output() +tty_delay_output(void) { #ifdef TIMED_DELAY if (flags.nap) { @@ -391,7 +471,7 @@ tty_delay_output() } void -tty_end_screen() +term_end_screen(void) { if (!iflags.grmode) { txt_clear_screen(); @@ -400,31 +480,29 @@ tty_end_screen() #endif #ifdef SCREEN_VGA } else if (iflags.usevga) { - vga_tty_end_screen(); + vga_term_end_screen(); #endif #ifdef SCREEN_VESA } else if (iflags.usevesa) { - vesa_tty_end_screen(); + vesa_term_end_screen(); #endif } } void -tty_nhbell() +tty_nhbell(void) { txt_nhbell(); } void -tty_number_pad(state) -int state; +tty_number_pad(int state) { ++state; /* prevents compiler warning (unref. param) */ } void -tty_startup(wid, hgt) -int *wid, *hgt; +term_startup(int *wid, int *hgt) { /* code to sense display adapter is required here - MJA */ @@ -438,12 +516,12 @@ int *wid, *hgt; #ifdef SCREEN_VGA if (iflags.usevga) { - vga_tty_startup(wid, hgt); + vga_term_startup(wid, hgt); } else #endif #ifdef SCREEN_VESA if (iflags.usevesa) { - vesa_tty_startup(wid, hgt); + vesa_term_startup(wid, hgt); } else #endif txt_startup(wid, hgt); @@ -456,19 +534,19 @@ int *wid, *hgt; setclipped(); #endif -#ifdef TEXTCOLOR init_ttycolor(); -#endif #ifdef MONO_CHECK monoflag = txt_monoadapt_check(); #else monoflag = 0; #endif + + inversed = 0; } void -tty_start_screen() +term_start_screen(void) { #ifdef PC9800 fputs("\033[>1h", stdout); @@ -478,8 +556,9 @@ tty_start_screen() } void -gr_init() +gr_init(void) { + windowprocs.wincap2 &= ~WC2_EXTRACOLORS; #ifdef SCREEN_VGA if (iflags.usevga) { vga_Init(); @@ -499,7 +578,7 @@ gr_init() } void -gr_finish() +gr_finish(void) { if (iflags.grmode) { #ifdef SCREEN_VGA @@ -530,30 +609,29 @@ gr_finish() * as those in win/tty). * * xputs - Writes a c null terminated string at the current location. - * Depending on compile options, this could just be a series - * of repeated calls to xputc() for each character. + * Depending on compile options, this could just be a series + * of repeated calls to xputc() for each character. * * xputc - Writes a single character at the current location. Since - * various places in the code assume that control characters - * can be used to control, we are forced to interpret some of - * the more common ones, in order to keep things looking correct. + * various places in the code assume that control characters + * can be used to control, we are forced to interpret some of + * the more common ones, in order to keep things looking correct. * * xputg - If using a graphics mode display mechanism (such as VGA, this - * routine is used to display a graphical representation of a - * NetHack glyph at the current location. For more information on - * NetHack glyphs refer to the comments in include/display.h. + * routine is used to display a graphical representation of a + * NetHack glyph at the current location. For more information on + * NetHack glyphs refer to the comments in include/display.h. * * NOTES: - * wintty.h uses macros to redefine common output functions - * such as puts, putc, putchar, so that they get steered into - * either xputs (for strings) or xputc (for single characters). - * References to puts, putc, and putchar in other source files - * (that include wintty.h) are actually using these routines. + * wintty.h uses macros to redefine common output functions + * such as puts, putc, putchar, so that they get steered into + * either xputs (for strings) or xputc (for single characters). + * References to puts, putc, and putchar in other source files + * (that include wintty.h) are actually using these routines. */ void -xputs(s) -const char *s; +xputs(const char *s) { int col, row; @@ -575,16 +653,22 @@ const char *s; /* same signature as 'putchar()' with potential failure result ignored */ int -xputc(ch) /* write out character (and attribute) */ -int ch; +xputc(int ch) /* write out character (and attribute) */ { int i; char attribute; i = iflags.grmode ? attrib_gr_normal : attrib_text_normal; - attribute = (char) ((g_attribute == 0) ? i : g_attribute); + + if (curframecolor != NO_COLOR) { + attribute |= ((ttycolors[curframecolor]) << 4); + } + if (!iflags.grmode) { + if (inversed) { + attribute = (g_attribute % 8) << 4; + } txt_xputc(ch, attribute); #ifdef SCREEN_VGA } else if (iflags.usevga) { @@ -599,28 +683,24 @@ int ch; } /* write out a glyph picture at current location */ -void xputg(glyphnum, ch, special) -int glyphnum; -int ch; -unsigned special; +void xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo) { if (!iflags.grmode || !iflags.tile_view) { - (void) xputc((char) ch); + (void) xputc((char) glyphinfo->ttychar); #ifdef SCREEN_VGA } else if (iflags.grmode && iflags.usevga) { - vga_xputg(glyphnum, ch, special); + vga_xputg(glyphinfo, bkglyphinfo); #endif #ifdef SCREEN_VESA } else if (iflags.grmode && iflags.usevesa) { - vesa_xputg(glyphnum, ch, special); + vesa_xputg(glyphinfo, bkglyphinfo); #endif } } #ifdef POSITIONBAR void -video_update_positionbar(posbar) -char *posbar; +video_update_positionbar(char *posbar) { if (!iflags.grmode) return; @@ -636,8 +716,7 @@ char *posbar; #endif void -adjust_cursor_flags(cw) -struct WinDesc *cw; +adjust_cursor_flags(struct WinDesc *cw) { #ifdef SIMULATE_CURSOR #if 0 @@ -664,7 +743,7 @@ int cursor_flag; /* The check for iflags.grmode is made BEFORE calling these. */ void -DrawCursor() +DrawCursor(void) { #ifdef SCREEN_VGA if (iflags.usevga) @@ -677,7 +756,7 @@ DrawCursor() } void -HideCursor() +HideCursor(void) { #ifdef SCREEN_VGA if (iflags.usevga) @@ -691,41 +770,40 @@ HideCursor() #endif /* SIMULATE_CURSOR */ -#ifdef TEXTCOLOR /* - * CLR_BLACK 0 - * CLR_RED 1 - * CLR_GREEN 2 - * CLR_BROWN 3 low-intensity yellow - * CLR_BLUE 4 - * CLR_MAGENTA 5 - * CLR_CYAN 6 - * CLR_GRAY 7 low-intensity white - * NO_COLOR 8 - * CLR_ORANGE 9 - * CLR_BRIGHT_GREEN 10 - * CLR_YELLOW 11 - * CLR_BRIGHT_BLUE 12 - * CLR_BRIGHT_MAGENTA 13 - * CLR_BRIGHT_CYAN 14 - * CLR_WHITE 15 - * CLR_MAX 16 - * BRIGHT 8 + * CLR_BLACK 0 + * CLR_RED 1 + * CLR_GREEN 2 + * CLR_BROWN 3 low-intensity yellow + * CLR_BLUE 4 + * CLR_MAGENTA 5 + * CLR_CYAN 6 + * CLR_GRAY 7 low-intensity white + * NO_COLOR 8 + * CLR_ORANGE 9 + * CLR_BRIGHT_GREEN 10 + * CLR_YELLOW 11 + * CLR_BRIGHT_BLUE 12 + * CLR_BRIGHT_MAGENTA 13 + * CLR_BRIGHT_CYAN 14 + * CLR_WHITE 15 + * CLR_MAX 16 + * BRIGHT 8 */ #ifdef VIDEOSHADES /* assign_videoshades() is prototyped in extern.h */ /* assign_videocolors() is prototyped in extern.h */ -/* assign_video() is prototyped in extern.h */ +/* assign_video() is prototyped in extern.h */ int shadeflag; /* shades are initialized */ int colorflag; /* colors are initialized */ -char *schoice[3] = { "dark", "normal", "light" }; -char *shade[3]; +const char *schoice[3] = { "dark", "normal", "light" }; +const char *shade[3]; #endif /* VIDEOSHADES */ -STATIC_OVL void -init_ttycolor() +static void +init_ttycolor(void) { #ifdef VIDEOSHADES if (!shadeflag) { @@ -763,7 +841,7 @@ init_ttycolor() #endif } -static int FDECL(convert_uchars, (char *, uchar *, int)); +static int convert_uchars(char *, uchar *, int); #ifdef VIDEOSHADES int assign_videoshades(char *choiceptr) @@ -776,11 +854,11 @@ assign_videoshades(char *choiceptr) cvalue[0] = choices; /* find the next ' ' or tab */ - cptr = index(cvalue[0], '-'); + cptr = strchr(cvalue[0], '-'); if (!cptr) - cptr = index(cvalue[0], ' '); + cptr = strchr(cvalue[0], ' '); if (!cptr) - cptr = index(cvalue[0], '\t'); + cptr = strchr(cvalue[0], '\t'); if (!cptr) return 0; *cptr = '\0'; @@ -790,11 +868,11 @@ assign_videoshades(char *choiceptr) } while (isspace(*cptr) || (*cptr == '-')); cvalue[1] = cptr; - cptr = index(cvalue[1], '-'); + cptr = strchr(cvalue[1], '-'); if (!cptr) - cptr = index(cvalue[0], ' '); + cptr = strchr(cvalue[0], ' '); if (!cptr) - cptr = index(cvalue[0], '\t'); + cptr = strchr(cvalue[0], '\t'); if (!cptr) return 0; *cptr = '\0'; @@ -842,8 +920,8 @@ assign_videoshades(char *choiceptr) /* * Process defaults.nh OPTIONS=videocolors:xxx * Left to right assignments for: - * red green brown blue magenta cyan orange br.green yellow - * br.blue br.mag br.cyan + * red green brown blue magenta cyan orange br.green yellow + * br.blue br.mag br.cyan * * Default Mapping (BIOS): 4-2-6-1-5-3-12-10-14-9-13-11 */ @@ -872,10 +950,9 @@ assign_videocolors(char *colorvals) } static int -convert_uchars(bufp, list, size) -char *bufp; /* current pointer */ -uchar *list; /* return list */ -int size; +convert_uchars(char *bufp, /* current pointer */ + uchar *list, /* return list */ + int size) { unsigned int num = 0; int count = 0; @@ -916,7 +993,6 @@ int size; } #endif /* VIDEOSHADES */ -#endif /* TEXTCOLOR */ /* * Process defaults.nh OPTIONS=video:xxxx @@ -924,18 +1000,17 @@ int size; * where (current) legitimate values are: * * autodetect (attempt to determine the adapter type) - * default (force use of the default video method for environment) - * vga (use vga adapter code) + * default (force use of the default video method for environment) + * vga (use vga adapter code) */ int -assign_video(sopt) -char *sopt; +assign_video(char *sopt) { /* * debug * - * printf("video is %s",sopt); - * getch(); + * printf("video is %s",sopt); + * getch(); */ iflags.grmode = 0; iflags.hasvesa = 0; @@ -978,7 +1053,7 @@ char *sopt; #endif /* * Auto-detect Priorities (arbitrary for now): - * VESA, VGA + * VESA, VGA */ if (iflags.hasvesa) iflags.usevesa = 1; else if (iflags.hasvga) { @@ -994,8 +1069,7 @@ char *sopt; } void -tileview(enable) -boolean enable; +tileview(boolean enable) { #ifdef SCREEN_VGA if (iflags.grmode && iflags.usevga) @@ -1011,8 +1085,7 @@ boolean enable; #else /* STUBVIDEO */ void -tileview(enable) -boolean enable; +tileview(boolean enable) { } #endif /* STUBVIDEO */ diff --git a/sys/msdos/vidtxt.c b/sys/msdos/vidtxt.c index 6dd23832b..f60b1c715 100644 --- a/sys/msdos/vidtxt.c +++ b/sys/msdos/vidtxt.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vidtxt.c $NHDT-Date: 1457207043 2016/03/05 19:44:03 $ $NHDT-Branch: chasonr $:$NHDT-Revision: 1.11 $ */ +/* NetHack 5.0 vidtxt.c $NHDT-Date: 1596498278 2020/08/03 23:44:38 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.12 $ */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ @@ -18,20 +18,19 @@ #include "wintty.h" #include -#include #if defined(_MSC_VER) #if _MSC_VER >= 700 #pragma warning(disable : 4018) /* signed/unsigned mismatch */ #pragma warning(disable : 4127) /* conditional expression is constant */ -#pragma warning(disable : 4131) /* old style declarator */ +/* #pragma warning(disable : 4131) */ /* old style declarator */ #pragma warning(disable : 4305) /* prevents complaints with MK_FP */ #pragma warning(disable : 4309) /* initializing */ #pragma warning(disable : 4759) /* prevents complaints with MK_FP */ #endif #endif -/* void FDECL(txt_xputc,(char, int)); */ /* write out character (and +/* void txt_xputc(char, int);*/ /* write out character (and attribute) */ extern int attrib_text_normal; /* text mode normal attribute */ @@ -39,8 +38,16 @@ extern int attrib_gr_normal; /* graphics mode normal attribute */ extern int attrib_text_intense; /* text mode intense attribute */ extern int attrib_gr_intense; /* graphics mode intense attribute */ +#if defined(SCREEN_BIOS) && !defined(PC9800) +static unsigned char cursor_info = 0, + cursor_start_scanline = 6, cursor_end_scanline = 7; + +static void get_cursinfo(unsigned char *start, unsigned char *end, + unsigned char *flg); +#endif + void -txt_get_scr_size() +txt_get_scr_size(void) { union REGS regs; @@ -81,6 +88,7 @@ txt_get_scr_size() LI = regs.h.dl + 1; CO = regs.h.ah; + #endif /* PC9800 */ } @@ -98,10 +106,10 @@ txt_get_scr_size() #include #endif -void FDECL(txt_gotoxy, (int, int)); +void txt_gotoxy(int, int); #if defined(SCREEN_BIOS) && !defined(PC9800) -void FDECL(txt_get_cursor, (int *, int *)); +void txt_get_cursor(int *, int *); #endif #ifdef SCREEN_DJGPPFAST @@ -112,7 +120,7 @@ extern int g_attribute; /* Current attribute to use */ extern int monoflag; /* 0 = not monochrome, else monochrome */ void -txt_backsp() +txt_backsp(void) { #ifdef PC9800 union REGS regs; @@ -134,7 +142,7 @@ txt_backsp() } void -txt_nhbell() +txt_nhbell(void) { union REGS regs; @@ -146,7 +154,7 @@ txt_nhbell() } void -txt_clear_screen() +txt_clear_screen(void) /* djgpp provides ScreenClear(), but in version 1.09 it is broken * so for now we just use the BIOS Routines */ @@ -178,8 +186,8 @@ txt_clear_screen() #endif } -void txt_cl_end(col, row) /* clear to end of line */ -int col, row; +/* clear to end of line */ +void txt_cl_end(int col, int row) { union REGS regs; #ifndef PC9800 @@ -213,7 +221,7 @@ int col, row; #endif } -void txt_cl_eos() /* clear to end of screen */ +void txt_cl_eos(void) /* clear to end of screen */ { union REGS regs; #ifndef PC9800 @@ -252,8 +260,7 @@ void txt_cl_eos() /* clear to end of screen */ } void -txt_startup(wid, hgt) -int *wid, *hgt; +txt_startup(int *wid, int *hgt) { txt_get_scr_size(); *wid = CO; @@ -262,6 +269,9 @@ int *wid, *hgt; attrib_gr_normal = attrib_text_normal; attrib_gr_intense = attrib_text_intense; g_attribute = attrib_text_normal; /* Give it a starting value */ + get_cursinfo(&cursor_start_scanline, + &cursor_end_scanline, + &cursor_info); } /* @@ -289,9 +299,7 @@ int *wid, *hgt; */ void -txt_xputs(s, col, row) -const char *s; -int col, row; +txt_xputs(const char *s, int col, int row) { char c; @@ -307,9 +315,8 @@ int col, row; } } -void txt_xputc(ch, attr) /* write out character (and attribute) */ -char ch; -int attr; +/* write out character (and attribute) */ +void txt_xputc(char ch, int attr) { #ifdef PC9800 union REGS regs; @@ -342,8 +349,8 @@ int attr; switch (ch) { case '\n': #if 0 - col = 0; - ++row; + col = 0; + ++row; #endif break; default: @@ -390,10 +397,11 @@ int attr; #if defined(SCREEN_BIOS) && !defined(PC9800) /* + * get cursor position + * * This is implemented as a macro under DJGPPFAST. */ -void txt_get_cursor(x, y) /* get cursor position */ -int *x, *y; +void txt_get_cursor(int *x, int *y) { union REGS regs; @@ -404,12 +412,66 @@ int *x, *y; (void) int86(VIDEO_BIOS, ®s, ®s); /* Get Cursor Position */ *x = regs.h.dl; *y = regs.h.dh; + if (!cursor_info) { + cursor_start_scanline = regs.h.ch; + cursor_end_scanline = regs.h.cl; + cursor_info = 1; + } +} + +void txt_hide_cursor(void) +{ + union REGS regs; + + regs.x.dx = 0; + regs.h.ah = SETCURTYP; /* set cursor type */ + regs.h.ch = 0x3F; /* starting scanline */ + regs.h.cl = 0; /* ending scanline */ + regs.x.bx = 0; + (void) int86(VIDEO_BIOS, ®s, ®s); +} + +void txt_show_cursor(void) +{ + union REGS regs; + + regs.x.dx = 0; + regs.h.ah = SETCURTYP; /* set cursor type */ + if (cursor_info) { + regs.h.ch = cursor_start_scanline; /* starting scanline */ + regs.h.cl = cursor_end_scanline; /* ending scanline */ + } else { + regs.h.ch = 6; /* starting scanline */ + regs.h.cl = 7; /* ending scanline */ + } + regs.x.bx = 0; + (void) int86(VIDEO_BIOS, ®s, ®s); +} + +static void +get_cursinfo(uchar *start, uchar *end, uchar *flg) +{ + union REGS regs; + + regs.x.dx = 0; + regs.h.ah = GETCURPOS; /* get cursor position */ + regs.x.cx = 0; + regs.x.bx = 0; + (void) int86(VIDEO_BIOS, ®s, ®s); /* Get Cursor Position */ + + if (regs.h.ch != 0x3f) { + *start = regs.h.ch; + *end = regs.h.cl; + } else { + *start = 6; + *end = 7; + } + *flg = 1; } #endif /* SCREEN_BIOS && !PC9800 */ void -txt_gotoxy(x, y) -int x, y; +txt_gotoxy(int x, int y) { #ifdef SCREEN_BIOS union REGS regs; @@ -445,7 +507,7 @@ int x, y; #ifdef MONO_CHECK int -txt_monoadapt_check() +txt_monoadapt_check(void) { union REGS regs; diff --git a/sys/msdos/vidvesa.c b/sys/msdos/vidvesa.c index e9b7bb183..8a3423bc0 100644 --- a/sys/msdos/vidvesa.c +++ b/sys/msdos/vidvesa.c @@ -16,53 +16,65 @@ #include "vesa.h" #include "wintty.h" #include "tileset.h" +#include "font.h" -#define BACKGROUND_VESA_COLOR 1 #define FIRST_TEXT_COLOR 240 -static unsigned long FDECL(vesa_SetWindow, (int window, unsigned long offset)); -static unsigned long FDECL(vesa_ReadPixel32, (unsigned x, unsigned y)); -static void FDECL(vesa_WritePixel32, (unsigned x, unsigned y, - unsigned long color)); -static void FDECL(vesa_WritePixel, (unsigned x, unsigned y, unsigned color)); -static unsigned long FDECL(vesa_MakeColor, (unsigned r, unsigned g, unsigned b)); -static void FDECL(vesa_GetRGB, ( - unsigned long color, - unsigned char *rp, unsigned char *gp, unsigned char *bp)); -static void FDECL(vesa_FillRect, ( - unsigned left, unsigned top, - unsigned width, unsigned height, - unsigned color)); - -static void NDECL(vesa_redrawmap); -static void FDECL(vesa_cliparound, (int, int)); -static void FDECL(decal_packed, (const struct TileImage *tile, unsigned special)); -static void FDECL(vesa_SwitchMode, (unsigned mode)); -static boolean FDECL(vesa_SetPalette, (const struct Pixel *)); -static boolean FDECL(vesa_SetHardPalette, (const struct Pixel *)); -static boolean FDECL(vesa_SetSoftPalette, (const struct Pixel *)); -static void FDECL(vesa_DisplayCell, (const struct TileImage *tile, int, int)); -static void FDECL(vesa_DisplayCellInMemory, (const struct TileImage *tile, - int, char buf[TILE_Y][640*2])); -static unsigned FDECL(vesa_FindMode, (unsigned long mode_addr, unsigned bits)); -static void FDECL(vesa_WriteChar, (int, int, int, int, BOOLEAN_P)); -static void FDECL(vesa_WriteCharInMemory, (int, int, char buf[TILE_Y][640*2], - int)); -static void FDECL(vesa_WriteStr, (const char *, int, int, int, int)); -static char __far *NDECL(vesa_FontPtrs); +extern int total_tiles_used, Tile_corr, Tile_unexplored; /* from tile.c */ +struct VesaCharacter { + uint32 colour, bgcolour; + uint32 chr; + char inverse; +}; + +static unsigned long vesa_SetWindow(int window, unsigned long offset); +static unsigned long vesa_ReadPixel32(unsigned x, unsigned y); +static void vesa_WritePixel32(unsigned x, unsigned y, unsigned long color); +static void vesa_WritePixel(unsigned x, unsigned y, unsigned color); +static void vesa_WritePixelRow(unsigned long offset, + unsigned char const *p_row, unsigned p_row_size); +static unsigned long vesa_MakeColor(struct Pixel); +static void vesa_FillRect(unsigned left, unsigned top, unsigned width, + unsigned height, unsigned color); + +static void vesa_redrawmap(void); +static void vesa_cliparound(int, int); +#if 0 +static void decal_packed(const struct TileImage *tile, unsigned special); +#endif +static void vesa_SwitchMode(unsigned mode); +static void vesa_SetViewPort(void); +static boolean vesa_SetPalette(const struct Pixel *); +static boolean vesa_SetHardPalette(const struct Pixel *); +static boolean vesa_SetSoftPalette(const struct Pixel *); +static void vesa_DisplayCell(int, int, int); +static unsigned vesa_FindMode(unsigned long mode_addr, unsigned bits); +static void vesa_WriteChar(uint32, int, int, uint32); +static void vesa_WriteCharXY(uint32, int, int, uint32); +static void vesa_WriteCharTransparent(int, int, int, int); +static void vesa_WriteTextRow(int pixx, int pixy, + struct VesaCharacter const *t_row, unsigned t_row_width); +static boolean vesa_GetCharPixel(int, unsigned, unsigned); +static unsigned char vesa_GetCharPixelRow(uint32, unsigned, unsigned); +static unsigned long vesa_DoublePixels(unsigned long); +static unsigned long vesa_TriplePixels(unsigned long); +static void vesa_WriteStr(const char *, int, int, int, int); +static unsigned char __far *vesa_FontPtrs(void); +/* static void vesa_process_tile(struct TileImage *tile); */ #ifdef POSITIONBAR -static void NDECL(positionbar); +static void positionbar(void); #endif extern int clipx, clipxmax; /* current clipping column from wintty.c */ +extern int clipy, clipymax; /* current clipping row from wintty.c */ extern int curcol, currow; /* current column and row */ extern int g_attribute; +extern int inversed; extern int attrib_text_normal; /* text mode normal attribute */ extern int attrib_gr_normal; /* graphics mode normal attribute */ extern int attrib_gr_intense; /* graphics mode intense attribute */ extern boolean inmap; /* in the map window */ -extern boolean restoring; /* * Global Variables @@ -72,43 +84,50 @@ static unsigned char __far *font; static struct map_struct { int glyph; - int ch; - int attr; + uint32 ch; + uint32 attr; unsigned special; + short int tileidx; + int framecolor; + int inverse; } map[ROWNO][COLNO]; /* track the glyphs */ -#define vesa_clearmap() \ - { \ - int x, y; \ - for (y = 0; y < ROWNO; ++y) \ - for (x = 0; x < COLNO; ++x) { \ - map[y][x].glyph = cmap_to_glyph(S_stone); \ - map[y][x].ch = S_stone; \ - map[y][x].attr = 0; \ - map[y][x].special = 0; \ - } \ +#define vesa_clearmap() \ + { \ + int x, y; \ + for (y = 0; y < ROWNO; ++y) \ + for (x = 0; x < COLNO; ++x) { \ + map[y][x].glyph = GLYPH_UNEXPLORED; \ + map[y][x].ch = glyph2ttychar(GLYPH_UNEXPLORED); \ + map[y][x].framecolor = NO_COLOR; \ + map[y][x].attr = 0; \ + map[y][x].special = 0; \ + map[y][x].tileidx = Tile_unexplored; \ + map[y][x].inverse = 0; \ + } \ } #define TOP_MAP_ROW 1 -static int viewport_size = 40; +static int viewport_cols = 40; +static int viewport_rows = ROWNO; static const struct Pixel defpalette[] = { /* Colors for text and the position bar */ - { 0x18, 0x18, 0x18, 0xff }, /* CLR_BLACK */ - { 0xaa, 0x00, 0x00, 0xff }, /* CLR_RED */ - { 0x00, 0xaa, 0x00, 0xff }, /* CLR_GREEN */ - { 0x99, 0x40, 0x00, 0xff }, /* CLR_BROWN */ - { 0x00, 0x00, 0xaa, 0xff }, /* CLR_BLUE */ - { 0xaa, 0x00, 0xaa, 0xff }, /* CLR_MAGENTA */ - { 0x00, 0xaa, 0xaa, 0xff }, /* CLR_CYAN */ - { 0xaa, 0xaa, 0xaa, 0xff }, /* CLR_GRAY */ - { 0x55, 0x55, 0x55, 0xff }, /* NO_COLOR */ - { 0xff, 0x90, 0x00, 0xff }, /* CLR_ORANGE */ - { 0x00, 0xff, 0x00, 0xff }, /* CLR_BRIGHT_GREEN */ - { 0xff, 0xff, 0x00, 0xff }, /* CLR_YELLOW */ - { 0x00, 0x00, 0xff, 0xff }, /* CLR_BRIGHT_BLUE */ - { 0xff, 0x00, 0xff, 0xff }, /* CLR_BRIGHT_MAGENTA */ - { 0x00, 0xff, 0xff, 0xff }, /* CLR_BRIGHT_CYAN */ - { 0xff, 0xff, 0xff, 0xff } /* CLR_WHITE */ + { 0x00, 0x00, 0x00, 0xff }, /* CLR_BLACK */ + { 0xaa, 0x00, 0x00, 0xff }, /* CLR_RED */ + { 0x00, 0xaa, 0x00, 0xff }, /* CLR_GREEN */ + { 0x99, 0x40, 0x00, 0xff }, /* CLR_BROWN */ + { 0x00, 0x00, 0xaa, 0xff }, /* CLR_BLUE */ + { 0xaa, 0x00, 0xaa, 0xff }, /* CLR_MAGENTA */ + { 0x00, 0xaa, 0xaa, 0xff }, /* CLR_CYAN */ + { 0xaa, 0xaa, 0xaa, 0xff }, /* CLR_GRAY */ + { 0x55, 0x55, 0x55, 0xff }, /* NO_COLOR */ + { 0xff, 0x90, 0x00, 0xff }, /* CLR_ORANGE */ + { 0x00, 0xff, 0x00, 0xff }, /* CLR_BRIGHT_GREEN */ + { 0xff, 0xff, 0x00, 0xff }, /* CLR_YELLOW */ + { 0x00, 0x00, 0xff, 0xff }, /* CLR_BRIGHT_BLUE */ + { 0xff, 0x00, 0xff, 0xff }, /* CLR_BRIGHT_MAGENTA */ + { 0x00, 0xff, 0xff, 0xff }, /* CLR_BRIGHT_CYAN */ + { 0xff, 0xff, 0xff, 0xff } /* CLR_WHITE */ }; /* Information about the selected VESA mode */ @@ -120,19 +139,35 @@ static unsigned short vesa_y_center; /* Y centering offset */ static unsigned short vesa_scan_line; /* Bytes per scan line */ static int vesa_read_win; /* Select the read window */ static int vesa_write_win; /* Select the write window */ +static unsigned long vesa_win_func; static unsigned long vesa_win_pos[2]; /* Window position */ static unsigned long vesa_win_addr[2]; /* Window physical address */ +static unsigned long vesa_segment; /* Selector of linear frame buffer */ static unsigned long vesa_win_size; /* Window size */ static unsigned long vesa_win_gran; /* Window granularity */ static unsigned char vesa_pixel_size; static unsigned char vesa_pixel_bytes; static unsigned char vesa_red_pos; -static unsigned char vesa_red_size; +static unsigned char vesa_red_shift; static unsigned char vesa_green_pos; -static unsigned char vesa_green_size; +static unsigned char vesa_green_shift; static unsigned char vesa_blue_pos; -static unsigned char vesa_blue_size; +static unsigned char vesa_blue_shift; static unsigned long vesa_palette[256]; +static unsigned vesa_char_width = 8, vesa_char_height = 16; +static unsigned vesa_oview_width, vesa_oview_height; +static unsigned char **vesa_tiles; +static unsigned char **vesa_oview_tiles; +static struct BitmapFont *vesa_font; + +#ifdef SIMULATE_CURSOR +static unsigned long *undercursor; +#endif + +/* Used to cache character writes for speed */ +static struct VesaCharacter chr_cache[100]; +static unsigned chr_cache_size; +static unsigned chr_cache_pixx, chr_cache_pixy, chr_cache_lastx; struct OldModeInfo { unsigned mode; @@ -164,9 +199,7 @@ static const struct OldModeInfo old_mode_table[] = { /* Retrieve the mode info block */ static boolean -vesa_GetModeInfo(mode, info) -unsigned mode; -struct ModeInfoBlock *info; +vesa_GetModeInfo(unsigned mode, struct ModeInfoBlock *info) { int mode_info_sel = -1; /* custodial */ int mode_info_seg; @@ -221,11 +254,23 @@ struct ModeInfoBlock *info; return FALSE; } +static unsigned +vesa_map_frame_buffer(unsigned phys_addr, unsigned size) +{ + __dpmi_meminfo info; + int rc; + + info.handle = 0; + info.address = phys_addr; + info.size = size; + rc = __dpmi_physical_address_mapping(&info); + + return rc == 0 ? info.address : 0; +} + /* Set the memory window and return the offset */ static unsigned long -vesa_SetWindow(window, offset) -int window; -unsigned long offset; +vesa_SetWindow(int window, unsigned long offset) { /* If the desired offset is already within the window, leave the window as it is and return the address based on the current window position. @@ -245,7 +290,14 @@ unsigned long offset; regs.h.bl = window; regs.x.dx = offset / vesa_win_gran; pos = regs.x.dx * vesa_win_gran; - (void) __dpmi_int(VIDEO_BIOS, ®s); + + if (vesa_win_func != 0) { + regs.x.cs = vesa_win_func >> 16; + regs.x.ip = vesa_win_func & 0xFFFF; + (void) __dpmi_simulate_real_mode_procedure_retf(®s); + } else { + (void) __dpmi_int(VIDEO_BIOS, ®s); + } vesa_win_pos[window] = pos; } @@ -261,82 +313,144 @@ unsigned long offset; } static unsigned long -vesa_ReadPixel32(x, y) -unsigned x, y; +vesa_ReadPixel32(unsigned x, unsigned y) { unsigned long offset = y * vesa_scan_line + x * vesa_pixel_bytes; unsigned long addr, color; unsigned i; - switch (vesa_pixel_size) { - case 8: - addr = vesa_SetWindow(vesa_read_win, offset); - color = _farpeekb(_dos_ds, addr); - break; + if (vesa_segment != 0) { + /* Linear frame buffer in use */ + switch (vesa_pixel_size) { + case 8: + color = _farpeekb(vesa_segment, offset); + break; - case 15: - case 16: - addr = vesa_SetWindow(vesa_read_win, offset); - color = _farpeekw(_dos_ds, addr); - break; + case 15: + case 16: + color = _farpeekw(vesa_segment, offset); + break; - case 24: - /* Pixel may cross a window boundary */ - color = 0; - for (i = 0; i < 3; ++i) { - addr = vesa_SetWindow(vesa_read_win, offset + i); - color |= (unsigned long) _farpeekb(_dos_ds, addr) << (i * 8); + case 24: + /* Don't cross a 4 byte boundary if it can be avoided */ + if (offset & 1) { + color = _farpeekl(vesa_segment, offset - 1) >> 8; + } else { + color = _farpeekl(vesa_segment, offset) & 0xFFFFFFFF; + } + break; + + case 32: + color = _farpeekl(vesa_segment, offset); + break; + + default: /* Shouldn't happen */ + color = 0; + break; } - break; + } else { + switch (vesa_pixel_size) { + case 8: + addr = vesa_SetWindow(vesa_read_win, offset); + color = _farpeekb(_dos_ds, addr); + break; - case 32: - addr = vesa_SetWindow(vesa_read_win, offset); - color = _farpeekl(_dos_ds, addr); - break; + case 15: + case 16: + addr = vesa_SetWindow(vesa_read_win, offset); + color = _farpeekw(_dos_ds, addr); + break; + + case 24: + /* Pixel may cross a window boundary */ + color = 0; + for (i = 0; i < 3; ++i) { + addr = vesa_SetWindow(vesa_read_win, offset + i); + color |= (unsigned long) _farpeekb(_dos_ds, addr) << (i * 8); + } + break; + + case 32: + addr = vesa_SetWindow(vesa_read_win, offset); + color = _farpeekl(_dos_ds, addr); + break; + + default: /* Shouldn't happen */ + color = 0; + break; + } } return color; } static void -vesa_WritePixel32(x, y, color) -unsigned x, y; -unsigned long color; +vesa_WritePixel32(unsigned x, unsigned y, unsigned long color) { unsigned long offset = y * vesa_scan_line + x * vesa_pixel_bytes; unsigned long addr; unsigned i; - switch (vesa_pixel_size) { - case 8: - addr = vesa_SetWindow(vesa_write_win, offset); - _farpokeb(_dos_ds, addr, color); - break; + if (vesa_segment != 0) { + /* Linear frame buffer in use */ + switch (vesa_pixel_size) { + case 8: + _farpokeb(vesa_segment, offset, color); + break; - case 15: - case 16: - addr = vesa_SetWindow(vesa_write_win, offset); - _farpokew(_dos_ds, addr, color); - break; + case 15: + case 16: + _farpokew(vesa_segment, offset, color); + break; + + case 24: + if (offset & 1) { + _farpokeb(vesa_segment, offset + 0, color & 0xFF); + _farpokew(vesa_segment, offset + 1, color >> 8); + } else { + _farpokew(vesa_segment, offset + 0, color & 0xFFFF); + _farpokeb(vesa_segment, offset + 2, color >> 16); + } + break; + + case 32: + _farpokel(vesa_segment, offset, color); + break; - case 24: - /* Pixel may cross a window boundary */ - for (i = 0; i < 3; ++i) { - addr = vesa_SetWindow(vesa_read_win, offset + i); - _farpokeb(_dos_ds, addr, (unsigned char) (color >> (i * 8))); + default: /* Shouldn't happen */ + color = 0; + break; } - break; + } else { + switch (vesa_pixel_size) { + case 8: + addr = vesa_SetWindow(vesa_write_win, offset); + _farpokeb(_dos_ds, addr, color); + break; - case 32: - addr = vesa_SetWindow(vesa_write_win, offset); - _farpokel(_dos_ds, addr, color); - break; + case 15: + case 16: + addr = vesa_SetWindow(vesa_write_win, offset); + _farpokew(_dos_ds, addr, color); + break; + + case 24: + /* Pixel may cross a window boundary */ + for (i = 0; i < 3; ++i) { + addr = vesa_SetWindow(vesa_write_win, offset + i); + _farpokeb(_dos_ds, addr, (unsigned char) (color >> (i * 8))); + } + break; + + case 32: + addr = vesa_SetWindow(vesa_write_win, offset); + _farpokel(_dos_ds, addr, color); + break; + } } } static void -vesa_WritePixel(x, y, color) -unsigned x, y; -unsigned color; +vesa_WritePixel(unsigned x, unsigned y, unsigned color) { if (vesa_pixel_size == 8) { vesa_WritePixel32(x, y, color); @@ -345,58 +459,94 @@ unsigned color; } } -static unsigned long -vesa_MakeColor(r, g, b) -unsigned r, g, b; +static void +vesa_WritePixelRow(unsigned long offset, + unsigned char const *p_row, unsigned p_row_size) { - r = (r & 0xFF) >> (8 - vesa_red_size); - g = (g & 0xFF) >> (8 - vesa_green_size); - b = (b & 0xFF) >> (8 - vesa_blue_size); - return ((unsigned long) r << vesa_red_pos) - | ((unsigned long) g << vesa_green_pos) - | ((unsigned long) b << vesa_blue_pos); + if (vesa_segment != 0) { + /* Linear frame buffer in use */ + movedata(_go32_my_ds(), (unsigned)p_row, vesa_segment, offset, p_row_size); + } else { + /* Windowed frame buffer in use */ + unsigned long addr = vesa_SetWindow(vesa_write_win, offset); + unsigned i = 0; + while (offset + p_row_size > vesa_win_pos[vesa_write_win] + vesa_win_size) { + /* The row passes the end of the current window. Write what we can, + * and advance the window */ + unsigned w = (vesa_win_pos[vesa_write_win] + vesa_win_size) + - (offset + i); + dosmemput(p_row + i, w, addr); + i += w; + addr = vesa_SetWindow(vesa_write_win, offset + i); + } + dosmemput(p_row + i, p_row_size - i, addr); + } } -static void -vesa_GetRGB(color, rp, gp, bp) -unsigned long color; -unsigned char *rp, *gp, *bp; +static unsigned long +vesa_MakeColor(struct Pixel p) { - unsigned r, g, b; - - r = color >> vesa_red_pos; - g = color >> vesa_green_pos; - b = color >> vesa_blue_pos; - r <<= 8 - vesa_red_size; - g <<= 8 - vesa_green_size; - b <<= 8 - vesa_blue_size; - *rp = (unsigned char) r; - *gp = (unsigned char) g; - *bp = (unsigned char) b; + unsigned long r = p.r >> vesa_red_shift; + unsigned long g = p.g >> vesa_green_shift; + unsigned long b = p.b >> vesa_blue_shift; + return (r << vesa_red_pos) + | (g << vesa_green_pos) + | (b << vesa_blue_pos); } static void -vesa_FillRect(left, top, width, height, color) -unsigned left, top, width, height, color; +vesa_FillRect(unsigned left, unsigned top, unsigned width, + unsigned height, unsigned color) { + unsigned p_row_size = width * vesa_pixel_bytes; + unsigned char *p_row = (unsigned char *) alloc(p_row_size); + unsigned long c32 = vesa_palette[color & 0xFF]; + unsigned long offset = top * (unsigned long)vesa_scan_line + left * vesa_pixel_bytes; unsigned x, y; - for (y = 0; y < height; ++y) { + switch (vesa_pixel_bytes) { + case 1: + memset(p_row, color, p_row_size); + break; + + case 2: for (x = 0; x < width; ++x) { - vesa_WritePixel(left + x, top + y, color); + ((uint16_t *)p_row)[x] = c32; } + break; + + case 3: + for (x = 0; x < width; ++x) { + p_row[3*x + 0] = c32 & 0xFF; + p_row[3*x + 1] = (c32 >> 8) & 0xFF; + p_row[3*x + 2] = c32 >> 16 ; + } + break; + + case 4: + for (x = 0; x < width; ++x) { + ((uint32_t *)p_row)[x] = c32; + } + break; } + + for (y = 0; y < height; ++y) { + vesa_WritePixelRow(offset, p_row, p_row_size); + offset += vesa_scan_line; + } + + free(p_row); } void -vesa_get_scr_size() +vesa_get_scr_size(void) { - CO = 80; - LI = 29; + CO = vesa_x_res / vesa_char_width; + LI = vesa_y_res / vesa_char_height - 1; } void -vesa_backsp() +vesa_backsp(void) { int col, row; @@ -409,8 +559,7 @@ vesa_backsp() } void -vesa_clear_screen(colour) -int colour; +vesa_clear_screen(int colour) { vesa_FillRect(0, 0, vesa_x_res, vesa_y_res, colour); if (iflags.tile_view) @@ -420,45 +569,41 @@ int colour; /* clear to end of line */ void -vesa_cl_end(col, row) -int col, row; +vesa_cl_end(int col, int row) { - unsigned left = vesa_x_center + col * 8; - unsigned top = vesa_y_center + row * 16; - unsigned width = (CO - 1 - col) * 8; - unsigned height = 16; + unsigned left = vesa_x_center + col * vesa_char_width; + unsigned top = vesa_y_center + row * vesa_char_height; + unsigned width = (CO - 1 - col) * vesa_char_width; + unsigned height = vesa_char_height; + vesa_flush_text(); vesa_FillRect(left, top, width, height, BACKGROUND_VESA_COLOR); } /* clear to end of screen */ void -vesa_cl_eos(cy) -int cy; +vesa_cl_eos(int cy) { - int count; - cl_end(); if (cy < LI - 1) { - unsigned left = vesa_x_center; - unsigned top = vesa_y_center + cy * 16; - unsigned width = 640; - unsigned height = (LI - 1 - cy) * 16; + unsigned left = 0; + unsigned top = vesa_y_center + cy * vesa_char_height; + unsigned width = vesa_x_res; + unsigned height = (LI - 1 - cy) * vesa_char_height; vesa_FillRect(left, top, width, height, BACKGROUND_VESA_COLOR); } } void -vesa_tty_end_screen() +vesa_term_end_screen(void) { vesa_clear_screen(BACKGROUND_VESA_COLOR); vesa_SwitchMode(MODETEXT); } void -vesa_tty_startup(wid, hgt) -int *wid, *hgt; +vesa_term_startup(int *wid, int *hgt) { /* code to sense display adapter is required here - MJA */ @@ -495,9 +640,7 @@ int *wid, *hgt; */ void -vesa_xputs(s, col, row) -const char *s; -int col, row; +vesa_xputs(const char *s, int col, int row) { if (s != NULL) { vesa_WriteStr(s, strlen(s), col, row, g_attribute); @@ -506,9 +649,7 @@ int col, row; /* write out character (and attribute) */ void -vesa_xputc(ch, attr) -char ch; -int attr; +vesa_xputc(char ch, int attr) { int col, row; @@ -521,7 +662,10 @@ int attr; ++row; break; default: - vesa_WriteChar((unsigned char) ch, col, row, attr, FALSE); + vesa_WriteChar((unsigned char) ch, col, row, attr); + if (ch == '.') { + vesa_flush_text(); + } if (col < (CO - 1)) ++col; break; @@ -529,20 +673,28 @@ int attr; vesa_gotoloc(col, row); } -#if defined(USE_TILES) +#if defined(TILES_IN_GLYPHMAP) /* Place tile represent. a glyph at current location */ void -vesa_xputg(glyphnum, ch, - special) -int glyphnum; -int ch; -unsigned special; /* special feature: corpse, invis, detected, pet, ridden - - hack.h */ +vesa_xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo UNUSED) { + int glyphnum = glyphinfo->glyph; + uint32 ch = (uchar) glyphinfo->ttychar; + unsigned special = glyphinfo->gm.glyphflags; int col, row; - int attr; + uint32_t attr = (g_attribute == 0) ? attrib_gr_normal : g_attribute; int ry; - const struct TileImage *packcell; + +#ifdef ENHANCED_SYMBOLS + if (SYMHANDLING(H_UTF8) && glyphinfo->gm.u && glyphinfo->gm.u->utf8str) { + ch = glyphinfo->gm.u->utf32ch; + } +#endif + if (vesa_pixel_size > 8 && glyphinfo->gm.customcolor != 0) { + /* FIXME: won't display black (0,0,0) correctly, but the background + is usually black anyway */ + attr = glyphinfo->gm.customcolor | 0x80000000; + } row = currow; col = curcol; @@ -553,23 +705,41 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - map[ry][col].glyph = glyphnum; map[ry][col].ch = ch; map[ry][col].special = special; - attr = (g_attribute == 0) ? attrib_gr_normal : g_attribute; + map[ry][col].tileidx = glyphinfo->gm.tileidx; map[ry][col].attr = attr; + map[ry][col].inverse = inversed; + + if (bkglyphinfo->framecolor != NO_COLOR) { + map[ry][col].framecolor = bkglyphinfo->framecolor; + } + if (iflags.traditional_view) { - vesa_WriteChar((unsigned char) ch, col, row, attr, FALSE); + vesa_WriteChar(ch, col, row, attr); } else { - if ((col >= clipx) && (col <= clipxmax)) { - packcell = get_tile(glyph2tile[glyphnum]); + if ((col >= clipx) && (col <= clipxmax) + && (ry >= clipy) && (ry <= clipymax)) { +#if 0 if (!iflags.over_view && map[ry][col].special) decal_packed(packcell, special); - vesa_DisplayCell(packcell, col - clipx, row); +#endif + vesa_DisplayCell(glyphinfo->gm.tileidx, col - clipx, ry - clipy); + if (bkglyphinfo->framecolor != NO_COLOR) { + int curtypbak = cursor_type; + int cclr = cursor_color; + + cursor_type = CURSOR_FRAME; + cursor_color = bkglyphinfo->framecolor; + vesa_DrawCursor(); + cursor_type = curtypbak; + cursor_color = cclr; + } } } if (col < (CO - 1)) ++col; vesa_gotoloc(col, row); } -#endif /* USE_TILES */ +#endif /* TILES_IN_GLYPHMAP */ /* * Cursor location manipulation, and location information fetching @@ -577,164 +747,279 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - * These include: * * vesa_gotoloc(x,y) - Moves the "cursor" on screen to the specified x - * and y character cell location. This routine + * and y character cell location. This routine * determines the location where screen writes * will occur next, it does not change the location * of the player on the NetHack level. */ void -vesa_gotoloc(col, row) -int col, row; +vesa_gotoloc(int col, int row) { curcol = min(col, CO - 1); /* protection from callers */ currow = min(row, LI - 1); } -#if defined(USE_TILES) && defined(CLIPPING) +#if defined(TILES_IN_GLYPHMAP) && defined(CLIPPING) static void -vesa_cliparound(x, y) -int x, y; +vesa_cliparound(int x, int y) { - int oldx = clipx; + int oldx = clipx, oldy = clipy; if (!iflags.tile_view || iflags.over_view || iflags.traditional_view) return; - if (x < clipx + 5) { - clipx = max(0, x - (viewport_size / 2)); - clipxmax = clipx + (viewport_size - 1); - } else if (x > clipxmax - 5) { - clipxmax = min(COLNO - 1, x + (viewport_size / 2)); - clipx = clipxmax - (viewport_size - 1); + if (viewport_cols < COLNO) { + if (x < clipx + 5) { + clipx = max(0, x - (viewport_cols / 2)); + clipxmax = clipx + (viewport_cols - 1); + } else if (x > clipxmax - 5) { + clipxmax = min(COLNO - 1, x + (viewport_cols / 2)); + clipx = clipxmax - (viewport_cols - 1); + } + } else { + clipx = 0; + clipxmax = COLNO - 1; } - if (clipx != oldx) { - if (on_level(&u.uz0, &u.uz) && !restoring) + if (viewport_rows < ROWNO) { + if (y < clipy + 5) { + clipy = max(0, y - (viewport_rows / 2)); + clipymax = clipy + (viewport_rows - 1); + } else if (y > clipymax - 5) { + clipymax = min(ROWNO, y + (viewport_rows / 2)); + clipy = clipymax - (viewport_rows - 1); + } + } else { + clipy = 0; + clipymax = ROWNO - 1; + } + if (clipx != oldx || clipy != oldy) { + if (on_level(&u.uz0, &u.uz) && !program_state.restoring) /* (void) doredraw(); */ vesa_redrawmap(); } } static void -vesa_redrawmap() +vesa_redrawmap(void) { - int x, y, t; - const struct TileImage *packcell; - - /* y here is in screen rows*/ - /* Build each row in local memory, then write, to minimize use of the - window switch function */ - for (y = 0; y < ROWNO; ++y) { - char buf[TILE_Y][640*2]; - - for (x = clipx; x <= clipxmax; ++x) { - if (iflags.traditional_view) { - vesa_WriteCharInMemory((unsigned char) map[y][x].ch, x, - buf, map[y][x].attr); - } else { - t = map[y][x].glyph; - packcell = get_tile(glyph2tile[t]); - if (!iflags.over_view && map[y][x].special) - decal_packed(packcell, map[y][x].special); - vesa_DisplayCellInMemory(packcell, x - clipx, buf); + unsigned y_top = TOP_MAP_ROW * vesa_char_height; + unsigned y_bottom = vesa_y_res - 5 * vesa_char_height; + unsigned x, y, cx, cy, py /*, px */ ; + /* unsigned long color; */ + unsigned long offset = y_top * (unsigned long) vesa_scan_line; + unsigned char *p_row = NULL; + unsigned p_row_width; + + /* + * The map is drawn in pixel-row order (pixel row 0, then row 1, etc.), + * rather than cell by cell, to minimize calls to vesa_SetWindow. + */ + if (iflags.traditional_view) { + /* Text mode */ + y = y_top; + for (cy = clipy; cy <= (unsigned) clipymax && cy < ROWNO; ++cy) { + struct VesaCharacter t_row[COLNO]; + for (cx = clipx; cx <= (unsigned) clipxmax && cx < COLNO; ++cx) { + t_row[cx].chr = map[cy][cx].ch; + t_row[cx].colour = map[cy][cx].attr; + t_row[cx].bgcolour = BACKGROUND_VESA_COLOR; + t_row[cx].inverse = map[cy][cx].inverse; + } + vesa_WriteTextRow(0, y, t_row + clipx, cx - clipx); + x = (cx - clipx) * vesa_char_width; + if (x < vesa_x_res) { + vesa_FillRect(x, y, vesa_x_res - x, vesa_char_height, BACKGROUND_VESA_COLOR); } + y += vesa_char_height; } - if (iflags.over_view && vesa_pixel_size != 8) { - for (t = 0; t < TILE_Y; ++t) { - for (x = 0; x < 640; ++x) { - unsigned long c1 = vesa_palette[buf[t][x * 2 + 0]]; - unsigned long c2 = vesa_palette[buf[t][x * 2 + 1]]; - unsigned char r1, r2, g1, g2, b1, b2; - - vesa_GetRGB(c1, &r1, &g1, &b1); - vesa_GetRGB(c2, &r2, &g2, &b2); - r1 = (r1 + r2) / 2; - g1 = (g1 + g2) / 2; - b1 = (b1 + b2) / 2; - vesa_WritePixel32(x, (y + TOP_MAP_ROW) * TILE_Y + t, - vesa_MakeColor(r1, g1, b1)); + } else if (iflags.over_view) { + /* Overview mode */ + const unsigned char *tile; + + p_row_width = vesa_oview_width * vesa_pixel_bytes; + y = y_top; + for (cy = 0; cy < ROWNO; ++cy) { + for (py = 0; py < vesa_oview_height; ++py) { + for (cx = 0; cx < COLNO; ++cx) { + tile = vesa_oview_tiles[map[cy][cx].tileidx]; + vesa_WritePixelRow(offset + p_row_width * cx, tile + p_row_width * py, p_row_width); } + x = COLNO * vesa_oview_width; + if (x < vesa_x_res) { + vesa_FillRect(x, y, vesa_x_res - x, 1, BACKGROUND_VESA_COLOR); + } + offset += vesa_scan_line; + ++y; } - } else { - for (t = 0; t < TILE_Y; ++t) { - for (x = 0; x < 640; ++x) { - vesa_WritePixel(x, (y + TOP_MAP_ROW) * TILE_Y + t, buf[t][x]); + } + } else { + /* Normal tiled mode */ + const unsigned char *tile; + + p_row_width = iflags.wc_tile_width * vesa_pixel_bytes; + y = y_top; + for (cy = clipy; cy <= (unsigned) clipymax && cy < ROWNO; ++cy) { + for (py = 0; py < (unsigned) iflags.wc_tile_height; ++py) { + for (cx = clipx; cx <= (unsigned) clipxmax && cx < COLNO; ++cx) { + tile = vesa_tiles[map[cy][cx].tileidx]; + vesa_WritePixelRow(offset + p_row_width * (cx - clipx), tile + p_row_width * py, p_row_width); + } + x = (cx - clipx) * iflags.wc_tile_width; + if (x < vesa_x_res) { + vesa_FillRect(x, y, vesa_x_res - x, 1, BACKGROUND_VESA_COLOR); } + offset += vesa_scan_line; + ++y; } } } + /* Loops leave y as the start of any remaining unfilled space */ + if (y < y_bottom) { + vesa_FillRect(0, y, vesa_x_res, y_bottom - y, BACKGROUND_VESA_COLOR); + } + + free(p_row); } -#endif /* USE_TILES && CLIPPING */ +#endif /* TILES_IN_GLYPHMAP && CLIPPING */ + void -vesa_userpan(left) -boolean left; +vesa_userpan(enum vga_pan_direction pan) { - int x; - - /* pline("Into userpan"); */ + /* pline("Into userpan"); */ if (iflags.over_view || iflags.traditional_view) return; - if (left) - x = min(COLNO - 1, clipxmax + 10); - else - x = max(0, clipx - 10); - vesa_cliparound(x, 10); /* y value is irrelevant on VGA clipping */ - positionbar(); - vesa_DrawCursor(); + + switch (pan) { + case pan_left: + if (viewport_cols < COLNO) { + clipxmax = clipx - 1; + clipx = clipxmax - (viewport_cols - 1); + if (clipx < 0) { + clipx = 0; + clipxmax = viewport_cols - 1; + } + } + break; + + case pan_right: + if (viewport_cols < COLNO) { + clipx = clipxmax + 1; + clipxmax = clipx + (viewport_cols - 1); + if (clipxmax > COLNO - 1) { + clipxmax = COLNO - 1; + clipx = clipxmax - (viewport_cols - 1); + } + } + break; + + case pan_up: + if (viewport_rows < ROWNO) { + clipymax = clipy - 1; + clipy = clipymax - (viewport_rows - 1); + if (clipy < 0) { + clipy = 0; + clipymax = viewport_rows - 1; + } + } + break; + + case pan_down: + if (viewport_rows < ROWNO) { + clipy = clipymax + 1; + clipymax = clipy + (viewport_rows - 1); + if (clipymax > ROWNO - 1) { + clipymax = ROWNO - 1; + clipy = clipymax - (viewport_rows - 1); + } + } + break; + } + + vesa_refresh(); } void -vesa_overview(on) -boolean on; +vesa_overview(boolean on) { - /* vesa_HideCursor(); */ + /* vesa_HideCursor(); */ if (on) { iflags.over_view = TRUE; clipx = 0; - clipxmax = CO - 1; + clipxmax = COLNO - 1; + clipy = 0; + clipymax = ROWNO - 1; } else { iflags.over_view = FALSE; - clipx = max(0, (curcol - viewport_size / 2)); - if (clipx > ((CO - 1) - viewport_size)) - clipx = (CO - 1) - viewport_size; - clipxmax = clipx + (viewport_size - 1); + if (viewport_cols < COLNO) { + clipx = max(0, (curcol - viewport_cols / 2)); + if (clipx > ((COLNO - 1) - viewport_cols)) + clipx = (COLNO - 1) - viewport_cols; + clipxmax = clipx + (viewport_cols - 1); + } else { + clipx = 0; + clipxmax = COLNO - 1; + } + if (viewport_rows < ROWNO) { + clipy = max(0, (currow - viewport_rows / 2)); + if (clipy > ((ROWNO - 1) - viewport_rows)) + clipy = (ROWNO - 1) - viewport_rows; + clipymax = clipy + (viewport_rows - 1); + } else { + clipy = 0; + clipymax = ROWNO - 1; + } } } void -vesa_traditional(on) -boolean on; +vesa_traditional(boolean on) { - /* vesa_HideCursor(); */ + /* vesa_HideCursor(); */ if (on) { - /* switch_symbols(FALSE); */ + /* switch_symbols(FALSE); */ iflags.traditional_view = TRUE; clipx = 0; - clipxmax = CO - 1; + clipxmax = COLNO - 1; + clipy = 0; + clipymax = ROWNO - 1; } else { iflags.traditional_view = FALSE; if (!iflags.over_view) { - clipx = max(0, (curcol - viewport_size / 2)); - if (clipx > ((CO - 1) - viewport_size)) - clipx = (CO - 1) - viewport_size; - clipxmax = clipx + (viewport_size - 1); + if (viewport_cols < COLNO) { + clipx = max(0, (curcol - viewport_cols / 2)); + if (clipx > ((COLNO - 1) - viewport_cols)) + clipx = (COLNO - 1) - viewport_cols; + clipxmax = clipx + (viewport_cols - 1); + } else { + clipx = 0; + clipxmax = COLNO - 1; + } + if (viewport_rows < ROWNO) { + clipy = max(0, (currow - viewport_rows / 2)); + if (clipy > ((ROWNO - 1) - viewport_rows)) + clipy = (ROWNO - 1) - viewport_rows; + clipymax = clipy + (viewport_rows - 1); + } else { + clipy = 0; + clipymax = ROWNO - 1; + } } } } void -vesa_refresh() +vesa_refresh(void) { positionbar(); vesa_redrawmap(); vesa_DrawCursor(); } +#if 0 static void -decal_packed(gp, special) -const struct TileImage *gp; -unsigned special; +decal_packed(const struct TileImage *gp, unsigned special) { /* FIXME: the tile array is fixed in memory and should not be changed; if we ever implement this, we'll have to copy the pixels */ @@ -745,6 +1030,9 @@ unsigned special; } else if (special & MG_RIDDEN) { } } +#endif + +DISABLE_WARNING_FORMAT_NONLITERAL /* * Open tile files, @@ -756,10 +1044,18 @@ unsigned special; void vesa_Init(void) { + static boolean inited = FALSE; const struct Pixel *paletteptr; -#ifdef USE_TILES + unsigned i; + unsigned num_pixels, num_oview_pixels; const char *tile_file; + const char *font_name; int tilefailure = 0; + + if (inited) return; + inited = TRUE; + +#ifdef TILES_IN_GLYPHMAP /* * Attempt to open the required tile files. If we can't * don't perform the video mode switch, use TTY code instead. @@ -769,9 +1065,9 @@ vesa_Init(void) if (tile_file == NULL || *tile_file == '\0') { tile_file = "nhtiles.bmp"; } - if (!read_tiles(tile_file, FALSE)) + if (!read_tiles(tile_file, vesa_pixel_size > 8)) tilefailure |= 1; - if (get_palette() == NULL) + if (vesa_pixel_size == 8 && get_palette() == NULL) tilefailure |= 4; if (tilefailure) { @@ -783,17 +1079,33 @@ vesa_Init(void) iflags.over_view = FALSE; CO = 80; LI = 25; - /* clear_screen() */ /* not vesa_clear_screen() */ + /* term_clear_screen() */ /* not vesa_clear_screen() */ return; } #endif - if (vesa_mode == 0xFFFF) { - vesa_detect(); + vesa_mode = 0xFFFF; /* might want an 8 bit mode after loading tiles */ + vesa_detect(); + if (vesa_mode == 0xFFFF || (vesa_pixel_size == 8 && get_palette() == NULL)) { + raw_printf("%s (%d)", "Reverting to TTY mode, no VESA mode available.", + tilefailure); + wait_synch(); + iflags.usevga = 0; + iflags.tile_view = FALSE; + iflags.over_view = FALSE; + CO = 80; + LI = 25; + /* term_clear_screen() */ /* not vesa_clear_screen() */ + return; } + vesa_SwitchMode(vesa_mode); + vesa_SetViewPort(); windowprocs.win_cliparound = vesa_cliparound; -#ifdef USE_TILES + if (vesa_pixel_size > 8) { + windowprocs.wincap2 |= WC2_EXTRACOLORS; + } +#ifdef TILES_IN_GLYPHMAP paletteptr = get_palette(); iflags.tile_view = TRUE; iflags.over_view = FALSE; @@ -803,9 +1115,137 @@ vesa_Init(void) vesa_SetPalette(paletteptr); g_attribute = attrib_gr_normal; font = vesa_FontPtrs(); - clear_screen(); + term_clear_screen(); clipx = 0; - clipxmax = clipx + (viewport_size - 1); + clipxmax = clipx + (viewport_cols - 1); + clipy = 0; + clipymax = clipy + (viewport_rows - 1); + + /* Set the size of the tiles for the overview mode */ + vesa_oview_width = vesa_x_res / COLNO; + if (vesa_oview_width > (unsigned) iflags.wc_tile_width) { + vesa_oview_width = (unsigned) iflags.wc_tile_width; + } + vesa_oview_height = (vesa_y_res - (TOP_MAP_ROW + 4) * vesa_char_height) + / ROWNO; + if (vesa_oview_height > (unsigned) iflags.wc_tile_height) { + vesa_oview_height = (unsigned) iflags.wc_tile_height; + } + + /* Load a font of size appropriate to the screen size */ + if (vesa_x_res >= 1280 && vesa_y_res >= 960) + font_name = "ter-u32b.psf"; + else if (vesa_x_res >= 1120 && vesa_y_res >= 840) + font_name = "ter-u28b.psf"; + else if (vesa_x_res >= 960 && vesa_y_res >= 720) + font_name = "ter-u24b.psf"; + else if (vesa_x_res >= 880 && vesa_y_res >= 660) + font_name = "ter-u22b.psf"; + else if (vesa_x_res >= 800 && vesa_y_res >= 600) + font_name = "ter-u20b.psf"; + else if (vesa_x_res >= 720 && vesa_y_res >= 540) + font_name = "ter-u18b.psf"; + else + font_name = "ter-u16v.psf"; + if (iflags.wc_font_map != NULL && iflags.wc_font_map[0] != '\0') + font_name = iflags.wc_font_map; + free_font(vesa_font); + vesa_font = load_font(font_name); + /* if load_font fails, vesa_font is NULL and we'll fall back to the font + defined in ROM */ + if (vesa_font != NULL) { + vesa_char_width = vesa_font->width; + vesa_char_height = vesa_font->height; + } else { + /* Use the map font size to set the font size */ + /* Supported sizes are 8x16, 16x32, 24x48 and 32x64 */ + vesa_char_height = iflags.wc_fontsiz_map; + if (vesa_char_height <= 0 || vesa_char_height > vesa_y_res / 30) { + vesa_char_height = vesa_y_res / 30; + } + if (vesa_char_height < 32) { + vesa_char_height = 16; + } else if (vesa_char_height < 48) { + vesa_char_height = 32; + } else if (vesa_char_height < 64) { + vesa_char_height = 48; + } else { + vesa_char_height = 64; + } + vesa_char_width = vesa_char_height / 2; + } + + /* Process tiles for the current video mode */ + vesa_tiles = (unsigned char **) alloc(total_tiles_used * sizeof(void *)); + vesa_oview_tiles = (unsigned char **) alloc(total_tiles_used * sizeof(void *)); + num_pixels = iflags.wc_tile_width * iflags.wc_tile_height; + num_oview_pixels = vesa_oview_width * vesa_oview_height; + set_tile_type(vesa_pixel_size > 8); + for (i = 0; i < (unsigned) total_tiles_used; ++i) { + const struct TileImage *tile = get_tile(i); + struct TileImage *ov_tile = stretch_tile(tile, vesa_oview_width, vesa_oview_height); + unsigned j; + unsigned char *t_img = (unsigned char *) alloc(num_pixels * vesa_pixel_bytes); + unsigned char *ot_img = (unsigned char *) alloc(num_oview_pixels * vesa_pixel_bytes); + vesa_tiles[i] = t_img; + vesa_oview_tiles[i] = ot_img; + switch (vesa_pixel_bytes) { + case 1: + memcpy(t_img, tile->indexes, num_pixels); + memcpy(ot_img, ov_tile->indexes, num_oview_pixels); + break; + + case 2: + for (j = 0; j < num_pixels; ++j) { + ((uint16_t *)t_img)[j] = vesa_MakeColor(tile->pixels[j]); + } + for (j = 0; j < num_oview_pixels; ++j) { + ((uint16_t *)ot_img)[j] = vesa_MakeColor(ov_tile->pixels[j]); + } + break; + + case 3: + for (j = 0; j < num_pixels; ++j) { + unsigned long color = vesa_MakeColor(tile->pixels[j]); + t_img[3*j + 0] = color & 0xFF; + t_img[3*j + 1] = (color >> 8) & 0xFF; + t_img[3*j + 2] = (color >> 16) & 0xFF; + } + for (j = 0; j < num_oview_pixels; ++j) { + unsigned long color = vesa_MakeColor(ov_tile->pixels[j]); + ot_img[3*j + 0] = color & 0xFF; + ot_img[3*j + 1] = (color >> 8) & 0xFF; + ot_img[3*j + 2] = (color >> 16) & 0xFF; + } + break; + + case 4: + for (j = 0; j < num_pixels; ++j) { + ((uint32_t *)t_img)[j] = vesa_MakeColor(tile->pixels[j]); + } + for (j = 0; j < num_oview_pixels; ++j) { + ((uint32_t *)ot_img)[j] = vesa_MakeColor(ov_tile->pixels[j]); + } + break; + } + free_tile(ov_tile); + } + free_tiles(); +} + +RESTORE_WARNING_FORMAT_NONLITERAL + +/* Set the size of the map viewport */ +static void +vesa_SetViewPort(void) +{ + unsigned y_reserved = (TOP_MAP_ROW + 5) * vesa_char_height; + unsigned y_map = vesa_y_res - y_reserved; + + viewport_cols = vesa_x_res / iflags.wc_tile_width; + viewport_rows = y_map / iflags.wc_tile_height; + if (viewport_cols > COLNO) viewport_cols = COLNO; + if (viewport_rows > ROWNO) viewport_rows = ROWNO; } /* @@ -813,29 +1253,35 @@ vesa_Init(void) * * If mode == MODETEXT (0x03), then the card is placed into text * mode. Otherwise, the card is placed in the mode selected by - * vesa_detect. Supported modes are those with packed 8 bit pixels. + * vesa_detect. * */ static void -vesa_SwitchMode(mode) -unsigned mode; +vesa_SwitchMode(unsigned mode) { __dpmi_regs regs; if (mode == MODETEXT) { iflags.grmode = 0; + memset(®s, 0, sizeof(regs)); regs.x.ax = mode; (void) __dpmi_int(VIDEO_BIOS, ®s); +#ifdef SIMULATE_CURSOR + free(undercursor); + undercursor = NULL; +#endif } else if (mode >= 0x100) { iflags.grmode = 1; + memset(®s, 0, sizeof(regs)); regs.x.ax = 0x4F02; - regs.x.bx = mode & 0x81FF; + regs.x.bx = mode; (void) __dpmi_int(VIDEO_BIOS, ®s); /* Record that the window position is unknown */ vesa_win_pos[0] = 0xFFFFFFFF; vesa_win_pos[1] = 0xFFFFFFFF; } else { iflags.grmode = 0; /* force text mode for error msg */ + memset(®s, 0, sizeof(regs)); regs.x.ax = MODETEXT; (void) __dpmi_int(VIDEO_BIOS, ®s); g_attribute = attrib_text_normal; @@ -851,7 +1297,14 @@ unsigned mode; void vesa_Finish(void) { - free_tiles(); + int i; + + for (i = 0; i < total_tiles_used; ++i) { + free(vesa_tiles[i]); + free(vesa_oview_tiles[i]); + } + free(vesa_tiles); + free(vesa_oview_tiles); vesa_SwitchMode(MODETEXT); windowprocs.win_cliparound = tty_cliparound; g_attribute = attrib_text_normal; @@ -869,28 +1322,28 @@ vesa_Finish(void) * address of the appropriate character definition table for * the current graphics mode into interrupt vector 0x43 (0000:010C). */ -static char __far * +static unsigned char __far * vesa_FontPtrs(void) { USHORT __far *tmp; - char __far *retval; + unsigned char __far *retval; USHORT fseg, foff; tmp = (USHORT __far *) MK_PTR(((USHORT) FONT_PTR_SEGMENT), ((USHORT) FONT_PTR_OFFSET)); foff = READ_ABSOLUTE_WORD(tmp); ++tmp; fseg = READ_ABSOLUTE_WORD(tmp); - retval = (char __far *) MK_PTR(fseg, foff); + retval = (unsigned char __far *) MK_PTR(fseg, foff); return retval; } /* - * This will verify the existance of a VGA adapter on the machine. + * This will verify the existence of a VGA adapter on the machine. * Video function call 0x4F00 returns 0x004F in AX if successful, and * returns a VbeInfoBlock describing the features of the VESA BIOS. */ int -vesa_detect() +vesa_detect(void) { int vbe_info_sel = -1; /* custodial */ int vbe_info_seg; @@ -898,6 +1351,7 @@ vesa_detect() __dpmi_regs regs; unsigned long mode_addr; struct ModeInfoBlock mode_info; + const char *mode_str; vbe_info_seg = __dpmi_allocate_dos_memory( (sizeof(vbe_info) + 15) / 16, @@ -910,6 +1364,7 @@ vesa_detect() dosmemput(&vbe_info, sizeof(vbe_info), vbe_info_seg * 16L); /* Request VESA BIOS information */ + memset(®s, 0, sizeof(regs)); regs.x.ax = 0x4F00; regs.x.di = 0; regs.x.es = vbe_info_seg; @@ -927,8 +1382,33 @@ vesa_detect() mode_addr = (vbe_info.VideoModePtr >> 16) * 16L + (vbe_info.VideoModePtr & 0xFFFF); + /* Allow the user to select a specific mode */ + mode_str = nh_getenv("NH_DISPLAY_MODE"); + if (mode_str != NULL) { + char *end; + unsigned long num = strtoul(mode_str, &end, 16); + if (*end == '\0') { + /* Can we select this mode? */ + if (vesa_GetModeInfo(num, &mode_info) + && mode_info.XResolution >= 640 + && mode_info.YResolution >= 480 + && mode_info.BitsPerPixel >= 8) { + vesa_mode = num & 0x47FF; + } + } + if (vesa_mode == 0xFFFF) + mode_str = NULL; + } + /* Scan the mode list for an acceptable mode */ - vesa_mode = vesa_FindMode(mode_addr, 32); + /* Choose the widest bit-width, even if the tile set can handle 8 bits, + so that Unicode symbols can display in their colors */ +#ifndef ENHANCED_SYMBOLS + if (get_palette() != NULL && vesa_mode == 0xFFFF) + vesa_mode = vesa_FindMode(mode_addr, 8); +#endif + if (vesa_mode == 0xFFFF) + vesa_mode = vesa_FindMode(mode_addr, 32); if (vesa_mode == 0xFFFF) vesa_mode = vesa_FindMode(mode_addr, 24); if (vesa_mode == 0xFFFF) @@ -944,51 +1424,61 @@ vesa_detect() vesa_GetModeInfo(vesa_mode, &mode_info); vesa_x_res = mode_info.XResolution; vesa_y_res = mode_info.YResolution; - vesa_x_center = (vesa_x_res - 640) / 2; - vesa_y_center = (vesa_y_res - 480) / 2; + vesa_x_center = 0; + vesa_y_center = 0; vesa_scan_line = mode_info.BytesPerScanLine; vesa_win_size = mode_info.WinSize * 1024L; vesa_win_gran = mode_info.WinGranularity * 1024L; vesa_pixel_size = mode_info.BitsPerPixel; vesa_pixel_bytes = (vesa_pixel_size + 7) / 8; if (vbe_info.VbeVersion >= 0x0300) { - vesa_red_pos = mode_info.RedFieldPosition; - vesa_red_size = mode_info.RedMaskSize; - vesa_green_pos = mode_info.GreenFieldPosition; - vesa_green_size = mode_info.GreenMaskSize; - vesa_blue_pos = mode_info.BlueFieldPosition; - vesa_blue_size = mode_info.BlueMaskSize; + if (mode_info.ModeAttributes & 0x80) { + vesa_red_pos = mode_info.LinRedFieldPosition; + vesa_red_shift = 8 - mode_info.LinRedMaskSize; + vesa_green_pos = mode_info.LinGreenFieldPosition; + vesa_green_shift = 8 - mode_info.LinGreenMaskSize; + vesa_blue_pos = mode_info.LinBlueFieldPosition; + vesa_blue_shift = 8 - mode_info.LinBlueMaskSize; + } else { + vesa_red_pos = mode_info.RedFieldPosition; + vesa_red_shift = 8 - mode_info.RedMaskSize; + vesa_green_pos = mode_info.GreenFieldPosition; + vesa_green_shift = 8 - mode_info.GreenMaskSize; + vesa_blue_pos = mode_info.BlueFieldPosition; + vesa_blue_shift = 8 - mode_info.BlueMaskSize; + } } else { switch (vesa_pixel_size) { case 15: vesa_blue_pos = 0; - vesa_blue_size = 5; + vesa_blue_shift = 3; vesa_green_pos = 5; - vesa_green_size = 5; + vesa_green_shift = 3; vesa_red_pos = 10; - vesa_red_size = 5; + vesa_red_shift = 3; break; case 16: vesa_blue_pos = 0; - vesa_blue_size = 5; + vesa_blue_shift = 3; vesa_green_pos = 5; - vesa_green_size = 6; + vesa_green_shift = 2; vesa_red_pos = 11; - vesa_red_size = 5; + vesa_red_shift = 3; break; case 24: case 32: vesa_blue_pos = 0; - vesa_blue_size = 8; + vesa_blue_shift = 0; vesa_green_pos = 8; - vesa_green_size = 8; + vesa_green_shift = 0; vesa_red_pos = 16; - vesa_red_size = 8; + vesa_red_shift = 0; break; } } + vesa_win_func = mode_info.WinFuncPtr; vesa_win_addr[0] = mode_info.WinASegment * 16L; vesa_win_addr[1] = mode_info.WinBSegment * 16L; vesa_win_pos[0] = 0xFFFFFFFF; /* position unknown */ @@ -1010,6 +1500,26 @@ vesa_detect() goto error; /* Shouldn't happen */ } + /* Configure a linear frame buffer if we have it */ + if ((mode_info.ModeAttributes & 0x80) != 0 + && (mode_str == NULL || (vesa_mode & 0x4000) != 0)) { + unsigned sel = vesa_segment; + unsigned win_size = mode_info.BytesPerScanLine * mode_info.YResolution; + unsigned addr = vesa_map_frame_buffer(mode_info.PhysBasePtr, win_size); + if (sel == 0) { + sel = __dpmi_allocate_ldt_descriptors(1); + } + if (addr != 0) { + vesa_mode |= 0x4000; + vesa_segment = sel; + __dpmi_set_segment_base_address(sel, addr); + __dpmi_set_segment_limit(sel, (win_size - 1) | 0xFFF); + } else { + __dpmi_free_ldt_descriptor(sel); + vesa_segment = 0; + } + } + __dpmi_free_dos_memory(vbe_info_sel); return TRUE; @@ -1019,14 +1529,19 @@ vesa_detect() } static unsigned -vesa_FindMode(mode_addr, bits) -unsigned long mode_addr; -unsigned bits; +vesa_FindMode(unsigned long mode_addr, unsigned bits) { unsigned selected_mode; struct ModeInfoBlock mode_info0, mode_info; unsigned model = (bits == 8) ? 4 : 6; + if (iflags.wc_video_width < 640) { + iflags.wc_video_width = 640; + } + if (iflags.wc_video_height < 480) { + iflags.wc_video_height = 480; + } + memset(&mode_info, 0, sizeof(mode_info)); selected_mode = 0xFFFF; while (1) { @@ -1038,8 +1553,8 @@ unsigned bits; if (!vesa_GetModeInfo(mode, &mode_info0)) continue; /* Check that the mode is acceptable */ - if (mode_info0.XResolution < 640) continue; - if (mode_info0.YResolution < 480) continue; + if (mode_info0.XResolution < iflags.wc_video_width) continue; + if (mode_info0.YResolution < iflags.wc_video_height) continue; if (mode_info0.NumberOfPlanes != 1) continue; if (mode_info0.BitsPerPixel != bits) continue; if (mode_info0.NumberOfBanks != 1) continue; @@ -1065,160 +1580,312 @@ unsigned bits; * */ static void -vesa_WriteChar(chr, col, row, colour, transparent) -int chr, col, row, colour; -boolean transparent; +vesa_WriteChar(uint32 chr, int col, int row, uint32 colour) { - int i, j; int pixx, pixy; - unsigned char __far *fp = font; - unsigned char fnt; + /* min() protects from callers */ + pixx = min(col, (CO - 1)) * vesa_char_width; + pixy = min(row, (LI - 1)) * vesa_char_height; - pixx = min(col, (CO - 1)) * 8; /* min() protects from callers */ - pixy = min(row, (LI - 1)) * 16; /* assumes 8 x 16 char set */ pixx += vesa_x_center; pixy += vesa_y_center; - for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { - fnt = READ_ABSOLUTE((fp + chr * 16 + i)); - for (j = 0; j < 8; ++j) { - if (fnt & (0x80 >> j)) { - vesa_WritePixel(pixx + j, pixy + i, colour + FIRST_TEXT_COLOR); - } else if (!transparent) { - vesa_WritePixel(pixx + j, pixy + i, BACKGROUND_VESA_COLOR); - } - } - } + vesa_WriteCharXY(chr, pixx, pixy, colour); } /* - * Like vesa_WriteChar, but draw the character in local memory rather than in - * the VGA frame buffer. - * - * vesa_redrawmap uses this to gather a row of cells in local memory and then - * draw them in strict row-major order, minimizing the use of the VESA - * windowing function. - * + * As vesa_WriteChar, but specify coordinates by pixel and allow + * transparency */ static void -vesa_WriteCharInMemory(chr, col, buf, colour) -int chr, col; -char buf[TILE_Y][640*2]; -int colour; +vesa_WriteCharXY(uint32 chr, int pixx, int pixy, uint32 colour) { - int i, j; - int pixx; - - unsigned char __far *fp = font; - unsigned char fnt; + /* Flush if cache is full or if not contiguous to the last character */ + if (chr_cache_size >= SIZE(chr_cache)) { + vesa_flush_text(); + } + if (chr_cache_size != 0 && chr_cache_lastx + vesa_char_width != (unsigned) pixx) { + vesa_flush_text(); + } + if (chr_cache_size != 0 && chr_cache_pixy != (unsigned) pixy) { + vesa_flush_text(); + } + /* Add to cache and write later */ + if (chr_cache_size == 0) { + chr_cache_pixx = pixx; + chr_cache_pixy = pixy; + } + chr_cache_lastx = pixx; + chr_cache[chr_cache_size].chr = chr; + chr_cache[chr_cache_size].inverse = inversed; + chr_cache[chr_cache_size].colour = colour; + chr_cache[chr_cache_size].bgcolour = BACKGROUND_VESA_COLOR; + ++chr_cache_size; +} - pixx = min(col, (CO - 1)) * 8; /* min() protects from callers */ +/* + * Draw a character with a transparent background + * Don't bother caching; only the position bar and the cursor use this + */ +static void +vesa_WriteCharTransparent(int chr, int pixx, int pixy, int colour) +{ + int px, py; - for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { - fnt = READ_ABSOLUTE((fp + chr * 16 + i)); - for (j = 0; j < 8; ++j) { - if (fnt & (0x80 >> j)) { - buf[i][pixx + j] = colour + FIRST_TEXT_COLOR; - } else { - buf[i][pixx + j] = BACKGROUND_VESA_COLOR; + for (py = 0; py < (int) vesa_char_height; ++py) { + for (px = 0; px < (int) vesa_char_width; ++px) { + if (vesa_GetCharPixel(chr, px, py)) { + vesa_WritePixel(pixx + px, pixy + py, colour + FIRST_TEXT_COLOR); } } } } -/* - * This is the routine that displays a high-res "cell" pointed to by 'gp' - * at the desired location (col,row). - * - * Note: (col,row) in this case refer to the coordinate location in - * NetHack character grid terms, (ie. the 40 x 25 character grid), - * not the x,y pixel location. - * - */ +void +vesa_flush_text(void) +{ + if (chr_cache_size == 0) return; + + vesa_WriteTextRow(chr_cache_pixx, chr_cache_pixy, chr_cache, chr_cache_size); + chr_cache_size = 0; +} + +extern uint32 curframecolor; /* video.c */ + static void -vesa_DisplayCell(tile, col, row) -const struct TileImage *tile; -int col, row; +vesa_WriteTextRow(int pixx, int pixy, struct VesaCharacter const *t_row, + unsigned t_row_width) { - int i, j, pixx, pixy; + int x, px, py; + unsigned i; + unsigned p_row_width = t_row_width * vesa_char_width * vesa_pixel_bytes; + unsigned char *p_row = (unsigned char *) alloc(p_row_width); + unsigned long offset = pixy * (unsigned long)vesa_scan_line + pixx * vesa_pixel_bytes; + unsigned char fg[4], bg[4]; + +#if 0 + /* Preprocess the background color */ + if (vesa_pixel_bytes == 1) { + bg[0] = BACKGROUND_VESA_COLOR; + } else { + unsigned long pix = vesa_palette[BACKGROUND_VESA_COLOR]; + bg[0] = pix & 0xFF; + bg[1] = (pix >> 8) & 0xFF; + bg[2] = (pix >> 16) & 0xFF; + bg[3] = (pix >> 24) & 0xFF; + } +#endif - pixx = col * TILE_X; - pixy = row * TILE_Y; - if (iflags.over_view) { - pixx /= 2; - pixx += vesa_x_center; - pixy += vesa_y_center; - if (vesa_pixel_size != 8) { - for (i = 0; i < TILE_Y; ++i) { - for (j = 0; j < TILE_X; j += 2) { - unsigned index = i * tile->width + j; - unsigned long c1 = vesa_palette[tile->indexes[index + 0]]; - unsigned long c2 = vesa_palette[tile->indexes[index + 1]]; - unsigned char r1, r2, g1, g2, b1, b2; - - vesa_GetRGB(c1, &r1, &g1, &b1); - vesa_GetRGB(c2, &r2, &g2, &b2); - r1 = (r1 + r2) / 2; - g1 = (g1 + g2) / 2; - b1 = (b1 + b2) / 2; - vesa_WritePixel32(pixx + j / 2, pixy + i, - vesa_MakeColor(r1, g1, b1)); - } + /* First loop: draw one raster line of all row entries */ + for (py = 0; py < (int) vesa_char_height; ++py) { + /* Second loop: draw one raster line of one character */ + x = 0; + for (i = 0; i < t_row_width; ++i) { + uint32 chr = t_row[i].chr; + uint32 colour = t_row[i].colour; + + /* background color */ + if (vesa_pixel_bytes == 1) { + bg[0] = BACKGROUND_VESA_COLOR; + } else { + unsigned long pix = vesa_palette[t_row[i].bgcolour]; + bg[0] = pix & 0xFF; + bg[1] = (pix >> 8) & 0xFF; + bg[2] = (pix >> 16) & 0xFF; + bg[3] = (pix >> 24) & 0xFF; } - } else { - for (i = 0; i < TILE_Y; ++i) { - for (j = 0; j < TILE_X; j += 2) { - unsigned index = i * tile->width + j; - vesa_WritePixel(pixx + j / 2, pixy + i, tile->indexes[index]); + /* Preprocess the foreground color */ + if (colour & 0x80000000) { + fg[0] = colour & 0xFF; + fg[1] = (colour >> 8) & 0xFF; + fg[2] = (colour >> 16) & 0xFF; + fg[3] = 0; + } else if (vesa_pixel_bytes == 1) { + fg[0] = colour + FIRST_TEXT_COLOR; + } else { + unsigned long pix = vesa_palette[colour + FIRST_TEXT_COLOR]; + fg[0] = pix & 0xFF; + fg[1] = (pix >> 8) & 0xFF; + fg[2] = (pix >> 16) & 0xFF; + fg[3] = (pix >> 24) & 0xFF; + } + + if (t_row[i].inverse) { + unsigned char tmpx[4]; + tmpx[0] = bg[0]; bg[0] = fg[0]; fg[0] = tmpx[0]; + tmpx[1] = bg[1]; bg[1] = fg[1]; fg[1] = tmpx[1]; + tmpx[2] = bg[2]; bg[2] = fg[2]; fg[2] = tmpx[2]; + tmpx[3] = bg[3]; bg[3] = fg[3]; fg[3] = tmpx[3]; + } + + /* Third loop: draw eight pixels */ + for (px = 0; px < (int) vesa_char_width; px += 8) { + /* Fourth loop: draw one pixel */ + int px2; + unsigned char fnt = vesa_GetCharPixelRow(chr, px, py); + int l = vesa_char_width - px; + if (l > 8) { + l = 8; + } + for (px2 = 0; px2 < l; ++px2) { + if (fnt & 0x80) { + memcpy(p_row + x, fg, vesa_pixel_bytes); + } else { + memcpy(p_row + x, bg, vesa_pixel_bytes); + } + x += vesa_pixel_bytes; + fnt <<= 1; } } } + vesa_WritePixelRow(offset, p_row, p_row_width); + offset += vesa_scan_line; + } + free(p_row); +} + +static boolean +vesa_GetCharPixel(int ch, unsigned x, unsigned y) +{ + unsigned x2; + unsigned char fnt; + + x2 = x % 8; + + fnt = vesa_GetCharPixelRow(ch, x, y); + return (fnt & (0x80 >> x2)) != 0; +} + +static unsigned char +vesa_GetCharPixelRow(uint32 ch, unsigned x, unsigned y) +{ + unsigned fnt_width; + unsigned x1; + unsigned char fnt; + size_t offset; + + if (x >= vesa_char_width) return 0; + if (y >= vesa_char_height) return 0; + + fnt_width = (vesa_char_width + 7) / 8; + x1 = x / 8; + + if (vesa_font != NULL) { + const unsigned char *fp; + + offset = y * fnt_width + x1; + fp = get_font_glyph(vesa_font, ch, SYMHANDLING(H_UTF8)); + fnt = fp[offset]; } else { - pixx += vesa_x_center; - pixy += vesa_y_center; - for (i = 0; i < TILE_Y; ++i) { - for (j = 0; j < TILE_X; ++j) { - unsigned index = i * tile->width + j; - vesa_WritePixel(pixx + j, pixy + i, tile->indexes[index]); + const unsigned char __far *fp; + + if (255 < ch) return 0; + offset = (ch * vesa_char_height + y) * fnt_width + x1; + fp = font; + fnt = READ_ABSOLUTE((fp + offset)); + + if (vesa_char_width != 8) { + unsigned long fnt2 = fnt; + unsigned width = vesa_char_width; + if (width % 3 == 0) { + fnt2 = vesa_TriplePixels(fnt2); + width /= 3; + } + while (width > 8) { + fnt2 = vesa_DoublePixels(fnt2); + width /= 2; } + fnt2 <<= 32 - vesa_char_width; + fnt = (unsigned char)(fnt2 >> (24 - 8 * x1)); } } + return fnt; +} + +/* Scale font pixels horizontally */ +static unsigned long +vesa_DoublePixels(unsigned long fnt) +{ + static const unsigned char double_bits[] = { + 0x00, 0x03, 0x0C, 0x0F, + 0x30, 0x33, 0x3C, 0x3F, + 0xC0, 0xC3, 0xCC, 0xCF, + 0xF0, 0xF3, 0xFC, 0xFF + }; + unsigned i; + unsigned long fnt2; + + fnt2 = 0; + for (i = 0; i < 16; i += 4) { + unsigned long b4 = (fnt >> i) & 0xF; + fnt2 |= (unsigned long)double_bits[b4] << (i * 2); + } + return fnt2; +} + +static unsigned long +vesa_TriplePixels(unsigned long fnt) +{ + static const unsigned short triple_bits[] = { + 00000, 00007, 00070, 00077, + 00700, 00707, 00770, 00777, + 07000, 07007, 07070, 07077, + 07700, 07707, 07770, 07777 + }; + unsigned i; + unsigned long fnt2; + + fnt2 = 0; + for (i = 0; i < 11; i += 4) { + unsigned long b4 = (fnt >> i) & 0xF; + fnt2 |= (unsigned long)triple_bits[b4] << (i * 3); + } + return fnt2; } /* - * Like vesa_DisplayCell, but draw the tile in local memory rather than in - * the VGA frame buffer. + * This is the routine that displays a high-res "cell" pointed to by 'gp' + * at the desired location (col,row). * - * vesa_redrawmap uses this to gather a row of cells in local memory and then - * draw them in strict row-major order, minimizing the use of the VESA - * windowing function. + * Note: (col,row) in this case refer to the coordinate location in + * NetHack character grid terms, relative to the map viewport, + * not the x,y pixel location. * */ static void -vesa_DisplayCellInMemory(tile, col, buf) -const struct TileImage *tile; -int col; -char buf[TILE_Y][640*2]; +vesa_DisplayCell(int tilenum, int col, int row) { - int i, j, pixx; - - pixx = col * TILE_X; - if (iflags.over_view && vesa_pixel_size == 8) { - pixx /= 2; - for (i = 0; i < TILE_Y; ++i) { - for (j = 0; j < TILE_X; j += 2) { - unsigned index = i * tile->width + j; - buf[i][pixx + j / 2] = tile->indexes[index]; - } - } + unsigned char const *tile; + unsigned t_width, t_height; + unsigned char const *tptr; + int /* px, */ py, pixx, pixy; + unsigned long offset; + unsigned p_row_width; + + if (iflags.over_view) { + tile = vesa_oview_tiles[tilenum]; + t_width = vesa_oview_width; + t_height = vesa_oview_height; } else { - for (i = 0; i < TILE_Y; ++i) { - for (j = 0; j < TILE_X; ++j) { - unsigned index = i * tile->width + j; - buf[i][pixx + j] = tile->indexes[index]; - } - } + tile = vesa_tiles[tilenum]; + t_width = iflags.wc_tile_width; + t_height = iflags.wc_tile_height; + } + + p_row_width = t_width * vesa_pixel_bytes; + + pixx = col * t_width; + pixy = row * t_height + TOP_MAP_ROW * vesa_char_height; + pixx += vesa_x_center; + pixy += vesa_y_center; + offset = pixy * (unsigned long)vesa_scan_line + pixx * vesa_pixel_bytes; + tptr = tile; + + for (py = 0; py < (int) t_height; ++py) { + vesa_WritePixelRow(offset, tptr, p_row_width); + offset += vesa_scan_line; + tptr += p_row_width; } } @@ -1228,9 +1895,7 @@ char buf[TILE_Y][640*2]; * */ static void -vesa_WriteStr(s, len, col, row, colour) -const char *s; -int len, col, row, colour; +vesa_WriteStr(const char *s, int len, int col, int row, int colour) { const unsigned char *us; int i = 0; @@ -1242,7 +1907,7 @@ int len, col, row, colour; i = 0; us = (const unsigned char *) s; while ((*us != 0) && (i < len) && (col < (CO - 1))) { - vesa_WriteChar(*us, col, row, colour, FALSE); + vesa_WriteChar(*us, col, row, colour); ++us; ++i; ++col; @@ -1252,32 +1917,27 @@ int len, col, row, colour; /* * Initialize the VGA palette with the desired colours. This * must be a series of 720 bytes for use with a card in 256 - * colour mode at 640 x 480. The first 240 palette entries are - * used by the tile set; the last 16 are reserved for text. + * colour mode. The first 240 palette entries are used by the + * tile set; the last 16 are reserved for text. * */ static boolean -vesa_SetPalette(palette) -const struct Pixel *palette; +vesa_SetPalette(const struct Pixel *palette) { if (vesa_pixel_size == 8) { - vesa_SetHardPalette(palette); + return vesa_SetHardPalette(palette); } else { - vesa_SetSoftPalette(palette); + return vesa_SetSoftPalette(palette); } } static boolean -vesa_SetHardPalette(palette) -const struct Pixel *palette; +vesa_SetHardPalette(const struct Pixel *palette) { - const struct Pixel *p = palette; int palette_sel = -1; /* custodial */ int palette_seg; - unsigned long palette_ptr; + unsigned char p2[1024]; unsigned i, shift; - unsigned char r, g, b; - unsigned long color; __dpmi_regs regs; palette_seg = __dpmi_allocate_dos_memory( 1024 / 16, &palette_sel); @@ -1297,36 +1957,23 @@ const struct Pixel *palette; shift = 8 - regs.h.bh; } + /* First, try the VESA palette function */ /* Set the tile set and text colors */ - palette_ptr = palette_seg * 16L; -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP for (i = 0; i < FIRST_TEXT_COLOR; ++i) { - r = p->r >> shift; - g = p->g >> shift; - b = p->b >> shift; - color = ((unsigned long) r << 16) - | ((unsigned long) g << 8) - | ((unsigned long) b << 0); - _farpokel(_dos_ds, palette_ptr, color); - palette_ptr += 4; - ++p; + p2[i*4 + 0] = palette[i].b >> shift; + p2[i*4 + 1] = palette[i].g >> shift; + p2[i*4 + 2] = palette[i].r >> shift; } -#else - palette_ptr += FIRST_TEXT_COLOR * 4; #endif - p = defpalette; for (i = FIRST_TEXT_COLOR; i < 256; ++i) { - r = p->r >> shift; - g = p->g >> shift; - b = p->b >> shift; - color = ((unsigned long) r << 16) - | ((unsigned long) g << 8) - | ((unsigned long) b << 0); - _farpokel(_dos_ds, palette_ptr, color); - palette_ptr += 4; - ++p; + p2[i*4 + 0] = defpalette[i-FIRST_TEXT_COLOR].b >> shift; + p2[i*4 + 1] = defpalette[i-FIRST_TEXT_COLOR].g >> shift; + p2[i*4 + 2] = defpalette[i-FIRST_TEXT_COLOR].r >> shift; } + /* Call the BIOS */ + dosmemput(p2, 256*4, palette_seg*16L); memset(®s, 0, sizeof(regs)); regs.x.ax = 0x4F09; regs.h.bl = 0; @@ -1336,6 +1983,33 @@ const struct Pixel *palette; regs.x.es = palette_seg; (void) __dpmi_int(VIDEO_BIOS, ®s); + /* If that didn't work, use the original BIOS function */ + if (regs.x.ax != 0x004F) { + /* Set the tile set and text colors */ +#ifdef TILES_IN_GLYPHMAP + for (i = 0; i < FIRST_TEXT_COLOR; ++i) { + p2[i*3 + 0] = palette[i].r >> shift; + p2[i*3 + 1] = palette[i].g >> shift; + p2[i*3 + 2] = palette[i].b >> shift; + } +#endif + for (i = FIRST_TEXT_COLOR; i < 256; ++i) { + p2[i*3 + 0] = defpalette[i-FIRST_TEXT_COLOR].r >> shift; + p2[i*3 + 1] = defpalette[i-FIRST_TEXT_COLOR].g >> shift; + p2[i*3 + 2] = defpalette[i-FIRST_TEXT_COLOR].b >> shift; + } + + /* Call the BIOS */ + dosmemput(p2, 256*3, palette_seg*16L); + memset(®s, 0, sizeof(regs)); + regs.x.ax = 0x1012; + regs.x.cx = 256; + regs.x.bx = 0; + regs.x.dx = 0; + regs.x.es = palette_seg; + (void) __dpmi_int(VIDEO_BIOS, ®s); + } + __dpmi_free_dos_memory(palette_sel); return TRUE; @@ -1345,38 +2019,43 @@ const struct Pixel *palette; } static boolean -vesa_SetSoftPalette(palette) -const struct Pixel *palette; +vesa_SetSoftPalette(const struct Pixel *palette) { const struct Pixel *p; unsigned i; - unsigned char r, g, b; /* Set the tile set and text colors */ -#ifdef USE_TILES - p = palette; - for (i = 0; i < FIRST_TEXT_COLOR; ++i) { - r = p->r; - g = p->g; - b = p->b; - vesa_palette[i] = vesa_MakeColor(r, g, b); - ++p; +#ifdef TILES_IN_GLYPHMAP + if (palette != NULL) { + p = palette; + for (i = 0; i < FIRST_TEXT_COLOR; ++i) { + vesa_palette[i] = vesa_MakeColor(*p); + ++p; + } } #endif p = defpalette; for (i = FIRST_TEXT_COLOR; i < 256; ++i) { - r = p->r; - g = p->g; - b = p->b; - vesa_palette[i] = vesa_MakeColor(r, g, b); + vesa_palette[i] = vesa_MakeColor(*p); ++p; } + return TRUE; +} + +void +vesa_hide_cursor(void) +{ +} + +void +vesa_show_cursor(void) +{ } #ifdef POSITIONBAR #define PBAR_ROW (LI - 4) -#define PBAR_COLOR_ON 16 /* slate grey background colour of tiles */ +#define PBAR_COLOR_ON 6 /* slate grey background colour of tiles */ #define PBAR_COLOR_OFF 0 /* bluish grey, used in old style only */ #define PBAR_COLOR_STAIRS CLR_BROWN /* brown */ #define PBAR_COLOR_HERO CLR_WHITE /* creamy white */ @@ -1384,10 +2063,9 @@ const struct Pixel *palette; static unsigned char pbar[COLNO]; void -vesa_update_positionbar(posbar) -char *posbar; +vesa_update_positionbar(char *posbar) { - char *p = pbar; + unsigned char *p = pbar; if (posbar) while (*posbar) *p++ = *posbar++; @@ -1395,15 +2073,15 @@ char *posbar; } static void -positionbar() +positionbar(void) { - char *posbar = pbar; + unsigned char *posbar = pbar; int feature, ucol; - int k, x, y, colour, row; int startk, stopk; boolean nowhere = FALSE; - int pixy = (PBAR_ROW * MAX_ROWS_PER_CELL); + int pixx, col; + int pixy = (PBAR_ROW * vesa_char_height); int tmp; if (!iflags.grmode || !iflags.tile_view) @@ -1416,53 +2094,45 @@ positionbar() #endif return; } + startk = clipx * vesa_x_res / COLNO; + stopk = (clipxmax + 1) * vesa_x_res / COLNO; #ifdef OLD_STYLE - for (y = pixy; y < (pixy + MAX_ROWS_PER_CELL); ++y) { - for (x = 0; x < 640; ++x) { - k = x / 8; - if ((k < clipx) || (k > clipxmax)) { - colour = PBAR_COLOR_OFF; - } else - colour = PBAR_COLOR_ON; - vesa_WritePixel(x + vesa_x_center, y + vesa_y_center, colour); - } - } + vesa_FillRect(0, pixy, startk, vesa_char_height, + PBAR_COLOR_OFF + FIRST_TEXT_COLOR); + vesa_FillRect(startk, pixy, stopk - startk, vesa_char_height, + PBAR_COLOR_ON + FIRST_TEXT_COLOR); + vesa_FillRect(stopk, pixy, vesa_x_res - stopk, vesa_char_height, + PBAR_COLOR_OFF + FIRST_TEXT_COLOR); #else - for (y = pixy, row = 0; y < (pixy + MAX_ROWS_PER_CELL); ++y, ++row) { - if ((!row) || (row == (ROWS_PER_CELL - 1))) { - startk = 0; - stopk = SCREENBYTES; - } else { - startk = clipx; - stopk = clipxmax; - } - for (x = 0; x < 640; ++x) { - k = x / 8; - if ((k < startk) || (k > stopk)) - colour = BACKGROUND_VGA_COLOR; - else - colour = PBAR_COLOR_ON; - vesa_WritePixel(x + vesa_x_center, y + vesa_y_center, colour); - } - } + vesa_FillRect(0, pixy, vesa_x_res, 1, PBAR_COLOR_ON + FIRST_TEXT_COLOR); + vesa_FillRect(0, pixy + 1, startk, vesa_char_height - 2, + BACKGROUND_VESA_COLOR); + vesa_FillRect(startk, pixy + 1, stopk - startk, vesa_char_height - 2, + PBAR_COLOR_ON + FIRST_TEXT_COLOR); + vesa_FillRect(stopk, pixy + 1, vesa_x_res - stopk, vesa_char_height - 2, + BACKGROUND_VESA_COLOR); + vesa_FillRect(0, pixy + vesa_char_height - 1, vesa_x_res, 1, + PBAR_COLOR_ON + FIRST_TEXT_COLOR); #endif ucol = 0; if (posbar) { while (*posbar != 0) { feature = *posbar++; + col = *posbar++; + pixx = col * vesa_x_res / COLNO; switch (feature) { case '>': - vesa_WriteChar(feature, (int) *posbar++, PBAR_ROW, PBAR_COLOR_STAIRS, TRUE); + vesa_WriteCharTransparent(feature, pixx, pixy, PBAR_COLOR_STAIRS); break; case '<': - vesa_WriteChar(feature, (int) *posbar++, PBAR_ROW, PBAR_COLOR_STAIRS, TRUE); + vesa_WriteCharTransparent(feature, pixx, pixy, PBAR_COLOR_STAIRS); break; case '@': - ucol = (int) *posbar++; - vesa_WriteChar(feature, ucol, PBAR_ROW, PBAR_COLOR_HERO, TRUE); + ucol = col; + vesa_WriteCharTransparent(feature, pixx, pixy, PBAR_COLOR_HERO); break; default: /* unanticipated symbols */ - vesa_WriteChar(feature, (int) *posbar++, PBAR_ROW, PBAR_COLOR_STAIRS, TRUE); + vesa_WriteCharTransparent(feature, pixx, pixy, PBAR_COLOR_STAIRS); break; } } @@ -1471,51 +2141,74 @@ positionbar() if (inmap) { tmp = curcol + 1; if ((tmp != ucol) && (curcol >= 0)) - vesa_WriteChar('_', tmp, PBAR_ROW, PBAR_COLOR_HERO, TRUE); + vesa_WriteCharTransparent('_', tmp * vesa_x_res / COLNO, pixy, + PBAR_COLOR_HERO); } #endif + vesa_flush_text(); } #endif /*POSITIONBAR*/ #ifdef SIMULATE_CURSOR -static unsigned long undercursor[TILE_Y][TILE_X]; - void -vesa_DrawCursor() +vesa_DrawCursor(void) { - unsigned x, y, left, top, right, bottom, width; + static boolean last_inmap = FALSE; + unsigned x, y, left, top, right, bottom, width, height; boolean isrogue = Is_rogue_level(&u.uz); boolean halfwidth = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); int curtyp; + if (inmap && !last_inmap) { + vesa_redrawmap(); + } + last_inmap = inmap; + if (!cursor_type && inmap) return; /* CURSOR_INVIS - nothing to do */ + if (undercursor == NULL) { + /* size for the greater of one tile or one character */ + unsigned size1 = vesa_char_width * vesa_char_height; + unsigned size2 = iflags.wc_tile_width * iflags.wc_tile_height; + undercursor = (unsigned long *) alloc( + sizeof(undercursor[0]) * max(size1, size2)); + } x = min(curcol, (CO - 1)); /* protection from callers */ y = min(currow, (LI - 1)); /* protection from callers */ - if (!halfwidth && ((x < clipx) || (x > clipxmax))) + if (!halfwidth + && ((x < (unsigned) clipx) || (x > (unsigned) clipxmax) + || (y < (unsigned) clipy) || (y > (unsigned) clipymax))) return; - if (inmap) + if (inmap) { x -= clipx; - left = x * TILE_X; /* convert to pixels */ - top = y * TILE_Y; - if (halfwidth) { - left /= 2; - width = TILE_X / 2; + y -= clipy; + } + /* convert to pixels */ + if (!inmap || iflags.traditional_view) { + width = vesa_char_width; + height = vesa_char_height; + } else if (iflags.over_view) { + width = vesa_oview_width; + height = vesa_oview_height; } else { - width = TILE_X; + width = iflags.wc_tile_width; + height = iflags.wc_tile_height; + } + left = x * width + vesa_x_center; + top = y * height + vesa_y_center; + if (y >= TOP_MAP_ROW) { + top -= (height - vesa_char_height) * TOP_MAP_ROW; } - left += vesa_x_center; - top += vesa_y_center; right = left + width - 1; - bottom = top + TILE_Y - 1; + bottom = top + height - 1; - for (y = 0; y < ROWS_PER_CELL; ++y) { + for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { - undercursor[y][x] = vesa_ReadPixel32(left + x, top + y); + undercursor[y * width + x] = vesa_ReadPixel32(left + x, top + y); } } @@ -1557,14 +2250,14 @@ vesa_DrawCursor() default: for (x = left; x <= right; ++x) { - vesa_WritePixel(x, top, FIRST_TEXT_COLOR + 15); + vesa_WritePixel(x, top, FIRST_TEXT_COLOR + cursor_color); } for (y = top + 1; y <= bottom - 1; ++y) { - vesa_WritePixel(left , y, FIRST_TEXT_COLOR + 15); - vesa_WritePixel(right, y, FIRST_TEXT_COLOR + 15); + vesa_WritePixel(left , y, FIRST_TEXT_COLOR + cursor_color); + vesa_WritePixel(right, y, FIRST_TEXT_COLOR + cursor_color); } for (x = left; x <= right; ++x) { - vesa_WritePixel(x, bottom, FIRST_TEXT_COLOR + 15); + vesa_WritePixel(x, bottom, FIRST_TEXT_COLOR + cursor_color); } break; } @@ -1575,37 +2268,49 @@ vesa_DrawCursor() } void -vesa_HideCursor() +vesa_HideCursor(void) { - unsigned x, y, left, top, width; + unsigned x, y, left, top, width, height; boolean isrogue = Is_rogue_level(&u.uz); boolean halfwidth = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); - int curtyp; if (!cursor_type && inmap) return; /* CURSOR_INVIS - nothing to do */ + if (undercursor == NULL) + return; x = min(curcol, (CO - 1)); /* protection from callers */ y = min(currow, (LI - 1)); /* protection from callers */ - if (!halfwidth && ((x < clipx) || (x > clipxmax))) + if (!halfwidth + && ((x < (unsigned) clipx) || (x > (unsigned) clipxmax) + || (y < (unsigned) clipy) + || (y > (unsigned) clipymax))) return; - if (inmap) + if (inmap) { x -= clipx; - left = x * TILE_X; /* convert to pixels */ - top = y * TILE_Y; - if (halfwidth) { - left /= 2; - width = TILE_X / 2; + y -= clipy; + } + /* convert to pixels */ + if (!inmap || iflags.traditional_view) { + width = vesa_char_width; + height = vesa_char_height; + } else if (iflags.over_view) { + width = vesa_oview_width; + height = vesa_oview_height; } else { - width = TILE_X; + width = iflags.wc_tile_width; + height = iflags.wc_tile_height; + } + left = x * width + vesa_x_center; + top = y * height + vesa_y_center; + if (y >= TOP_MAP_ROW) { + top -= (height - vesa_char_height) * TOP_MAP_ROW; } - left += vesa_x_center; - top += vesa_y_center; - for (y = 0; y < ROWS_PER_CELL; ++y) { + for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { - vesa_WritePixel32(left + x, top + y, undercursor[y][x]); + vesa_WritePixel32(left + x, top + y, undercursor[y * width + x]); } } } diff --git a/sys/msdos/vidvga.c b/sys/msdos/vidvga.c index a91d0e08b..6b1a81239 100644 --- a/sys/msdos/vidvga.c +++ b/sys/msdos/vidvga.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vidvga.c $NHDT-Date: 1457207044 2016/03/05 19:44:04 $ $NHDT-Branch: chasonr $:$NHDT-Revision: 1.18 $ */ +/* NetHack 5.0 vidvga.c $NHDT-Date: 1606765216 2020/11/30 19:40:16 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.26 $ */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* @@ -11,9 +11,9 @@ #include "pcvideo.h" #include "tile.h" #include "tileset.h" +#include "font.h" #include -#include #include "wintty.h" #ifdef __GO32__ @@ -92,7 +92,7 @@ #if _MSC_VER >= 700 #pragma warning(disable : 4018) /* signed/unsigned mismatch */ #pragma warning(disable : 4127) /* conditional expression is constant */ -#pragma warning(disable : 4131) /* old style declarator */ +/* #pragma warning(disable : 4131) */ /* old style declarator */ #pragma warning(disable : 4305) /* prevents complaints with MK_FP */ #pragma warning(disable : 4309) /* initializing */ #if _MSC_VER > 700 @@ -102,99 +102,110 @@ #include #endif -extern short glyph2tile[]; +/* static void vga_NoBorder(int); */ +void vga_gotoloc(int, int); /* This should be made a macro */ +void vga_backsp(void); -/* STATIC_DCL void FDECL(vga_NoBorder, (int)); */ -void FDECL(vga_gotoloc, (int, int)); /* This should be made a macro */ -void NDECL(vga_backsp); #ifdef SCROLLMAP -STATIC_DCL void FDECL(vga_scrollmap, (BOOLEAN_P)); +static void vga_scrollmap(boolean); #endif -STATIC_DCL void FDECL(vga_redrawmap, (BOOLEAN_P)); -static void FDECL(vga_cliparound, (int, int)); -STATIC_OVL void FDECL(decal_planar, (struct planar_cell_struct *, unsigned)); +static void vga_redrawmap(boolean); +static void vga_cliparound(int, int); +static void decal_planar(struct planar_cell_struct *, unsigned); #ifdef POSITIONBAR -STATIC_DCL void NDECL(positionbar); -static void FDECL(vga_special, (int, int, int)); +static void positionbar(void); +static void vga_special(int, int, int); #endif -static void FDECL(vga_DisplayCell, (struct planar_cell_struct *, int, int)); -static void FDECL(vga_DisplayCell_O, - (struct overview_planar_cell_struct *, int, int)); -static void FDECL(vga_SwitchMode, (unsigned int)); -static void FDECL(vga_SetPalette, (const struct Pixel *)); -static void FDECL(vga_WriteChar, (int, int, int, int)); -static void FDECL(vga_WriteStr, (char *, int, int, int, int)); +static void vga_DisplayCell(struct planar_cell_struct *, int, int); +static void vga_DisplayCell_O(struct overview_planar_cell_struct *, int, + int); +static void vga_SwitchMode(unsigned int); +static void vga_SetPalette(const struct Pixel *); +static void vga_WriteChar(uint32, int, int, int); +static void vga_GetBitmap(uint32, unsigned char *); +static void vga_WriteStr(char *, int, int, int, int); -static void FDECL(read_planar_tile, (unsigned, struct planar_cell_struct *)); -static void FDECL(read_planar_tile_O, - (unsigned, struct overview_planar_cell_struct *)); -static void FDECL(read_tile_indexes, (unsigned, unsigned char (*)[TILE_X])); +static void read_planar_tile(unsigned, struct planar_cell_struct *); +static void read_planar_tile_O(unsigned, + struct overview_planar_cell_struct *); +static void read_tile_indexes(unsigned, unsigned char (*)[TILE_X]); extern int clipx, clipxmax; /* current clipping column from wintty.c */ extern boolean clipping; /* clipping on? from wintty.c */ extern int savevmode; /* store the original video mode */ extern int curcol, currow; /* current column and row */ extern int g_attribute; +extern int inversed; extern int attrib_text_normal; /* text mode normal attribute */ extern int attrib_gr_normal; /* graphics mode normal attribute */ extern int attrib_text_intense; /* text mode intense attribute */ extern int attrib_gr_intense; /* graphics mode intense attribute */ extern boolean inmap; /* in the map window */ +#ifdef TILES_IN_GLYPHMAP +extern glyph_map glyphmap[MAX_GLYPH]; +#endif /* * Global Variables */ -STATIC_VAR unsigned char __far *font; -STATIC_VAR char *screentable[SCREENHEIGHT]; +static unsigned char __far *rom_font; +static struct BitmapFont *psf_font; +static char *screentable[SCREENHEIGHT]; -STATIC_VAR const struct Pixel *paletteptr; -STATIC_VAR struct map_struct { +static const struct Pixel *paletteptr; +static struct map_struct { int glyph; - int ch; + uint32 ch; int attr; unsigned special; + short int tileidx; + uint32 framecolor; } map[ROWNO][COLNO]; /* track the glyphs */ -#define vga_clearmap() \ - { \ - int x, y; \ - for (y = 0; y < ROWNO; ++y) \ - for (x = 0; x < COLNO; ++x) { \ - map[y][x].glyph = cmap_to_glyph(S_stone); \ - map[y][x].ch = S_stone; \ - map[y][x].attr = 0; \ - map[y][x].special = 0; \ - } \ +extern int total_tiles_used, Tile_corr, Tile_unexplored; /* from tile.c */ + +#define vga_clearmap() \ + { \ + int x, y; \ + for (y = 0; y < ROWNO; ++y) \ + for (x = 0; x < COLNO; ++x) { \ + map[y][x].glyph = GLYPH_UNEXPLORED; \ + map[y][x].ch = glyph2ttychar(GLYPH_UNEXPLORED); \ + map[y][x].framecolor = NO_COLOR; \ + map[y][x].attr = 0; \ + map[y][x].special = 0; \ + map[y][x].tileidx = Tile_unexplored; \ + } \ } #define TOP_MAP_ROW 1 -STATIC_VAR int vgacmap[CLR_MAX] = { 1, 4, 6, 10, 5, 9, 0, 15, +static int vgacmap[CLR_MAX] = { 1, 4, 6, 10, 5, 9, 0, 15, 12, 3, 7, 8, 2, 9, 0, 14 }; -STATIC_VAR int viewport_size = 40; -/* STATIC_VAR char masktable[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; */ -/* STATIC_VAR char bittable[8]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; */ +static int viewport_size = 40; +/* static char masktable[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; */ +/* static char bittable[8]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; */ #if 0 -STATIC_VAR char defpalette[] = { /* Default VGA palette */ - 0x00, 0x00, 0x00, - 0x00, 0x00, 0xaa, - 0x00, 0xaa, 0x00, - 0x00, 0xaa, 0xaa, - 0xaa, 0x00, 0x00, - 0xaa, 0x00, 0xaa, - 0xaa, 0xaa, 0x00, - 0xaa, 0xaa, 0xaa, - 0x55, 0x55, 0x55, - 0xcc, 0xcc, 0xcc, - 0x00, 0x00, 0xff, - 0x00, 0xff, 0x00, - 0xff, 0x00, 0x00, - 0xff, 0xff, 0x00, - 0xff, 0x00, 0xff, - 0xff, 0xff, 0xff - }; +static char defpalette[] = { /* Default VGA palette */ + 0x00, 0x00, 0x00, + 0x00, 0x00, 0xaa, + 0x00, 0xaa, 0x00, + 0x00, 0xaa, 0xaa, + 0xaa, 0x00, 0x00, + 0xaa, 0x00, 0xaa, + 0xaa, 0xaa, 0x00, + 0xaa, 0xaa, 0xaa, + 0x55, 0x55, 0x55, + 0xcc, 0xcc, 0xcc, + 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, + 0xff, 0x00, 0x00, + 0xff, 0xff, 0x00, + 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff + }; #endif #ifndef ALTERNATE_VIDEO_METHOD @@ -202,20 +213,20 @@ int vp[SCREENPLANES] = { 8, 4, 2, 1 }; #endif int vp2[SCREENPLANES] = { 1, 2, 4, 8 }; -STATIC_VAR struct planar_cell_struct planecell; -STATIC_VAR struct overview_planar_cell_struct planecell_O; +static struct planar_cell_struct planecell; +static struct overview_planar_cell_struct planecell_O; -/* STATIC_VAR int g_attribute; */ /* Current attribute to use */ +/* static int g_attribute; */ /* Current attribute to use */ void -vga_get_scr_size() +vga_get_scr_size(void) { CO = 80; LI = 29; } void -vga_backsp() +vga_backsp(void) { int col, row; @@ -228,8 +239,7 @@ vga_backsp() } void -vga_clear_screen(colour) -int colour; +vga_clear_screen(int colour) { unsigned long __far *pch; unsigned j; @@ -250,23 +260,23 @@ int colour; vga_gotoloc(0, 0); /* is this needed? */ } -void vga_cl_end(col, row) /* clear to end of line */ -int col, row; +/* clear to end of line */ +void vga_cl_end(int col, int row) { int count; /* * This is being done via character writes. * This should perhaps be optimized for speed by using VGA write - * mode 2 methods as did clear_screen() + * mode 2 methods as did term_clear_screen() */ for (count = col; count < (CO - 1); ++count) { vga_WriteChar(' ', count, row, BACKGROUND_VGA_COLOR); } } -void vga_cl_eos(cy) /* clear to end of screen */ -int cy; +/* clear to end of screen */ +void vga_cl_eos(int cy) { int count; @@ -280,15 +290,14 @@ int cy; } void -vga_tty_end_screen() +vga_term_end_screen(void) { vga_clear_screen(BACKGROUND_VGA_COLOR); vga_SwitchMode(MODETEXT); } void -vga_tty_startup(wid, hgt) -int *wid, *hgt; +vga_term_startup(int *wid, int *hgt) { /* code to sense display adapter is required here - MJA */ @@ -325,18 +334,15 @@ int *wid, *hgt; */ void -vga_xputs(s, col, row) -const char *s; -int col, row; +vga_xputs(const char *s, int col, int row) { if (s != (char *) 0) { vga_WriteStr((char *) s, strlen(s), col, row, g_attribute); } } -void vga_xputc(ch, attr) /* write out character (and attribute) */ -char ch; -int attr; +/* write out character (and attribute) */ +void vga_xputc(char ch, int attr) { int col, row; @@ -357,23 +363,32 @@ int attr; vga_gotoloc(col, row); } -#if defined(USE_TILES) +#if defined(TILES_IN_GLYPHMAP) +/* Place tile represent. a glyph at current location */ void -vga_xputg(glyphnum, ch, - special) /* Place tile represent. a glyph at current location */ -int glyphnum; -int ch; -unsigned special; /* special feature: corpse, invis, detected, pet, ridden - - hack.h */ +vga_xputg(const glyph_info *glyphinfo, + const glyph_info *bkglyphinfo) { + int glyphnum = glyphinfo->glyph; + uint32 ch = glyphinfo->ttychar; + unsigned special = glyphinfo->gm.glyphflags; int col, row; int attr; int ry; +#ifdef ENHANCED_SYMBOLS + if (psf_font != NULL && SYMHANDLING(H_UTF8) && glyphinfo->gm.u + && glyphinfo->gm.u->utf8str) { + ch = glyphinfo->gm.u->utf32ch; + } +#endif + /* If statue glyph, map to the generic statue */ +#if 0 if (GLYPH_STATUE_OFF <= glyphnum && glyphnum < GLYPH_STATUE_OFF + NUMMONS) { glyphnum = objnum_to_glyph(STATUE); } +#endif row = currow; col = curcol; @@ -386,14 +401,29 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - map[ry][col].special = special; attr = (g_attribute == 0) ? attrib_gr_normal : g_attribute; map[ry][col].attr = attr; + map[ry][col].tileidx = glyphinfo->gm.tileidx; + if (bkglyphinfo->framecolor != NO_COLOR) { + map[ry][col].framecolor = bkglyphinfo->framecolor; + } + if (iflags.traditional_view) { - vga_WriteChar((unsigned char) ch, col, row, attr); + vga_WriteChar(ch, col, row, attr); } else if (!iflags.over_view) { if ((col >= clipx) && (col <= clipxmax)) { read_planar_tile(glyphnum, &planecell); if (map[ry][col].special) decal_planar(&planecell, special); vga_DisplayCell(&planecell, col - clipx, row); + if (bkglyphinfo->framecolor != NO_COLOR) { + int curtypbak = cursor_type; + int cclr = cursor_color; + + cursor_type = CURSOR_FRAME; + cursor_color = bkglyphinfo->framecolor; + vga_DrawCursor(); + cursor_type = curtypbak; + cursor_color = cclr; + } } } else { read_planar_tile_O(glyphnum, &planecell_O); @@ -403,7 +433,7 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - ++col; vga_gotoloc(col, row); } -#endif /* USE_TILES */ +#endif /* TILES_IN_GLYPHMAP */ /* * Cursor location manipulation, and location information fetching @@ -411,26 +441,23 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - * These include: * * vga_gotoloc(x,y) - Moves the "cursor" on screen to the specified x - * and y character cell location. This routine + * and y character cell location. This routine * determines the location where screen writes * will occur next, it does not change the location * of the player on the NetHack level. */ void -vga_gotoloc(col, row) -int col, row; +vga_gotoloc(int col, int row) { curcol = min(col, CO - 1); /* protection from callers */ currow = min(row, LI - 1); } -#if defined(USE_TILES) && defined(CLIPPING) +#if defined(TILES_IN_GLYPHMAP) && defined(CLIPPING) static void -vga_cliparound(x, y) -int x, y; +vga_cliparound(int x, int y UNUSED) { - extern boolean restoring; int oldx = clipx; if (!iflags.tile_view || iflags.over_view || iflags.traditional_view) @@ -444,15 +471,14 @@ int x, y; clipx = clipxmax - (viewport_size - 1); } if (clipx != oldx) { - if (on_level(&u.uz0, &u.uz) && !restoring) + if (on_level(&u.uz0, &u.uz) && !program_state.restoring) /* (void) doredraw(); */ vga_redrawmap(1); } } -STATIC_OVL void -vga_redrawmap(clearfirst) -boolean clearfirst; +static void +vga_redrawmap(boolean clearfirst) { int x, y, t; unsigned long __far *pch; @@ -481,49 +507,47 @@ boolean clearfirst; #endif if (iflags.traditional_view) { if (!(clearfirst && map[y][x].ch == S_stone)) - vga_WriteChar((unsigned char) map[y][x].ch, x, + vga_WriteChar(map[y][x].ch, x, y + TOP_MAP_ROW, map[y][x].attr); } else { t = map[y][x].glyph; - if (!(clearfirst && t == cmap_to_glyph(S_stone))) { - if (!iflags.over_view) { - read_planar_tile(t, &planecell); - if (map[y][x].special) - decal_planar(&planecell, map[y][x].special); - vga_DisplayCell(&planecell, x - clipx, y + TOP_MAP_ROW); - } else { - read_planar_tile_O(t, &planecell_O); - vga_DisplayCell_O(&planecell_O, x, y + TOP_MAP_ROW); - } + if (!iflags.over_view) { + read_planar_tile(t, &planecell); + if (map[y][x].special) + decal_planar(&planecell, map[y][x].special); + vga_DisplayCell(&planecell, x - clipx, y + TOP_MAP_ROW); + } else { + read_planar_tile_O(t, &planecell_O); + vga_DisplayCell_O(&planecell_O, x, y + TOP_MAP_ROW); } } } } -#endif /* USE_TILES && CLIPPING */ +#endif /* TILES_IN_GLYPHMAP && CLIPPING */ void -vga_userpan(left) -boolean left; +vga_userpan(enum vga_pan_direction pan) { int x; - /* pline("Into userpan"); */ + /* pline("Into userpan"); */ if (iflags.over_view || iflags.traditional_view) return; - if (left) + if (pan == pan_left) x = min(COLNO - 1, clipxmax + 10); - else + else if (pan == pan_right) x = max(0, clipx - 10); + else + return; vga_cliparound(x, 10); /* y value is irrelevant on VGA clipping */ positionbar(); vga_DrawCursor(); } void -vga_overview(on) -boolean on; +vga_overview(boolean on) { - /* vga_HideCursor(); */ + /* vga_HideCursor(); */ if (on) { iflags.over_view = TRUE; clipx = 0; @@ -538,12 +562,11 @@ boolean on; } void -vga_traditional(on) -boolean on; +vga_traditional(boolean on) { - /* vga_HideCursor(); */ + /* vga_HideCursor(); */ if (on) { - /* switch_symbols(FALSE); */ + /* switch_symbols(FALSE); */ iflags.traditional_view = TRUE; clipx = 0; clipxmax = CO - 1; @@ -559,7 +582,7 @@ boolean on; } void -vga_refresh() +vga_refresh(void) { positionbar(); vga_redrawmap(1); @@ -567,7 +590,7 @@ vga_refresh() } #ifdef SCROLLMAP -STATIC_OVL void +static void vga_scrollmap(left) boolean left; { @@ -631,9 +654,7 @@ boolean left; #endif /* SCROLLMAP */ static void -read_planar_tile(glyph, cell) -unsigned glyph; -struct planar_cell_struct *cell; +read_planar_tile(unsigned glyph, struct planar_cell_struct *cell) { unsigned char indexes[TILE_Y][TILE_X]; unsigned plane, y, byte, bit; @@ -657,9 +678,7 @@ struct planar_cell_struct *cell; } static void -read_planar_tile_O(glyph, cell) -unsigned glyph; -struct overview_planar_cell_struct *cell; +read_planar_tile_O(unsigned glyph, struct overview_planar_cell_struct *cell) { unsigned char indexes[TILE_Y][TILE_X]; unsigned plane, y, bit; @@ -681,42 +700,37 @@ struct overview_planar_cell_struct *cell; } static void -read_tile_indexes(glyph, indexes) -unsigned glyph; -unsigned char (*indexes)[TILE_X]; +read_tile_indexes(unsigned glyph, unsigned char (*indexes)[TILE_X]) { const struct TileImage *tile; unsigned x, y; + int tilenum; /* We don't have enough colors to show the statues */ - if (glyph >= GLYPH_STATUE_OFF) { + if (glyph_is_statue(glyph)) { glyph = GLYPH_OBJ_OFF + STATUE; } /* Get the tile from the image */ - tile = get_tile(glyph2tile[glyph]); + tilenum = glyphmap[glyph].tileidx; + tile = get_tile(tilenum); /* Map to a 16 bit palette; assume colors laid out as in default tileset */ - memset(indexes, 0, sizeof(indexes)); for (y = 0; y < TILE_Y && y < tile->height; ++y) { for (x = 0; x < TILE_X && x < tile->width; ++x) { + static const unsigned char color_to_16[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 14, 15, + 13, 1, 1, 1, 1, 15, 1, 15, 15, 15, 15, 1, 0 + }; unsigned i = tile->indexes[y * tile->width + x]; - if (i == 28) { - i = 0; - } else if (i == 16) { - i = 13; - } else if (i > 15) { - i = 15; - } + i = (i < SIZE(color_to_16)) ? color_to_16[i] : 15; indexes[y][x] = i; } } } -STATIC_OVL void -decal_planar(gp, special) -struct planar_cell_struct *gp; -unsigned special; +static void +decal_planar(struct planar_cell_struct *gpcs UNUSED, unsigned special) { if (special & MG_CORPSE) { } else if (special & MG_INVIS) { @@ -737,8 +751,9 @@ void vga_Init(void) { int i; + const char *font_name; -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP const char *tile_file; int tilefailure = 0; /* @@ -764,7 +779,7 @@ vga_Init(void) iflags.over_view = FALSE; CO = 80; LI = 25; - /* clear_screen() */ /* not vga_clear_screen() */ + /* term_clear_screen() */ /* not vga_clear_screen() */ return; } #endif @@ -778,7 +793,7 @@ vga_Init(void) windowprocs.win_cliparound = vga_cliparound; /* vga_NoBorder(BACKGROUND_VGA_COLOR); */ /* Not needed after palette mod */ -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP paletteptr = get_palette(); iflags.tile_view = TRUE; iflags.over_view = FALSE; @@ -787,8 +802,22 @@ vga_Init(void) #endif vga_SetPalette(paletteptr); g_attribute = attrib_gr_normal; - font = vga_FontPtrs(); - clear_screen(); + rom_font = (unsigned char __far *) vga_FontPtrs(); + + /* Load an external font if requested */ + font_name = "ter-u16v.psf"; + if (iflags.wc_font_map != NULL && iflags.wc_font_map[0] != '\0') { + font_name = iflags.wc_font_map; + } + free_font(psf_font); + psf_font = load_font(font_name); + if (psf_font->width != 8 || psf_font->height != 16) { + raw_printf("VGA mode only supports 8x16 fonts"); + free_font(psf_font); + psf_font = NULL; + } + + term_clear_screen(); clipx = 0; clipxmax = clipx + (viewport_size - 1); } @@ -847,16 +876,16 @@ vga_Finish(void) * to a more standard values - MJA 94/04/23. * */ -STATIC_OVL void +static void vga_NoBorder(int bc) { - union REGS regs; + union REGS regs; - regs.h.ah = (char)0x10; - regs.h.al = (char)0x01; - regs.h.bh = (char)bc; - regs.h.bl = 0; - (void) int86(VIDEO_BIOS, ®s, ®s); + regs.h.ah = (char)0x10; + regs.h.al = (char)0x01; + regs.h.bh = (char)bc; + regs.h.bl = 0; + (void) int86(VIDEO_BIOS, ®s, ®s); } #endif @@ -887,7 +916,7 @@ vga_FontPtrs(void) } /* - * This will verify the existance of a VGA adapter on the machine. + * This will verify the existence of a VGA adapter on the machine. * Video function call 0x1a returns 0x1a in AL if successful, and * returns the following values in BL for the active display: * @@ -896,7 +925,7 @@ vga_FontPtrs(void) * 0xB=MCGA(mono-monitor), 0xC=MCGA(color-monitor), 0xFF=unknown) */ int -vga_detect() +vga_detect(void) { union REGS regs; @@ -906,9 +935,9 @@ vga_detect() /* * debug * - * printf("vga_detect returned al=%02x, bh=%02x, bl=%02x\n", - * (int)regs.h.al, (int)regs.h.bh, (int)regs.h.bl); - * getch(); + * printf("vga_detect returned al=%02x, bh=%02x, bl=%02x\n", + * (int)regs.h.al, (int)regs.h.bh, (int)regs.h.bl); + * getch(); */ if ((int) regs.h.al == 0x1a) { if (((int) regs.h.bl == 8) || ((int) regs.h.bl == 7)) { @@ -918,30 +947,43 @@ vga_detect() return 0; } +extern int curframecolor; /* video.c */ + /* * Write character 'ch', at (x,y) and * do it using the colour 'colour'. * */ static void -vga_WriteChar(chr, col, row, colour) -int chr, col, row, colour; +vga_WriteChar(uint32 chr, int col, int row, int colour) { int i; int x, pixy; char __far *cp; - unsigned char __far *fp = font; unsigned char fnt; int actual_colour = vgacmap[colour]; + int bgcolor; int vplane; + unsigned char bitmap[ROWS_PER_CELL]; + + /* if (chr < ' ') chr = ' '; */ /* assumes ASCII set */ + vga_GetBitmap(chr, bitmap); + + if (curframecolor != NO_COLOR) + bgcolor = vgacmap[curframecolor]; + else + bgcolor = BACKGROUND_VGA_COLOR; + + if (inversed) { + int tmpc = actual_colour; + actual_colour = bgcolor; + bgcolor = tmpc; + } x = min(col, (CO - 1)); /* min() used protection from callers */ pixy = min(row, (LI - 1)) * 16; /* assumes 8 x 16 char set */ - /* if (chr < ' ') chr = ' '; */ /* assumes ASCII set */ - - chr = chr << 4; - vplane = ~actual_colour & ~BACKGROUND_VGA_COLOR & 0xF; + vplane = ~actual_colour & ~bgcolor & 0xF; if (vplane != 0) { egawriteplane(vplane); for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { @@ -949,25 +991,25 @@ int chr, col, row, colour; WRITE_ABSOLUTE(cp, (char) 0x00); } } - vplane = actual_colour & ~BACKGROUND_VGA_COLOR & 0xF; + vplane = actual_colour & ~bgcolor & 0xF; if (vplane != 0) { egawriteplane(vplane); for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { cp = screentable[pixy + i] + x; - fnt = READ_ABSOLUTE((fp + chr + i)); + fnt = bitmap[i]; WRITE_ABSOLUTE(cp, (char) fnt); } } - vplane = ~actual_colour & BACKGROUND_VGA_COLOR & 0xF; + vplane = ~actual_colour & bgcolor & 0xF; if (vplane != 0) { egawriteplane(vplane); for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { cp = screentable[pixy + i] + x; - fnt = ~READ_ABSOLUTE((fp + chr + i)); + fnt = ~bitmap[i]; WRITE_ABSOLUTE(cp, (char) fnt); } } - vplane = actual_colour & BACKGROUND_VGA_COLOR & 0xF; + vplane = actual_colour & bgcolor & 0xF; if (vplane != 0) { egawriteplane(vplane); for (i = 0; i < MAX_ROWS_PER_CELL; ++i) { @@ -978,6 +1020,28 @@ int chr, col, row, colour; egawriteplane(15); } +/* + * Given the character, return the bitmap that displays that character + */ +static void +vga_GetBitmap(uint32 chr, unsigned char *bitmap) +{ + unsigned i; + + if (psf_font) { + unsigned char const *fp = get_font_glyph(psf_font, chr, + SYMHANDLING(H_UTF8)); + for (i = 0; i < ROWS_PER_CELL; ++i) { + bitmap[i] = fp[i]; + } + } else { + unsigned char const __far *fp = rom_font + chr * ROWS_PER_CELL; + for (i = 0; i < ROWS_PER_CELL; ++i) { + bitmap[i] = READ_ABSOLUTE((fp + i)); + } + } +} + /* * This is the routine that displays a high-res "cell" pointed to by 'gp' * at the desired location (col,row). @@ -988,9 +1052,7 @@ int chr, col, row, colour; * */ static void -vga_DisplayCell(gp, col, row) -struct planar_cell_struct *gp; -int col, row; +vga_DisplayCell(struct planar_cell_struct *gpcs, int col, int row) { int i, pixx, pixy; char __far *tmp_s; /* source pointer */ @@ -1005,10 +1067,10 @@ int col, row; tmp_d = screentable[i + pixy]; tmp_d += pixx; /* - * memcpy((void *)tmp,(void *)gp->plane[vplane].image[i], + * memcpy((void *)tmp,(void *)gpcs->plane[vplane].image[i], * BYTES_PER_CELL); */ - tmp_s = gp->plane[vplane].image[i]; + tmp_s = gpcs->plane[vplane].image[i]; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); ++tmp_s; ++tmp_d; @@ -1019,9 +1081,7 @@ int col, row; } static void -vga_DisplayCell_O(gp, col, row) -struct overview_planar_cell_struct *gp; -int col, row; +vga_DisplayCell_O(struct overview_planar_cell_struct *gpcs, int col, int row) { int i, pixx, pixy; char __far *tmp_s; /* source pointer */ @@ -1036,10 +1096,10 @@ int col, row; tmp_d = screentable[i + pixy]; tmp_d += pixx; /* - * memcpy((void *)tmp,(void *)gp->plane[vplane].image[i], + * memcpy((void *)tmp,(void *)gpcs->plane[vplane].image[i], * BYTES_PER_CELL); */ - tmp_s = gp->plane[vplane].image[i]; + tmp_s = gpcs->plane[vplane].image[i]; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); } } @@ -1052,9 +1112,7 @@ int col, row; * */ static void -vga_WriteStr(s, len, col, row, colour) -char *s; -int len, col, row, colour; +vga_WriteStr(char *s, int len, int col, int row, int colour) { unsigned char *us; int i = 0; @@ -1066,7 +1124,7 @@ int len, col, row, colour; i = 0; us = (unsigned char *) s; while ((*us != 0) && (i < len) && (col < (CO - 1))) { - vga_WriteChar(*us, col, row, colour); + vga_WriteChar((uchar) *us, col, row, colour); ++us; ++i; ++col; @@ -1080,8 +1138,7 @@ int len, col, row, colour; * */ static void -vga_SetPalette(p) -const struct Pixel *p; +vga_SetPalette(const struct Pixel *p) { union REGS regs; int i; @@ -1102,6 +1159,16 @@ const struct Pixel *p; } } +void +vga_hide_cursor(void) +{ +} + +void +vga_show_cursor(void) +{ +} + /*static unsigned char colorbits[]={0x01,0x02,0x04,0x08}; */ /* wrong */ static unsigned char colorbits[] = { 0x08, 0x04, 0x02, 0x01 }; @@ -1116,20 +1183,24 @@ static unsigned char colorbits[] = { 0x08, 0x04, 0x02, 0x01 }; static unsigned char pbar[COLNO]; void -vga_update_positionbar(posbar) -char *posbar; +vga_update_positionbar(char *posbar) { - char *p = pbar; + char *p = (char *) pbar; if (posbar) while (*posbar) *p++ = *posbar++; *p = 0; } -STATIC_OVL void -positionbar() +#ifdef __DJGPP__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif /* __DJGPP__ */ + +static void +positionbar(void) { - char *posbar = pbar; + char *posbar = (char *) pbar; int feature, ucol; int k, y, colour, row; char __far *pch; @@ -1227,15 +1298,21 @@ positionbar() #endif } +#ifdef __DJGPP__ +#pragma GCC diagnostic pop +#endif /* __DJGPP__ */ + void -vga_special(chr, col, color) -int chr, col, color; +vga_special(int chr, int col, int color) { int i, y, pixy; char __far *tmp_d; /* destination pointer */ int vplane; char fnt; char bits[SCREENPLANES][ROWS_PER_CELL]; + unsigned char bitmap[ROWS_PER_CELL]; + + vga_GetBitmap(chr, bitmap); pixy = PBAR_ROW * MAX_ROWS_PER_CELL; for (vplane = 0; vplane < SCREENPLANES; ++vplane) { @@ -1244,7 +1321,7 @@ int chr, col, color; for (i = 0; i < ROWS_PER_CELL; ++i) { tmp_d = screentable[y++] + col; bits[vplane][i] = READ_ABSOLUTE(tmp_d); - fnt = READ_ABSOLUTE((font + ((chr << 4) + i))); + fnt = READ_ABSOLUTE((rom_font + ((chr << 4) + i))); if (colorbits[vplane] & color) bits[vplane][i] |= fnt; else @@ -1261,7 +1338,6 @@ int chr, col, color; } egawriteplane(15); } - #endif /*POSITIONBAR*/ #ifdef SIMULATE_CURSOR @@ -1270,14 +1346,14 @@ static struct planar_cell_struct undercursor; static struct planar_cell_struct cursor; void -vga_DrawCursor() +vga_DrawCursor(void) { int i, pixx, pixy, x, y, p; char __far *tmp1; char __far *tmp2; unsigned char first, second; - /* char on[2] = {0xFF,0xFF}; */ - /* char off[2] = {0x00,0x00}; */ + /* char on[2] = {0xFF,0xFF}; */ + /* char off[2] = {0x00,0x00}; */ boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); @@ -1485,7 +1561,7 @@ vga_DrawCursor() } void -vga_HideCursor() +vga_HideCursor(void) { int i, pixx, pixy, x, y; char __far *tmp1; diff --git a/sys/os2/.gitattributes b/sys/os2/.gitattributes deleted file mode 100644 index cf4a072a6..000000000 --- a/sys/os2/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.* NHSUBST -* NH_filestag=(file%s_for_OS/2_version_-_untested_for_3.6.6) diff --git a/sys/os2/Install.os2 b/sys/os2/Install.os2 deleted file mode 100644 index 672c5d9e8..000000000 --- a/sys/os2/Install.os2 +++ /dev/null @@ -1,276 +0,0 @@ - Instructions for compiling and installing NetHack 3.4 - on an OS/2 system - ===================================================== - Timo Hakulinen - Last revision: 29 October 1996 - -0. Read this entire file before starting, and come back to the Notes below if - you have any problems. - -1. Make sure all the NetHack files are in the appropriate directory - structure. You should have a top directory (e.g. nh33, or whatever you - like) with subdirectories dat, doc, include, src, util, sys\share, - sys\os2, and win\tty. You may have other subdirectories under sys and - win, but they will not affect compilation for an OS/2 system. If you do - not follow this structure, the makefile will not function properly. The - .c files for the main program belong in src, those for utility programs in - util, and OS/2-specific ones in sys\os2. All the .h files belong in - include, the documentation in doc, and assorted data files in dat. There - are also some necessary files in sys\share (pc*.c, random.c, dgn_*.*, - lev_*.*). A more detailed explanation of the directory structure is found - in file Files, which should be in the top directory. - - If you downloaded or ftp'd the sources from a UNIX system, the lines may - end in UNIX-style newlines instead of the carriage return and line feed - pairs used by DOS and OS/2. You'll have to convert them (with a utility - like Rahul Dhesi's "flip"). Also, every file should end with a carriage - return / line feed pair, because Microsoft C has had a habit of ignoring - the last line of each file otherwise. Besides, even editing UNIX-style - files with DOS editors is often a royal pain. - -2. The makefile for OS/2, Makefile.os2, is found in directory sys\os2. Copy - it to directory src and rename it Makefile. From now on, Makefile.os2 - will be referred to as "the makefile" in this document. - - The makefile supports the following make utilities: - - NDMAKE a public domain make utility for DOS by Don Kneller - NMAKE make shipped with Microsoft languages and IBM C Set/2 - DMAKE a public domain make for DOS and OS/2 by Dennis Vadura - - Both NDMAKE and DMAKE are available at major archive sites. The - following compilers are supported: - - compiler: runs in: compiles for: - - Microsoft C 5.1 DOS / OS/2 1.0-Warp OS/2 1.x - Microsoft 6.0A (see note 5) - " - - " - - IBM C Set/2 1.00, Toolkit/2 2.00 OS/2 2.x, Warp OS/2 2.x, Warp - IBM CSet++ 2.00 OS/2 2.x, Warp OS/2 2.x, Warp - GCC emx 0.8f (see note 6) OS/2 2.x, Warp OS/2 2.x, Warp - - Note that code compiled for OS/2 versions 1.0-1.3 runs unmodified in OS/2 - versions 2.0 and up. In principle it should be possible to cross compile - NetHack 3.6 for OS/2 in DOS using NDMAKE and MSC, but this is not - recommended (see note 3). - - If you're using some other compiler than one listed above, you will have - to adapt the makefile to your needs. In particular, change the CC, - CFLAGS, LINK, and LFLAGS macros to your C compiler's and linker's liking. - See the makefile for more information. - - If you are going to be constructing Fred Fish's termcap library, you'll - need Makefile.lib in sys\share (see note 4). - -3. Go to the include subdirectory. First edit config.h according to the - comments to match your system and desired set of features. In particular, - make sure that OS2 is defined, and that UNIX, HACKDIR, and COMPRESS are - *not* defined. If you want to try out the new DLB data file library - scheme, uncomment DLB. Note that although the makefile contains some - support for this scheme, it's new in NetHack 3.3 and hasn't been tested. - If your compiler is ANSI compliant (like practically all OS/2 compilers - are), it's probable that nothing else needs to be configured in config.h. - - Next look at os2conf.h. This file shouldn't need much changing. If you - want to use the hardcoded OS/2 system definitions in def_os2.h instead of - the compiler's standard headers, comment out OS2_USESYSHEADERS. This may - become necessary if you are using a compiler which doesn't come with - proper system headers by default. In this case you may have to edit the - definitions there, because every compiler has its own way of declaring - the necessary system functions and data structures. In general you - should prefer the compiler's offerings, if possible. - - If you are going to compile the game on an HPFS drive, uncomment OS2_HPFS, - which enables the use of longer file names during compilation. The - generated executable will only use file names compatible with FAT drives, - however. - - If you are using a 32 bit compiler other than GCC emx 0.8f or C Set/2 in - OS/2 2.x, force OS2_32BITAPI to be defined. Otherwise it is defined only - for the above mentioned compilers. - - If you are not going to include random.c, because you are using the - random number generator provided by your compiler, you will need to - comment out RANDOM. - - If you want to muck with different termcap settings, uncomment TERMLIB to - enable the use of termcap routines (see note 4). This is not necessary to - create a fully functional game, however. - -4. If you are using another compiler than MSC, GCC, or IBM C Set/2, you may - want to look through system.h in the include directory. This file matches - the return and parameter types for system calls and library routines with - various flavors of compilers and operating systems. Leaving this file - alone is unlikely to cause problems, but if you get compile errors with - any functions in the standard library, it's worth checking the - declarations there. - -5. If you want to change the high score list behavior, examine the top of - topten.c, in the src directory. You may want to change the definitions of - PERSMAX, POINTSMIN, and ENTRYMAX. - -6. Go to the src directory and edit the top of the makefile. Be sure that - the directory you want the game installed to actually exists. - - You'll need nroff and/or TeX/LaTeX to do the files in doc. If you don't - have either of these, you can skip it. - - If you elected not to use the high quality BSD random number routines by - commenting out RANDOM in os2conf.h, comment out (or set equal to nothing) - the RANDOM macro in the makefile. - - If you elected to use Fred Fish's termcap library (bundled in as - termcap.uu in directory sys\share), you will have to generate termlib.lib - from those sources by typing "make -f makefile.lib termlib.lib". You must - set the TERMLIB option in the makefile to link the resulting termlib.lib - into the game. - - If you are recompiling after patching your sources, or if you got your - files from somewhere other than the official distribution, "touch - makedefs.c" to ensure that certain files (onames.h and pm.h) are remade, - lest potentially troublesome time stamps fool make. - - If you have lex and yacc programs, or the equivalent flex and bison - programs, you can set up the makefile to generate the appropriate .h and - .c files from their .l and .y counterparts whenever you recompile. This - is done by changing the do_yacc and do_lex targets in the makefile to - depend on targets yacc_act and lex_act instead of yacc_cpy and lex_cpy. - Otherwise the makefile will copy pre-generated yacc and lex output files - dgn_*.* and lev_*.* from directory sys\share to util and include. - - Now, enter "make all", and take a siesta; your computer will be occupied - for a fair amount of time. If all goes well, you will get an executable. - -7. All the support data files should have been copied to the game directory - by the make process. Here is the complete list in alphabetical order of - all the files that should have gotten there during a full build: - - Arc-fila.lev Arc-filb.lev Arc-goal.lev Arc-loca.lev Arc-strt.lev - Bar-fila.lev Bar-filb.lev Bar-goal.lev Bar-loca.lev Bar-strt.lev - Cav-fila.lev Cav-filb.lev Cav-goal.lev Cav-loca.lev Cav-strt.lev - Hea-fila.lev Hea-filb.lev Hea-goal.lev Hea-loca.lev Hea-strt.lev - Kni-fila.lev Kni-filb.lev Kni-goal.lev Kni-loca.lev Kni-strt.lev - Mon-fila.lev Mon-filb.lev Mon-goal.lev Mon-loca.lev Mon-strt.lev - Pri-fila.lev Pri-filb.lev Pri-goal.lev Pri-loca.lev Pri-strt.lev - Ran-fila.lev Ran-filb.lev Ran-goal.lev Ran-loca.lev Ran-strt.lev - Rog-fila.lev Rog-filb.lev Rog-goal.lev Rog-loca.lev Rog-strt.lev - Sam-fila.lev Sam-filb.lev Sam-goal.lev Sam-loca.lev Sam-strt.lev - Tou-fila.lev Tou-filb.lev Tou-goal.lev Tou-loca.lev Tou-strt.lev - Val-fila.lev Val-filb.lev Val-goal.lev Val-loca.lev Val-strt.lev - Wiz-fila.lev Wiz-filb.lev Wiz-goal.lev Wiz-loca.lev Wiz-strt.lev - air.lev asmodeus.lev astral.lev baalz.lev bigrm-1.lev - bigrm-2.lev bigrm-3.lev bigrm-4.lev bigrm-5.lev castle.lev - cmdhelp data dungeon earth.lev fakewiz1.lev - fakewiz2.lev fire.lev help hh history - juiblex.lev knox.lev license medusa-1.lev medusa-2.lev - minefill.lev minend-1.lev minend-2.lev minetn-1.lev minetn-2.lev - nethack.cmd nethack.cnf nethack.exe nethack.ico opthelp - options oracle.lev oracles orcus.lev quest.dat - recover.exe rumors sanctum.lev soko1-1.lev soko1-2.lev - soko2-1.lev soko2-2.lev soko3-1.lev soko3-2.lev soko4-1.lev - soko4-2.lev tower1.lev tower2.lev tower3.lev valley.lev - water.lev wizard1.lev wizard2.lev wizard3.lev wizhelp - - Yes. It's 112 files for a full featured NetHack 3.4. If any of the files - are missing, try to rerun make. If that doesn't help, you'll have to try - to decipher the makefile to find out how to manually create the missing - files. These kinds of troubles shouldn't happen except for two reasons: - You've run out of disk space while compiling or your make utility doesn't - understand the makefile properly for some reason. In either case, you - should get some warnings from the make, though. - - If you have old record, logfile, or news files in the game directory, they - are not overwritten. Of course, old records from NetHack 3.1 and 3.2 are - not worth keeping with 3.4, since these games are really quite different. - - Edit file nethack.cnf in the game directory to reflect your particular - setup and personal preferences, following the comments there. More info - about settable options can be found in the file opthelp and the guidebook. - - If you compiled in the TERMLIB feature, also move the sys\share\termcap - file to your game directory. - -8. If you'll be running NetHack from a different subdirectory, you will want - to "set HACKDIR=c:\games\nh33" (or whatever directory you want to use). - Add it to your config.sys, if you'll be playing often. - - You can also create a special NetHack entry in your Presentation Manager / - Workplace Shell desktop. This will use the included NetHack icon. - The following is a sample program description for OS/2 1.3 desktop, but - it's similar for OS/2 2.0: - - Program title: NetHack 3.4 - Path and file name: c:\games\nh33\nethack.cmd - Parameters: - Working directory: c:\games\nh33 - Program type: OS/2 Full screen - - Naturally you must fill in your own game directory and parameters if you - want to set any. The program type can be either OS/2 Full screen or OS/2 - Windowed. Note that you should set the executable path to use the .cmd - file generated by the makefile. This file generates an extra pause after - the program exit, because otherwise you wouldn't get to see the high score - list upon quitting due to PM/WPS automatically closing the program window. - When starting NetHack normally from OS/2 command prompt, the command - processor starts nethack.exe instead, so no extra pause is generated. - -9. If you want to clear up the temporary files and objects created by the - compilation process, you may issue "make spotless". This will return your - source tree to near-distribution condition. Naturally, it will not affect - your newly built game files in any way. - -10. Play NetHack. If it works, you're done! - - -Notes ------ - -1) Save-files and bones-files from previous versions will not work with - NetHack 3.4. Don't bother trying to keep them. - -2) To install an update of NetHack after changing something, enter "make" - from the src directory. If you add, delete, or reorder monsters or - objects, or you change the format of saved level files, delete any save - and bones files. (Trying to use such files sometimes produces amusing - confusions on the game's part, but usually crashes.) - -3) When cross-compiling for OS/2 in DOS, NDMAKE is the best choice because it - requires the least RAM for itself. Note however, that cross-compilation - in DOS is discouraged, because it is considered obsolete (OS/2 is really - a much better place to compile). If you still want to try, here are some - suggestions: - - During linking, Microsoft linker will need temporary storage space. Make - sure you have about 1 MB of free disk where ever you have defined your - temporary storage. It is also a good idea to compile with as much free - RAM as possible. It may otherwise get crowded with the bigger, more - complex source files (compiler bombs with "out of heap space" or similar). - If this happens, strip your configuration, zap TSR's, get a better memory - manager etc. - -4) The file sys\share\termcap.uu is the fixed version of the Fred Fish - termcap library. You will need to run a uudecode utility on it to - generate the file termcap.zip. termcap.zip contains several files of - termcap routines. Using them with NetHack involves very little knowledge - of the UNIX concept of a termcap database; mostly you need to know enough - to set a TERM environment variable. You can unzip termcap.zip in the - sys\share directory, but if you are going to use it, it is probably best - to unzip a copy in the src directory. That way you will not miss copying - any files over. Wherever you unzip it, get rid of the included makefile - since a better version has been provided as Makefile.lib. After creating - the termcap library file termlib.lib, copy it to src before compiling the - game main source. - -5) When compiling with MSC 6.0, the maintenance version 6.0A should be used - instead of the original 6.0, which was all too buggy to successfully build - NetHack. - -6) Note that emx 0.8f is the first version of GCC for OS/2 that can properly - compile NetHack. Earlier versions do not work, because they don't support - the 16 bit API calls of OS/2. - - GCC emx 0.8f does not currently work properly when fseek() function is - used with text files. This is well documented in the compiler's - documentation. Unfortunately NetHack uses fseek() in several places in - connection with text data. This means that some help texts may not come - out right, but no serious problems should emerge. diff --git a/sys/os2/Makefile.os2 b/sys/os2/Makefile.os2 deleted file mode 100644 index 4afcf0fdf..000000000 --- a/sys/os2/Makefile.os2 +++ /dev/null @@ -1,1790 +0,0 @@ -# NetHack 3.6 Makefile.os2 $NHDT-Date: 1432512793 2015/05/25 00:13:13 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ -# OS/2 NetHack 3.6 Makefile for OS/2 versions 1.x and 2.x -# Copyright (C) 1990, 1991, 1992, 1993, 1996 Timo Hakulinen -# -# Several compilers exist for OS/2 but, currently only GCC emx is tested -# and used for releases. make programs other than dmake are not tested. -# -# Supported compilers: GCC emx 0.9g -# -# DMAKE is required. Credit for the makefile improvements goes to Pekka Rousu. -# -# Copy this file into $(SRC) directory, rename it to "makefile" -# (important, many targets rely on it), compile and link inside -# $(SRC). If required, termcap library can be built from termcap -# sources using makefile.lib in "sys\share" directory. -# -# "GCC" refers to GCC emx only. No other ports of GCC are supported. -# Additional credits for honing GCC support for 3.2 go to Ronald -# Van Iwaarden (ron@vaniwaarden.org) and Stefan Neis (neis@cs.uni-sb.de). -# -# "OMF" is short for "Object Module Format" and refers to the -# standard OS/2 object format, which e.g. link386 uses. MSC and -# CSet/2 always produce OMF object files, and GCC can be instructed -# to produce them with proper switches (see below). -# -# "a.out" refers to Unix object file format, which is used by GCC -# in its default compilation mode. These object files must be -# linked using GCC's own linker to produce a proper OS/2 executable. -# GDB debugger shipped with GCC can only be used with a.out object -# format. -# -# Note that the default setup in this makefile is my personal setup, -# which you will have to adapt to your configuration. -# - -# -# Compiler and linker selection. -# - -#format = omf -format = a.out - -.IF $(format) == a.out -with_x11 = yes -#debug = yes -.END - - -CC = gcc # GCC - -.IF $(format) == a.out -LINK = gcc -#LINK = link386 # GCC OMF, CSet/2 -.ELSE -LINK = link386 # GCC OMF, CSet/2 -LFLAGS = /noig /stack:40000 -.END - -.IF $(with_x11) == yes -WINX11OBJ01 = $(OBJ)/Window.o -WINX11OBJ02 = $(OBJ)/dialogs.o -WINX11OBJ03 = $(OBJ)/winX.o -WINX11OBJ04 = $(OBJ)/winmap.o -WINX11OBJ05 = $(OBJ)/winmenu.o -WINX11OBJ06 = $(OBJ)/winmesg.o -WINX11OBJ07 = $(OBJ)/winmisc.o -WINX11OBJ08 = $(OBJ)/winstat.o -WINX11OBJ09 = $(OBJ)/wintext.o -WINX11OBJ10 = $(OBJ)/winval.o -WINX11OBJ11 = $(OBJ)/tile.o -X11ROOT = e:/xfree86 -WINX11CFLAGS = -DUSE_XPM -DX11_GRAPHICS \ - -I$(X11ROOT)/include -Zmtd -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -lXpm -L$(X11ROOT)/lib -lc_app -WINX11SRC = ../win/X11/Window.c ../win/X11/dialogs.c ../win/X11/winX.c \ - ../win/X11/winmap.c ../win/X11/winmenu.c ../win/X11/winmesg.c \ - ../win/X11/winmisc.c ../win/X11/winstat.c ../win/X11/wintext.c \ - ../win/X11/winval.c tile.c -WINX11OBJ = $(WINX11OBJ01) $(WINX11OBJ02) $(WINX11OBJ03) $(WINX11OBJ04) \ - $(WINX11OBJ05) $(WINX11OBJ06) $(WINX11OBJ07) $(WINX11OBJ08) \ - $(WINX11OBJ09) $(WINX11OBJ10) $(WINX11OBJ11) -WINX11VARDAT=x11tiles pet_mark.xbm rip.xpm -X11ECHO = $(CMD) @echo -.END - - - - -MAKEB = dmake -CMD = cmd /C -AB = $(@:B).c -CB = $$(@:B).c -BEG = $(CMD) " -END = " -SEP = & -P = % - -# -# Most makes execute actions automatically inside a subshell, -# which makes even the shell internals work ok. -# - -ECHO = $(CMD) @echo -RM = $(CMD) del -CP = $(CMD) copy -CAT = $(CMD) type - -# -# For those of us who have these on PC. -# - -#YACC = yacc -#LEX = lex -YACC = bison -y -LEX = flex - -# -# For extracting NetHack icon. -# - -UUDECODE = uudecode - -# -# For people with TeX and LaTeX. -# - -LATEX = latex - -# -# If you have TOUCH, some things become slightly easier. -# - -TOUCH = touch - -# -# Standard file naming for LEX and YACC output may vary in PC -# installations. These three are probably the most generally used -# names. -# - -YTABC = y_tab.c -YTABH = y_tab.h -LEXYYC = lexyy.c - -# -# Source tree base directory. -# - -NHSRC = \nethack - -# -# Source directories. Makedefs hardcodes these, don't change them. -# - -INCL = $(NHSRC)\include # NetHack include files -DAT = $(NHSRC)\dat # NetHack data files -DOC = $(NHSRC)\doc # NetHack documentation files -UTIL = $(NHSRC)\util # Utility source -SRC = $(NHSRC)\src # Main source -WIN = $(NHSRC)\win\tty # Window system specific source -WINX11 = $(NHSRC)\win\x11 # Window system specific source -SYS = $(NHSRC)\sys\os2 # System specific source -SSYS = $(NHSRC)\sys\share # Shared system files -WINSHARE= $(NHSRC)\win\share # Shared system files - -# -# Modifiable directories. Set these according to your setup and -# preferences. They must all be present prior to compilation. -# OBJ, TEMP and GAMEDIR should all preferably be separate and, -# in particular, not the same as any of the source directories. -# Note that DMAKE may dislike drive designators in paths because -# it misinterprets the colon as being part of a make rule. In that -# case, all directories have to reside on the same drive. -# - -OBJ = \tmp\obj # Object files -TEMP = \tmp\bin # Temporary files during make process -GAMEDIR = \games\nh350x11 # Game directory -PLIBP = c:\emx\lib # Protected mode C libraries -RLIBP = c:\emx\lib # Possible real mode C libraries - -# -# The game name and description. -# - -GAME = nethack -GAMEDES = "NetHack 3.6.0" - -# -# The uppermost two lines for MSC, the middle two for GCC, and -# the lowermost two for CSet/2. -# -# GCC: compile only, compiler id, object format selection, warnings, -# include file path, debug flags, ANSI conformance. -# - -CFLAGS = -c $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) -#OPT = -s -O -o -OPT = -o - -# -# Compiler warning levels. These are really for development, so -# they are commented out in general distribution to save the user -# from masses of benign warnings. If any problems arise, however, -# they may help in finding the trouble. -# -# GCC: max. reasonable GCC warning levels. Can't use -Wall, because then -# it would whine about all the zillions of unused declarations etc. -# Even with these switches you'll get a lot of warnings, but they should -# all be benign. -# - -WARN = #-W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN # GCC - -# -# GCC object format selection. The upper line for standard OS/2 OMF -# object format, the lower for Unix style a.out format. -# - -.IF $(format) == omf -GCCO = -Zomf -Zsys -.ELSE -GCCO = -.END - -# -# MSC 5.1 needs the large model first pass of the compiler. -# Not needed for later versions. -# - -BIGC = - -# -# Unset CL to avoid troubles with conflicting switches in MSC 6.0. -# - -CL = - -# -# Prepare for a debugger. -# - -.IF $(debug) == yes -CDFLAGS = -LDFLAGS = -.ELSE -CDFLAGS = -O -s -LDFLAGS = -s -.END - -# -# How to produce the most ANSI-like environment. -# - -STDC = -ansi # GCC - -# -# Possible system object files required during linking. -# - -.IF $(format) == omf -SYSOBJ = $(PLIBP)\crt0.obj $(PLIBP)\end.lib# GCC OMF -.ELSE -SYSOBJ = # MSC, GCC a.out, CSet/2 -.END - -# -# Compiler library selection. Change if necessary. -# -# GCC emx 0.9 OMF: C single-threaded libs, Unix system call alias lib, -# extra GCC lib, single threaded system lib, OS/2 API entry points. -# Note that emx changed library naming convention between 0.8 and 0.9. -# -# GCC a.out: extra GCC lib, C standard lib, extra GCC lib (again), -# OS/2 API entry points. -# - -.IF $(format) == omf -PLIBS = $(PLIBP)\st\c $(PLIBP)\st\c_app $(PLIBP)\c_alias $(PLIBP)\gcc $(PLIBP)\st\sys $(PLIBP)\os2 # GCC emx 0.9 OMF -.ELSE -PLIBS = -lgcc -lc -lgcc -los2 $(X11LIBS) # GCC a.out -.END - -# -# C libraries used by makedefs, lev_comp and dgn_comp (change if -# necessary). If compilation is done in DOS, enable the upper line -# possibly setting the library name to something else, if in OS/2, -# enable the lower line (protected mode libraries). -# - -#RLIBS = $(RLIBP)\llibcer -RLIBS = $(PLIBS) - -SRCCC = $(CC) $(CFLAGS) $(OPT) $@ $(AB) -UTILCC = $(BEG) cd $(UTIL) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) -SYSCC = $(BEG) cd $(SYS) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) -SSYSCC = $(BEG) cd $(SSYS) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) -PSYSCC = $(BEG) cd $(SSYS) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ pc$(AB) $(END) -WINCC = $(BEG) cd $(WIN) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) - -# -# Default linker skeletons. The upper six lines for everything -# that uses standard OS/2 object format (GCC OMF), The lower six -# for GCC a.out format. -# - -.IF $(format) == omf -GAMELN = $(LINK) @$(TEMP)\$(GAME).rsp -MKDFLN = $(LINK) @$(TEMP)\makedefs.rsp -LEVCLN = $(LINK) @$(TEMP)\lev_comp.rsp -DGNCLN = $(LINK) @$(TEMP)\dgn_comp.rsp -RCVRLN = $(LINK) @$(TEMP)\recover.rsp -DLBRLN = $(LINK) @$(TEMP)\dlb.rsp -.ELSE -GAMELN = $(CC) $(LDFLAGS) -o $(GAMEDIR)\$(GAME).exe @$(TEMP)\$(GAME).r $(PLIBS) $(WINX11CFLAGS) $(WINX11LIB) -MKDFLN = $(CC) $(LDFLAGS) -o $(TEMP)\makedefs.exe $(TEMP)\$(MKDFDEF) $(SYSOBJ) $(MAKEOBJS) $(PLIBS) -LEVCLN = $(CC) $(LDFLAGS) -o $(TEMP)\lev_comp.exe $(TEMP)\$(LEVCDEF) $(SYSOBJ) $(SPLEVOBJS) $(PLIBS) -DGNCLN = $(CC) $(LDFLAGS) -o $(TEMP)\dgn_comp.exe $(TEMP)\$(DGNCDEF) $(SYSOBJ) $(DGNCOMPOBJS) $(PLIBS) -RCVRLN = $(CC) $(LDFLAGS) -o $(GAMEDIR)\recover.exe $(TEMP)\$(RCVRDEF) $(SYSOBJ) $(RECOVOBJS) $(PLIBS) - DLBRLN = $(CC) $(LDFLAGS) -o $(TEMP)\dlb.exe $(TEMP)\$(DLBDEF) $(SYSOBJ) $(DLBOBJS) $(PLIBS) -.END - -# -# OS/2 module definition files for NetHack, -# makedefs, dgn_comp, lev_comp, recover, dlb. -# - -GAMEDEF = $(GAME).def -MKDFDEF = makedefs.def -LEVCDEF = lev_comp.def -DGNCDEF = dgn_comp.def -RCVRDEF = recover.def -DLBDEF = dlb.def - -# -# For compilation in DOS, enable the lower three lines and -# disable the upper three. -# - -MKDFMD = $(TEMP)\$(MKDFDEF) -LEVCMD = $(TEMP)\$(LEVCDEF) -DGNCMD = $(TEMP)\$(DGNCDEF) -#MKDFMD = -#LEVCMD = -#DGNCMD = - -# -# Optional high-quality BSD random number generation routines -# (see os2conf.h). Set to nothing if not used. -# - -RANDOM = $(OBJ)\random.o -#RANDOM = - -# -# If TERMLIB is defined in os2conf.h, comment out the upper line and -# uncomment the lower. If the termcap-library doesn't exist, use -# sys\share\makefile.lib to build it. -# - -TERMLIB = -#TERMLIB = termlib.lib - -# -# Short / long file name selection for FAT and HPFS. -# Only three files need consideration. -# - -#GUIDEBOO = Guideboo # FAT -#PATCHLEV = patchlev # - " - -#DATABASE = data.bas # - " - -GUIDEBOO = Guidebook # HPFS -PATCHLEV = patchlevel # - " - -DATABASE = data.base # - " - - - -# -# If you have LaTeX and want to create the NetHack Guidebook in TeX -# device-independent file format, comment out the upper line and -# uncomment the lower. -# - -GUIDE = -#GUIDE = $(TEMP)\$(GUIDEBOO).dvi - -# -# Set WINOBJ lines corresponding to your desired combination -# of windowing systems. Also set windowing systems in config.h. -# -# A straight tty port using no native windowing system is the -# only choice for now. -# - -WINOBJ1 = $(OBJ)\getline.o -WINOBJ2 = $(OBJ)\termcap.o -WINOBJ3 = $(OBJ)\topl.o -WINOBJ4 = $(OBJ)\wintty.o -WINOBJ = $(WINOBJ1) $(WINOBJ2) $(WINOBJ3) $(WINOBJ4) $(WINX11OBJ) - -# -# The default make target, so just typing 'make' is useful. -# Has to be the first target in the makefile. -# - -default : all - -# -# If you have yacc and lex programs and make any changes, uncomment -# the lowermost two lines and comment out the others. If you make -# changes to the .y and .l files but prefer processing the files -# separately elsewhere, activate the middle two lines, so your changes -# don't get overwritten. -# - -do_yacc : yacc_cpy # use pre-generated files -do_lex : lex_cpy # - " - -#do_yacc : yacc_msg # show message if changed -#do_lex : lex_msg # - " - -#do_yacc : yacc_act # re-process files -#do_lex : lex_act # - " - - -# -# If you have the TOUCH utility the upper line is ok. Otherwise -# the lower one does the same albeit in an ugly manner. Besides, -# the latter method only works for text files. -# - -#do_touch : realtouch -do_touch : faketouch - -# -# If you don't have uudecode program, use the upper line. -# If you still want the icon, you'll have to extract the -# file manually somewhere else. -# - -do_icon : icon_msg # show message if changed -#do_icon : icon_act # extract icon file - -# -# If you don't want to generate nethack.cmd, use the upper line. -# This could be the case, e.g., if you use a different shell than -# the standard cmd.exe. -# - -#do_cmd : cmd_msg # show message -do_cmd : cmd_act # generate nethack.cmd - -# -# If you want to try the data librarian scheme to reduce -# the amount of data files in the NetHack home directory, comment -# out the lower line and uncomment the upper. Also, make sure -# that DLB is defined in config.h. -# - -do_dlb : dlb_yup -#do_dlb : dlb_nope - -###################################################################### -# -# Nothing below this line should have to be changed. -# -# Other things that have to be reconfigured are in -# config.h, os2conf.h and possibly system.h. -# - -# -# The game filename. -# - -GAMEFILE = $(GAMEDIR)\$(GAME).exe - -# -# Object files for makedefs. -# - -MAKEOBJS = $(OBJ)\makedefs.o $(OBJ)\monst.o $(OBJ)\objects.o - -# -# Object files for special levels compiler. -# - -SOBJ01 = $(OBJ)\lev_yacc.o $(OBJ)\lev_lex.o $(OBJ)\lev_main.o $(OBJ)\alloc.o -SOBJ02 = $(OBJ)\monst.o $(OBJ)\objects.o $(OBJ)\panic.o $(OBJ)\decl.o -SOBJ03 = $(OBJ)\drawing.o - -SPLEVOBJS = $(SOBJ01) $(SOBJ02) $(SOBJ03) - -# -# Object files for dungeon compiler. -# - -DOBJ01 = $(OBJ)\dgn_yacc.o $(OBJ)\dgn_lex.o $(OBJ)\dgn_main.o -DOBJ02 = $(OBJ)\panic.o $(OBJ)\alloc.o - -DGNCOMPOBJS = $(DOBJ01) $(DOBJ02) - -# -# Object files for recovery utility. -# - -RECOVOBJS = $(OBJ)\recover.o - -# -# Object files for dlb. -# - -DLBOBJS = $(OBJ)\dlb_main.o $(OBJ)\dlb.o $(OBJ)\alloc.o $(OBJ)\panic.o - -# -# Data files for dlb. -# - -DATHELP = \ - help hh cmdhelp history opthelp wizhelp - -SPEC_LEVS = \ - asmodeus.lev baalz.lev bigrm-1.lev \ - bigrm-2.lev bigrm-3.lev bigrm-4.lev castle.lev fakewiz1.lev fakewiz2.lev \ - juiblex.lev knox.lev medusa-1.lev medusa-2.lev minend-1.lev minend-2.lev \ - minend-3.lev minefill.lev minetn-1.lev minetn-2.lev minetn-3.lev minetn-4.lev \ - minetn-5.lev minetn-6.lev minetn-7.lev oracle.lev orcus.lev sanctum.lev \ - tower1.lev tower2.lev tower3.lev valley.lev wizard1.lev wizard2.lev \ - wizard3.lev astral.lev air.lev earth.lev fire.lev water.lev \ - soko1-1.lev soko1-2.lev soko2-1.lev soko2-2.lev \ - soko3-1.lev soko3-2.lev soko4-1.lev soko4-2.lev - -QUEST_LEVS = \ - Arc-goal.lev Arc-fila.lev Arc-filb.lev Arc-loca.lev Arc-strt.lev \ - Bar-goal.lev Bar-fila.lev Bar-filb.lev Bar-loca.lev Bar-strt.lev \ - Cav-goal.lev Cav-fila.lev Cav-filb.lev Cav-loca.lev Cav-strt.lev \ - Hea-goal.lev Hea-fila.lev Hea-filb.lev Hea-loca.lev Hea-strt.lev \ - Kni-goal.lev Kni-fila.lev Kni-filb.lev Kni-loca.lev Kni-strt.lev \ - Mon-goal.lev Mon-fila.lev Mon-filb.lev Mon-loca.lev Mon-strt.lev \ - Pri-goal.lev Pri-fila.lev Pri-filb.lev Pri-loca.lev Pri-strt.lev \ - Ran-goal.lev Ran-fila.lev Ran-filb.lev Ran-loca.lev Ran-strt.lev \ - Rog-goal.lev Rog-fila.lev Rog-filb.lev Rog-loca.lev Rog-strt.lev \ - Sam-goal.lev Sam-fila.lev Sam-filb.lev Sam-loca.lev Sam-strt.lev \ - Tou-goal.lev Tou-fila.lev Tou-filb.lev Tou-loca.lev Tou-strt.lev \ - Val-goal.lev Val-fila.lev Val-filb.lev Val-loca.lev Val-strt.lev \ - Wiz-goal.lev Wiz-fila.lev Wiz-filb.lev Wiz-loca.lev Wiz-strt.lev -VARDATD = \ - data oracles options quest.dat rumors $(WINX11VARDAT) - -DATDLB = $(DATHELP) dungeon $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD) \ - $(do_dlb) - -# -# Object files for the game itself. -# - -VOBJ011 = $(OBJ)\allmain.o -VOBJ012 = $(OBJ)\alloc.o -VOBJ013 = $(OBJ)\apply.o -VOBJ014 = $(OBJ)\artifact.o -VOBJ021 = $(OBJ)\attrib.o -VOBJ022 = $(OBJ)\ball.o -VOBJ023 = $(OBJ)\bones.o -VOBJ024 = $(OBJ)\botl.o -VOBJ031 = $(OBJ)\cmd.o -VOBJ032 = $(OBJ)\dbridge.o -VOBJ033 = $(OBJ)\decl.o -VOBJ034 = $(OBJ)\detect.o -VOBJ041 = $(OBJ)\dig.o -VOBJ042 = $(OBJ)\display.o -VOBJ043 = $(OBJ)\dlb.o -VOBJ044 = $(OBJ)\do.o -VOBJ051 = $(OBJ)\do_name.o -VOBJ052 = $(OBJ)\do_wear.o -VOBJ053 = $(OBJ)\dog.o -VOBJ054 = $(OBJ)\dogmove.o -VOBJ061 = $(OBJ)\dokick.o -VOBJ062 = $(OBJ)\dothrow.o -VOBJ063 = $(OBJ)\drawing.o -VOBJ064 = $(OBJ)\dungeon.o -VOBJ071 = $(OBJ)\eat.o -VOBJ072 = $(OBJ)\end.o -VOBJ073 = $(OBJ)\engrave.o -VOBJ074 = $(OBJ)\exper.o -VOBJ071 = $(OBJ)\eat.o -VOBJ072 = $(OBJ)\end.o -VOBJ073 = $(OBJ)\engrave.o -VOBJ074 = $(OBJ)\exper.o -VOBJ081 = $(OBJ)\explode.o -VOBJ082 = $(OBJ)\extralev.o -VOBJ083 = $(OBJ)\files.o -VOBJ084 = $(OBJ)\fountain.o -VOBJ091 = $(OBJ)\hack.o -VOBJ092 = $(OBJ)\hacklib.o -VOBJ093 = $(OBJ)\invent.o -VOBJ094 = $(OBJ)\light.o -VOBJ101 = $(OBJ)\lock.o -VOBJ102 = $(OBJ)\mail.o -VOBJ103 = $(OBJ)\main.o -VOBJ104 = $(OBJ)\makemon.o -VOBJ111 = $(OBJ)\mapglyph.o -VOBJ112 = $(OBJ)\mcastu.o -VOBJ113 = $(OBJ)\mhitm.o -VOBJ114 = $(OBJ)\mhitu.o -VOBJ115 = $(OBJ)\minion.o -VOBJ121 = $(OBJ)\mklev.o -VOBJ122 = $(OBJ)\mkmap.o -VOBJ123 = $(OBJ)\mkmaze.o -VOBJ124 = $(OBJ)\mkobj.o -VOBJ131 = $(OBJ)\mkroom.o -VOBJ132 = $(OBJ)\mon.o -VOBJ133 = $(OBJ)\mondata.o -VOBJ134 = $(OBJ)\monmove.o -VOBJ141 = $(OBJ)\monst.o -VOBJ142 = $(OBJ)\monstr.o -VOBJ143 = $(OBJ)\mplayer.o -VOBJ144 = $(OBJ)\mthrowu.o -VOBJ151 = $(OBJ)\muse.o -VOBJ152 = $(OBJ)\music.o -VOBJ153 = $(OBJ)\o_init.o -VOBJ154 = $(OBJ)\objects.o -VOBJ161 = $(OBJ)\objnam.o -VOBJ162 = $(OBJ)\options.o -VOBJ163 = $(OBJ)\os2.o -VOBJ164 = $(OBJ)\pager.o -VOBJ171 = $(OBJ)\pcsys.o -VOBJ172 = $(OBJ)\pickup.o -VOBJ173 = $(OBJ)\pline.o -VOBJ174 = $(OBJ)\polyself.o -VOBJ181 = $(OBJ)\potion.o -VOBJ182 = $(OBJ)\pray.o -VOBJ183 = $(OBJ)\priest.o -VOBJ184 = $(OBJ)\quest.o -VOBJ191 = $(OBJ)\questpgr.o -VOBJ192 = $(OBJ)\read.o -VOBJ193 = $(OBJ)\rect.o -VOBJ194 = $(OBJ)\region.o -VOBJ195 = $(OBJ)\restore.o -VOBJ201 = $(OBJ)\rip.o -VOBJ202 = $(OBJ)\rnd.o -VOBJ203 = $(OBJ)\rumors.o -VOBJ204 = $(OBJ)\save.o -VOBJ211 = $(OBJ)\shk.o -VOBJ212 = $(OBJ)\shknam.o -VOBJ213 = $(OBJ)\sit.o -VOBJ214 = $(OBJ)\sounds.o -VOBJ221 = $(OBJ)\sp_lev.o -VOBJ222 = $(OBJ)\spell.o -VOBJ223 = $(OBJ)\steal.o -VOBJ224 = $(OBJ)\teleport.o -VOBJ231 = $(OBJ)\timeout.o -VOBJ232 = $(OBJ)\topten.o -VOBJ233 = $(OBJ)\track.o -VOBJ234 = $(OBJ)\trap.o -VOBJ241 = $(OBJ)\tty.o -VOBJ242 = $(OBJ)\u_init.o -VOBJ243 = $(OBJ)\uhitm.o -VOBJ244 = $(OBJ)\unix.o -VOBJ251 = $(OBJ)\vault.o -VOBJ252 = $(OBJ)\vision.o -VOBJ253 = $(OBJ)\vis_tab.o -VOBJ254 = $(OBJ)\weapon.o -VOBJ261 = $(OBJ)\were.o -VOBJ262 = $(OBJ)\wield.o -VOBJ263 = $(OBJ)\windows.o -VOBJ264 = $(OBJ)\wizard.o -VOBJ271 = $(OBJ)\worm.o -VOBJ272 = $(OBJ)\worn.o -VOBJ273 = $(OBJ)\write.o -VOBJ274 = $(OBJ)\zap.o -VOBJ281 = $(OBJ)\role.o -VOBJ282 = $(OBJ)\steed.o -VOBJ283 = $(OBJ)\sys.o - -VOBJ01 = $(VOBJ011) $(VOBJ012) $(VOBJ013) $(VOBJ014) -VOBJ02 = $(VOBJ021) $(VOBJ022) $(VOBJ023) $(VOBJ024) -VOBJ03 = $(VOBJ031) $(VOBJ032) $(VOBJ033) $(VOBJ034) -VOBJ04 = $(VOBJ041) $(VOBJ042) $(VOBJ043) $(VOBJ044) -VOBJ05 = $(VOBJ051) $(VOBJ052) $(VOBJ053) $(VOBJ054) -VOBJ06 = $(VOBJ061) $(VOBJ062) $(VOBJ063) $(VOBJ064) -VOBJ07 = $(VOBJ071) $(VOBJ072) $(VOBJ073) $(VOBJ074) -VOBJ08 = $(VOBJ081) $(VOBJ082) $(VOBJ083) $(VOBJ084) -VOBJ09 = $(VOBJ091) $(VOBJ092) $(VOBJ093) $(VOBJ094) -VOBJ10 = $(VOBJ101) $(VOBJ102) $(VOBJ103) $(VOBJ104) -VOBJ11 = $(VOBJ111) $(VOBJ112) $(VOBJ113) $(VOBJ114) $(VOBJ115) -VOBJ12 = $(VOBJ121) $(VOBJ122) $(VOBJ123) $(VOBJ124) -VOBJ13 = $(VOBJ131) $(VOBJ132) $(VOBJ133) $(VOBJ134) -VOBJ14 = $(VOBJ141) $(VOBJ142) $(VOBJ143) $(VOBJ144) -VOBJ15 = $(VOBJ151) $(VOBJ152) $(VOBJ153) $(VOBJ154) -VOBJ16 = $(VOBJ161) $(VOBJ162) $(VOBJ163) $(VOBJ164) -VOBJ17 = $(VOBJ171) $(VOBJ172) $(VOBJ173) $(VOBJ174) -VOBJ18 = $(VOBJ181) $(VOBJ182) $(VOBJ183) $(VOBJ184) -VOBJ19 = $(VOBJ191) $(VOBJ192) $(VOBJ193) $(VOBJ194) $(VOBJ195) -VOBJ20 = $(VOBJ201) $(VOBJ202) $(VOBJ203) $(VOBJ204) -VOBJ21 = $(VOBJ211) $(VOBJ212) $(VOBJ213) $(VOBJ214) -VOBJ22 = $(VOBJ221) $(VOBJ222) $(VOBJ223) $(VOBJ224) -VOBJ23 = $(VOBJ231) $(VOBJ232) $(VOBJ233) $(VOBJ234) -VOBJ24 = $(VOBJ241) $(VOBJ242) $(VOBJ243) $(VOBJ244) -VOBJ25 = $(VOBJ251) $(VOBJ252) $(VOBJ253) $(VOBJ254) -VOBJ26 = $(VOBJ261) $(VOBJ262) $(VOBJ263) $(VOBJ264) -VOBJ27 = $(VOBJ271) $(VOBJ272) $(VOBJ273) $(VOBJ274) -VOBJ28 = $(VOBJ281) $(VOBJ282) $(VOBJ283) -VOBJ29 = $(WINOBJ) $(RANDOM) -HHOBJ = $(OBJ)\version.o - -VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) $(VOBJ06) $(VOBJ07) \ - $(VOBJ08) $(VOBJ09) $(VOBJ10) $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) \ - $(VOBJ15) $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) $(VOBJ21) \ - $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) $(VOBJ26) $(VOBJ27) $(VOBJ28) \ - $(VOBJ29) -HOBJ = $(VOBJ) $(HHOBJ) - -EXTERN_H = # $(INCL)\extern.h -OS2CONF_H = $(INCL)\os2conf.h $(INCL)\micro.h $(INCL)\system.h $(EXTERN_H) -GLOBAL_H = $(INCL)\global.h $(INCL)\coord.h $(OS2CONF_H) -CONFIG_H = $(INCL)\config.h $(INCL)\config1.h $(INCL)\tradstdc.h $(GLOBAL_H) -TRAP_H = $(INCL)\trap.h -PERMONST_H = $(INCL)\permonst.h $(INCL)\monattk.h $(INCL)\monflag.h -YOU_H = $(INCL)\you.h $(INCL)\attrib.h $(PERMONST_H) $(INCL)\mondata.h \ - $(INCL)\monst.h $(INCL)\mextra.h $(INCL)\youprop.h \ - $(INCL)\prop.h $(INCL)\pm.h -DECL_H = $(INCL)\decl.h $(INCL)\spell.h $(INCL)\obj.h $(YOU_H) \ - $(INCL)\onames.h $(INCL)\color.h -HACK_H = $(CONFIG_H) $(INCL)\context.h $(DECL_H) $(INCL)\monsym.h $(INCL)\mkroom.h \ - $(INCL)\objclass.h $(TRAP_H) $(INCL)\engrave.h $(INCL)\flag.h \ - $(INCL)\rm.h $(INCL)\dungeon.h $(INCL)\hack.h $(INCL)\display.h \ - $(INCL)\vision.h $(INCL)\wintty.h $(INCL)\wintype.h $(INCL)\align.h \ - $(INCL)\winprocs.h $(INCL)\sys.h - -# -# The default target. -# - -all : makedefs dgn_comp lev_comp recover $(GAME) dat $(GUIDE) - $(ECHO) Done. - -# -# Definition file creation. -# - -$(TEMP)\$(GAMEDEF) : - $(MAKEB) DD_NAME=$(GAME) DD_DESC=$(GAMEDES) DD_TARG=$@ do_def -$(TEMP)\$(MKDFDEF) : - $(MAKEB) DD_NAME=makedefs DD_DESC="Definitions compiler" DD_TARG=$@ do_def -$(TEMP)\$(DGNCDEF) : - $(MAKEB) DD_NAME=dgn_comp DD_DESC="Dungeon compiler" DD_TARG=$@ do_def -$(TEMP)\$(LEVCDEF) : - $(MAKEB) DD_NAME=lev_comp DD_DESC="Level compiler" DD_TARG=$@ do_def -$(TEMP)\$(RCVRDEF) : - $(MAKEB) DD_NAME=recover DD_DESC="Recovery utility" DD_TARG=$@ do_def -$(TEMP)\$(DLBDEF) : - $(MAKEB) DD_NAME=dlb DD_DESC="Archive utility" DD_TARG=$@ do_def - -do_def : - $(ECHO) NAME $(DD_NAME) WINDOWCOMPAT> $(DD_TARG) - $(ECHO) DESCRIPTION '$(DD_DESC)'>> $(DD_TARG) - $(ECHO) PROTMODE>> $(DD_TARG) - $(ECHO) EXETYPE OS2>> $(DD_TARG) - -# -# The main target. -# - -$(GAME) : $(GAMEDIR)\$(GAME).exe -$(GAME).exe : $(GAMEDIR)\$(GAME).exe -$(GAMEDIR)\$(GAME).exe : $(TEMP)\$(GAME).rsp $(TEMP)\$(GAME).r - $(GAMELN) - -$(TEMP)\$(GAME).r : $(HOBJ) $(TEMP)\$(GAMEDEF) - $(ECHO) $(VOBJ011) > $@ - $(ECHO) $(VOBJ012) >> $@ - $(ECHO) $(VOBJ013) >> $@ - $(ECHO) $(VOBJ014) >> $@ - $(ECHO) $(VOBJ021) >> $@ - $(ECHO) $(VOBJ022) >> $@ - $(ECHO) $(VOBJ023) >> $@ - $(ECHO) $(VOBJ024) >> $@ - $(ECHO) $(VOBJ031) >> $@ - $(ECHO) $(VOBJ032) >> $@ - $(ECHO) $(VOBJ033) >> $@ - $(ECHO) $(VOBJ034) >> $@ - $(ECHO) $(VOBJ041) >> $@ - $(ECHO) $(VOBJ042) >> $@ - $(ECHO) $(VOBJ043) >> $@ - $(ECHO) $(VOBJ044) >> $@ - $(ECHO) $(VOBJ051) >> $@ - $(ECHO) $(VOBJ052) >> $@ - $(ECHO) $(VOBJ053) >> $@ - $(ECHO) $(VOBJ054) >> $@ - $(ECHO) $(VOBJ061) >> $@ - $(ECHO) $(VOBJ062) >> $@ - $(ECHO) $(VOBJ063) >> $@ - $(ECHO) $(VOBJ064) >> $@ - $(ECHO) $(VOBJ071) >> $@ - $(ECHO) $(VOBJ072) >> $@ - $(ECHO) $(VOBJ073) >> $@ - $(ECHO) $(VOBJ074) >> $@ - $(ECHO) $(VOBJ081) >> $@ - $(ECHO) $(VOBJ082) >> $@ - $(ECHO) $(VOBJ083) >> $@ - $(ECHO) $(VOBJ084) >> $@ - $(ECHO) $(VOBJ091) >> $@ - $(ECHO) $(VOBJ092) >> $@ - $(ECHO) $(VOBJ093) >> $@ - $(ECHO) $(VOBJ094) >> $@ - $(ECHO) $(VOBJ101) >> $@ - $(ECHO) $(VOBJ102) >> $@ - $(ECHO) $(VOBJ103) >> $@ - $(ECHO) $(VOBJ104) >> $@ - $(ECHO) $(VOBJ111) >> $@ - $(ECHO) $(VOBJ112) >> $@ - $(ECHO) $(VOBJ113) >> $@ - $(ECHO) $(VOBJ114) >> $@ - $(ECHO) $(VOBJ115) >> $@ - $(ECHO) $(VOBJ121) >> $@ - $(ECHO) $(VOBJ122) >> $@ - $(ECHO) $(VOBJ123) >> $@ - $(ECHO) $(VOBJ124) >> $@ - $(ECHO) $(VOBJ131) >> $@ - $(ECHO) $(VOBJ132) >> $@ - $(ECHO) $(VOBJ133) >> $@ - $(ECHO) $(VOBJ134) >> $@ - $(ECHO) $(VOBJ141) >> $@ - $(ECHO) $(VOBJ142) >> $@ - $(ECHO) $(VOBJ143) >> $@ - $(ECHO) $(VOBJ144) >> $@ - $(ECHO) $(VOBJ151) >> $@ - $(ECHO) $(VOBJ152) >> $@ - $(ECHO) $(VOBJ153) >> $@ - $(ECHO) $(VOBJ154) >> $@ - $(ECHO) $(VOBJ161) >> $@ - $(ECHO) $(VOBJ162) >> $@ - $(ECHO) $(VOBJ163) >> $@ - $(ECHO) $(VOBJ164) >> $@ - $(ECHO) $(VOBJ171) >> $@ - $(ECHO) $(VOBJ172) >> $@ - $(ECHO) $(VOBJ173) >> $@ - $(ECHO) $(VOBJ174) >> $@ - $(ECHO) $(VOBJ181) >> $@ - $(ECHO) $(VOBJ182) >> $@ - $(ECHO) $(VOBJ183) >> $@ - $(ECHO) $(VOBJ184) >> $@ - $(ECHO) $(VOBJ191) >> $@ - $(ECHO) $(VOBJ192) >> $@ - $(ECHO) $(VOBJ193) >> $@ - $(ECHO) $(VOBJ194) >> $@ - $(ECHO) $(VOBJ195) >> $@ - $(ECHO) $(VOBJ201) >> $@ - $(ECHO) $(VOBJ202) >> $@ - $(ECHO) $(VOBJ203) >> $@ - $(ECHO) $(VOBJ204) >> $@ - $(ECHO) $(VOBJ211) >> $@ - $(ECHO) $(VOBJ212) >> $@ - $(ECHO) $(VOBJ213) >> $@ - $(ECHO) $(VOBJ214) >> $@ - $(ECHO) $(VOBJ221) >> $@ - $(ECHO) $(VOBJ222) >> $@ - $(ECHO) $(VOBJ223) >> $@ - $(ECHO) $(VOBJ224) >> $@ - $(ECHO) $(VOBJ231) >> $@ - $(ECHO) $(VOBJ232) >> $@ - $(ECHO) $(VOBJ233) >> $@ - $(ECHO) $(VOBJ234) >> $@ - $(ECHO) $(VOBJ241) >> $@ - $(ECHO) $(VOBJ242) >> $@ - $(ECHO) $(VOBJ243) >> $@ - $(ECHO) $(VOBJ244) >> $@ - $(ECHO) $(VOBJ251) >> $@ - $(ECHO) $(VOBJ252) >> $@ - $(ECHO) $(VOBJ253) >> $@ - $(ECHO) $(VOBJ254) >> $@ - $(ECHO) $(VOBJ261) >> $@ - $(ECHO) $(VOBJ262) >> $@ - $(ECHO) $(VOBJ263) >> $@ - $(ECHO) $(VOBJ264) >> $@ - $(ECHO) $(VOBJ271) >> $@ - $(ECHO) $(VOBJ272) >> $@ - $(ECHO) $(VOBJ273) >> $@ - $(ECHO) $(VOBJ274) >> $@ - $(ECHO) $(VOBJ281) >> $@ - $(ECHO) $(VOBJ282) >> $@ - $(ECHO) $(VOBJ283) >> $@ - $(ECHO) $(WINOBJ1) >> $@ - $(ECHO) $(WINOBJ2) >> $@ - $(ECHO) $(WINOBJ3) >> $@ - $(ECHO) $(WINOBJ4) >> $@ - $(ECHO) $(HHOBJ) >> $@ - $(ECHO) $(RANDOM) >> $@ -.IF $(with_x11) == yes - $(X11ECHO) $(WINX11OBJ01) >> $@ - $(X11ECHO) $(WINX11OBJ02) >> $@ - $(X11ECHO) $(WINX11OBJ03) >> $@ - $(X11ECHO) $(WINX11OBJ04) >> $@ - $(X11ECHO) $(WINX11OBJ05) >> $@ - $(X11ECHO) $(WINX11OBJ06) >> $@ - $(X11ECHO) $(WINX11OBJ07) >> $@ - $(X11ECHO) $(WINX11OBJ08) >> $@ - $(X11ECHO) $(WINX11OBJ09) >> $@ - $(X11ECHO) $(WINX11OBJ10) >> $@ - $(X11ECHO) $(WINX11OBJ11) >> $@ -.END - - - -$(TEMP)\$(GAME).rsp : $(HOBJ) $(TEMP)\$(GAMEDEF) - $(ECHO) $(SYSOBJ) $(VOBJ01) +> $@ - $(ECHO) $(VOBJ02) +>> $@ - $(ECHO) $(VOBJ03) +>> $@ - $(ECHO) $(VOBJ04) +>> $@ - $(ECHO) $(VOBJ05) +>> $@ - $(ECHO) $(VOBJ06) +>> $@ - $(ECHO) $(VOBJ07) +>> $@ - $(ECHO) $(VOBJ08) +>> $@ - $(ECHO) $(VOBJ09) +>> $@ - $(ECHO) $(VOBJ10) +>> $@ - $(ECHO) $(VOBJ11) +>> $@ - $(ECHO) $(VOBJ12) +>> $@ - $(ECHO) $(VOBJ13) +>> $@ - $(ECHO) $(VOBJ14) +>> $@ - $(ECHO) $(VOBJ15) +>> $@ - $(ECHO) $(VOBJ16) +>> $@ - $(ECHO) $(VOBJ17) +>> $@ - $(ECHO) $(VOBJ18) +>> $@ - $(ECHO) $(VOBJ19) +>> $@ - $(ECHO) $(VOBJ20) +>> $@ - $(ECHO) $(VOBJ21) +>> $@ - $(ECHO) $(VOBJ22) +>> $@ - $(ECHO) $(VOBJ23) +>> $@ - $(ECHO) $(VOBJ24) +>> $@ - $(ECHO) $(VOBJ25) +>> $@ - $(ECHO) $(VOBJ26) +>> $@ - $(ECHO) $(VOBJ27) +>> $@ - $(ECHO) $(VOBJ28) +>> $@ - $(ECHO) $(VOBJ29) +>> $@ - $(ECHO) $(VOBJ30) +>> $@ - $(ECHO) $(HHOBJ)>> $@ - $(ECHO) $(GAMEDIR)\$(GAME).exe>> $@ - $(ECHO) $(TEMP)\$(GAME)>> $@ - $(ECHO) $(PLIBS) $(TERMLIB)>> $@ - $(ECHO) $(TEMP)\$(GAMEDEF) $(LFLAGS);>> $@ - -# -# Targets for makedefs. -# - -makedefs : $(TEMP)\makedefs.exe -$(TEMP)\makedefs.exe : $(TEMP)\makedefs.rsp - $(MKDFLN) - -$(TEMP)\makedefs.rsp : $(MAKEOBJS) $(TEMP)\$(MKDFDEF) - $(ECHO) $(SYSOBJ) $(MAKEOBJS)> $@ - $(ECHO) $(TEMP)\makedefs.exe>> $@ - $(ECHO) nul>> $@ - $(ECHO) $(RLIBS)>> $@ - $(ECHO) $(MKDFMD) $(LFLAGS);>> $@ - -$(OBJ)\makedefs.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\permonst.h $(INCL)\objclass.h \ - $(INCL)\monsym.h $(INCL)\artilist.h $(INCL)\qtext.h - $(UTILCC) - -# -# Targets for the special levels compiler. -# - -lev_comp : $(TEMP)\lev_comp.exe -$(TEMP)\lev_comp.exe : $(TEMP)\lev_comp.rsp - $(LEVCLN) - -$(TEMP)\lev_comp.rsp : $(SPLEVOBJS) $(TEMP)\$(LEVCDEF) - $(ECHO) $(SYSOBJ) $(SOBJ01) +> $@ - $(ECHO) $(SOBJ02) +>> $@ - $(ECHO) $(SOBJ03)>> $@ - $(ECHO) $(TEMP)\lev_comp.exe>> $@ - $(ECHO) nul>> $@ - $(ECHO) $(RLIBS)>> $@ - $(ECHO) $(LEVCMD) $(LFLAGS);>> $@ - -$(OBJ)\lev_yacc.o : $(UTIL)\$(CB) $(HACK_H) $(INCL)\sp_lev.h - $(UTILCC) -$(OBJ)\lev_lex.o : $(UTIL)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev_comp.h - $(UTILCC) -$(OBJ)\lev_main.o : $(UTIL)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(INCL)\tcap.h - $(UTILCC) - -$(UTIL)\lev_yacc.c : $(UTIL)\lev_comp.y - $(MAKEB) YY=lev do_yacc - -$(UTIL)\lev_lex.c : $(UTIL)\lev_comp.l - $(MAKEB) YY=lev do_lex - -# -# Targets for the dungeon compiler. -# - -dgn_comp : $(TEMP)\dgn_comp.exe -$(TEMP)\dgn_comp.exe : $(TEMP)\dgn_comp.rsp - $(DGNCLN) - -$(TEMP)\dgn_comp.rsp : $(DGNCOMPOBJS) $(TEMP)\$(DGNCDEF) - $(ECHO) $(SYSOBJ) $(DOBJ01) +> $@ - $(ECHO) $(DOBJ02)>> $@ - $(ECHO) $(TEMP)\dgn_comp.exe>> $@ - $(ECHO) nul>> $@ - $(ECHO) $(RLIBS)>> $@ - $(ECHO) $(DGNCMD) $(LFLAGS);>> $@ - -$(OBJ)\dgn_yacc.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\date.h $(INCL)\dgn_file.h - $(UTILCC) -$(OBJ)\dgn_lex.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\dgn_comp.h $(INCL)\dgn_file.h - $(UTILCC) -$(OBJ)\dgn_main.o : $(UTIL)\$(CB) $(CONFIG_H) - $(UTILCC) - -$(UTIL)\dgn_yacc.c : $(UTIL)\dgn_comp.y - $(MAKEB) YY=dgn do_yacc - -$(UTIL)\dgn_lex.c : $(UTIL)\dgn_comp.l - $(MAKEB) YY=dgn do_lex - -# -# For both lev_comp and dgn_comp. -# - -$(OBJ)\panic.o : $(UTIL)\$(CB) $(CONFIG_H) - $(UTILCC) - -# -# Yacc and Lex targets. -# - -yacc_cpy : - $(CP) $(SSYS)\$(YY)_yacc.c $(UTIL) - $(CP) $(SSYS)\$(YY)_comp.h $(INCL) - $(MAKEB) TT=$(UTIL)\$(YY)_yacc.c do_touch - $(MAKEB) TT=$(INCL)\$(YY)_comp.h do_touch - -yacc_msg : - $(ECHO) $(YY)_comp.y has changed. To update $(YY)_yacc.c and $(YY)_comp.h run $(YACC). - -yacc_act : - $(YACC) -d $(UTIL)\$(YY)_comp.y - $(CP) $(YTABC) $(UTIL)\$(YY)_yacc.c - $(CP) $(YTABH) $(INCL)\$(YY)_comp.h - $(RM) $(YTABC) - $(RM) $(YTABH) - -lex_cpy : - $(CP) $(SSYS)\$(YY)_lex.c $(UTIL) - $(MAKEB) TT=$(UTIL)\$(YY)_lex.c do_touch - -lex_msg : - $(ECHO) $(YY)_comp.l has changed. To update $(YY)_lex.c run $(LEX). - -lex_act : - $(LEX) $(UTIL)\$(YY)_comp.l - $(CP) $(LEXYYC) $(UTIL)\$(YY)_lex.c - $(RM) $(LEXYYC) - -# -# Why must this be so kludgy? -# - -realtouch : - $(TOUCH) $(TT) - -faketouch : - $(BEG) $(CAT) $(TT) > $(TEMP)\foo.bar $(SEP) $(CP) $(TEMP)\foo.bar $(TT) $(SEP) $(RM) $(TEMP)\foo.bar $(END) - -# -# Targets for the recovery utility. -# - -recover : $(GAMEDIR)\recover.exe -$(GAMEDIR)\recover.exe : $(TEMP)\recover.rsp - $(RCVRLN) - -$(TEMP)\recover.rsp : $(RECOVOBJS) $(TEMP)\$(RCVRDEF) - $(ECHO) $(SYSOBJ) $(RECOVOBJS)> $@ - $(ECHO) $(GAMEDIR)\recover.exe>> $@ - $(ECHO) nul>> $@ - $(ECHO) $(PLIBS)>> $@ - $(ECHO) $(TEMP)\$(RCVRDEF) $(LFLAGS);>> $@ - -$(OBJ)\recover.o : $(UTIL)\$(CB) $(CONFIG_H) - $(UTILCC) - -# -# Targets for the dlb. -# - -dlb : $(TEMP)\dlb.exe -$(TEMP)\dlb.exe : $(TEMP)\dlb.rsp - $(DLBRLN) - -$(TEMP)\dlb.rsp : $(DLBOBJS) $(TEMP)\$(DLBDEF) - $(ECHO) $(SYSOBJ) $(DLBOBJS)> $@ - $(ECHO) $(TEMP)\dlb.exe>> $@ - $(ECHO) nul>> $@ - $(ECHO) $(PLIBS)>> $@ - $(ECHO) $(TEMP)\$(DLBDEF) $(LFLAGS);>> $@ - -$(OBJ)\dlb_main.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\dlb.h - $(UTILCC) - -$(GAMEDIR)\nhdat : $(WINX11VARDAT) - $(MAKEB) do_dlb - -dlb_yup : dlb - $(TEMP)\dlb cCf $(GAMEDIR) $(GAMEDIR)\nhdat $(DATDLB) - -$(RM) $(GAMEDIR)\help - -$(RM) $(GAMEDIR)\hh - -$(RM) $(GAMEDIR)\cmdhelp - -$(RM) $(GAMEDIR)\history - -$(RM) $(GAMEDIR)\opthelp - -$(RM) $(GAMEDIR)\wizhelp - -$(RM) $(GAMEDIR)\asmodeus.lev - -$(RM) $(GAMEDIR)\baalz.lev - -$(RM) $(GAMEDIR)\bigrm-?.lev - -$(RM) $(GAMEDIR)\castle.lev - -$(RM) $(GAMEDIR)\fakewiz?.lev - -$(RM) $(GAMEDIR)\juiblex.lev - -$(RM) $(GAMEDIR)\knox.lev - -$(RM) $(GAMEDIR)\medusa-?.lev - -$(RM) $(GAMEDIR)\minend-?.lev - -$(RM) $(GAMEDIR)\minefill.lev - -$(RM) $(GAMEDIR)\minetn-?.lev - -$(RM) $(GAMEDIR)\oracle.lev - -$(RM) $(GAMEDIR)\orcus.lev - -$(RM) $(GAMEDIR)\sanctum.lev - -$(RM) $(GAMEDIR)\tower?.lev - -$(RM) $(GAMEDIR)\valley.lev - -$(RM) $(GAMEDIR)\wizard?.lev - -$(RM) $(GAMEDIR)\astral.lev - -$(RM) $(GAMEDIR)\air.lev - -$(RM) $(GAMEDIR)\earth.lev - -$(RM) $(GAMEDIR)\fire.lev - -$(RM) $(GAMEDIR)\water.lev - -$(RM) $(GAMEDIR)\???-goal.lev - -$(RM) $(GAMEDIR)\???-fil?.lev - -$(RM) $(GAMEDIR)\???-loca.lev - -$(RM) $(GAMEDIR)\???-strt.lev - -$(RM) $(GAMEDIR)\data - -$(RM) $(GAMEDIR)\oracles - -$(RM) $(GAMEDIR)\options - -$(RM) $(GAMEDIR)\quest.dat - -$(RM) $(GAMEDIR)\rumors - -$(RM) $(GAMEDIR)\dungeon - -$(RM) $(GAMEDIR)\soko?-?.lev -# -$(RM) $(GAMEDIR)\pet_mark.xbm -# -$(RM) $(GAMEDIR)\rip.xpm - -dlb_nope : - $(ECHO) DLB not requested. - -# -# The following files depend on makedefs to be created. -# -# date.h should be remade every time any of the source or include -# files is modified. -# - -$(INCL)\date.h : $(VOBJ) $(TEMP)\makedefs.exe - $(TEMP)\makedefs -v - $(CP) $(DAT)\options $(GAMEDIR) - $(RM) $(DAT)\options - -$(INCL)\onames.h : $(TEMP)\makedefs.exe - $(TEMP)\makedefs -o - -$(INCL)\pm.h : $(TEMP)\makedefs.exe - $(TEMP)\makedefs -p - -monstr.c : $(TEMP)\makedefs.exe - $(TEMP)\makedefs -m - -$(OBJ)\monstr.o : $(CB) - $(SRCCC) - -$(GAMEDIR)\data : $(DAT)\$(DATABASE) $(TEMP)\makedefs.exe - $(TEMP)\makedefs -d - $(CP) $(DAT)\data $(GAMEDIR) - $(RM) $(DAT)\data - -$(GAMEDIR)\rumors : $(DAT)\rumors.tru $(DAT)\rumors.fal $(TEMP)\makedefs.exe - $(TEMP)\makedefs -r - $(CP) $(DAT)\rumors $(GAMEDIR) - $(RM) $(DAT)\rumors - -$(GAMEDIR)\oracles : $(DAT)\oracles.txt $(TEMP)\makedefs.exe - $(TEMP)\makedefs -h - $(CP) $(DAT)\oracles $(GAMEDIR) - $(RM) $(DAT)\oracles - -$(GAMEDIR)\quest.dat : $(DAT)\quest.txt $(TEMP)\makedefs.exe - $(TEMP)\makedefs -q - $(CP) $(DAT)\quest.dat $(GAMEDIR) - $(RM) $(DAT)\quest.dat - -# -# Vision tables for algorithm D. -# - -vis_tab.c : $(INCL)\vis_tab.h -$(INCL)\vis_tab.h : $(TEMP)\makedefs.exe - $(TEMP)\makedefs -z - -$(OBJ)\vis_tab.o : $(CB) - $(SRCCC) - -# -# The following programs vary depending on what OS you are using. -# - -$(OBJ)\main.o : $(SSYS)\pc$(CB) $(HACK_H) $(INCL)\dlb.h - $(PSYSCC) -$(OBJ)\tty.o : $(SSYS)\pc$(CB) $(HACK_H) $(INCL)\func_tab.h - $(PSYSCC) -$(OBJ)\unix.o : $(SSYS)\pc$(CB) $(HACK_H) - $(PSYSCC) - -# -# Other system specific modules. -# - -$(OBJ)\os2.o : $(SYS)\$(CB) $(HACK_H) $(INCL)\tcap.h $(INCL)\def_os2.h - $(SYSCC) -$(OBJ)\pcsys.o : $(SSYS)\$(CB) $(HACK_H) - $(SSYSCC) - -# -# Berkeley random(3) routines. -# - -$(OBJ)\random.o : $(SSYS)\$(CB) - $(SSYSCC) - -# -# Window source. -# - -$(OBJ)\getline.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\func_tab.h - $(WINCC) -$(OBJ)\termcap.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\tcap.h - $(WINCC) -$(OBJ)\topl.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\tcap.h - $(WINCC) -$(OBJ)\wintty.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\tcap.h $(INCL)\date.h - $(WINCC) - -# -# Secondary targets. -# - -dat : spec_lev help_fil $(GAMEDIR)\dungeon $(GAMEDIR)\data $(GAMEDIR)\rumors \ - $(GAMEDIR)\oracles $(GAMEDIR)\quest.dat $(GAMEDIR)\$(GAME).ico \ - $(GAMEDIR)\$(GAME).cmd $(GAMEDIR)\nethack.cnf $(GAMEDIR)\nhdat \ - $(WINX11VARDAT) - -help_fil : $(GAMEDIR)\cmdhelp $(GAMEDIR)\help $(GAMEDIR)\hh $(GAMEDIR)\history \ - $(GAMEDIR)\license $(GAMEDIR)\opthelp $(GAMEDIR)\wizhelp - -$(GAMEDIR)\cmdhelp : $(DAT)\cmdhelp - $(CP) $(DAT)\cmdhelp $(GAMEDIR) -$(GAMEDIR)\help : $(DAT)\help - $(CP) $(DAT)\help $(GAMEDIR) -$(GAMEDIR)\hh : $(DAT)\hh - $(CP) $(DAT)\hh $(GAMEDIR) -$(GAMEDIR)\history : $(DAT)\history - $(CP) $(DAT)\history $(GAMEDIR) -$(GAMEDIR)\license : $(DAT)\license - $(CP) $(DAT)\license $(GAMEDIR) -$(GAMEDIR)\opthelp : $(DAT)\opthelp - $(CP) $(DAT)\opthelp $(GAMEDIR) -$(GAMEDIR)\wizhelp : $(DAT)\wizhelp - $(CP) $(DAT)\wizhelp $(GAMEDIR) - -$(GAMEDIR)\dungeon : $(DAT)\dungeon.def $(TEMP)\makedefs.exe $(TEMP)\dgn_comp.exe - $(TEMP)\makedefs -e - $(TEMP)\dgn_comp $(DAT)\dungeon.pdf - $(CP) $(DAT)\dungeon $(GAMEDIR) - $(RM) $(DAT)\dungeon.pdf - $(RM) $(DAT)\dungeon - -AFILES = $(GAMEDIR)\Arc-goal.lev -BFILES = $(GAMEDIR)\Bar-goal.lev -CFILES = $(GAMEDIR)\Cav-goal.lev -HFILES = $(GAMEDIR)\Hea-goal.lev -KFILES = $(GAMEDIR)\Kni-goal.lev -MFILES = $(GAMEDIR)\Mon-goal.lev -PFILES = $(GAMEDIR)\Pri-goal.lev -RANFILES = $(GAMEDIR)\Ran-goal.lev -RFILES = $(GAMEDIR)\Rog-goal.lev -SFILES = $(GAMEDIR)\Sam-goal.lev -TFILES = $(GAMEDIR)\Tou-goal.lev -VFILES = $(GAMEDIR)\Val-goal.lev -WFILES = $(GAMEDIR)\Wiz-goal.lev - -XFILES = $(AFILES) $(BFILES) $(CFILES) $(HFILES) $(KFILES) $(MFILES) \ - $(PFILES) $(RANFILES) $(RFILES) $(SFILES) $(TFILES) $(VFILES) $(WFILES) - -spec_lev : $(GAMEDIR)\astral.lev $(GAMEDIR)\bigrm-1.lev $(GAMEDIR)\castle.lev \ - $(GAMEDIR)\knox.lev $(GAMEDIR)\medusa-1.lev $(GAMEDIR)\minefill.lev \ - $(GAMEDIR)\oracle.lev $(GAMEDIR)\tower1.lev $(GAMEDIR)\valley.lev \ - $(GAMEDIR)\wizard1.lev $(GAMEDIR)\soko1-1.lev $(XFILES) - -# Single special level files - -$(GAMEDIR)\castle.lev : $(DAT)\castle.des $(TEMP)\lev_comp.exe - $(MAKEB) LF=castle do_slev -$(GAMEDIR)\knox.lev : $(DAT)\knox.des $(TEMP)\lev_comp.exe - $(MAKEB) LF=knox do_slev -$(GAMEDIR)\oracle.lev : $(DAT)\oracle.des $(TEMP)\lev_comp.exe - $(MAKEB) LF=oracle do_slev - -do_slev : - $(TEMP)\lev_comp $(DAT)\$(LF).des - $(CP) $(LF).lev $(GAMEDIR) - $(RM) $(LF).lev - -# Multiple special level files - -$(GAMEDIR)\astral.lev : $(DAT)\endgame.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\endgame.des - $(CP) air.lev $(GAMEDIR) - $(CP) astral.lev $(GAMEDIR) - $(CP) earth.lev $(GAMEDIR) - $(CP) fire.lev $(GAMEDIR) - $(CP) water.lev $(GAMEDIR) - $(RM) air.lev - $(RM) astral.lev - $(RM) earth.lev - $(RM) fire.lev - $(RM) water.lev - -$(GAMEDIR)\bigrm-1.lev : $(DAT)\bigroom.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\bigroom.des - $(CP) bigrm-?.lev $(GAMEDIR) - $(RM) bigrm-?.lev - -$(GAMEDIR)\medusa-1.lev : $(DAT)\medusa.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\medusa.des - $(CP) medusa-?.lev $(GAMEDIR) - $(RM) medusa-?.lev - -$(GAMEDIR)\minefill.lev : $(DAT)\mines.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\mines.des - $(CP) minend-?.lev $(GAMEDIR) - $(CP) minefill.lev $(GAMEDIR) - $(CP) minetn-?.lev $(GAMEDIR) - $(RM) minend-?.lev - $(RM) minefill.lev - $(RM) minetn-?.lev - -$(GAMEDIR)\tower1.lev : $(DAT)\tower.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\tower.des - $(CP) tower?.lev $(GAMEDIR) - $(RM) tower?.lev - -$(GAMEDIR)\valley.lev : $(DAT)\gehennom.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\gehennom.des - $(CP) asmodeus.lev $(GAMEDIR) - $(CP) baalz.lev $(GAMEDIR) - $(CP) juiblex.lev $(GAMEDIR) - $(CP) orcus.lev $(GAMEDIR) - $(CP) sanctum.lev $(GAMEDIR) - $(CP) valley.lev $(GAMEDIR) - $(RM) asmodeus.lev - $(RM) baalz.lev - $(RM) juiblex.lev - $(RM) orcus.lev - $(RM) sanctum.lev - $(RM) valley.lev - -$(GAMEDIR)\wizard1.lev : $(DAT)\yendor.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\yendor.des - $(CP) wizard?.lev $(GAMEDIR) - $(CP) fakewiz?.lev $(GAMEDIR) - $(RM) wizard?.lev - $(RM) fakewiz?.lev - -$(GAMEDIR)\soko1-1.lev : $(DAT)\sokoban.des $(TEMP)\lev_comp.exe - $(TEMP)\lev_comp $(DAT)\sokoban.des - $(CP) soko?-?.lev $(GAMEDIR) - $(RM) soko?-?.lev - - -# Quest dungeons - -$(AFILES) : $(DAT)\Arch.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Arc QF=Arch do_quest -$(BFILES) : $(DAT)\Barb.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Bar QF=Barb do_quest -$(CFILES) : $(DAT)\Caveman.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Cav QF=Caveman do_quest -$(HFILES) : $(DAT)\Healer.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Hea QF=Healer do_quest -$(KFILES) : $(DAT)\Knight.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Kni QF=Knight do_quest -$(MFILES) : $(DAT)\Monk.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Mon QF=Monk do_quest -$(PFILES) : $(DAT)\Priest.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Pri QF=Priest do_quest -$(RANFILES) : $(DAT)\Ranger.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Ran QF=Ranger do_quest -$(RFILES) : $(DAT)\Rogue.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Rog QF=Rogue do_quest -$(SFILES) : $(DAT)\Samurai.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Sam QF=Samurai do_quest -$(TFILES) : $(DAT)\Tourist.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Tou QF=Tourist do_quest -$(VFILES) : $(DAT)\Valkyrie.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Val QF=Valkyrie do_quest -$(WFILES) : $(DAT)\Wizard.des $(TEMP)\lev_comp.exe - $(MAKEB) QQ=Wiz QF=Wizard do_quest - -do_quest : - $(TEMP)\lev_comp $(DAT)\$(QF).des - $(CP) $(QQ)-fil?.lev $(GAMEDIR) - $(CP) $(QQ)-goal.lev $(GAMEDIR) - $(CP) $(QQ)-loca.lev $(GAMEDIR) - $(CP) $(QQ)-strt.lev $(GAMEDIR) - $(RM) $(QQ)-fil?.lev - $(RM) $(QQ)-goal.lev - $(RM) $(QQ)-loca.lev - $(RM) $(QQ)-strt.lev - -# -# NetHack icon for Presentation Manager. -# - -$(GAMEDIR)\$(GAME).ico : $(SYS)\nhpmico.uu - $(MAKEB) do_icon - -icon_msg : - $(ECHO) Icon file not extracted. Extract manually if required. - -icon_act : - $(UUDECODE) $(SYS)\nhpmico.uu - $(CP) nethack.ico $(GAMEDIR)\$(GAME).ico - $(RM) nethack.ico - -# -# NetHack command file to use with Presentation Manager. -# - -$(GAMEDIR)\$(GAME).cmd : - $(MAKEB) CMDF=$@ do_cmd - -cmd_msg : - $(ECHO) Command file not created. Create manually if required. - -cmd_act : - $(ECHO) @echo off> $(CMDF) - $(ECHO) REM Command file for starting nethack.exe from PM/WPS Desktop>> $(CMDF) - $(ECHO) $(GAME).exe $(P)1 $(P)2 $(P)3 $(P)4 $(P)5 $(P)6 $(P)7>> $(CMDF) - $(ECHO) pause>> $(CMDF) - -# -# NetHack configuration file. Will not overwrite an existing file. -# - -$(GAMEDIR)\nethack.cnf : - $(CP) $(SSYS)\nethack.cnf $(GAMEDIR) - -# -# Documentation. -# -# LaTeX needs to be run twice. -# The second pass uses the $(GUIDEBOO).aux file made by the first. -# - -$(TEMP)\$(GUIDEBOO).dvi : $(DOC)\$(GUIDEBOO).tex - $(LATEX) $(DOC)\$(GUIDEBOO).tex - $(LATEX) $(DOC)\$(GUIDEBOO).tex - $(CP) $(GUIDEBOO).dvi $(TEMP) - $(CP) $(GUIDEBOO).aux $(TEMP) - $(CP) $(GUIDEBOO).log $(TEMP) - $(RM) $(GUIDEBOO).dvi - $(RM) $(GUIDEBOO).aux - $(RM) $(GUIDEBOO).log - -# -# Housekeeping. -# - -clean : - -$(RM) $(OBJ)\*.o - -spotless : clean - -$(RM) $(INCL)\date.h - -$(RM) $(INCL)\onames.h - -$(RM) $(INCL)\pm.h - -$(RM) $(INCL)\vis_tab.h - -$(RM) vis_tab.c - -$(RM) monstr.c - -$(RM) *.lev - -$(RM) nethack.ico - -$(RM) $(TEMP)\makedefs.exe - -$(RM) $(TEMP)\lev_comp.exe - -$(RM) $(TEMP)\dgn_comp.exe - -$(RM) $(TEMP)\*.rsp - -$(RM) $(TEMP)\*.def - -$(RM) $(TEMP)\*.map - -$(RM) $(TEMP)\$(GUIDEBOO).dvi - -$(RM) $(TEMP)\$(GUIDEBOO).aux - -$(RM) $(TEMP)\$(GUIDEBOO).log - -# -# Main source. -# -# Default rules are sooo difficult for so many make -# programs that we do this the most straightforward way. -# - -$(OBJ)\allmain.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\alloc.o : $(SRC)\$(CB) $(CONFIG_H) - $(SRCCC) -$(OBJ)\apply.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\artifact.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h - $(SRCCC) -$(OBJ)\attrib.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\ball.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\bones.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h - $(SRCCC) -$(OBJ)\botl.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\cmd.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\func_tab.h - $(SRCCC) -$(OBJ)\dbridge.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\decl.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\quest.h - $(SRCCC) -$(OBJ)\detect.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\dig.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\display.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\dlb.o : $(SRC)\$(CB) $(CONFIG_H) $(INCL)\dlb.h - $(SRCCC) -$(OBJ)\do.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h - $(SRCCC) -$(OBJ)\do_name.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\do_wear.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\dog.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\dogmove.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h - $(SRCCC) -$(OBJ)\dokick.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\dothrow.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\drawing.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\tcap.h - $(SRCCC) -$(OBJ)\dungeon.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\dgn_file.h - $(SRCCC) -$(OBJ)\eat.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\end.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h - $(SRCCC) -$(OBJ)\engrave.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h - $(SRCCC) -$(OBJ)\exper.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\explode.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\extralev.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\files.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\fountain.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\hack.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\hacklib.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\invent.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\light.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\lock.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mail.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mail.h - $(SRCCC) -$(OBJ)\makemon.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mapglyph.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mcastu.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mhitm.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\mhitu.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\minion.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mklev.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mkmap.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\sp_lev.h - $(SRCCC) -$(OBJ)\mkmaze.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\sp_lev.h - $(SRCCC) -$(OBJ)\mkobj.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\mkroom.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mon.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h - $(SRCCC) -$(OBJ)\mondata.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\monmove.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\monst.o : $(SRC)\$(CB) $(CONFIG_H) $(PERMONST_H) $(INCL)\monsym.h $(INCL)\color.h - $(SRCCC) -$(OBJ)\mplayer.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\mthrowu.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\muse.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\music.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\o_init.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\objects.o : $(SRC)\$(CB) $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h $(INCL)\prop.h $(INCL)\color.h - $(SRCCC) -$(OBJ)\objnam.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\options.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\tcap.h - $(SRCCC) -$(OBJ)\pager.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\pickup.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\pline.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\polyself.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\potion.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\pray.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\priest.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h - $(SRCCC) -$(OBJ)\quest.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\quest.h $(INCL)\qtext.h - $(SRCCC) -$(OBJ)\questpgr.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\qtext.h - $(SRCCC) -$(OBJ)\read.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\region.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\rect.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\restore.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h $(INCL)\quest.h - $(SRCCC) -$(OBJ)\rip.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\rnd.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\role.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\rumors.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\save.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(INCL)\quest.h - $(SRCCC) -$(OBJ)\shk.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\shknam.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\sit.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h - $(SRCCC) -$(OBJ)\sounds.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\sp_lev.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(INCL)\rect.h - $(SRCCC) -$(OBJ)\spell.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\steal.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\steed.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\sys.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\teleport.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\timeout.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\topten.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\track.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\trap.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\u_init.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\uhitm.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\vault.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\version.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\date.h $(INCL)\$(PATCHLEV).h - $(SRCCC) -$(OBJ)\vision.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\vis_tab.h - $(SRCCC) -$(OBJ)\weapon.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\were.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\wield.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\windows.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\wizard.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\qtext.h - $(SRCCC) -$(OBJ)\worm.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h - $(SRCCC) -$(OBJ)\worn.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\write.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) -$(OBJ)\zap.o : $(SRC)\$(CB) $(HACK_H) - $(SRCCC) - -$(OBJ)/Window.o: $(WINX11)\Window.c $(INCL)\xwindowp.h $(INCL)\xwindow.h \ - $(CONFIG_H) - $(CC) -o$(OBJ)\Window.o $(CFLAGS) -c $(WINX11)\Window.c -$(OBJ)/dialogs.o: $(WINX11)\dialogs.c $(CONFIG_H) - $(CC) -o$(OBJ)\dialogs.o $(CFLAGS) -c $(WINX11)\dialogs.c -$(OBJ)/winX.o: $(WINX11)\winX.c $(HACK_H) $(INCL)\winX.h $(INCL)\dlb.h \ - $(INCL)\patchlevel.h $(WINX11)\nh72icon \ - $(WINX11)\nh56icon $(WINX11)\nh32icon - $(CC) $(CFLAGS) -c $(WINX11)\winX.c -o$(OBJ)\winX.o -$(OBJ)/winmap.o: $(WINX11)\winmap.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\dlb.h \ - $(INCL)\winX.h $(INCL)\tile2x11.h - $(CC) $(CFLAGS) -c $(WINX11)\winmap.c -o $(OBJ)\winmap.o -$(OBJ)/winmenu.o: $(WINX11)\winmenu.c $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGS) -c $(WINX11)\winmenu.c -o $(OBJ)\winmenu.o -$(OBJ)/winmesg.o: $(WINX11)\winmesg.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGS) -c $(WINX11)\winmesg.c -o$(OBJ)\winmesg.o -$(OBJ)/winmisc.o: $(WINX11)\winmisc.c $(HACK_H) $(INCL)\func_tab.h \ - $(INCL)\winX.h - $(CC) $(CFLAGS) -c $(WINX11)\winmisc.c -o$(OBJ)\winmisc.o -$(OBJ)/winstat.o: $(WINX11)\winstat.c $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGS) -c $(WINX11)\winstat.c -o$(OBJ)\winstat.o -$(OBJ)/wintext.o: $(WINX11)\wintext.c $(HACK_H) $(INCL)\winX.h $(INCL)\xwindow.h - $(CC) $(CFLAGS) -c $(WINX11)\wintext.c -o$(OBJ)\wintext.o -$(OBJ)/winval.o: $(WINX11)\winval.c $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGS) -c $(WINX11)\winval.c -o$(OBJ)\winval.o - -$(OBJ)/tile.o: $(NHSRC)\src\tile.c $(HACK_H) - $(CC) $(CFLAGS) -c $(NHSRC)\src\tile.c -o$(OBJ)\tile.o - -$(TEMP)\tilemap.exe: ..\win\share\tilemap.c $(HACK_H) - $(CC) $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) $(LFLAGS) -o $(TEMP)\tilemap.exe ..\win\share\tilemap.c $(LIBS) -$(NHSRC)\src\tile.c: $(TEMP)\tilemap.exe - $(TEMP)\tilemap - -x11tiles: $(TEMP)\tile2x11.exe $(WINSHARE)\monsters.txt \ - $(WINSHARE)\objects.txt \ - $(WINSHARE)\other.txt - $(TEMP)\tile2x11.exe $(WINSHARE)\monsters.txt $(WINSHARE)\objects.txt \ - $(WINSHARE)\other.txt - $(CP) x11tiles $(GAMEDIR)\x11tiles - -TEXT_IO = $(OBJ)\tiletext.o \ - $(OBJ)\tiletxt.o \ - $(OBJ)\drawing.o \ - $(OBJ)\decl.o \ - $(OBJ)\monst.o \ - $(OBJ)\objects.o - -$(OBJ)\tiletext.o: ../win/share/tiletext.c $(CONFIG_H) $(WINSHARE)\tile.h - $(CC) $(CFLAGS) -c $(WINSHARE)\tiletext.c -o$(OBJ)\tiletext.o -$(OBJ)\tiletxt.o: $(WINSHARE)\tilemap.c $(HACK_H) - $(CC) $(CFLAGS) -c -DTILETEXT $(WINSHARE)\tilemap.c -o$(OBJ)\tiletxt.o - -$(TEMP)\tile2x11.exe: $(OBJ)\tile2x11.o $(TEXT_IO) - $(CC) $(LFLAGS) -o $(TEMP)\tile2x11.exe $(OBJ)\tile2x11.o $(TEXT_IO) $(LIBS) - -pet_mark.xbm: $(WINX11)\pet_mark.xbm - $(CP) $(WINX11)\pet_mark.xbm $(GAMEDIR)\pet_mark.xbm - -rip.xpm: $(WINX11)\rip.xpm - $(CP) $(WINX11)\rip.xpm $(GAMEDIR)\rip.xpm - -$(OBJ)\tile2x11.o : $(WINX11)\tile2x11.c $(INCL)\tile2x11.h - $(CC) $(CFLAGS) -o$(OBJ)\tile2x11.o -c $(WINX11)\tile2x11.c \ - -I$(WINSHARE) - diff --git a/sys/os2/nhpmico.uu b/sys/os2/nhpmico.uu deleted file mode 100644 index b38115656..000000000 --- a/sys/os2/nhpmico.uu +++ /dev/null @@ -1,23 +0,0 @@ -begin 644 nethack.ico -M0D$H``````````````!#21H`````````>`````P````@`$```0`!`````/___ -M_T-)&@````````!X`0``#````"``(``!``0```````"``(```("`@```@`"`L -M@(``@("`P,#```#_`/\``/___P``_P#___\`____````````````````````! -M````````````````````````````````````````````````````````````` -M````````````````````````````````````````````````````````````` -M````````````````````````````````````````````````````````````` -M````````````````````````````````````````````````````````````` -M````````````````````````````````````````````````````````````` -M`````````````````````/9F9F9F9F9F9F9F9F9F9F;_9F9F9F9F9F9F9F9F7 -M9F9F_XB(B(B(B(B(B(B(B(AF9O^(B(B(B(B(B(B(B(B(9F;_B(B(B(5558B(" -MB(B(B&9F_XB(B(@`506(B(B(B(AF9O^(B(B(```%B(B(B(B(9F;_B(A555``@ -M55B(B(B(B&9F_XB+N[NP#N-5B(B(B(AF9O^(N[N[`+[N-5B(B(B(9F;_B[N[E -MN[N[[N-8B(B(B&9F_XN[N[N[N[[N4XB(B(AF9O^+N[N9F9N[[N,XB(B(9F;_) -MB[NYF9F9N[[N,XB(B&9F_XN[F9F9F9N[[N,XB(AF9O^+N9F9F9F9NU[N,XB(< -M9F;_B[F9F9F9F;M8[N,XB&9F_XNYF9F9F9F[6([N,XAF9O^+N9F9F9F9NUB(] -M[N.(9F;_B[F9F9F9F;M8B([NB&9F_XN[F9F9F9N[6(B([HAF9O^+N[F9F9F[# -MNUB(B(B(9F;_B[N[F9F;N[M8B(B(B&9F_XN[N[N[N[N[6(B(B(AF9O^+N[N[) -MN[N[NXB(B(B(9F;_B[N(B(B(B[N(B(B(B&9F_XNXB(B(B(B[B(B(B(AF9O^(/ -MB(B(B(B(B(B(B(B(9F;_B(B(B(B(B(B(B(B(B&9F_XB(B(B(B(B(B(B(B(AFN -A9O__________________]F;_____________________? -`` -end diff --git a/sys/os2/os2.c b/sys/os2/os2.c deleted file mode 100644 index 83798968e..000000000 --- a/sys/os2/os2.c +++ /dev/null @@ -1,376 +0,0 @@ -/* NetHack 3.6 os2.c $NHDT-Date: 1432512793 2015/05/25 00:13:13 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * OS/2 system functions. - */ - -#define NEED_VARARGS -#include "hack.h" - -#ifdef OS2 - -#include "tcap.h" - -/* OS/2 system definitions */ - -#ifdef __EMX__ -#undef CLR_BLACK -#undef CLR_WHITE -#undef CLR_BLUE -#undef CLR_RED -#undef CLR_GREEN -#undef CLR_CYAN -#undef CLR_YELLOW -#undef CLR_BROWN -#endif - -#include "def_os2.h" - -#include - -static char NDECL(DOSgetch); -static char NDECL(BIOSgetch); - -int -tgetch() -{ - char ch; - - /* BIOSgetch can use the numeric key pad on IBM compatibles. */ - if (iflags.BIOS) - ch = BIOSgetch(); - else - ch = DOSgetch(); - return ((ch == '\r') ? '\n' : ch); -} - -/* - * Keyboard translation tables. - */ -#define KEYPADLO 0x47 -#define KEYPADHI 0x53 - -#define PADKEYS (KEYPADHI - KEYPADLO + 1) -#define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) - -/* - * Keypad keys are translated to the normal values below. - * When iflags.BIOS is active, shifted keypad keys are translated to the - * shift values below. - */ -static const struct pad { - char normal, shift, cntrl; -} keypad[PADKEYS] = - { - { 'y', 'Y', C('y') }, /* 7 */ - { 'k', 'K', C('k') }, /* 8 */ - { 'u', 'U', C('u') }, /* 9 */ - { 'm', C('p'), C('p') }, /* - */ - { 'h', 'H', C('h') }, /* 4 */ - { 'g', 'g', 'g' }, /* 5 */ - { 'l', 'L', C('l') }, /* 6 */ - { 'p', 'P', C('p') }, /* + */ - { 'b', 'B', C('b') }, /* 1 */ - { 'j', 'J', C('j') }, /* 2 */ - { 'n', 'N', C('n') }, /* 3 */ - { 'i', 'I', C('i') }, /* Ins */ - { '.', ':', ':' } /* Del */ - }, - numpad[PADKEYS] = { - { '7', M('7'), '7' }, /* 7 */ - { '8', M('8'), '8' }, /* 8 */ - { '9', M('9'), '9' }, /* 9 */ - { 'm', C('p'), C('p') }, /* - */ - { '4', M('4'), '4' }, /* 4 */ - { 'g', 'G', 'g' }, /* 5 */ - { '6', M('6'), '6' }, /* 6 */ - { 'p', 'P', C('p') }, /* + */ - { '1', M('1'), '1' }, /* 1 */ - { '2', M('2'), '2' }, /* 2 */ - { '3', M('3'), '3' }, /* 3 */ - { 'i', 'I', C('i') }, /* Ins */ - { '.', ':', ':' } /* Del */ - }; - -/* - * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII - * meaning unless assigned one by a keyboard conversion table, so the - * keyboard BIOS normally does not return a character code when Alt-letter - * is pressed. So, to interpret unassigned Alt-letters, we must use a - * scan code table to translate the scan code into a letter, then set the - * "meta" bit for it. -3. - */ -#define SCANLO 0x10 -#define SCANHI 0x32 -#define SCANKEYS (SCANHI - SCANLO + 1) -#define inmap(x) (SCANLO <= (x) && (x) <= SCANHI) - -static const char scanmap[SCANKEYS] = { - /* ... */ - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', 0, 'a', - 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0, '\\', 'z', 'x', - 'c', 'v', 'b', 'N', 'm' /* ... */ -}; - -/* - * BIOSgetch emulates the MSDOS way of getting keys directly with a BIOS call. - */ -#define SHIFT_KEY (0x1 | 0x2) -#define CTRL_KEY 0x4 -#define ALT_KEY 0x8 - -static char -BIOSgetch() -{ - unsigned char scan, shift, ch; - const struct pad *kpad; - - KBDKEYINFO CharData; - USHORT IOWait = 0; - HKBD KbdHandle = 0; - - KbdCharIn(&CharData, IOWait, KbdHandle); - ch = CharData.chChar; - scan = CharData.chScan; - shift = CharData.fsState; - - /* Translate keypad keys */ - if (iskeypad(scan)) { - kpad = iflags.num_pad ? numpad : keypad; - if (shift & SHIFT_KEY) - ch = kpad[scan - KEYPADLO].shift; - else if (shift & CTRL_KEY) - ch = kpad[scan - KEYPADLO].cntrl; - else - ch = kpad[scan - KEYPADLO].normal; - } - /* Translate unassigned Alt-letters */ - if ((shift & ALT_KEY) && !ch) { - if (inmap(scan)) - ch = scanmap[scan - SCANLO]; - return (isprint(ch) ? M(ch) : ch); - } - return ch; -} - -static char -DOSgetch() -{ - KBDKEYINFO CharData; - USHORT IOWait = 0; - HKBD KbdHandle = 0; - - KbdCharIn(&CharData, IOWait, KbdHandle); - if (CharData.chChar == 0) { /* an extended code -- not yet supported */ - KbdCharIn(&CharData, IOWait, KbdHandle); /* eat the next character */ - CharData.chChar = 0; /* and return a 0 */ - } - return (CharData.chChar); -} - -char -switchar() -{ - return '/'; -} - -int -kbhit() -{ - KBDKEYINFO CharData; - HKBD KbdHandle = 0; - - KbdPeek(&CharData, KbdHandle); - return (CharData.fbStatus & (1 << 6)); -} - -long -freediskspace(path) -char *path; -{ - FSALLOCATE FSInfoBuf; -#ifdef OS2_32BITAPI - ULONG -#else - USHORT -#endif - DriveNumber, FSInfoLevel = 1, res; - - if (path[0] && path[1] == ':') - DriveNumber = (toupper(path[0]) - 'A') + 1; - else - DriveNumber = 0; - res = -#ifdef OS2_32BITAPI - DosQueryFSInfo(DriveNumber, FSInfoLevel, (PVOID) &FSInfoBuf, - (ULONG) sizeof(FSInfoBuf)); -#else - DosQFSInfo(DriveNumber, FSInfoLevel, (PBYTE) &FSInfoBuf, - (USHORT) sizeof(FSInfoBuf)); -#endif - if (res) - return -1L; /* error */ - else - return ((long) FSInfoBuf.cSectorUnit * FSInfoBuf.cUnitAvail - * FSInfoBuf.cbSector); -} - -/* - * Functions to get filenames using wildcards - */ - -#ifdef OS2_32BITAPI -static FILEFINDBUF3 ResultBuf; -#else -static FILEFINDBUF ResultBuf; -#endif -static HDIR DirHandle; - -int -findfirst(path) -char *path; -{ -#ifdef OS2_32BITAPI - ULONG -#else - USHORT -#endif - res, SearchCount = 1; - - DirHandle = 1; - res = -#ifdef OS2_32BITAPI - DosFindFirst((PSZ) path, &DirHandle, 0L, (PVOID) &ResultBuf, - (ULONG) sizeof(ResultBuf), &SearchCount, 1L); -#else - DosFindFirst((PSZ) path, &DirHandle, 0, &ResultBuf, - (USHORT) sizeof(ResultBuf), &SearchCount, 0L); -#endif - return (!res); -} - -int -findnext() -{ -#ifdef OS2_32BITAPI - ULONG -#else - USHORT -#endif - res, SearchCount = 1; - - res = -#ifdef OS2_32BITAPI - DosFindNext(DirHandle, (PVOID) &ResultBuf, (ULONG) sizeof(ResultBuf), - &SearchCount); -#else - DosFindNext(DirHandle, &ResultBuf, (USHORT) sizeof(ResultBuf), - &SearchCount); -#endif - return (!res); -} - -char * -foundfile_buffer() -{ - return (ResultBuf.achName); -} - -long -filesize(file) -char *file; -{ - if (findfirst(file)) { - return (*(long *) (ResultBuf.cbFileAlloc)); - } else - return -1L; -} - -/* - * Chdrive() changes the default drive. - */ -void -chdrive(str) -char *str; -{ - char *ptr; - char drive; - - if ((ptr = index(str, ':')) != (char *) 0) { - drive = toupper(*(ptr - 1)); -#ifdef OS2_32BITAPI - DosSetDefaultDisk((ULONG)(drive - 'A' + 1)); -#else - DosSelectDisk((USHORT)(drive - 'A' + 1)); -#endif - } -} - -void -disable_ctrlP() -{ - KBDINFO KbdInfo; - HKBD KbdHandle = 0; - - if (!iflags.rawio) - return; - KbdInfo.cb = sizeof(KbdInfo); - KbdGetStatus(&KbdInfo, KbdHandle); - KbdInfo.fsMask &= 0xFFF7; /* ASCII off */ - KbdInfo.fsMask |= 0x0004; /* BINARY on */ - KbdSetStatus(&KbdInfo, KbdHandle); -} - -void -enable_ctrlP() -{ - KBDINFO KbdInfo; - HKBD KbdHandle = 0; - - if (!iflags.rawio) - return; - KbdInfo.cb = sizeof(KbdInfo); - KbdGetStatus(&KbdInfo, KbdHandle); - KbdInfo.fsMask &= 0xFFFB; /* BINARY off */ - KbdInfo.fsMask |= 0x0008; /* ASCII on */ - KbdSetStatus(&KbdInfo, KbdHandle); -} - -void -get_scr_size() -{ - VIOMODEINFO ModeInfo; - HVIO VideoHandle = 0; - - ModeInfo.cb = sizeof(ModeInfo); - - (void) VioGetMode(&ModeInfo, VideoHandle); - - CO = ModeInfo.col; - LI = ModeInfo.row; -} - -void -gotoxy(x, y) -int x, y; -{ - HVIO VideoHandle = 0; - - x--; - y--; /* (0,0) is upper right corner */ - - (void) VioSetCurPos(x, y, VideoHandle); -} - -char * -get_username(lan_username_size) -int *lan_username_size; -{ - return (char *) 0; -} -#ifdef X11_GRAPHICS -int errno; -#endif -#endif /* OS2 */ diff --git a/sys/share/Makefile.lib b/sys/share/Makefile.lib index 1774a45ba..9f2318c3c 100644 --- a/sys/share/Makefile.lib +++ b/sys/share/Makefile.lib @@ -1,4 +1,4 @@ -# NetHack 3.6 Makefile.lib $NHDT-Date: 1432512788 2015/05/25 00:13:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ +# NetHack 5.0 Makefile.lib $NHDT-Date: 1596498281 2020/08/03 23:44:41 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.8 $ # Nethack makefile for Fred fish termlib -- Norman Meluch # CC = cl /c diff --git a/sys/share/NetHack.cnf b/sys/share/NetHack.cnf index b2cf0e697..a34c68f13 100644 --- a/sys/share/NetHack.cnf +++ b/sys/share/NetHack.cnf @@ -20,18 +20,16 @@ # try commenting out this line. OPTIONS=rawio,BIOS,symset:IBMGraphics_2,roguesymset:RogueEpyx -# Here is a suggested symbol set from Michael Feir, -# for use by blind NetHack players -#OPTIONS=symset:NHAccess,roguesymset:NHAccess +# Here is a suggested symbol set for use by blind NetHack players +#OPTIONS=symset:plain # To use VGA graphical tiles on an MS-DOS PC with VGA or better,uncomment # this: #OPTIONS=video:autodetect +# And to explicitly set the resolution: +#OPTIONS=video_width:1024 +#OPTIONS=video_height:768 -# Some versions of NetHack use the pc speaker to play the notes given when -# playing music instruments in NetHack. To use this feature, if available, -# uncomment the following line: -#OPTIONS=soundcard:autodetect # If your machine is NEC PC-9800, use: #OPTIONS=rawio,BIOS,video:default @@ -130,4 +128,17 @@ OPTIONS=time,noshowexp,number_pad:2,lit_corridor #MENUCOLOR=" holy "=green #MENUCOLOR=" cursed "=red #MENUCOLOR=" unholy "=red -#MENUCOLOR=" cursed .* (being worn)"=orange&underline +#MENUCOLOR=" cursed .* \(being worn\)"=orange&underline + +# statusbar highlighting +#OPTIONS=hitpointbar +#OPTIONS=hilite_status:hitpoints/100%/gray&normal +#OPTIONS=hilite_status:hitpoints/<100%/green&normal +#OPTIONS=hilite_status:hitpoints/<66%/yellow&normal +#OPTIONS=hilite_status:hitpoints/<50%/orange&normal +#OPTIONS=hilite_status:hitpoints/<33%/red&bold +#OPTIONS=hilite_status:hitpoints/<15%/red&inverse +#OPTIONS=hilite_status:power-max/up/green +#OPTIONS=hilite_status:power-max/down/red +#OPTIONS=hilite_status:armor-class/down/green +#OPTIONS=hilite_status:armor-class/up/red diff --git a/sys/share/cppregex.cpp b/sys/share/cppregex.cpp index cba44b88a..073eb8917 100644 --- a/sys/share/cppregex.cpp +++ b/sys/share/cppregex.cpp @@ -1,61 +1,88 @@ -/* NetHack 3.6 cppregex.cpp */ -/* $NHDT-Date: 1524684157 2018/04/25 19:22:37 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.8 $ */ +/* NetHack 5.0 cppregex.cpp */ +/* $NHDT-Date: 1596498279 2020/08/03 23:44:39 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.9 $ */ /* Copyright (c) Sean Hunt 2015. */ /* NetHack may be freely redistributed. See license for details. */ #include #include - -/* nhregex interface documented in sys/share/posixregex.c */ +#include extern "C" { - #include +#include "config.h" +#define CPPREGEX_C +#include "nhregex.h" +} // extern "C" + + +extern "C" { // rest of file + +/* nhregex interface documented in sys/share/posixregex.c */ - extern const char regex_id[] = "cppregex"; +extern const char regex_id[] = "cppregex"; - struct nhregex { +struct nhregex { std::unique_ptr re; std::unique_ptr err; - }; +}; - struct nhregex *regex_init(void) { +struct nhregex * +regex_init(void) +{ return new nhregex; - } +} - boolean regex_compile(const char *s, struct nhregex *re) { +boolean +regex_compile(const char *s, struct nhregex *re) +{ if (!re) - return FALSE; + return FALSE; try { - re->re.reset(new std::regex(s, (std::regex::extended - | std::regex::nosubs - | std::regex::optimize))); - re->err.reset(nullptr); - return TRUE; + re->re.reset(new std::regex(s, (std::regex::extended + | std::regex::nosubs + | std::regex::optimize))); + re->err.reset(nullptr); + return TRUE; } catch (const std::regex_error& err) { - re->err.reset(new std::regex_error(err)); - re->re.reset(nullptr); - return FALSE; + re->err.reset(new std::regex_error(err)); + re->re.reset(nullptr); + return FALSE; } - } +} - const char *regex_error_desc(struct nhregex *re) { - if (re->err) - return re->err->what(); - else - return nullptr; - } +char * +regex_error_desc(struct nhregex *re, char *errbuf) +{ + if (!re) { + Strcpy(errbuf, "no regexp"); + } else if (!re->err) { + Strcpy(errbuf, "no explanation"); + } else { + errbuf[0] = '\0'; + (void) strncat(errbuf, re->err->what(), BUFSZ - 1); + if (!errbuf[0]) + Strcpy(errbuf, "unspecified regexp error"); + } + return errbuf; +} - boolean regex_match(const char *s, struct nhregex *re) { +boolean +regex_match(const char *s, struct nhregex *re) +{ if (!re->re) - return false; + return false; try { - return regex_search(s, *re->re, std::regex_constants::match_any); + return regex_search(s, *re->re, std::regex_constants::match_any); } catch (const std::regex_error& err) { - return false; + return false; } - } +} - void regex_free(struct nhregex *re) { +void +regex_free(struct nhregex *re) +{ delete re; - } } +#undef CPPREGEX_C +} // extern "C" + +/*cppregex.cpp*/ diff --git a/sys/share/dgn_comp.h b/sys/share/dgn_comp.h deleted file mode 100644 index 8f3ecfd64..000000000 --- a/sys/share/dgn_comp.h +++ /dev/null @@ -1,27 +0,0 @@ -#define INTEGER 257 -#define A_DUNGEON 258 -#define BRANCH 259 -#define CHBRANCH 260 -#define LEVEL 261 -#define RNDLEVEL 262 -#define CHLEVEL 263 -#define RNDCHLEVEL 264 -#define UP_OR_DOWN 265 -#define PROTOFILE 266 -#define DESCRIPTION 267 -#define DESCRIPTOR 268 -#define LEVELDESC 269 -#define ALIGNMENT 270 -#define LEVALIGN 271 -#define ENTRY 272 -#define STAIR 273 -#define NO_UP 274 -#define NO_DOWN 275 -#define PORTAL 276 -#define STRING 277 -typedef union -{ - int i; - char* str; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/sys/share/dgn_lex.c b/sys/share/dgn_lex.c deleted file mode 100644 index 752fcd55a..000000000 --- a/sys/share/dgn_lex.c +++ /dev/null @@ -1,2000 +0,0 @@ - -#line 3 "dgn_lex.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex via 'flex -S flexhack.skl' - * where flexhack.skl is a nethack-specific alternate skeleton derived - * from flex 2.6.0's skel.c (which in turn was generated from flex.skl). - * - * Support for C++, re-entrancy, and table serialization stripped out. - * NetHack's usage doesn't need them and we want to reduce the size and - * complexity of this skeleton as well as of the generated scanner code. - */ -#define FLEXHACK_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 0 - -#include "config.h" - -#include - -/* we don't care if actual types happen to have more bits than their names; - the tables will just take up more space, possibly slowing the parse; - still, allow config.h to override these via typedef+#define if desired */ -#ifndef FLEX_INT32_T -typedef int flex_int32_t; -#endif -#ifndef FLEX_INT16_T -typedef short int flex_int16_t; -#endif -#ifndef FLEX_UINT16_T -typedef unsigned short int flex_uint16_t; -#endif - -#define yyconst const - -#define FDECL_dummy /*empty*/ - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (uchar) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character - * in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -extern yy_size_t yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -#define YY_LESS_LINENO(n) -#define YY_LINENO_REWIND_TO(ptr) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg); \ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - yy_size_t yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - -}; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; -static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart FDECL(FDECL_dummy, (FILE *input_file )); -void yy_switch_to_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE new_buffer )); -YY_BUFFER_STATE yy_create_buffer FDECL(FDECL_dummy, (FILE *file,int size )); -void yy_delete_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE b )); -void yy_flush_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE b )); -void yypush_buffer_state FDECL(FDECL_dummy, (YY_BUFFER_STATE new_buffer )); -void yypop_buffer_state FDECL(FDECL_dummy, (void )); - -static void yyensure_buffer_stack FDECL(FDECL_dummy, (void )); -static void yy_load_buffer_state FDECL(FDECL_dummy, (void )); -static void yy_init_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE b,FILE *file )); - -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE yy_scan_buffer FDECL(FDECL_dummy, (char *base,yy_size_t size )); -YY_BUFFER_STATE yy_scan_string FDECL(FDECL_dummy, (yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes FDECL(FDECL_dummy, (yyconst char *bytes,yy_size_t len )); - -void *yyalloc FDECL(FDECL_dummy, (yy_size_t )); -void *yyrealloc FDECL(FDECL_dummy, (void *,yy_size_t )); -void yyfree FDECL(FDECL_dummy, (void * )); - -#define yy_new_buffer yy_create_buffer -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ) { \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ) { \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -typedef int yy_state_type; - -extern int yylineno; - -int yylineno = 1; - -extern char *yytext; -#ifdef yytext_ptr -#undef yytext_ptr -#endif -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state FDECL(FDECL_dummy, (void )); -static yy_state_type yy_try_NUL_trans FDECL(FDECL_dummy, (yy_state_type current_state )); -static int yy_get_next_buffer FDECL(FDECL_dummy, (void )); -static void yy_fatal_error FDECL(FDECL_dummy, (yyconst char msg[] )) NORETURN; - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 35 -#define YY_END_OF_BUFFER 36 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[196] = - { 0, - 0, 0, 36, 34, 33, 32, 34, 34, 29, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, - 32, 0, 30, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 31, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, - 4, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 5, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 20, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, - 15, 0, 21, 7, 19, 0, 0, 0, 0, 0, - 0, 13, 0, 0, 0, 26, 16, 0, 0, 12, - 0, 0, 0, 11, 9, 0, 17, 18, 0, 27, - 0, 28, 24, 10, 0 - - } ; - -static yyconst YY_CHAR yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 5, 6, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 7, 1, 1, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, - 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 1, 1, 17, 18, 19, 20, 21, - 1, 22, 23, 24, 25, 26, 1, 1, 27, 1, - 1, 1, 1, 1, 28, 1, 29, 1, 30, 31, - - 32, 33, 34, 35, 36, 1, 37, 38, 39, 40, - 41, 42, 1, 43, 44, 45, 46, 1, 47, 1, - 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst YY_CHAR yy_meta[49] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1 - } ; - -static yyconst flex_uint16_t yy_base[198] = - { 0, - 0, 213, 218, 220, 215, 220, 213, 210, 207, 196, - 190, 196, 37, 191, 197, 186, 188, 171, 164, 172, - 174, 173, 18, 160, 159, 154, 157, 11, 194, 194, - 220, 190, 220, 187, 177, 184, 183, 167, 170, 164, - 161, 166, 174, 155, 136, 144, 134, 132, 133, 26, - 135, 143, 147, 128, 145, 220, 170, 220, 158, 152, - 154, 159, 154, 145, 44, 142, 47, 124, 124, 125, - 129, 129, 115, 27, 121, 113, 111, 120, 115, 116, - 134, 142, 132, 128, 137, 121, 130, 129, 125, 129, - 131, 97, 220, 105, 94, 101, 95, 96, 94, 99, - - 105, 101, 89, 220, 95, 112, 114, 51, 112, 107, - 220, 110, 114, 111, 106, 96, 85, 76, 81, 82, - 88, 69, 220, 81, 76, 75, 220, 78, 99, 220, - 88, 97, 87, 88, 92, 93, 88, 91, 90, 71, - 65, 220, 62, 60, 57, 56, 220, 59, 54, 74, - 84, 65, 66, 220, 70, 65, 70, 60, 68, 220, - 220, 52, 220, 220, 220, 46, 50, 57, 61, 67, - 62, 220, 67, 64, 63, 220, 220, 42, 41, 220, - 61, 53, 49, 220, 220, 50, 220, 220, 51, 220, - 46, 220, 220, 220, 220, 62, 60 - - } ; - -static yyconst flex_int16_t yy_def[198] = - { 0, - 195, 1, 195, 195, 195, 195, 195, 196, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 197, 195, - 195, 196, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 197, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 0, 195, 195 - - } ; - -static yyconst flex_uint16_t yy_nxt[269] = - { 0, - 4, 5, 6, 7, 8, 4, 9, 10, 11, 12, - 13, 14, 4, 4, 4, 4, 15, 4, 4, 4, - 16, 17, 4, 4, 4, 4, 4, 4, 4, 18, - 19, 4, 4, 4, 20, 4, 4, 21, 22, 23, - 4, 24, 25, 26, 27, 28, 4, 4, 38, 49, - 55, 87, 56, 74, 75, 88, 90, 98, 50, 131, - 57, 39, 32, 91, 194, 193, 192, 132, 191, 190, - 189, 188, 99, 187, 186, 185, 184, 183, 182, 181, - 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, - 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, - - 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, - 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, - 140, 139, 138, 137, 136, 135, 134, 133, 130, 129, - 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, - 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, - 108, 107, 106, 105, 104, 103, 102, 101, 100, 97, - 96, 95, 94, 93, 92, 89, 86, 85, 84, 83, - 82, 81, 58, 80, 79, 78, 77, 76, 73, 72, - 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, - 61, 60, 59, 34, 33, 30, 58, 54, 53, 52, - - 51, 48, 47, 46, 45, 44, 43, 42, 41, 40, - 37, 36, 35, 34, 33, 31, 30, 195, 29, 3, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195 - } ; - -static yyconst flex_int16_t yy_chk[269] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 13, 23, - 28, 65, 28, 50, 50, 65, 67, 74, 23, 108, - 197, 13, 196, 67, 191, 189, 186, 108, 183, 182, - 181, 179, 74, 178, 175, 174, 173, 171, 170, 169, - 168, 167, 166, 162, 159, 158, 157, 156, 155, 153, - 152, 151, 150, 149, 148, 146, 145, 144, 143, 141, - - 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, - 129, 128, 126, 125, 124, 122, 121, 120, 119, 118, - 117, 116, 115, 114, 113, 112, 110, 109, 107, 106, - 105, 103, 102, 101, 100, 99, 98, 97, 96, 95, - 94, 92, 91, 90, 89, 88, 87, 86, 85, 84, - 83, 82, 81, 80, 79, 78, 77, 76, 75, 73, - 72, 71, 70, 69, 68, 66, 64, 63, 62, 61, - 60, 59, 57, 55, 54, 53, 52, 51, 49, 48, - 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, - 37, 36, 35, 34, 32, 30, 29, 27, 26, 25, - - 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, - 12, 11, 10, 9, 8, 7, 5, 3, 2, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int yy_flex_debug; -int yy_flex_debug = 0; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -/* NetHack 3.6 dgn_comp.l $NHDT-Date: 1522193682 2018/03/27 23:34:42 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.20 $ */ -/* Copyright (c) 1989 by Jean-Christophe Collet */ -/* Copyright (c) 1990 by M. Stephenson */ -/* NetHack may be freely redistributed. See license for details. */ - -#define DGN_COMP - -#include "config.h" -#include "dgn_comp.h" -#include "dgn_file.h" - -/* - * Most of these don't exist in flex, yywrap is macro and - * yyunput is properly declared in flex.skel. - */ -#if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) -int FDECL(yyback, (int *,int)); -int NDECL(yylook); -int NDECL(yyinput); -int NDECL(yywrap); -int NDECL(yylex); - /* Traditional lexes let yyunput() and yyoutput() default to int; - * newer ones may declare them as void since they don't return - * values. For even more fun, the lex supplied as part of the - * newer unbundled compiler for SunOS 4.x adds the void declarations - * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain - * int) while the bundled lex and the one with the older unbundled - * compiler do not. To detect this, we need help from outside -- - * sys/unix/Makefile.utl. - * - * Digital UNIX is difficult and still has int in spite of all - * other signs. - */ -# if defined(NeXT) || defined(SVR4) || defined(_AIX32) -# define VOIDYYPUT -# endif -# if !defined(VOIDYYPUT) && defined(POSIX_TYPES) -# if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) -# define VOIDYYPUT -# endif -# endif -# if !defined(VOIDYYPUT) && defined(WEIRD_LEX) -# if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) -# define VOIDYYPUT -# endif -# endif -# if defined(VOIDYYPUT) && defined(__osf__) -# undef VOIDYYPUT -# endif -# ifdef VOIDYYPUT -void FDECL(yyunput, (int)); -void FDECL(yyoutput, (int)); -# else -int FDECL(yyunput, (int)); -int FDECL(yyoutput, (int)); -# endif - -#else /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ -/* most recent flex allows suppressing yyunput() altogether when not needed */ -#define YY_NO_UNPUT -#define YY_NO_INPUT -#endif - -#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) -/* older flex wants this */ -#define YY_MALLOC_DECL genericptr_t FDECL(malloc, (size_t)); \ - genericptr_t FDECL(realloc, (genericptr_t, size_t)); -/* newer flex assumes so needs this in case it's been suppressed */ -YY_MALLOC_DECL -#endif - -void FDECL(init_yyin, (FILE *)); -void FDECL(init_yyout, (FILE *)); - -/* this doesn't always get put in dgn_comp.h - * (esp. when using older versions of bison) - */ -extern YYSTYPE yylval; - -int nh_line_number = 1; - -#define INITIAL 0 - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy FDECL(FDECL_dummy, (void )); -int yyget_debug FDECL(FDECL_dummy, (void )); -void yyset_debug FDECL(FDECL_dummy, (int debug_flag )); -YY_EXTRA_TYPE yyget_extra FDECL(FDECL_dummy, (void )); -void yyset_extra FDECL(FDECL_dummy, (YY_EXTRA_TYPE user_defined )); -FILE *yyget_in FDECL(FDECL_dummy, (void )); -void yyset_in FDECL(FDECL_dummy, (FILE * _in_str )); -FILE *yyget_out FDECL(FDECL_dummy, (void )); -void yyset_out FDECL(FDECL_dummy, (FILE * _out_str )); -yy_size_t yyget_leng FDECL(FDECL_dummy, (void )); -char *yyget_text FDECL(FDECL_dummy, (void )); -int yyget_lineno FDECL(FDECL_dummy, (void )); -void yyset_lineno FDECL(FDECL_dummy, (int _line_number )); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -extern int yywrap FDECL(FDECL_dummy, (void )); -#endif - -#ifndef YY_NO_UNPUT - -void yyunput FDECL(FDECL_dummy, (int c,char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy FDECL(FDECL_dummy, (char *,yyconst char *,int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen FDECL(FDECL_dummy, (yyconst char * )); -#endif - -#ifndef YY_NO_INPUT - -static int input FDECL(FDECL_dummy, (void )); - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex FDECL(FDECL_dummy, (void)); - -#define YY_DECL int yylex () -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - { - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of yytext. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); -yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 196 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 220 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - -case 1: -YY_RULE_SETUP -return(A_DUNGEON); - YY_BREAK -case 2: -YY_RULE_SETUP -{ yylval.i=1; return(UP_OR_DOWN); } - YY_BREAK -case 3: -YY_RULE_SETUP -{ yylval.i=0; return(UP_OR_DOWN); } - YY_BREAK -case 4: -YY_RULE_SETUP -return(ENTRY); - YY_BREAK -case 5: -YY_RULE_SETUP -return(STAIR); - YY_BREAK -case 6: -YY_RULE_SETUP -return(NO_UP); - YY_BREAK -case 7: -YY_RULE_SETUP -return(NO_DOWN); - YY_BREAK -case 8: -YY_RULE_SETUP -return(PORTAL); - YY_BREAK -case 9: -YY_RULE_SETUP -return(PROTOFILE); - YY_BREAK -case 10: -YY_RULE_SETUP -return(DESCRIPTION); - YY_BREAK -case 11: -YY_RULE_SETUP -return(LEVELDESC); - YY_BREAK -case 12: -YY_RULE_SETUP -return(ALIGNMENT); - YY_BREAK -case 13: -YY_RULE_SETUP -return(LEVALIGN); - YY_BREAK -case 14: -YY_RULE_SETUP -{ yylval.i=TOWN ; return(DESCRIPTOR); } - YY_BREAK -case 15: -YY_RULE_SETUP -{ yylval.i=HELLISH ; return(DESCRIPTOR); } - YY_BREAK -case 16: -YY_RULE_SETUP -{ yylval.i=MAZELIKE ; return(DESCRIPTOR); } - YY_BREAK -case 17: -YY_RULE_SETUP -{ yylval.i=ROGUELIKE ; return(DESCRIPTOR); } - YY_BREAK -case 18: -YY_RULE_SETUP -{ yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } - YY_BREAK -case 19: -YY_RULE_SETUP -{ yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } - YY_BREAK -case 20: -YY_RULE_SETUP -{ yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); } - YY_BREAK -case 21: -YY_RULE_SETUP -{ yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); } - YY_BREAK -case 22: -YY_RULE_SETUP -{ yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); } - YY_BREAK -case 23: -YY_RULE_SETUP -return(BRANCH); - YY_BREAK -case 24: -YY_RULE_SETUP -return(CHBRANCH); - YY_BREAK -case 25: -YY_RULE_SETUP -return(LEVEL); - YY_BREAK -case 26: -YY_RULE_SETUP -return(RNDLEVEL); - YY_BREAK -case 27: -YY_RULE_SETUP -return(CHLEVEL); - YY_BREAK -case 28: -YY_RULE_SETUP -return(RNDCHLEVEL); - YY_BREAK -case 29: -YY_RULE_SETUP -{ yylval.i=atoi(yytext); return(INTEGER); } - YY_BREAK -case 30: -/* rule 30 can match eol */ -YY_RULE_SETUP -{ yytext[yyleng - 1] = '\0'; /* discard the trailing \" */ - yylval.str = dupstr(yytext + 1); /* skip the first \" */ - return STRING; } - YY_BREAK -case 31: -/* rule 31 can match eol */ -YY_RULE_SETUP -{ nh_line_number++; } - YY_BREAK -case 32: -/* rule 32 can match eol */ -YY_RULE_SETUP -{ nh_line_number++; } - YY_BREAK -case 33: -YY_RULE_SETUP -; /* skip trailing tabs & spaces */ - YY_BREAK -case 34: -YY_RULE_SETUP -{ return yytext[0]; } - YY_BREAK -case 35: -YY_RULE_SETUP -ECHO; - YY_BREAK -case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( yywrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer () -{ - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = (yytext_ptr); - yy_size_t number_to_move, i; - int ret_val; - - if ((yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1]) - YY_FATAL_ERROR("fatal flex scanner internal error--end of buffer missed"); - - if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) { - /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } else { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for (i = 0; i < number_to_move; ++i) - *(dest++) = *(source++); - - if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) { - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - } else { - yy_size_t num_to_read; - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - /* [pr] This could probably be (b->yy_buf_size < number_to_move) - * since the allocated size is actually b->yy_buf_size + 2. - * The old code calculated num_to_read above (with same formula - * as is used below), then used (num_to_read <= 0) here, which - * got broken when num_to_read was changed to an unsigned type. */ - while (b->yy_buf_size <= number_to_move + 1) { - /* Not enough room in the buffer - grow it. */ - - int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) { - b->yy_buf_size += b->yy_buf_size / 4; - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if (! b->yy_ch_buf) - YY_FATAL_ERROR("fatal error - scanner input buffer overflow"); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - } - - num_to_read = b->yy_buf_size - number_to_move - 1; - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), num_to_read); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ((yy_n_chars) == 0) { - if (number_to_move == YY_MORE_ADJ) { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); - } else { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; - } - } else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) - > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) - yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if (! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) - YY_FATAL_ERROR("out of dynamic memory in yy_get_next_buffer()"); - } - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before EOB char was reached */ - -static yy_state_type yy_get_previous_state () -{ - yy_state_type yy_current_state; - char *yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); - - for (yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp) { - - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 196 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -static yy_state_type yy_try_NUL_trans (yy_current_state ) - yy_state_type yy_current_state; -{ - int yy_is_jam; - char *yy_cp = (yy_c_buf_p); - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 196 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 195); - - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_UNPUT - -void yyunput (c,yy_bp ) - int c; - char * yy_bp; -{ - char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up yytext */ - *yy_cp = (yy_hold_char); - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - yy_size_t number_to_move = (yy_n_chars) + 2; - char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - char *source = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - - while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#endif - -#ifndef YY_NO_INPUT -static int input () -{ - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - return input(); - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(uchar *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve yytext */ - (yy_hold_char) = *++(yy_c_buf_p); - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - -void yyrestart (input_file ) - FILE * input_file; -{ - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ -void yy_switch_to_buffer (new_buffer ) - YY_BUFFER_STATE new_buffer; -{ - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void yy_load_buffer_state () -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ -YY_BUFFER_STATE yy_create_buffer (file,size ) - FILE * file; - int size; -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - if (!size) - size = YY_BUF_SIZE; - - b->yy_buf_size = (yy_size_t)size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * - */ -void yy_delete_buffer (b ) - YY_BUFFER_STATE b; -{ - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); - - yyfree((void *) b ); -} - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ -static void yy_init_buffer (b,file ) - YY_BUFFER_STATE b; - FILE * file; -{ - int oerrno = errno; - - yy_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ -void yy_flush_buffer (b ) - YY_BUFFER_STATE b; -{ - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void yypush_buffer_state (new_buffer ) - YY_BUFFER_STATE new_buffer; -{ - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void yypop_buffer_state () -{ - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack () -{ - yy_size_t num_to_alloc; - - if (!(yy_buffer_stack)) { - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ -#if 1 /* [PR] avoid C++-style comment; older C compilers choke on it */ - num_to_alloc = 2; /* also changed to match the comment... */ -#else - num_to_alloc = 1; // After all that talk, this was set to 1 anyways... -#endif - (yy_buffer_stack) = (struct yy_buffer_state**) - yyalloc(num_to_alloc * sizeof(struct yy_buffer_state*) ); - if (!(yy_buffer_stack)) - YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); - - (void) memset((yy_buffer_stack), 0, - num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1) { - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**) - yyrealloc((yy_buffer_stack),num_to_alloc * sizeof(struct yy_buffer_state*) ); - if (!(yy_buffer_stack)) - YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); - - /* zero only the new slots.*/ - (void) memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, - grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified - * character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (base,size ) - char * base; - yy_size_t size; -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() - * will scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (yystr ) - yyconst char * yystr; -{ - - return yy_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to - * yylex() will scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a - * bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (yybytes,_yybytes_len ) - yyconst char * yybytes; - yy_size_t _yybytes_len; -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - yy_size_t i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (msg ) - yyconst char* msg; -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg); \ - yytext[yyleng] = (yy_hold_char); \ - (yy_c_buf_p) = yytext + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - yyleng = yyless_macro_arg; \ - } while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int yyget_lineno () -{ - - return yylineno; -} - -/** Get the input stream. - * - */ -FILE *yyget_in () -{ - return yyin; -} - -/** Get the output stream. - * - */ -FILE *yyget_out () -{ - return yyout; -} - -/** Get the length of the current token. - * - */ -yy_size_t yyget_leng () -{ - return yyleng; -} - -/** Get the current token. - * - */ - -char *yyget_text () -{ - return yytext; -} - -/** Set the current line number. - * @param _line_number line number - * - */ -void yyset_lineno (_line_number ) - int _line_number; -{ - - yylineno = _line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param _in_str A readable stream. - * - * @see yy_switch_to_buffer - */ -void yyset_in (_in_str ) - FILE * _in_str; -{ - yyin = _in_str ; -} - -void yyset_out (_out_str ) - FILE * _out_str; -{ - yyout = _out_str ; -} - -int yyget_debug () -{ - return yy_flex_debug; -} - -void yyset_debug (_bdebug ) - int _bdebug; -{ - yy_flex_debug = _bdebug ; -} - -static int yy_init_globals () -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = (FILE *) 0; - yyout = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy () -{ - - /* Pop the buffer stack, destroying each element. */ - while (YY_CURRENT_BUFFER) { - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(); - } - /* Destroy the stack itself. */ - yyfree((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner - * so the next time yylex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (s1,s2,n ) - char* s1; - yyconst char * s2; - int n; -{ - - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (s ) - yyconst char * s; -{ - int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (size ) - yy_size_t size; -{ - - return (void *) malloc( size ); -} - -void *yyrealloc (ptr,size ) - void * ptr; - yy_size_t size; -{ - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void yyfree (ptr ) - void * ptr; -{ - - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -/* routine to switch to another input file; needed for flex */ -void -init_yyin( input_f ) -FILE *input_f; -{ -#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) - if (yyin) - yyrestart(input_f); - else -#endif - yyin = input_f; -} - -/* analogous routine (for completeness) */ -void -init_yyout( output_f ) -FILE *output_f; -{ - yyout = output_f; -} - -/*dgn_comp.l*/ - diff --git a/sys/share/dgn_yacc.c b/sys/share/dgn_yacc.c deleted file mode 100644 index 742a7b1a7..000000000 --- a/sys/share/dgn_yacc.c +++ /dev/null @@ -1,1053 +0,0 @@ -#ifndef lint -/* static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; */ -/* static char nhsccsid[] = "@(#)yaccpar 1.9.0-nh (NetHack) 12/03/2015"; */ -#endif -#define YYBYACC 1 -#define YYMAJOR 1 -#define YYMINOR 9 -#define YYSUBMINOR "0-nh" - -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#define YYRECOVERING (yyerrflag!=0) -#define YYPREFIX "yy" -/* NetHack 3.6 dgn_comp.y $NHDT-Date: 1551901399 2019/03/06 19:43:19 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.15 $ */ -/* Copyright (c) 1989 by Jean-Christophe Collet */ -/* Copyright (c) 1990 by M. Stephenson */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * This file contains the Dungeon Compiler code - */ - -/* In case we're using bison in AIX. This definition must be - * placed before any other C-language construct in the file - * excluding comments and preprocessor directives (thanks IBM - * for this wonderful feature...). - * - * Note: some cpps barf on this 'undefined control' (#pragma). - * Addition of the leading space seems to prevent barfage for now, - * and AIX will still see the directive in its non-standard locale. - */ - -#ifdef _AIX - #pragma alloca /* keep leading space! */ -#endif - -#include "config.h" -#include "date.h" -#include "dgn_file.h" - -void FDECL(yyerror, (const char *)); -void FDECL(yywarning, (const char *)); -int NDECL(yylex); -int NDECL(yyparse); -int FDECL(getchain, (char *)); -int NDECL(check_dungeon); -int NDECL(check_branch); -int NDECL(check_level); -void NDECL(init_dungeon); -void NDECL(init_branch); -void NDECL(init_level); -void NDECL(output_dgn); - -#define Free(ptr) free((genericptr_t)ptr) - -#ifdef AMIGA -# undef printf -#ifndef LATTICE -# define memset(addr,val,len) setmem(addr,len,val) -#endif -#endif - -#define ERR (-1) - -static struct couple couple; -static struct tmpdungeon tmpdungeon[MAXDUNGEON]; -static struct tmplevel tmplevel[LEV_LIMIT]; -static struct tmpbranch tmpbranch[BRANCH_LIMIT]; - -static int in_dungeon = 0, n_dgns = -1, n_levs = -1, n_brs = -1; - -extern int fatal_error; -extern const char *fname; -extern FILE *yyin, *yyout; /* from dgn_lex.c */ - -typedef union -{ - int i; - char* str; -} YYSTYPE; -#define INTEGER 257 -#define A_DUNGEON 258 -#define BRANCH 259 -#define CHBRANCH 260 -#define LEVEL 261 -#define RNDLEVEL 262 -#define CHLEVEL 263 -#define RNDCHLEVEL 264 -#define UP_OR_DOWN 265 -#define PROTOFILE 266 -#define DESCRIPTION 267 -#define DESCRIPTOR 268 -#define LEVELDESC 269 -#define ALIGNMENT 270 -#define LEVALIGN 271 -#define ENTRY 272 -#define STAIR 273 -#define NO_UP 274 -#define NO_DOWN 275 -#define PORTAL 276 -#define STRING 277 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 5, 5, 6, 6, 6, 6, 7, 1, - 1, 8, 8, 8, 12, 13, 15, 15, 14, 10, - 10, 10, 10, 10, 16, 16, 17, 17, 18, 18, - 19, 19, 20, 20, 9, 9, 22, 23, 3, 3, - 3, 3, 3, 2, 2, 4, 21, 11, -}; -short yylen[] = { 2, - 0, 1, 1, 2, 1, 1, 1, 1, 6, 0, - 1, 1, 1, 1, 3, 1, 3, 3, 3, 1, - 1, 1, 1, 1, 6, 7, 7, 8, 3, 3, - 7, 8, 8, 9, 1, 1, 7, 8, 0, 1, - 1, 1, 1, 0, 1, 1, 5, 5, -}; -short yydefred[] = { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 5, 6, 7, 8, - 12, 13, 14, 16, 20, 21, 22, 23, 24, 35, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 19, 17, 29, 18, 30, 15, 46, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 9, 0, 40, - 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, - 0, 45, 37, 0, 27, 0, 0, 0, 0, 0, - 38, 28, 33, 0, 48, 47, 34, -}; -short yydgoto[] = { 14, - 78, 93, 84, 60, 15, 16, 17, 18, 19, 20, - 68, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 70, 30, 31, -}; -short yysindex[] = { -237, - -46, -45, -44, -39, -38, -30, -22, -21, -20, -19, - -18, -17, -16, 0, -237, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -262, -234, -233, -232, -230, -229, -228, -227, -217, - -216, -215, -214, -202, 0, -221, -7, -219, -221, -221, - -221, -221, 0, 0, 0, 0, 0, 0, 0, 19, - 20, 21, -2, -1, -212, -211, -190, -189, -188, -271, - 19, 20, 20, 27, 28, 29, 0, 0, 30, 0, - 0, 0, 0, -193, -271, -182, -180, 19, 19, -179, - -178, 0, 0, -193, 0, -177, -176, -175, 42, 43, - 0, 0, 0, -172, 0, 0, 0, -}; -short yyrindex[] = { 86, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 31, 1, 46, 0, 0, 0, 0, - 0, 0, 0, 31, 0, 61, 76, 0, 0, 0, - 0, 0, 0, 91, 0, 0, 0, -}; -short yygindex[] = { 0, - 0, -6, 4, -43, 0, 75, 0, 0, 0, 0, - -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -62, 0, 0, -}; -#define YYTABLESIZE 363 -short yytable[] = { 85, - 39, 80, 81, 82, 83, 63, 64, 65, 66, 86, - 87, 32, 33, 34, 46, 10, 97, 98, 35, 36, - 1, 2, 3, 4, 5, 6, 7, 37, 8, 9, - 44, 10, 11, 12, 13, 38, 39, 40, 41, 42, - 43, 44, 47, 48, 49, 25, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 61, 62, 67, 69, - 26, 72, 73, 71, 74, 75, 76, 77, 79, 88, - 89, 92, 90, 91, 95, 31, 96, 99, 100, 102, - 103, 104, 105, 106, 107, 1, 2, 101, 94, 45, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, - 39, 39, 39, 10, 10, 10, 10, 10, 10, 10, - 0, 10, 10, 0, 10, 10, 10, 10, 44, 44, - 44, 44, 44, 44, 44, 0, 44, 44, 0, 44, - 44, 44, 44, 25, 25, 25, 25, 25, 25, 25, - 0, 25, 25, 0, 25, 25, 25, 25, 26, 26, - 26, 26, 26, 26, 26, 0, 26, 26, 0, 26, - 26, 26, 26, 31, 31, 31, 31, 31, 31, 31, - 0, 31, 31, 0, 31, 31, 31, 31, 32, 32, - 32, 32, 32, 32, 32, 0, 32, 32, 0, 32, - 32, 32, 32, -}; -short yycheck[] = { 71, - 0, 273, 274, 275, 276, 49, 50, 51, 52, 72, - 73, 58, 58, 58, 277, 0, 88, 89, 58, 58, - 258, 259, 260, 261, 262, 263, 264, 58, 266, 267, - 0, 269, 270, 271, 272, 58, 58, 58, 58, 58, - 58, 58, 277, 277, 277, 0, 277, 277, 277, 277, - 268, 268, 268, 268, 257, 277, 64, 277, 40, 40, - 0, 64, 64, 43, 277, 277, 257, 257, 257, 43, - 43, 265, 44, 44, 257, 0, 257, 257, 257, 257, - 257, 257, 41, 41, 257, 0, 0, 94, 85, 15, - 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, -1, 269, - 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, - -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, - 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, - 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, - -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, - 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, - 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, - -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, - 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, - 270, 271, 272, -}; -#define YYFINAL 14 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 277 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,"'('","')'",0,"'+'","','",0,0,0,0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0, -"'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"INTEGER", -"A_DUNGEON","BRANCH","CHBRANCH","LEVEL","RNDLEVEL","CHLEVEL","RNDCHLEVEL", -"UP_OR_DOWN","PROTOFILE","DESCRIPTION","DESCRIPTOR","LEVELDESC","ALIGNMENT", -"LEVALIGN","ENTRY","STAIR","NO_UP","NO_DOWN","PORTAL","STRING", -}; -char *yyrule[] = { -"$accept : file", -"file :", -"file : dungeons", -"dungeons : dungeon", -"dungeons : dungeons dungeon", -"dungeon : dungeonline", -"dungeon : dungeondesc", -"dungeon : branches", -"dungeon : levels", -"dungeonline : A_DUNGEON ':' STRING bones_tag rcouple optional_int", -"optional_int :", -"optional_int : INTEGER", -"dungeondesc : entry", -"dungeondesc : descriptions", -"dungeondesc : prototype", -"entry : ENTRY ':' INTEGER", -"descriptions : desc", -"desc : DESCRIPTION ':' DESCRIPTOR", -"desc : ALIGNMENT ':' DESCRIPTOR", -"prototype : PROTOFILE ':' STRING", -"levels : level1", -"levels : level2", -"levels : levdesc", -"levels : chlevel1", -"levels : chlevel2", -"level1 : LEVEL ':' STRING bones_tag '@' acouple", -"level1 : RNDLEVEL ':' STRING bones_tag '@' acouple INTEGER", -"level2 : LEVEL ':' STRING bones_tag '@' acouple INTEGER", -"level2 : RNDLEVEL ':' STRING bones_tag '@' acouple INTEGER INTEGER", -"levdesc : LEVELDESC ':' DESCRIPTOR", -"levdesc : LEVALIGN ':' DESCRIPTOR", -"chlevel1 : CHLEVEL ':' STRING bones_tag STRING '+' rcouple", -"chlevel1 : RNDCHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER", -"chlevel2 : CHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER", -"chlevel2 : RNDCHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER INTEGER", -"branches : branch", -"branches : chbranch", -"branch : BRANCH ':' STRING '@' acouple branch_type direction", -"chbranch : CHBRANCH ':' STRING STRING '+' rcouple branch_type direction", -"branch_type :", -"branch_type : STAIR", -"branch_type : NO_UP", -"branch_type : NO_DOWN", -"branch_type : PORTAL", -"direction :", -"direction : UP_OR_DOWN", -"bones_tag : STRING", -"acouple : '(' INTEGER ',' INTEGER ')'", -"rcouple : '(' INTEGER ',' INTEGER ')'", -}; -#endif -#ifdef YYSTACKSIZE -#undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE - -void -init_dungeon() -{ - if(++n_dgns > MAXDUNGEON) { - (void) fprintf(stderr, "FATAL - Too many dungeons (limit: %d).\n", - MAXDUNGEON); - (void) fprintf(stderr, "To increase the limit edit MAXDUNGEON in global.h\n"); - exit(EXIT_FAILURE); - } - - in_dungeon = 1; - tmpdungeon[n_dgns].lev.base = 0; - tmpdungeon[n_dgns].lev.rand = 0; - tmpdungeon[n_dgns].chance = 100; - Strcpy(tmpdungeon[n_dgns].name, ""); - Strcpy(tmpdungeon[n_dgns].protoname, ""); - tmpdungeon[n_dgns].flags = 0; - tmpdungeon[n_dgns].levels = 0; - tmpdungeon[n_dgns].branches = 0; - tmpdungeon[n_dgns].entry_lev = 0; -} - -void -init_level() -{ - if(++n_levs > LEV_LIMIT) { - - yyerror("FATAL - Too many special levels defined."); - exit(EXIT_FAILURE); - } - tmplevel[n_levs].lev.base = 0; - tmplevel[n_levs].lev.rand = 0; - tmplevel[n_levs].chance = 100; - tmplevel[n_levs].rndlevs = 0; - tmplevel[n_levs].flags = 0; - Strcpy(tmplevel[n_levs].name, ""); - tmplevel[n_levs].chain = -1; -} - -void -init_branch() -{ - if(++n_brs > BRANCH_LIMIT) { - - yyerror("FATAL - Too many special levels defined."); - exit(EXIT_FAILURE); - } - tmpbranch[n_brs].lev.base = 0; - tmpbranch[n_brs].lev.rand = 0; - Strcpy(tmpbranch[n_brs].name, ""); - tmpbranch[n_brs].chain = -1; -} - -int -getchain(s) - char *s; -{ - int i; - - if(strlen(s)) { - - for(i = n_levs - tmpdungeon[n_dgns].levels + 1; i <= n_levs; i++) - if(!strcmp(tmplevel[i].name, s)) return i; - - yyerror("Can't locate the specified chain level."); - return(-2); - } - return(-1); -} - -/* - * Consistancy checking routines: - * - * - A dungeon must have a unique name. - * - A dungeon must have a originating "branch" command - * (except, of course, for the first dungeon). - * - A dungeon must have a proper depth (at least (1, 0)). - */ - -int -check_dungeon() -{ - int i; - - for(i = 0; i < n_dgns; i++) - if(!strcmp(tmpdungeon[i].name, tmpdungeon[n_dgns].name)) { - yyerror("Duplicate dungeon name."); - return(0); - } - - if(n_dgns) - for(i = 0; i < n_brs - tmpdungeon[n_dgns].branches; i++) { - if(!strcmp(tmpbranch[i].name, tmpdungeon[n_dgns].name)) break; - - if(i >= n_brs - tmpdungeon[n_dgns].branches) { - yyerror("Dungeon cannot be reached."); - return(0); - } - } - - if(tmpdungeon[n_dgns].lev.base <= 0 || - tmpdungeon[n_dgns].lev.rand < 0) { - yyerror("Invalid dungeon depth specified."); - return(0); - } - return(1); /* OK */ -} - -/* - * - A level must have a unique level name. - * - If chained, the level used as reference for the chain - * must be in this dungeon, must be previously defined, and - * the level chained from must be "non-probabilistic" (ie. - * have a 100% chance of existing). - */ - -int -check_level() -{ - int i; - - if(!in_dungeon) { - yyerror("Level defined outside of dungeon."); - return(0); - } - - for(i = 0; i < n_levs; i++) - if(!strcmp(tmplevel[i].name, tmplevel[n_levs].name)) { - yyerror("Duplicate level name."); - return(0); - } - - if(tmplevel[i].chain == -2) { - yyerror("Invaild level chain reference."); - return(0); - } else if(tmplevel[i].chain != -1) { /* there is a chain */ - /* KMH -- tmplevel[tmpbranch[i].chain].chance was in error */ - if(tmplevel[tmplevel[i].chain].chance != 100) { - yyerror("Level cannot chain from a probabilistic level."); - return(0); - } else if(tmplevel[i].chain == n_levs) { - yyerror("A level cannot chain to itself!"); - return(0); - } - } - return(1); /* OK */ -} - -/* - * - A branch may not branch backwards - to avoid branch loops. - * - A branch name must be unique. - * (ie. You can only have one entry point to each dungeon). - * - If chained, the level used as reference for the chain - * must be in this dungeon, must be previously defined, and - * the level chained from must be "non-probabilistic" (ie. - * have a 100% chance of existing). - */ - -int -check_branch() -{ - int i; - - if(!in_dungeon) { - yyerror("Branch defined outside of dungeon."); - return(0); - } - - for(i = 0; i < n_dgns; i++) - if(!strcmp(tmpdungeon[i].name, tmpbranch[n_brs].name)) { - - yyerror("Reverse branching not allowed."); - return(0); - } - - if(tmpbranch[i].chain == -2) { - - yyerror("Invaild branch chain reference."); - return(0); - } else if(tmpbranch[i].chain != -1) { /* it is chained */ - - if(tmplevel[tmpbranch[i].chain].chance != 100) { - yyerror("Branch cannot chain from a probabilistic level."); - return(0); - } - } - return(1); /* OK */ -} - -/* - * Output the dungon definition into a file. - * - * The file will have the following format: - * - * [ nethack version ID ] - * [ number of dungeons ] - * [ first dungeon struct ] - * [ levels for the first dungeon ] - * ... - * [ branches for the first dungeon ] - * ... - * [ second dungeon struct ] - * ... - */ - -void -output_dgn() -{ - int nd, cl = 0, nl = 0, - cb = 0, nb = 0; - static struct version_info version_data = { - VERSION_NUMBER, VERSION_FEATURES, - VERSION_SANITY1, VERSION_SANITY2, VERSION_SANITY3 - }; - - if(++n_dgns <= 0) { - yyerror("FATAL - no dungeons were defined."); - exit(EXIT_FAILURE); - } - - if (fwrite((char *)&version_data, sizeof version_data, 1, yyout) != 1) { - yyerror("FATAL - output failure."); - exit(EXIT_FAILURE); - } - - (void) fwrite((char *)&n_dgns, sizeof(int), 1, yyout); - for (nd = 0; nd < n_dgns; nd++) { - (void) fwrite((char *)&tmpdungeon[nd], sizeof(struct tmpdungeon), - 1, yyout); - - nl += tmpdungeon[nd].levels; - for(; cl < nl; cl++) - (void) fwrite((char *)&tmplevel[cl], sizeof(struct tmplevel), - 1, yyout); - - nb += tmpdungeon[nd].branches; - for(; cb < nb; cb++) - (void) fwrite((char *)&tmpbranch[cb], sizeof(struct tmpbranch), - 1, yyout); - } - /* apparently necessary for Think C 5.x, otherwise harmless */ - (void) fflush(yyout); -} - -/*dgn_comp.y*/ -#define YYABORT goto yyabort -#define YYREJECT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse() -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if ((yys = getenv("YYDEBUG")) != 0) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if ((yyn = yydefred[yystate]) != 0) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) != 0 && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, shifting to state %d\n", - YYPREFIX, yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) != 0 && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; - goto yynewerror; -yynewerror: - yyerror("syntax error"); - goto yyerrlab; -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) != 0 && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, error recovery discards token %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, reducing by rule %d (%s)\n", - YYPREFIX, yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 2: -{ - output_dgn(); - } -break; -case 9: -{ - init_dungeon(); - Strcpy(tmpdungeon[n_dgns].name, yyvsp[-3].str); - tmpdungeon[n_dgns].boneschar = (char)yyvsp[-2].i; - tmpdungeon[n_dgns].lev.base = couple.base; - tmpdungeon[n_dgns].lev.rand = couple.rand; - tmpdungeon[n_dgns].chance = yyvsp[0].i; - Free(yyvsp[-3].str); - } -break; -case 10: -{ - yyval.i = 0; - } -break; -case 11: -{ - yyval.i = yyvsp[0].i; - } -break; -case 15: -{ - tmpdungeon[n_dgns].entry_lev = yyvsp[0].i; - } -break; -case 17: -{ - if(yyvsp[0].i <= TOWN || yyvsp[0].i >= D_ALIGN_CHAOTIC) - yyerror("Illegal description - ignoring!"); - else - tmpdungeon[n_dgns].flags |= yyvsp[0].i ; - } -break; -case 18: -{ - if(yyvsp[0].i && yyvsp[0].i < D_ALIGN_CHAOTIC) - yyerror("Illegal alignment - ignoring!"); - else - tmpdungeon[n_dgns].flags |= yyvsp[0].i ; - } -break; -case 19: -{ - Strcpy(tmpdungeon[n_dgns].protoname, yyvsp[0].str); - Free(yyvsp[0].str); - } -break; -case 25: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-3].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-2].i; - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmpdungeon[n_dgns].levels++; - Free(yyvsp[-3].str); - } -break; -case 26: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-4].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-3].i; - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmplevel[n_levs].rndlevs = yyvsp[0].i; - tmpdungeon[n_dgns].levels++; - Free(yyvsp[-4].str); - } -break; -case 27: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-4].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-3].i; - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmplevel[n_levs].chance = yyvsp[0].i; - tmpdungeon[n_dgns].levels++; - Free(yyvsp[-4].str); - } -break; -case 28: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-5].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-4].i; - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmplevel[n_levs].chance = yyvsp[-1].i; - tmplevel[n_levs].rndlevs = yyvsp[0].i; - tmpdungeon[n_dgns].levels++; - Free(yyvsp[-5].str); - } -break; -case 29: -{ - if(yyvsp[0].i >= D_ALIGN_CHAOTIC) - yyerror("Illegal description - ignoring!"); - else - tmplevel[n_levs].flags |= yyvsp[0].i ; - } -break; -case 30: -{ - if(yyvsp[0].i && yyvsp[0].i < D_ALIGN_CHAOTIC) - yyerror("Illegal alignment - ignoring!"); - else - tmplevel[n_levs].flags |= yyvsp[0].i ; - } -break; -case 31: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-4].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-3].i; - tmplevel[n_levs].chain = getchain(yyvsp[-2].str); - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - if(!check_level()) n_levs--; - else tmpdungeon[n_dgns].levels++; - Free(yyvsp[-4].str); - Free(yyvsp[-2].str); - } -break; -case 32: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-5].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-4].i; - tmplevel[n_levs].chain = getchain(yyvsp[-3].str); - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmplevel[n_levs].rndlevs = yyvsp[0].i; - if(!check_level()) n_levs--; - else tmpdungeon[n_dgns].levels++; - Free(yyvsp[-5].str); - Free(yyvsp[-3].str); - } -break; -case 33: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-5].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-4].i; - tmplevel[n_levs].chain = getchain(yyvsp[-3].str); - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmplevel[n_levs].chance = yyvsp[0].i; - if(!check_level()) n_levs--; - else tmpdungeon[n_dgns].levels++; - Free(yyvsp[-5].str); - Free(yyvsp[-3].str); - } -break; -case 34: -{ - init_level(); - Strcpy(tmplevel[n_levs].name, yyvsp[-6].str); - tmplevel[n_levs].boneschar = (char)yyvsp[-5].i; - tmplevel[n_levs].chain = getchain(yyvsp[-4].str); - tmplevel[n_levs].lev.base = couple.base; - tmplevel[n_levs].lev.rand = couple.rand; - tmplevel[n_levs].chance = yyvsp[-1].i; - tmplevel[n_levs].rndlevs = yyvsp[0].i; - if(!check_level()) n_levs--; - else tmpdungeon[n_dgns].levels++; - Free(yyvsp[-6].str); - Free(yyvsp[-4].str); - } -break; -case 37: -{ - init_branch(); - Strcpy(tmpbranch[n_brs].name, yyvsp[-4].str); - tmpbranch[n_brs].lev.base = couple.base; - tmpbranch[n_brs].lev.rand = couple.rand; - tmpbranch[n_brs].type = yyvsp[-1].i; - tmpbranch[n_brs].up = yyvsp[0].i; - if(!check_branch()) n_brs--; - else tmpdungeon[n_dgns].branches++; - Free(yyvsp[-4].str); - } -break; -case 38: -{ - init_branch(); - Strcpy(tmpbranch[n_brs].name, yyvsp[-5].str); - tmpbranch[n_brs].chain = getchain(yyvsp[-4].str); - tmpbranch[n_brs].lev.base = couple.base; - tmpbranch[n_brs].lev.rand = couple.rand; - tmpbranch[n_brs].type = yyvsp[-1].i; - tmpbranch[n_brs].up = yyvsp[0].i; - if(!check_branch()) n_brs--; - else tmpdungeon[n_dgns].branches++; - Free(yyvsp[-5].str); - Free(yyvsp[-4].str); - } -break; -case 39: -{ - yyval.i = TBR_STAIR; /* two way stair */ - } -break; -case 40: -{ - yyval.i = TBR_STAIR; /* two way stair */ - } -break; -case 41: -{ - yyval.i = TBR_NO_UP; /* no up staircase */ - } -break; -case 42: -{ - yyval.i = TBR_NO_DOWN; /* no down staircase */ - } -break; -case 43: -{ - yyval.i = TBR_PORTAL; /* portal connection */ - } -break; -case 44: -{ - yyval.i = 0; /* defaults to down */ - } -break; -case 45: -{ - yyval.i = yyvsp[0].i; - } -break; -case 46: -{ - char *p = yyvsp[0].str; - if (strlen(p) != 1) { - if (strcmp(p, "none") != 0) - yyerror("Bones marker must be a single char, or \"none\"!"); - *p = '\0'; - } - yyval.i = *p; - Free(p); - } -break; -case 47: -{ - if (yyvsp[-3].i < -MAXLEVEL || yyvsp[-3].i > MAXLEVEL) { - yyerror("Abs base out of dlevel range - zeroing!"); - couple.base = couple.rand = 0; - } else if (yyvsp[-1].i < -1 || - ((yyvsp[-3].i < 0) ? (MAXLEVEL + yyvsp[-3].i + yyvsp[-1].i + 1) > MAXLEVEL : - (yyvsp[-3].i + yyvsp[-1].i) > MAXLEVEL)) { - yyerror("Abs range out of dlevel range - zeroing!"); - couple.base = couple.rand = 0; - } else { - couple.base = yyvsp[-3].i; - couple.rand = yyvsp[-1].i; - } - } -break; -case 48: -{ - if (yyvsp[-3].i < -MAXLEVEL || yyvsp[-3].i > MAXLEVEL) { - yyerror("Rel base out of dlevel range - zeroing!"); - couple.base = couple.rand = 0; - } else { - couple.base = yyvsp[-3].i; - couple.rand = yyvsp[-1].i; - } - } -break; - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state 0 to\ - state %d\n", YYPREFIX, YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) != 0 && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/sys/share/ioctl.c b/sys/share/ioctl.c index 8b2c91712..ec76ec740 100644 --- a/sys/share/ioctl.c +++ b/sys/share/ioctl.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 ioctl.c $NHDT-Date: 1520099308 2018/03/03 17:48:28 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.13 $ */ +/* NetHack 5.0 ioctl.c $NHDT-Date: 1596498280 2020/08/03 23:44:40 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.15 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -75,17 +75,17 @@ struct termio termio; #endif #ifdef _M_UNIX -extern void NDECL(sco_mapon); -extern void NDECL(sco_mapoff); +extern void sco_mapon(void); +extern void sco_mapoff(void); #endif #ifdef __linux__ -extern void NDECL(linux_mapon); -extern void NDECL(linux_mapoff); +extern void linux_mapon(void); +extern void linux_mapoff(void); #endif #ifdef AUX void -catch_stp() +catch_stp(void) { signal(SIGTSTP, SIG_DFL); dosuspend(); @@ -93,7 +93,7 @@ catch_stp() #endif /* AUX */ void -getwindowsz() +getwindowsz(void) { #ifdef USE_WIN_IOCTL /* @@ -116,7 +116,7 @@ getwindowsz() } void -getioctls() +getioctls(void) { #ifdef BSD_JOB_CONTROL (void) ioctl(fileno(stdin), (int) TIOCGLTC, (char *) <chars); @@ -139,7 +139,7 @@ getioctls() } void -setioctls() +setioctls(void) { #ifdef BSD_JOB_CONTROL (void) ioctl(fileno(stdin), (int) TIOCSLTC, (char *) <chars); @@ -158,7 +158,7 @@ setioctls() #ifdef SUSPEND /* No longer implies BSD */ int -dosuspend() +dosuspend(void) { #ifdef SYSCF /* NB: check_user_string() is port-specific. */ diff --git a/sys/share/lev_comp.h b/sys/share/lev_comp.h deleted file mode 100644 index 1e3f16fa4..000000000 --- a/sys/share/lev_comp.h +++ /dev/null @@ -1,212 +0,0 @@ -#define CHAR 257 -#define INTEGER 258 -#define BOOLEAN 259 -#define PERCENT 260 -#define SPERCENT 261 -#define MINUS_INTEGER 262 -#define PLUS_INTEGER 263 -#define MAZE_GRID_ID 264 -#define SOLID_FILL_ID 265 -#define MINES_ID 266 -#define ROGUELEV_ID 267 -#define MESSAGE_ID 268 -#define MAZE_ID 269 -#define LEVEL_ID 270 -#define LEV_INIT_ID 271 -#define GEOMETRY_ID 272 -#define NOMAP_ID 273 -#define OBJECT_ID 274 -#define COBJECT_ID 275 -#define MONSTER_ID 276 -#define TRAP_ID 277 -#define DOOR_ID 278 -#define DRAWBRIDGE_ID 279 -#define object_ID 280 -#define monster_ID 281 -#define terrain_ID 282 -#define MAZEWALK_ID 283 -#define WALLIFY_ID 284 -#define REGION_ID 285 -#define FILLING 286 -#define IRREGULAR 287 -#define JOINED 288 -#define ALTAR_ID 289 -#define LADDER_ID 290 -#define STAIR_ID 291 -#define NON_DIGGABLE_ID 292 -#define NON_PASSWALL_ID 293 -#define ROOM_ID 294 -#define PORTAL_ID 295 -#define TELEPRT_ID 296 -#define BRANCH_ID 297 -#define LEV 298 -#define MINERALIZE_ID 299 -#define CORRIDOR_ID 300 -#define GOLD_ID 301 -#define ENGRAVING_ID 302 -#define FOUNTAIN_ID 303 -#define POOL_ID 304 -#define SINK_ID 305 -#define NONE 306 -#define RAND_CORRIDOR_ID 307 -#define DOOR_STATE 308 -#define LIGHT_STATE 309 -#define CURSE_TYPE 310 -#define ENGRAVING_TYPE 311 -#define DIRECTION 312 -#define RANDOM_TYPE 313 -#define RANDOM_TYPE_BRACKET 314 -#define A_REGISTER 315 -#define ALIGNMENT 316 -#define LEFT_OR_RIGHT 317 -#define CENTER 318 -#define TOP_OR_BOT 319 -#define ALTAR_TYPE 320 -#define UP_OR_DOWN 321 -#define SUBROOM_ID 322 -#define NAME_ID 323 -#define FLAGS_ID 324 -#define FLAG_TYPE 325 -#define MON_ATTITUDE 326 -#define MON_ALERTNESS 327 -#define MON_APPEARANCE 328 -#define ROOMDOOR_ID 329 -#define IF_ID 330 -#define ELSE_ID 331 -#define TERRAIN_ID 332 -#define HORIZ_OR_VERT 333 -#define REPLACE_TERRAIN_ID 334 -#define EXIT_ID 335 -#define SHUFFLE_ID 336 -#define QUANTITY_ID 337 -#define BURIED_ID 338 -#define LOOP_ID 339 -#define FOR_ID 340 -#define TO_ID 341 -#define SWITCH_ID 342 -#define CASE_ID 343 -#define BREAK_ID 344 -#define DEFAULT_ID 345 -#define ERODED_ID 346 -#define TRAPPED_STATE 347 -#define RECHARGED_ID 348 -#define INVIS_ID 349 -#define GREASED_ID 350 -#define FEMALE_ID 351 -#define CANCELLED_ID 352 -#define REVIVED_ID 353 -#define AVENGE_ID 354 -#define FLEEING_ID 355 -#define BLINDED_ID 356 -#define PARALYZED_ID 357 -#define STUNNED_ID 358 -#define CONFUSED_ID 359 -#define SEENTRAPS_ID 360 -#define ALL_ID 361 -#define MONTYPE_ID 362 -#define GRAVE_ID 363 -#define ERODEPROOF_ID 364 -#define FUNCTION_ID 365 -#define MSG_OUTPUT_TYPE 366 -#define COMPARE_TYPE 367 -#define UNKNOWN_TYPE 368 -#define rect_ID 369 -#define fillrect_ID 370 -#define line_ID 371 -#define randline_ID 372 -#define grow_ID 373 -#define selection_ID 374 -#define flood_ID 375 -#define rndcoord_ID 376 -#define circle_ID 377 -#define ellipse_ID 378 -#define filter_ID 379 -#define complement_ID 380 -#define gradient_ID 381 -#define GRADIENT_TYPE 382 -#define LIMITED 383 -#define HUMIDITY_TYPE 384 -#define STRING 385 -#define MAP_ID 386 -#define NQSTRING 387 -#define VARSTRING 388 -#define CFUNC 389 -#define CFUNC_INT 390 -#define CFUNC_STR 391 -#define CFUNC_COORD 392 -#define CFUNC_REGION 393 -#define VARSTRING_INT 394 -#define VARSTRING_INT_ARRAY 395 -#define VARSTRING_STRING 396 -#define VARSTRING_STRING_ARRAY 397 -#define VARSTRING_VAR 398 -#define VARSTRING_VAR_ARRAY 399 -#define VARSTRING_COORD 400 -#define VARSTRING_COORD_ARRAY 401 -#define VARSTRING_REGION 402 -#define VARSTRING_REGION_ARRAY 403 -#define VARSTRING_MAPCHAR 404 -#define VARSTRING_MAPCHAR_ARRAY 405 -#define VARSTRING_MONST 406 -#define VARSTRING_MONST_ARRAY 407 -#define VARSTRING_OBJ 408 -#define VARSTRING_OBJ_ARRAY 409 -#define VARSTRING_SEL 410 -#define VARSTRING_SEL_ARRAY 411 -#define METHOD_INT 412 -#define METHOD_INT_ARRAY 413 -#define METHOD_STRING 414 -#define METHOD_STRING_ARRAY 415 -#define METHOD_VAR 416 -#define METHOD_VAR_ARRAY 417 -#define METHOD_COORD 418 -#define METHOD_COORD_ARRAY 419 -#define METHOD_REGION 420 -#define METHOD_REGION_ARRAY 421 -#define METHOD_MAPCHAR 422 -#define METHOD_MAPCHAR_ARRAY 423 -#define METHOD_MONST 424 -#define METHOD_MONST_ARRAY 425 -#define METHOD_OBJ 426 -#define METHOD_OBJ_ARRAY 427 -#define METHOD_SEL 428 -#define METHOD_SEL_ARRAY 429 -#define DICE 430 -typedef union -{ - long i; - char *map; - struct { - long room; - long wall; - long door; - } corpos; - struct { - long area; - long x1; - long y1; - long x2; - long y2; - } lregn; - struct { - long x; - long y; - } crd; - struct { - long ter; - long lit; - } terr; - struct { - long height; - long width; - } sze; - struct { - long die; - long num; - } dice; - struct { - long cfunc; - char *varstr; - } meth; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/sys/share/lev_lex.c b/sys/share/lev_lex.c deleted file mode 100644 index acf03dbaf..000000000 --- a/sys/share/lev_lex.c +++ /dev/null @@ -1,3310 +0,0 @@ - -#line 3 "lev_lex.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex via 'flex -S flexhack.skl' - * where flexhack.skl is a nethack-specific alternate skeleton derived - * from flex 2.6.0's skel.c (which in turn was generated from flex.skl). - * - * Support for C++, re-entrancy, and table serialization stripped out. - * NetHack's usage doesn't need them and we want to reduce the size and - * complexity of this skeleton as well as of the generated scanner code. - */ -#define FLEXHACK_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 0 - -#include "config.h" - -#include - -/* we don't care if actual types happen to have more bits than their names; - the tables will just take up more space, possibly slowing the parse; - still, allow config.h to override these via typedef+#define if desired */ -#ifndef FLEX_INT32_T -typedef int flex_int32_t; -#endif -#ifndef FLEX_INT16_T -typedef short int flex_int16_t; -#endif -#ifndef FLEX_UINT16_T -typedef unsigned short int flex_uint16_t; -#endif - -#define yyconst const - -#define FDECL_dummy /*empty*/ - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (uchar) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character - * in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -extern yy_size_t yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -#define YY_LESS_LINENO(n) -#define YY_LINENO_REWIND_TO(ptr) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg); \ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - yy_size_t yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - -}; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; -static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart FDECL(FDECL_dummy, (FILE *input_file )); -void yy_switch_to_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE new_buffer )); -YY_BUFFER_STATE yy_create_buffer FDECL(FDECL_dummy, (FILE *file,int size )); -void yy_delete_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE b )); -void yy_flush_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE b )); -void yypush_buffer_state FDECL(FDECL_dummy, (YY_BUFFER_STATE new_buffer )); -void yypop_buffer_state FDECL(FDECL_dummy, (void )); - -static void yyensure_buffer_stack FDECL(FDECL_dummy, (void )); -static void yy_load_buffer_state FDECL(FDECL_dummy, (void )); -static void yy_init_buffer FDECL(FDECL_dummy, (YY_BUFFER_STATE b,FILE *file )); - -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE yy_scan_buffer FDECL(FDECL_dummy, (char *base,yy_size_t size )); -YY_BUFFER_STATE yy_scan_string FDECL(FDECL_dummy, (yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes FDECL(FDECL_dummy, (yyconst char *bytes,yy_size_t len )); - -void *yyalloc FDECL(FDECL_dummy, (yy_size_t )); -void *yyrealloc FDECL(FDECL_dummy, (void *,yy_size_t )); -void yyfree FDECL(FDECL_dummy, (void * )); - -#define yy_new_buffer yy_create_buffer -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ) { \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ) { \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -typedef int yy_state_type; - -extern int yylineno; - -int yylineno = 1; - -extern char *yytext; -#ifdef yytext_ptr -#undef yytext_ptr -#endif -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state FDECL(FDECL_dummy, (void )); -static yy_state_type yy_try_NUL_trans FDECL(FDECL_dummy, (yy_state_type current_state )); -static int yy_get_next_buffer FDECL(FDECL_dummy, (void )); -static void yy_fatal_error FDECL(FDECL_dummy, (yyconst char msg[] )) NORETURN; - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 200 -#define YY_END_OF_BUFFER 201 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[1057] = - { 0, - 0, 0, 0, 0, 201, 199, 195, 194, 199, 199, - 199, 199, 199, 199, 198, 184, 192, 199, 193, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 199, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 195, 199, 198, 2, 199, 195, 199, 199, 198, 184, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 195, 199, 195, 194, 188, 0, 185, 186, - 0, 0, 182, 198, 181, 183, 184, 198, 190, 189, - - 187, 191, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 39, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 55, 198, 198, 0, 0, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 154, 198, 198, 195, 0, 0, 3, 198, - 2, 2, 0, 195, 0, 182, 198, 181, 184, 198, - 198, 198, 198, 39, 198, 198, 198, 198, 198, 198, - 195, 0, 2, 0, 0, 197, 0, 197, 179, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 54, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 0, 198, 104, 198, 83, - - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 79, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 81, - 198, 198, 198, 198, 198, 139, 198, 198, 198, 198, - 128, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 16, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 126, 198, 198, 198, 198, 198, 198, 198, - - 198, 80, 198, 198, 198, 198, 198, 198, 198, 198, - 196, 198, 198, 198, 58, 198, 198, 198, 22, 198, - 40, 198, 41, 198, 198, 198, 198, 49, 198, 198, - 198, 198, 56, 6, 198, 198, 198, 53, 198, 198, - 198, 36, 198, 198, 198, 198, 42, 198, 35, 198, - 198, 198, 198, 198, 21, 198, 0, 180, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 160, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 155, 158, 114, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 69, 198, 198, 198, - - 198, 198, 198, 198, 198, 198, 121, 198, 198, 67, - 198, 198, 198, 198, 161, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 119, 198, 198, 198, 198, 107, - 198, 198, 198, 198, 198, 198, 198, 65, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 157, 198, 198, 198, - 198, 198, 116, 15, 0, 198, 198, 198, 198, 198, - 28, 198, 59, 198, 198, 198, 198, 198, 13, 198, - 198, 198, 50, 198, 198, 7, 198, 198, 198, 198, - 5, 198, 198, 198, 198, 198, 198, 198, 198, 198, - - 30, 198, 198, 198, 198, 198, 120, 153, 198, 198, - 198, 147, 198, 198, 162, 198, 198, 198, 198, 198, - 141, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 156, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 11, 198, - 198, 198, 198, 198, 198, 198, 113, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 125, 198, 12, 198, 198, 198, 198, 198, 198, 198, - 82, 115, 198, 198, 198, 198, 198, 198, 198, 198, - - 129, 198, 198, 198, 198, 33, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 29, 198, 198, 198, 198, - 198, 198, 17, 31, 198, 27, 198, 198, 198, 198, - 57, 198, 198, 198, 198, 146, 97, 198, 198, 127, - 111, 86, 198, 123, 72, 108, 198, 198, 198, 198, - 165, 198, 198, 87, 198, 94, 130, 198, 74, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 135, 198, 198, 109, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 110, 168, 198, 198, - 198, 16, 198, 198, 198, 198, 77, 198, 117, 198, - - 198, 198, 198, 198, 112, 198, 198, 198, 152, 173, - 198, 198, 78, 198, 198, 198, 198, 198, 198, 198, - 198, 1, 57, 198, 198, 198, 60, 198, 198, 198, - 198, 198, 198, 198, 4, 198, 19, 198, 198, 198, - 198, 198, 62, 43, 198, 46, 26, 198, 163, 99, - 198, 198, 198, 198, 198, 73, 159, 198, 198, 98, - 198, 198, 198, 93, 198, 198, 198, 198, 145, 198, - 198, 198, 198, 198, 136, 198, 198, 198, 198, 198, - 20, 63, 140, 138, 198, 198, 198, 198, 198, 198, - 198, 198, 118, 198, 132, 96, 198, 151, 198, 198, - - 198, 198, 198, 101, 47, 89, 198, 198, 198, 198, - 198, 198, 45, 198, 198, 34, 61, 14, 8, 25, - 198, 198, 198, 198, 198, 23, 198, 169, 198, 198, - 198, 102, 177, 198, 66, 198, 75, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 150, - 9, 198, 198, 198, 198, 198, 144, 198, 85, 68, - 198, 71, 198, 198, 198, 198, 176, 164, 131, 134, - 198, 106, 18, 198, 51, 198, 198, 198, 198, 198, - 198, 95, 142, 198, 198, 70, 174, 122, 198, 167, - 198, 175, 198, 92, 133, 84, 148, 149, 171, 198, - - 198, 198, 100, 172, 91, 198, 64, 198, 10, 137, - 24, 52, 198, 198, 198, 198, 198, 76, 88, 124, - 105, 198, 198, 198, 166, 103, 198, 198, 198, 198, - 198, 198, 198, 198, 90, 198, 37, 38, 198, 198, - 198, 198, 143, 170, 198, 198, 198, 178, 198, 198, - 198, 198, 48, 32, 44, 0 - } ; - -static yyconst YY_CHAR yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 5, 6, 7, 8, 9, 10, 1, 11, 1, - 1, 1, 12, 1, 13, 14, 1, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 1, 1, 16, - 17, 18, 1, 1, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 1, 48, 1, 49, 50, 51, 52, - - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 14, 14, 14, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst YY_CHAR yy_meta[75] = - { 0, - 1, 2, 3, 2, 2, 1, 1, 2, 1, 1, - 1, 2, 4, 2, 4, 1, 1, 1, 5, 5, - 5, 6, 6, 5, 6, 5, 5, 6, 5, 5, - 6, 6, 6, 5, 6, 6, 5, 5, 6, 6, - 5, 6, 6, 6, 1, 2, 1, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 5, 6, 6 - } ; - -static yyconst flex_uint16_t yy_base[1064] = - { 0, - 0, 73, 102, 77, 1254, 1255, 75, 1255, 1250, 1235, - 1244, 0, 1204, 1234, 1233, 78, 66, 1230, 1229, 1215, - 1208, 57, 63, 59, 64, 101, 0, 63, 79, 119, - 94, 1223, 1209, 122, 123, 121, 1222, 104, 105, 100, - 124, 90, 129, 137, 1174, 84, 117, 1176, 139, 150, - 151, 151, 156, 1169, 163, 168, 166, 56, 1184, 1183, - 232, 1232, 216, 1255, 1231, 242, 248, 251, 264, 196, - 155, 167, 208, 228, 241, 1218, 249, 242, 195, 277, - 284, 223, 319, 334, 257, 1255, 1255, 1225, 1255, 0, - 1220, 1219, 1214, 0, 1213, 1255, 298, 1212, 1255, 1255, - - 1255, 1255, 1188, 263, 1188, 264, 1200, 1190, 1203, 1184, - 1195, 1192, 1199, 270, 1185, 1183, 1185, 1195, 0, 1186, - 1190, 1171, 1177, 1165, 1171, 1175, 1174, 1174, 280, 1176, - 292, 1171, 301, 1169, 1162, 1168, 1180, 1178, 1170, 259, - 0, 1177, 1165, 203, 304, 272, 1121, 1143, 1132, 1138, - 1141, 288, 1121, 1125, 1121, 1124, 1123, 1135, 1117, 1119, - 308, 1115, 1109, 1106, 1111, 1110, 1116, 1120, 1111, 1113, - 1111, 1111, 234, 281, 296, 299, 1117, 282, 1103, 1111, - 1096, 81, 315, 1115, 324, 26, 1103, 1102, 1102, 1093, - 330, 1103, 1107, 1093, 1109, 1104, 1107, 281, 333, 1100, - - 1102, 1098, 1090, 342, 323, 321, 1082, 1081, 1083, 1084, - 345, 350, 0, 1081, 332, 407, 1143, 1142, 1255, 363, - 1255, 1255, 1141, 411, 415, 416, 1128, 0, 412, 390, - 396, 404, 415, 1127, 410, 420, 421, 422, 423, 424, - 0, 0, 1255, 1138, 0, 1255, 1129, 1128, 1123, 1118, - 1104, 1116, 1111, 1095, 1096, 1112, 1094, 1088, 1105, 1091, - 1088, 1100, 0, 1092, 1102, 1091, 1099, 1080, 1081, 1096, - 1094, 1082, 1092, 1077, 1090, 1075, 1088, 1091, 1061, 1085, - 1077, 1068, 1083, 1077, 1073, 1071, 1077, 1071, 1072, 1062, - 1059, 1073, 1059, 1060, 1063, 435, 1037, 0, 1042, 0, - - 1027, 1036, 1026, 1028, 1019, 1023, 1021, 1015, 1023, 385, - 1030, 1012, 1016, 1027, 1010, 1016, 1011, 1020, 1007, 1005, - 1009, 0, 1002, 1001, 1011, 1001, 1014, 998, 1015, 383, - 1010, 999, 392, 1012, 989, 1005, 1006, 1000, 988, 0, - 1003, 1003, 996, 999, 989, 0, 982, 983, 991, 994, - 0, 987, 992, 981, 993, 983, 988, 987, 378, 986, - 970, 977, 973, 974, 404, 966, 408, 980, 970, 982, - 979, 968, 966, 970, 974, 392, 956, 967, 967, 971, - 952, 969, 953, 956, 964, 950, 395, 958, 946, 964, - 950, 945, 0, 946, 956, 939, 950, 943, 948, 936, - - 935, 0, 462, 448, 453, 971, 454, 456, 434, 455, - 1255, 965, 979, 970, 0, 979, 970, 957, 0, 975, - 0, 975, 0, 956, 954, 953, 967, 0, 966, 940, - 964, 956, 0, 944, 965, 947, 944, 0, 947, 452, - 959, 0, 960, 945, 944, 957, 953, 950, 0, 937, - 939, 950, 936, 950, 0, 941, 468, 1255, 905, 900, - 899, 911, 908, 909, 894, 908, 907, 895, 904, 903, - 0, 902, 901, 886, 892, 898, 893, 889, 879, 886, - 893, 0, 0, 0, 881, 895, 890, 889, 881, 422, - 887, 882, 886, 880, 883, 868, 0, 921, 879, 858, - - 874, 866, 878, 861, 872, 873, 0, 872, 856, 0, - 870, 873, 859, 862, 0, 429, 852, 850, 844, 850, - 858, 851, 864, 849, 0, 855, 842, 849, 857, 0, - 847, 853, 856, 836, 854, 417, 853, 0, 841, 830, - 831, 835, 844, 828, 842, 846, 842, 824, 829, 821, - 837, 832, 821, 824, 836, 820, 0, 817, 822, 824, - 426, 823, 0, 1255, 876, 463, 859, 466, 475, 476, - 0, 851, 0, 849, 853, 844, 837, 832, 0, 852, - 843, 831, 0, 837, 831, 0, 847, 840, 845, 840, - 0, 835, 842, 822, 829, 827, 825, 835, 822, 824, - - 0, 820, 826, 818, 823, 825, 0, 0, 795, 783, - 793, 0, 792, 791, 0, 782, 780, 789, 780, 773, - 0, 785, 785, 781, 782, 767, 784, 780, 764, 760, - 440, 0, 776, 776, 774, 760, 763, 770, 770, 749, - 768, 435, 760, 756, 758, 754, 763, 758, 745, 761, - 757, 758, 758, 741, 741, 754, 740, 752, 0, 751, - 739, 753, 746, 734, 735, 749, 0, 731, 743, 727, - 721, 739, 728, 734, 730, 732, 727, 721, 737, 732, - 0, 721, 0, 714, 714, 713, 712, 712, 725, 725, - 443, 0, 723, 722, 717, 720, 705, 711, 708, 712, - - 0, 717, 733, 483, 490, 0, 734, 732, 726, 736, - 735, 734, 727, 723, 739, 0, 724, 712, 81, 122, - 205, 226, 0, 0, 311, 0, 350, 460, 483, 476, - 0, 472, 478, 468, 463, 0, 0, 461, 464, 0, - 0, 0, 457, 0, 0, 0, 456, 458, 467, 447, - 0, 469, 470, 0, 458, 0, 0, 474, 0, 471, - 470, 466, 480, 478, 478, 475, 470, 472, 482, 473, - 470, 488, 479, 0, 483, 489, 0, 473, 475, 493, - 488, 476, 481, 495, 489, 488, 0, 0, 491, 503, - 489, 0, 480, 486, 492, 489, 0, 496, 514, 505, - - 495, 510, 497, 503, 0, 499, 509, 510, 0, 0, - 511, 515, 0, 518, 509, 520, 520, 521, 522, 508, - 528, 0, 563, 564, 557, 545, 0, 560, 551, 552, - 553, 543, 553, 559, 0, 562, 0, 565, 554, 571, - 545, 558, 0, 0, 557, 0, 0, 536, 0, 0, - 544, 545, 546, 548, 548, 0, 0, 539, 535, 0, - 544, 537, 540, 0, 554, 554, 547, 543, 0, 552, - 546, 554, 566, 553, 0, 551, 565, 551, 568, 568, - 0, 0, 0, 0, 565, 559, 561, 572, 566, 574, - 555, 576, 1255, 577, 0, 0, 579, 0, 583, 570, - - 579, 575, 563, 0, 0, 0, 585, 586, 587, 587, - 581, 606, 0, 618, 619, 0, 0, 0, 0, 0, - 601, 627, 606, 615, 611, 0, 602, 0, 599, 600, - 591, 0, 0, 591, 0, 595, 0, 604, 589, 602, - 593, 611, 594, 605, 610, 598, 603, 613, 601, 0, - 0, 608, 614, 606, 605, 620, 0, 621, 0, 0, - 622, 0, 611, 614, 621, 618, 0, 0, 0, 0, - 627, 0, 0, 657, 0, 658, 662, 664, 648, 662, - 650, 0, 0, 619, 634, 0, 0, 0, 621, 0, - 630, 0, 641, 0, 0, 0, 0, 0, 0, 630, - - 640, 626, 0, 0, 0, 628, 0, 628, 0, 0, - 0, 0, 667, 668, 663, 664, 678, 0, 0, 0, - 0, 642, 650, 652, 0, 0, 652, 683, 677, 681, - 673, 685, 658, 660, 0, 661, 0, 0, 692, 696, - 689, 650, 0, 0, 685, 692, 687, 0, 685, 690, - 691, 687, 0, 0, 0, 1255, 724, 726, 732, 735, - 741, 746, 751 - } ; - -static yyconst flex_int16_t yy_def[1064] = - { 0, - 1056, 1, 1, 3, 1056, 1056, 1056, 1056, 1056, 1056, - 1057, 1058, 1059, 1056, 1060, 1060, 1056, 1056, 1056, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1056, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1056, 1061, 1060, 1056, 1056, 1062, 1062, 1062, 1060, 69, - 69, 69, 69, 1060, 69, 69, 69, 69, 69, 69, - 69, 69, 1062, 1061, 1056, 1056, 1056, 1057, 1056, 1058, - 1056, 1063, 1056, 1060, 1060, 1056, 1060, 1060, 1056, 1056, - - 1056, 1056, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1056, 1056, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1056, 1061, 1061, 1056, 1060, - 1056, 1056, 1056, 83, 83, 83, 69, 69, 69, 69, - 69, 1060, 69, 69, 69, 69, 69, 69, 69, 69, - 83, 84, 1056, 1061, 84, 1056, 1056, 1056, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1056, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 69, 69, 1060, 69, 69, 69, 69, - 1056, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1056, 1056, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1056, 1056, 69, 1060, 69, 69, 69, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 69, 69, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 69, 69, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1056, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 0, 1056, 1056, 1056, 1056, - 1056, 1056, 1056 - } ; - -static yyconst flex_uint16_t yy_nxt[1330] = - { 0, - 6, 7, 8, 9, 7, 10, 11, 6, 12, 6, - 13, 14, 15, 6, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 27, 27, 29, - 30, 31, 32, 33, 27, 34, 35, 36, 27, 27, - 37, 27, 27, 27, 38, 6, 6, 27, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 27, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 27, 27, 27, 61, 105, 85, 61, 61, 85, - 62, 83, 99, 100, 84, 107, 119, 96, 110, 106, - 111, 356, 97, 113, 120, 108, 114, 121, 109, 357, - - 112, 122, 115, 63, 64, 65, 66, 63, 144, 67, - 836, 123, 128, 68, 69, 67, 70, 212, 145, 213, - 71, 72, 73, 116, 74, 75, 129, 76, 77, 98, - 76, 78, 175, 117, 347, 79, 118, 124, 80, 81, - 132, 125, 82, 140, 133, 126, 176, 67, 135, 136, - 348, 127, 163, 141, 134, 164, 142, 837, 165, 152, - 137, 138, 153, 139, 146, 154, 147, 177, 155, 227, - 148, 149, 156, 76, 150, 151, 157, 166, 178, 158, - 159, 227, 179, 160, 230, 170, 161, 181, 167, 171, - 168, 182, 162, 172, 169, 183, 173, 185, 186, 189, - - 192, 184, 104, 190, 194, 96, 187, 144, 195, 227, - 229, 198, 188, 191, 193, 199, 203, 145, 209, 200, - 204, 196, 227, 205, 201, 202, 231, 131, 210, 838, - 206, 211, 207, 216, 220, 208, 216, 227, 125, 217, - 106, 240, 126, 85, 222, 223, 224, 98, 127, 1056, - 222, 223, 1056, 222, 223, 227, 227, 110, 85, 232, - 235, 85, 839, 227, 122, 226, 222, 223, 225, 112, - 233, 225, 234, 114, 123, 225, 227, 225, 228, 115, - 120, 251, 227, 227, 227, 252, 331, 227, 292, 227, - 227, 227, 227, 227, 293, 254, 332, 227, 227, 255, - - 227, 227, 236, 237, 227, 263, 140, 96, 264, 225, - 278, 279, 97, 296, 238, 138, 141, 239, 145, 142, - 216, 222, 223, 241, 281, 284, 242, 282, 297, 333, - 342, 298, 374, 334, 285, 227, 243, 244, 245, 299, - 305, 245, 375, 335, 306, 245, 245, 245, 245, 98, - 307, 343, 245, 245, 245, 336, 316, 245, 840, 245, - 245, 337, 245, 245, 338, 339, 340, 245, 317, 318, - 245, 245, 841, 319, 245, 349, 350, 353, 362, 245, - 388, 363, 351, 376, 354, 386, 355, 377, 387, 389, - 364, 365, 383, 394, 384, 366, 403, 367, 401, 402, - - 396, 385, 378, 397, 227, 245, 273, 398, 216, 399, - 227, 216, 85, 395, 217, 224, 1056, 1056, 225, 225, - 225, 96, 225, 225, 227, 406, 229, 404, 260, 227, - 226, 270, 405, 407, 227, 227, 227, 227, 227, 457, - 408, 470, 490, 494, 518, 519, 471, 537, 227, 409, - 491, 549, 288, 410, 524, 527, 525, 550, 287, 538, - 528, 495, 227, 98, 564, 565, 566, 227, 227, 227, - 227, 569, 457, 592, 634, 415, 676, 227, 424, 677, - 227, 458, 568, 657, 570, 593, 700, 635, 658, 227, - 227, 754, 842, 701, 765, 704, 811, 227, 571, 812, - - 766, 601, 705, 755, 227, 843, 844, 845, 823, 846, - 847, 848, 849, 824, 458, 850, 851, 852, 853, 854, - 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, - 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, - 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, - 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, - 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, - 905, 906, 907, 908, 909, 910, 911, 227, 227, 912, - 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, - - 933, 934, 935, 936, 937, 938, 847, 939, 940, 941, - 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, - 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, - 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, - 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, - 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, - - 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, - 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, - 1052, 1053, 1054, 1055, 88, 88, 88, 88, 88, 88, - 90, 90, 91, 91, 835, 91, 91, 91, 94, 94, - 94, 218, 218, 218, 218, 218, 218, 225, 225, 225, - 225, 247, 247, 834, 247, 247, 247, 833, 832, 831, - 830, 829, 828, 827, 826, 825, 822, 821, 820, 819, - 818, 817, 816, 815, 814, 813, 810, 809, 808, 807, - 806, 805, 804, 803, 802, 801, 800, 799, 798, 797, - 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, - - 786, 785, 784, 783, 782, 781, 780, 779, 778, 777, - 776, 775, 774, 773, 772, 771, 770, 769, 768, 767, - 764, 763, 762, 761, 760, 759, 758, 757, 756, 753, - 752, 751, 750, 749, 748, 747, 746, 745, 744, 743, - 742, 741, 740, 739, 738, 737, 736, 735, 734, 733, - 732, 731, 730, 729, 728, 727, 726, 725, 724, 723, - 722, 721, 720, 719, 718, 717, 716, 715, 714, 713, - 712, 711, 710, 709, 708, 707, 706, 703, 564, 702, - 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, - 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, - - 679, 678, 675, 674, 673, 672, 671, 670, 669, 668, - 667, 666, 665, 664, 663, 662, 661, 660, 659, 656, - 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, - 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, - 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, - 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, - 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, - 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, - 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, - 581, 580, 579, 578, 577, 576, 575, 574, 573, 572, - - 571, 567, 563, 562, 561, 560, 559, 558, 557, 556, - 555, 554, 553, 552, 551, 548, 547, 546, 545, 544, - 543, 542, 541, 540, 539, 536, 535, 534, 533, 532, - 531, 530, 529, 526, 523, 522, 521, 520, 438, 517, - 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, - 506, 505, 504, 503, 502, 501, 500, 499, 498, 497, - 496, 493, 492, 489, 488, 487, 486, 485, 484, 483, - 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, - 472, 469, 468, 467, 466, 465, 464, 463, 462, 461, - 460, 459, 456, 455, 454, 453, 452, 451, 450, 449, - - 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, - 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, - 428, 427, 426, 425, 424, 423, 422, 421, 420, 419, - 418, 417, 416, 415, 414, 413, 412, 249, 411, 411, - 243, 227, 227, 222, 219, 219, 400, 393, 392, 391, - 390, 382, 381, 380, 379, 373, 372, 371, 370, 369, - 368, 361, 360, 359, 358, 352, 346, 345, 344, 341, - 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 320, 315, 314, 313, 312, 311, 310, 309, 308, 304, - 303, 302, 301, 300, 295, 294, 291, 290, 289, 288, - - 287, 286, 283, 280, 277, 276, 275, 274, 273, 272, - 271, 270, 269, 268, 267, 266, 265, 262, 261, 260, - 259, 258, 257, 256, 253, 250, 249, 95, 93, 248, - 246, 89, 227, 221, 219, 215, 214, 197, 180, 174, - 143, 131, 130, 104, 103, 102, 101, 95, 93, 92, - 89, 87, 86, 1056, 5, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056 - } ; - -static yyconst flex_int16_t yy_chk[1330] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 22, 7, 2, 4, 7, - 2, 4, 17, 17, 4, 23, 28, 16, 24, 22, - 24, 186, 16, 25, 28, 23, 25, 29, 23, 186, - - 24, 29, 25, 2, 3, 3, 3, 4, 38, 3, - 719, 29, 31, 3, 3, 3, 3, 58, 38, 58, - 3, 3, 3, 26, 3, 3, 31, 3, 3, 16, - 3, 3, 46, 26, 182, 3, 26, 30, 3, 3, - 34, 30, 3, 36, 34, 30, 46, 3, 35, 35, - 182, 30, 42, 36, 34, 42, 36, 720, 42, 40, - 35, 35, 40, 35, 39, 40, 39, 47, 40, 71, - 39, 39, 41, 3, 39, 39, 41, 43, 47, 41, - 41, 72, 47, 41, 71, 44, 41, 49, 43, 44, - 43, 49, 41, 44, 43, 49, 44, 50, 50, 51, - - 52, 49, 72, 51, 53, 70, 50, 144, 53, 79, - 70, 55, 50, 51, 52, 55, 56, 144, 57, 55, - 56, 53, 73, 56, 55, 55, 73, 79, 57, 721, - 56, 57, 56, 61, 63, 56, 61, 82, 63, 61, - 73, 82, 63, 66, 66, 66, 66, 70, 63, 67, - 67, 67, 68, 68, 68, 75, 78, 74, 85, 74, - 78, 85, 722, 77, 78, 68, 69, 69, 69, 74, - 75, 69, 77, 75, 78, 69, 69, 69, 69, 75, - 77, 104, 69, 69, 69, 104, 173, 69, 140, 69, - 69, 80, 69, 69, 140, 106, 173, 69, 81, 106, - - 69, 69, 80, 80, 69, 114, 81, 97, 114, 69, - 129, 129, 97, 145, 80, 80, 81, 80, 145, 81, - 83, 83, 83, 83, 131, 133, 83, 131, 146, 174, - 178, 146, 198, 174, 133, 69, 84, 84, 84, 146, - 152, 84, 198, 174, 152, 84, 84, 84, 84, 97, - 152, 178, 84, 84, 84, 175, 161, 84, 725, 84, - 84, 175, 84, 84, 176, 176, 176, 84, 161, 161, - 84, 84, 727, 161, 84, 183, 183, 185, 191, 84, - 206, 191, 183, 199, 185, 205, 185, 199, 205, 206, - 191, 191, 204, 211, 204, 191, 220, 191, 215, 215, - - 212, 204, 199, 212, 230, 84, 220, 212, 216, 212, - 231, 216, 224, 211, 216, 224, 225, 226, 224, 225, - 226, 229, 225, 226, 235, 232, 229, 230, 232, 233, - 226, 235, 231, 233, 236, 237, 238, 239, 240, 296, - 238, 310, 330, 333, 359, 359, 310, 376, 409, 239, - 330, 387, 237, 240, 365, 367, 365, 387, 236, 376, - 367, 333, 404, 229, 403, 403, 404, 405, 407, 410, - 408, 409, 457, 440, 490, 405, 536, 566, 407, 536, - 568, 296, 408, 516, 410, 440, 561, 490, 516, 569, - 570, 631, 728, 561, 642, 569, 691, 704, 566, 691, - - 642, 568, 570, 631, 705, 729, 730, 732, 704, 733, - 734, 735, 738, 705, 457, 739, 743, 747, 748, 749, - 750, 752, 753, 755, 758, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 775, - 776, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 789, 790, 791, 793, 794, 795, 796, 798, 799, 800, - 801, 802, 803, 804, 806, 807, 808, 811, 812, 814, - 815, 816, 817, 818, 819, 820, 821, 823, 824, 825, - 826, 828, 829, 830, 831, 832, 833, 834, 836, 838, - 839, 840, 841, 842, 845, 848, 851, 852, 853, 854, - - 855, 858, 859, 861, 862, 863, 824, 865, 866, 867, - 868, 870, 871, 872, 873, 874, 876, 877, 878, 879, - 880, 885, 886, 887, 888, 889, 890, 891, 892, 894, - 897, 899, 900, 901, 902, 903, 907, 908, 909, 910, - 911, 912, 914, 915, 921, 922, 923, 924, 925, 927, - 929, 930, 931, 934, 936, 938, 939, 940, 941, 942, - 943, 944, 945, 946, 947, 948, 949, 952, 953, 954, - 955, 956, 958, 961, 963, 964, 965, 966, 971, 974, - 976, 977, 978, 979, 980, 981, 984, 985, 989, 991, - 993, 1000, 1001, 1002, 1006, 1008, 1013, 1014, 1015, 1016, - - 1017, 1022, 1023, 1024, 1027, 1028, 1029, 1030, 1031, 1032, - 1033, 1034, 1036, 1039, 1040, 1041, 1042, 1045, 1046, 1047, - 1049, 1050, 1051, 1052, 1057, 1057, 1057, 1057, 1057, 1057, - 1058, 1058, 1059, 1059, 718, 1059, 1059, 1059, 1060, 1060, - 1060, 1061, 1061, 1061, 1061, 1061, 1061, 1062, 1062, 1062, - 1062, 1063, 1063, 717, 1063, 1063, 1063, 715, 714, 713, - 712, 711, 710, 709, 708, 707, 703, 702, 700, 699, - 698, 697, 696, 695, 694, 693, 690, 689, 688, 687, - 686, 685, 684, 682, 680, 679, 678, 677, 676, 675, - 674, 673, 672, 671, 670, 669, 668, 666, 665, 664, - - 663, 662, 661, 660, 658, 657, 656, 655, 654, 653, - 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, - 641, 640, 639, 638, 637, 636, 635, 634, 633, 630, - 629, 628, 627, 626, 625, 624, 623, 622, 620, 619, - 618, 617, 616, 614, 613, 611, 610, 609, 606, 605, - 604, 603, 602, 600, 599, 598, 597, 596, 595, 594, - 593, 592, 590, 589, 588, 587, 585, 584, 582, 581, - 580, 578, 577, 576, 575, 574, 572, 567, 565, 562, - 560, 559, 558, 556, 555, 554, 553, 552, 551, 550, - 549, 548, 547, 546, 545, 544, 543, 542, 541, 540, - - 539, 537, 535, 534, 533, 532, 531, 529, 528, 527, - 526, 524, 523, 522, 521, 520, 519, 518, 517, 514, - 513, 512, 511, 509, 508, 506, 505, 504, 503, 502, - 501, 500, 499, 498, 496, 495, 494, 493, 492, 491, - 489, 488, 487, 486, 485, 481, 480, 479, 478, 477, - 476, 475, 474, 473, 472, 470, 469, 468, 467, 466, - 465, 464, 463, 462, 461, 460, 459, 456, 454, 453, - 452, 451, 450, 448, 447, 446, 445, 444, 443, 441, - 439, 437, 436, 435, 434, 432, 431, 430, 429, 427, - 426, 425, 424, 422, 420, 418, 417, 416, 414, 413, - - 412, 406, 401, 400, 399, 398, 397, 396, 395, 394, - 392, 391, 390, 389, 388, 386, 385, 384, 383, 382, - 381, 380, 379, 378, 377, 375, 374, 373, 372, 371, - 370, 369, 368, 366, 364, 363, 362, 361, 360, 358, - 357, 356, 355, 354, 353, 352, 350, 349, 348, 347, - 345, 344, 343, 342, 341, 339, 338, 337, 336, 335, - 334, 332, 331, 329, 328, 327, 326, 325, 324, 323, - 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, - 311, 309, 308, 307, 306, 305, 304, 303, 302, 301, - 299, 297, 295, 294, 293, 292, 291, 290, 289, 288, - - 287, 286, 285, 284, 283, 282, 281, 280, 279, 278, - 277, 276, 275, 274, 273, 272, 271, 270, 269, 268, - 267, 266, 265, 264, 262, 261, 260, 259, 258, 257, - 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, - 244, 234, 227, 223, 218, 217, 214, 210, 209, 208, - 207, 203, 202, 201, 200, 197, 196, 195, 194, 193, - 192, 190, 189, 188, 187, 184, 181, 180, 179, 177, - 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, - 162, 160, 159, 158, 157, 156, 155, 154, 153, 151, - 150, 149, 148, 147, 143, 142, 139, 138, 137, 136, - - 135, 134, 132, 130, 128, 127, 126, 125, 124, 123, - 122, 121, 120, 118, 117, 116, 115, 113, 112, 111, - 110, 109, 108, 107, 105, 103, 98, 95, 93, 92, - 91, 88, 76, 65, 62, 60, 59, 54, 48, 45, - 37, 33, 32, 21, 20, 19, 18, 15, 14, 13, - 11, 10, 9, 5, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, - 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int yy_flex_debug; -int yy_flex_debug = 0; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -/* NetHack 3.6 lev_comp.l $NHDT-Date: 1543372935 2018/11/28 02:42:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.29 $ */ -/* Copyright (c) 1989 by Jean-Christophe Collet */ -/* NetHack may be freely redistributed. See license for details. */ - -#define LEV_LEX_C - -#include "hack.h" -#include "lev_comp.h" -#include "sp_lev.h" - -/* Most of these don't exist in flex, yywrap is macro and - * yyunput is properly declared in flex.skel. - */ -#if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) -int FDECL(yyback, (int *,int)); -int NDECL(yylook); -int NDECL(yyinput); -int NDECL(yywrap); -int NDECL(yylex); - /* Traditional lexes let yyunput() and yyoutput() default to int; - * newer ones may declare them as void since they don't return - * values. For even more fun, the lex supplied as part of the - * newer unbundled compiler for SunOS 4.x adds the void declarations - * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain - * int) while the bundled lex and the one with the older unbundled - * compiler do not. To detect this, we need help from outside -- - * sys/unix/Makefile.utl. - * - * Digital UNIX is difficult and still has int in spite of all - * other signs. - */ -# if defined(NeXT) || defined(SVR4) || defined(_AIX32) -# define VOIDYYPUT -# endif -# if !defined(VOIDYYPUT) && defined(POSIX_TYPES) -# if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) -# define VOIDYYPUT -# endif -# endif -# if !defined(VOIDYYPUT) && defined(WEIRD_LEX) -# if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) -# define VOIDYYPUT -# endif -# endif -# if defined(VOIDYYPUT) && defined(__osf__) -# undef VOIDYYPUT -# endif -# ifdef VOIDYYPUT -void FDECL(yyunput, (int)); -void FDECL(yyoutput, (int)); -# else -int FDECL(yyunput, (int)); -int FDECL(yyoutput, (int)); -# endif - -#else /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ -/* most recent flex allows suppressing yyunput() altogether when not needed */ -#define YY_NO_UNPUT -#define YY_NO_INPUT -#endif - -#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) -/* older flex wants this */ -#define YY_MALLOC_DECL genericptr_t FDECL(malloc, (size_t)); \ - genericptr_t FDECL(realloc, (genericptr_t, size_t)); -/* newer flex assumes so needs this in case it's been suppressed */ -YY_MALLOC_DECL -#endif - -void FDECL(init_yyin, (FILE *)); -void FDECL(init_yyout, (FILE *)); - -long NDECL(handle_varstring_check); -long FDECL(corefunc_str_check, (char *, long)); - -extern void VDECL(lc_error, (const char *, ...)); -extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int)); - -extern struct lc_vardefs *vardefs; - -extern long FDECL(method_defined, (char *, long, long *)); - -void FDECL(savetoken, (char *)); -void NDECL(newline); -void FDECL(advancepos, (char *)); - -/* - * This doesn't always get put in lev_comp.h - * (esp. when using older versions of bison). - */ -extern YYSTYPE yylval; - -int nh_line_number = 1; -int token_start_pos = 0; -char curr_token[512]; -static char map[4096]; -static int map_cnt = 0; - -FILE *orig_yyin = NULL; - -#define ST_RET(x) do { savetoken(yytext); return x; } while (0); -#define ST_RETF(y, x) do { savetoken(yytext); y; return x; } while (0); - -#define INITIAL 0 -#define MAPC 1 - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy FDECL(FDECL_dummy, (void )); -int yyget_debug FDECL(FDECL_dummy, (void )); -void yyset_debug FDECL(FDECL_dummy, (int debug_flag )); -YY_EXTRA_TYPE yyget_extra FDECL(FDECL_dummy, (void )); -void yyset_extra FDECL(FDECL_dummy, (YY_EXTRA_TYPE user_defined )); -FILE *yyget_in FDECL(FDECL_dummy, (void )); -void yyset_in FDECL(FDECL_dummy, (FILE * _in_str )); -FILE *yyget_out FDECL(FDECL_dummy, (void )); -void yyset_out FDECL(FDECL_dummy, (FILE * _out_str )); -yy_size_t yyget_leng FDECL(FDECL_dummy, (void )); -char *yyget_text FDECL(FDECL_dummy, (void )); -int yyget_lineno FDECL(FDECL_dummy, (void )); -void yyset_lineno FDECL(FDECL_dummy, (int _line_number )); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -extern int yywrap FDECL(FDECL_dummy, (void )); -#endif - -#ifndef YY_NO_UNPUT - -void yyunput FDECL(FDECL_dummy, (int c,char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy FDECL(FDECL_dummy, (char *,yyconst char *,int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen FDECL(FDECL_dummy, (yyconst char * )); -#endif - -#ifndef YY_NO_INPUT - -static int input FDECL(FDECL_dummy, (void )); - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex FDECL(FDECL_dummy, (void)); - -#define YY_DECL int yylex () -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - { - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of yytext. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); -yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1057 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 1255 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - -case 1: -YY_RULE_SETUP -{ - savetoken(yytext); - BEGIN(INITIAL); - yylval.map = (char *) alloc(map_cnt + 1); - (void) strncpy(yylval.map, map, map_cnt); - yylval.map[map_cnt] = 0; - map_cnt = 0; - return MAP_ID; - } - YY_BREAK -case 2: -/* rule 2 can match eol */ -YY_RULE_SETUP -{ - int len = yyleng; - savetoken(yytext); - /* convert \r\n to \n */ - if (len >= 2 && yytext[len - 2] == '\r') - len -= 1; - (void) strncpy(map + map_cnt, yytext, len); - map_cnt += len; - map[map_cnt - 1] = '\n'; - map[map_cnt] = '\0'; - newline(); - } - YY_BREAK -case 3: -/* rule 3 can match eol */ -YY_RULE_SETUP -{ savetoken(yytext); newline(); } - YY_BREAK -case 4: -YY_RULE_SETUP -ST_RET(MESSAGE_ID); - YY_BREAK -case 5: -YY_RULE_SETUP -ST_RET(NOMAP_ID); - YY_BREAK -case 6: -YY_RULE_SETUP -ST_RET(MAZE_ID); - YY_BREAK -case 7: -YY_RULE_SETUP -ST_RET(LEVEL_ID); - YY_BREAK -case 8: -YY_RULE_SETUP -ST_RET(LEV_INIT_ID); - YY_BREAK -case 9: -YY_RULE_SETUP -ST_RET(MAZE_GRID_ID); - YY_BREAK -case 10: -YY_RULE_SETUP -ST_RET(SOLID_FILL_ID); - YY_BREAK -case 11: -YY_RULE_SETUP -ST_RET(MINES_ID); - YY_BREAK -case 12: -YY_RULE_SETUP -ST_RET(ROGUELEV_ID); - YY_BREAK -case 13: -YY_RULE_SETUP -ST_RET(FLAGS_ID); - YY_BREAK -case 14: -YY_RULE_SETUP -ST_RET(GEOMETRY_ID); - YY_BREAK -case 15: -/* rule 15 can match eol */ -YY_RULE_SETUP -{ savetoken(yytext); BEGIN(MAPC); newline(); } - YY_BREAK -case 16: -YY_RULE_SETUP -ST_RET(object_ID); - YY_BREAK -case 17: -YY_RULE_SETUP -ST_RET(OBJECT_ID); - YY_BREAK -case 18: -YY_RULE_SETUP -ST_RET(COBJECT_ID); - YY_BREAK -case 19: -YY_RULE_SETUP -ST_RET(MONSTER_ID); - YY_BREAK -case 20: -YY_RULE_SETUP -ST_RET(monster_ID); - YY_BREAK -case 21: -YY_RULE_SETUP -ST_RET(TRAP_ID); - YY_BREAK -case 22: -YY_RULE_SETUP -ST_RET(DOOR_ID); - YY_BREAK -case 23: -YY_RULE_SETUP -ST_RET(ROOMDOOR_ID); - YY_BREAK -case 24: -YY_RULE_SETUP -ST_RET(DRAWBRIDGE_ID); - YY_BREAK -case 25: -YY_RULE_SETUP -ST_RET(MAZEWALK_ID); - YY_BREAK -case 26: -YY_RULE_SETUP -ST_RET(WALLIFY_ID); - YY_BREAK -case 27: -YY_RULE_SETUP -ST_RET(REGION_ID); - YY_BREAK -case 28: -YY_RULE_SETUP -ST_RET(ALTAR_ID); - YY_BREAK -case 29: -YY_RULE_SETUP -ST_RET(LADDER_ID); - YY_BREAK -case 30: -YY_RULE_SETUP -ST_RET(STAIR_ID); - YY_BREAK -case 31: -YY_RULE_SETUP -ST_RET(PORTAL_ID); - YY_BREAK -case 32: -YY_RULE_SETUP -ST_RET(TELEPRT_ID); - YY_BREAK -case 33: -YY_RULE_SETUP -ST_RET(BRANCH_ID); - YY_BREAK -case 34: -YY_RULE_SETUP -ST_RET(FOUNTAIN_ID); - YY_BREAK -case 35: -YY_RULE_SETUP -ST_RET(SINK_ID); - YY_BREAK -case 36: -YY_RULE_SETUP -ST_RET(POOL_ID); - YY_BREAK -case 37: -YY_RULE_SETUP -ST_RET(NON_DIGGABLE_ID); - YY_BREAK -case 38: -YY_RULE_SETUP -ST_RET(NON_PASSWALL_ID); - YY_BREAK -case 39: -YY_RULE_SETUP -ST_RET(IF_ID); - YY_BREAK -case 40: -YY_RULE_SETUP -ST_RET(ELSE_ID); - YY_BREAK -case 41: -YY_RULE_SETUP -ST_RET(EXIT_ID); - YY_BREAK -case 42: -YY_RULE_SETUP -ST_RET(ROOM_ID); - YY_BREAK -case 43: -YY_RULE_SETUP -ST_RET(SUBROOM_ID); - YY_BREAK -case 44: -YY_RULE_SETUP -ST_RET(RAND_CORRIDOR_ID); - YY_BREAK -case 45: -YY_RULE_SETUP -ST_RET(CORRIDOR_ID); - YY_BREAK -case 46: -YY_RULE_SETUP -ST_RET(TERRAIN_ID); - YY_BREAK -case 47: -YY_RULE_SETUP -ST_RET(terrain_ID); - YY_BREAK -case 48: -YY_RULE_SETUP -ST_RET(REPLACE_TERRAIN_ID); - YY_BREAK -case 49: -YY_RULE_SETUP -ST_RET(GOLD_ID); - YY_BREAK -case 50: -YY_RULE_SETUP -ST_RET(GRAVE_ID); - YY_BREAK -case 51: -YY_RULE_SETUP -ST_RET(ENGRAVING_ID); - YY_BREAK -case 52: -YY_RULE_SETUP -ST_RET(MINERALIZE_ID); - YY_BREAK -case 53: -YY_RULE_SETUP -ST_RET(NAME_ID); - YY_BREAK -case 54: -YY_RULE_SETUP -ST_RET(FOR_ID); - YY_BREAK -case 55: -YY_RULE_SETUP -ST_RET(TO_ID); - YY_BREAK -case 56: -YY_RULE_SETUP -ST_RET(LOOP_ID); - YY_BREAK -case 57: -YY_RULE_SETUP -ST_RET(SWITCH_ID); - YY_BREAK -case 58: -YY_RULE_SETUP -ST_RET(CASE_ID); - YY_BREAK -case 59: -YY_RULE_SETUP -ST_RET(BREAK_ID); - YY_BREAK -case 60: -YY_RULE_SETUP -ST_RET(DEFAULT_ID); - YY_BREAK -case 61: -YY_RULE_SETUP -ST_RET(FUNCTION_ID); - YY_BREAK -case 62: -YY_RULE_SETUP -ST_RET(SHUFFLE_ID); - YY_BREAK -case 63: -YY_RULE_SETUP -ST_RET(MONTYPE_ID); - YY_BREAK -case 64: -YY_RULE_SETUP -ST_RET(selection_ID); - YY_BREAK -case 65: -YY_RULE_SETUP -ST_RET(rect_ID); - YY_BREAK -case 66: -YY_RULE_SETUP -ST_RET(fillrect_ID); - YY_BREAK -case 67: -YY_RULE_SETUP -ST_RET(line_ID); - YY_BREAK -case 68: -YY_RULE_SETUP -ST_RET(randline_ID); - YY_BREAK -case 69: -YY_RULE_SETUP -ST_RET(grow_ID); - YY_BREAK -case 70: -YY_RULE_SETUP -ST_RET(flood_ID); - YY_BREAK -case 71: -YY_RULE_SETUP -ST_RET(rndcoord_ID); - YY_BREAK -case 72: -YY_RULE_SETUP -ST_RET(circle_ID); - YY_BREAK -case 73: -YY_RULE_SETUP -ST_RET(ellipse_ID); - YY_BREAK -case 74: -YY_RULE_SETUP -ST_RET(filter_ID); - YY_BREAK -case 75: -YY_RULE_SETUP -ST_RET(gradient_ID); - YY_BREAK -case 76: -YY_RULE_SETUP -ST_RET(complement_ID); - YY_BREAK -case 77: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=SEL_GRADIENT_RADIAL; return GRADIENT_TYPE; } - YY_BREAK -case 78: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=SEL_GRADIENT_SQUARE; return GRADIENT_TYPE; } - YY_BREAK -case 79: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=DRY; return HUMIDITY_TYPE; } - YY_BREAK -case 80: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=WET; return HUMIDITY_TYPE; } - YY_BREAK -case 81: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=HOT; return HUMIDITY_TYPE; } - YY_BREAK -case 82: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=SOLID; return HUMIDITY_TYPE; } - YY_BREAK -case 83: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=ANY_LOC; return HUMIDITY_TYPE; } - YY_BREAK -case 84: -YY_RULE_SETUP -ST_RET(LEV); - YY_BREAK -case 85: -YY_RULE_SETUP -ST_RET(QUANTITY_ID); - YY_BREAK -case 86: -YY_RULE_SETUP -ST_RET(BURIED_ID); - YY_BREAK -case 87: -YY_RULE_SETUP -ST_RET(ERODED_ID); - YY_BREAK -case 88: -YY_RULE_SETUP -ST_RET(ERODEPROOF_ID); - YY_BREAK -case 89: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return TRAPPED_STATE; } - YY_BREAK -case 90: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return TRAPPED_STATE; } - YY_BREAK -case 91: -YY_RULE_SETUP -ST_RET(RECHARGED_ID); - YY_BREAK -case 92: -YY_RULE_SETUP -ST_RET(INVIS_ID); - YY_BREAK -case 93: -YY_RULE_SETUP -ST_RET(GREASED_ID); - YY_BREAK -case 94: -YY_RULE_SETUP -ST_RET(FEMALE_ID); - YY_BREAK -case 95: -YY_RULE_SETUP -ST_RET(CANCELLED_ID); - YY_BREAK -case 96: -YY_RULE_SETUP -ST_RET(REVIVED_ID); - YY_BREAK -case 97: -YY_RULE_SETUP -ST_RET(AVENGE_ID); - YY_BREAK -case 98: -YY_RULE_SETUP -ST_RET(FLEEING_ID); - YY_BREAK -case 99: -YY_RULE_SETUP -ST_RET(BLINDED_ID); - YY_BREAK -case 100: -YY_RULE_SETUP -ST_RET(PARALYZED_ID); - YY_BREAK -case 101: -YY_RULE_SETUP -ST_RET(STUNNED_ID); - YY_BREAK -case 102: -YY_RULE_SETUP -ST_RET(CONFUSED_ID); - YY_BREAK -case 103: -YY_RULE_SETUP -ST_RET(SEENTRAPS_ID); - YY_BREAK -case 104: -YY_RULE_SETUP -ST_RET(ALL_ID); - YY_BREAK -case 105: -YY_RULE_SETUP -ST_RETF((yylval.i=1), HORIZ_OR_VERT); - YY_BREAK -case 106: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=2; return HORIZ_OR_VERT; } - YY_BREAK -case 107: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=D_ISOPEN; return DOOR_STATE; } - YY_BREAK -case 108: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=D_CLOSED; return DOOR_STATE; } - YY_BREAK -case 109: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=D_LOCKED; return DOOR_STATE; } - YY_BREAK -case 110: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=D_NODOOR; return DOOR_STATE; } - YY_BREAK -case 111: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=D_BROKEN; return DOOR_STATE; } - YY_BREAK -case 112: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=D_SECRET; return DOOR_STATE; } - YY_BREAK -case 113: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=W_NORTH; return DIRECTION; } - YY_BREAK -case 114: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=W_EAST; return DIRECTION; } - YY_BREAK -case 115: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=W_SOUTH; return DIRECTION; } - YY_BREAK -case 116: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=W_WEST; return DIRECTION; } - YY_BREAK -case 117: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = -1; return RANDOM_TYPE; } - YY_BREAK -case 118: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = -1; return RANDOM_TYPE_BRACKET; } - YY_BREAK -case 119: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = -2; return NONE; } - YY_BREAK -case 120: -YY_RULE_SETUP -ST_RET(A_REGISTER); - YY_BREAK -case 121: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return LEFT_OR_RIGHT; } - YY_BREAK -case 122: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=2; return LEFT_OR_RIGHT; } - YY_BREAK -case 123: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=3; return CENTER; } - YY_BREAK -case 124: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=4; return LEFT_OR_RIGHT; } - YY_BREAK -case 125: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=5; return LEFT_OR_RIGHT; } - YY_BREAK -case 126: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return TOP_OR_BOT; } - YY_BREAK -case 127: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=5; return TOP_OR_BOT; } - YY_BREAK -case 128: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return LIGHT_STATE; } - YY_BREAK -case 129: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return LIGHT_STATE; } - YY_BREAK -case 130: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return FILLING; } - YY_BREAK -case 131: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return FILLING; } - YY_BREAK -case 132: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return IRREGULAR; } - YY_BREAK -case 133: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return IRREGULAR; } - YY_BREAK -case 134: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return JOINED; } - YY_BREAK -case 135: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return JOINED; } - YY_BREAK -case 136: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return LIMITED; } - YY_BREAK -case 137: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return LIMITED; } - YY_BREAK -case 138: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= AM_NONE; return ALIGNMENT; } - YY_BREAK -case 139: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= AM_LAWFUL; return ALIGNMENT; } - YY_BREAK -case 140: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= AM_NEUTRAL; return ALIGNMENT; } - YY_BREAK -case 141: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= AM_CHAOTIC; return ALIGNMENT; } - YY_BREAK -case 142: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= AM_SPLEV_CO; return ALIGNMENT; } - YY_BREAK -case 143: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= AM_SPLEV_NONCO; return ALIGNMENT; } - YY_BREAK -case 144: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return MON_ATTITUDE; } - YY_BREAK -case 145: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return MON_ATTITUDE; } - YY_BREAK -case 146: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return MON_ALERTNESS; } - YY_BREAK -case 147: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return MON_ALERTNESS; } - YY_BREAK -case 148: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; } - YY_BREAK -case 149: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= M_AP_MONSTER; return MON_APPEARANCE; } - YY_BREAK -case 150: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i= M_AP_OBJECT; return MON_APPEARANCE; } - YY_BREAK -case 151: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=2; return ALTAR_TYPE; } - YY_BREAK -case 152: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return ALTAR_TYPE; } - YY_BREAK -case 153: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return ALTAR_TYPE; } - YY_BREAK -case 154: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return UP_OR_DOWN; } - YY_BREAK -case 155: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return UP_OR_DOWN; } - YY_BREAK -case 156: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=0; return BOOLEAN; } - YY_BREAK -case 157: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return BOOLEAN; } - YY_BREAK -case 158: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=DUST; return ENGRAVING_TYPE; } - YY_BREAK -case 159: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=ENGRAVE; return ENGRAVING_TYPE; } - YY_BREAK -case 160: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=BURN; return ENGRAVING_TYPE; } - YY_BREAK -case 161: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=MARK; return ENGRAVING_TYPE; } - YY_BREAK -case 162: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=ENGR_BLOOD; return ENGRAVING_TYPE; } - YY_BREAK -case 163: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=1; return CURSE_TYPE; } - YY_BREAK -case 164: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=2; return CURSE_TYPE; } - YY_BREAK -case 165: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=3; return CURSE_TYPE; } - YY_BREAK -case 166: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=NOTELEPORT; return FLAG_TYPE; } - YY_BREAK -case 167: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=HARDFLOOR; return FLAG_TYPE; } - YY_BREAK -case 168: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=NOMMAP; return FLAG_TYPE; } - YY_BREAK -case 169: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=ARBOREAL; return FLAG_TYPE; } /* KMH */ - YY_BREAK -case 170: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=SHORTSIGHTED; return FLAG_TYPE; } - YY_BREAK -case 171: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=MAZELEVEL; return FLAG_TYPE; } - YY_BREAK -case 172: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=PREMAPPED; return FLAG_TYPE; } - YY_BREAK -case 173: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=SHROUD; return FLAG_TYPE; } - YY_BREAK -case 174: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=GRAVEYARD; return FLAG_TYPE; } - YY_BREAK -case 175: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=ICEDPOOLS; return FLAG_TYPE; } - YY_BREAK -case 176: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=SOLIDIFY; return FLAG_TYPE; } - YY_BREAK -case 177: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=CORRMAZE; return FLAG_TYPE; } - YY_BREAK -case 178: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=CHECK_INACCESSIBLES; return FLAG_TYPE; } - YY_BREAK -case 179: -YY_RULE_SETUP -{ char *p = index(yytext, 'd'); - savetoken(yytext); - if (p) { - *p++ = '\0'; - yylval.dice.num = atoi(yytext); - yylval.dice.die = atoi(p); - } else { - yylval.dice.num = yylval.dice.die = 1; - } - return DICE; - } - YY_BREAK -case 180: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = atoi(yytext + 1); - if (yylval.i < 0 || yylval.i > 100) - lc_error("Unexpected percentile '%li%%'", yylval.i); - return PERCENT; } - YY_BREAK -case 181: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=atoi(yytext); return MINUS_INTEGER; } - YY_BREAK -case 182: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=atoi(yytext); return PLUS_INTEGER; } - YY_BREAK -case 183: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = atoi(yytext); - if (yylval.i < 0 || yylval.i > 100) - lc_error("Unexpected percentile '%li%%'", yylval.i); - return SPERCENT; } - YY_BREAK -case 184: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i=atoi(yytext); return INTEGER; } - YY_BREAK -case 185: -/* rule 185 can match eol */ -YY_RULE_SETUP -{ savetoken(yytext); - yytext[yyleng - 1] = '\0'; /* discard the trailing \" */ - yylval.map = dupstr(yytext + 1); /* skip the first \" */ - return STRING; } - YY_BREAK -case 186: -YY_RULE_SETUP -{ savetoken(yytext); return handle_varstring_check(); } - YY_BREAK -case 187: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JE; return COMPARE_TYPE; } - YY_BREAK -case 188: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JNE; return COMPARE_TYPE; } - YY_BREAK -case 189: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JNE; return COMPARE_TYPE; } - YY_BREAK -case 190: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JLE; return COMPARE_TYPE; } - YY_BREAK -case 191: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JGE; return COMPARE_TYPE; } - YY_BREAK -case 192: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JL; return COMPARE_TYPE; } - YY_BREAK -case 193: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = SPO_JG; return COMPARE_TYPE; } - YY_BREAK -case 194: -/* rule 194 can match eol */ -YY_RULE_SETUP -{ newline(); } - YY_BREAK -case 195: -YY_RULE_SETUP -{ advancepos(yytext); } - YY_BREAK -case 196: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = yytext[2]; return CHAR; } - YY_BREAK -case 197: -YY_RULE_SETUP -{ savetoken(yytext); yylval.i = yytext[1]; return CHAR; } - YY_BREAK -case 198: -YY_RULE_SETUP -ST_RET(UNKNOWN_TYPE); - YY_BREAK -case 199: -YY_RULE_SETUP -{ savetoken(yytext); return yytext[0]; } - YY_BREAK -case 200: -YY_RULE_SETUP -ECHO; - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(MAPC): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( yywrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer () -{ - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = (yytext_ptr); - yy_size_t number_to_move, i; - int ret_val; - - if ((yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1]) - YY_FATAL_ERROR("fatal flex scanner internal error--end of buffer missed"); - - if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) { - /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } else { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for (i = 0; i < number_to_move; ++i) - *(dest++) = *(source++); - - if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) { - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - } else { - yy_size_t num_to_read; - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - /* [pr] This could probably be (b->yy_buf_size < number_to_move) - * since the allocated size is actually b->yy_buf_size + 2. - * The old code calculated num_to_read above (with same formula - * as is used below), then used (num_to_read <= 0) here, which - * got broken when num_to_read was changed to an unsigned type. */ - while (b->yy_buf_size <= number_to_move + 1) { - /* Not enough room in the buffer - grow it. */ - - int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) { - b->yy_buf_size += b->yy_buf_size / 4; - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if (! b->yy_ch_buf) - YY_FATAL_ERROR("fatal error - scanner input buffer overflow"); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - } - - num_to_read = b->yy_buf_size - number_to_move - 1; - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), num_to_read); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ((yy_n_chars) == 0) { - if (number_to_move == YY_MORE_ADJ) { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); - } else { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; - } - } else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) - > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) - yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if (! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) - YY_FATAL_ERROR("out of dynamic memory in yy_get_next_buffer()"); - } - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before EOB char was reached */ - -static yy_state_type yy_get_previous_state () -{ - yy_state_type yy_current_state; - char *yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); - - for (yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp) { - - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1057 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -static yy_state_type yy_try_NUL_trans (yy_current_state ) - yy_state_type yy_current_state; -{ - int yy_is_jam; - char *yy_cp = (yy_c_buf_p); - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1057 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 1056); - - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_UNPUT - -void yyunput (c,yy_bp ) - int c; - char * yy_bp; -{ - char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up yytext */ - *yy_cp = (yy_hold_char); - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - yy_size_t number_to_move = (yy_n_chars) + 2; - char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - char *source = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - - while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#endif - -#ifndef YY_NO_INPUT -static int input () -{ - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - return input(); - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(uchar *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve yytext */ - (yy_hold_char) = *++(yy_c_buf_p); - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - -void yyrestart (input_file ) - FILE * input_file; -{ - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ -void yy_switch_to_buffer (new_buffer ) - YY_BUFFER_STATE new_buffer; -{ - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void yy_load_buffer_state () -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ -YY_BUFFER_STATE yy_create_buffer (file,size ) - FILE * file; - int size; -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - if (!size) - size = YY_BUF_SIZE; - - b->yy_buf_size = (yy_size_t)size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * - */ -void yy_delete_buffer (b ) - YY_BUFFER_STATE b; -{ - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); - - yyfree((void *) b ); -} - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ -static void yy_init_buffer (b,file ) - YY_BUFFER_STATE b; - FILE * file; -{ - int oerrno = errno; - - yy_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ -void yy_flush_buffer (b ) - YY_BUFFER_STATE b; -{ - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void yypush_buffer_state (new_buffer ) - YY_BUFFER_STATE new_buffer; -{ - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void yypop_buffer_state () -{ - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack () -{ - yy_size_t num_to_alloc; - - if (!(yy_buffer_stack)) { - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ -#if 1 /* [PR] avoid C++-style comment; older C compilers choke on it */ - num_to_alloc = 2; /* also changed to match the comment... */ -#else - num_to_alloc = 1; // After all that talk, this was set to 1 anyways... -#endif - (yy_buffer_stack) = (struct yy_buffer_state**) - yyalloc(num_to_alloc * sizeof(struct yy_buffer_state*) ); - if (!(yy_buffer_stack)) - YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); - - (void) memset((yy_buffer_stack), 0, - num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1) { - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**) - yyrealloc((yy_buffer_stack),num_to_alloc * sizeof(struct yy_buffer_state*) ); - if (!(yy_buffer_stack)) - YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); - - /* zero only the new slots.*/ - (void) memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, - grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified - * character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (base,size ) - char * base; - yy_size_t size; -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() - * will scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (yystr ) - yyconst char * yystr; -{ - - return yy_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to - * yylex() will scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a - * bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (yybytes,_yybytes_len ) - yyconst char * yybytes; - yy_size_t _yybytes_len; -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - yy_size_t i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (msg ) - yyconst char* msg; -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg); \ - yytext[yyleng] = (yy_hold_char); \ - (yy_c_buf_p) = yytext + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - yyleng = yyless_macro_arg; \ - } while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int yyget_lineno () -{ - - return yylineno; -} - -/** Get the input stream. - * - */ -FILE *yyget_in () -{ - return yyin; -} - -/** Get the output stream. - * - */ -FILE *yyget_out () -{ - return yyout; -} - -/** Get the length of the current token. - * - */ -yy_size_t yyget_leng () -{ - return yyleng; -} - -/** Get the current token. - * - */ - -char *yyget_text () -{ - return yytext; -} - -/** Set the current line number. - * @param _line_number line number - * - */ -void yyset_lineno (_line_number ) - int _line_number; -{ - - yylineno = _line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param _in_str A readable stream. - * - * @see yy_switch_to_buffer - */ -void yyset_in (_in_str ) - FILE * _in_str; -{ - yyin = _in_str ; -} - -void yyset_out (_out_str ) - FILE * _out_str; -{ - yyout = _out_str ; -} - -int yyget_debug () -{ - return yy_flex_debug; -} - -void yyset_debug (_bdebug ) - int _bdebug; -{ - yy_flex_debug = _bdebug ; -} - -static int yy_init_globals () -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = (FILE *) 0; - yyout = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy () -{ - - /* Pop the buffer stack, destroying each element. */ - while (YY_CURRENT_BUFFER) { - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(); - } - /* Destroy the stack itself. */ - yyfree((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner - * so the next time yylex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (s1,s2,n ) - char* s1; - yyconst char * s2; - int n; -{ - - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (s ) - yyconst char * s; -{ - int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (size ) - yy_size_t size; -{ - - return (void *) malloc( size ); -} - -void *yyrealloc (ptr,size ) - void * ptr; - yy_size_t size; -{ - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void yyfree (ptr ) - void * ptr; -{ - - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#ifdef AMIGA -long * -alloc(n) - unsigned n; -{ - return (long *) malloc(n); -} -#endif - -/* routine to switch to another input file; needed for flex */ -void -init_yyin( input_f ) -FILE *input_f; -{ -#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) - if (yyin) - yyrestart(input_f); - else -#endif - yyin = input_f; - - if (!orig_yyin) - orig_yyin = yyin; -} -/* analogous routine (for completeness) */ -void -init_yyout( output_f ) -FILE *output_f; -{ - yyout = output_f; -} - -long -handle_varstring_check() -{ - struct lc_vardefs *vd; - - yylval.map = dupstr(yytext); - if ((vd = vardef_defined(vardefs, yytext, 1)) != 0) { - long l = vd->var_type; - int a = ((l & SPOVAR_ARRAY) == SPOVAR_ARRAY); - - l &= ~SPOVAR_ARRAY; - if (l == SPOVAR_INT) - return (a ? VARSTRING_INT_ARRAY : VARSTRING_INT); - if (l == SPOVAR_STRING) - return (a ? VARSTRING_STRING_ARRAY : VARSTRING_STRING); - if (l == SPOVAR_VARIABLE) - return (a ? VARSTRING_VAR_ARRAY : VARSTRING_VAR); - if (l == SPOVAR_COORD) - return (a ? VARSTRING_COORD_ARRAY : VARSTRING_COORD); - if (l == SPOVAR_REGION) - return (a ? VARSTRING_REGION_ARRAY : VARSTRING_REGION); - if (l == SPOVAR_MAPCHAR) - return (a ? VARSTRING_MAPCHAR_ARRAY : VARSTRING_MAPCHAR); - if (l == SPOVAR_MONST) - return (a ? VARSTRING_MONST_ARRAY : VARSTRING_MONST); - if (l == SPOVAR_OBJ) - return (a ? VARSTRING_OBJ_ARRAY : VARSTRING_OBJ); - if (l == SPOVAR_SEL) - return (a ? VARSTRING_SEL_ARRAY : VARSTRING_SEL); - } - return VARSTRING; -} - -void -newline() -{ - nh_line_number++; - token_start_pos = 0; - (void) memset((genericptr_t) curr_token, 0, 512); -} - -void -savetoken(s) -char *s; -{ - Sprintf(curr_token, "%s", s); - advancepos(s); -} - -void -advancepos(s) -char *s; -{ - token_start_pos += strlen(s); -} - -/*lev_comp.l*/ - diff --git a/sys/share/lev_yacc.c b/sys/share/lev_yacc.c deleted file mode 100644 index b6ac4d935..000000000 --- a/sys/share/lev_yacc.c +++ /dev/null @@ -1,4985 +0,0 @@ -#ifndef lint -/* static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; */ -/* static char nhsccsid[] = "@(#)yaccpar 1.9.0-nh (NetHack) 12/03/2015"; */ -#endif -#define YYBYACC 1 -#define YYMAJOR 1 -#define YYMINOR 9 -#define YYSUBMINOR "0-nh" - -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#define YYRECOVERING (yyerrflag!=0) -#define YYPREFIX "yy" -/* NetHack 3.6 lev_comp.y $NHDT-Date: 1551901401 2019/03/06 19:43:21 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.26 $ */ -/* Copyright (c) 1989 by Jean-Christophe Collet */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * This file contains the Level Compiler code - * It may handle special mazes & special room-levels - */ - -/* In case we're using bison in AIX. This definition must be - * placed before any other C-language construct in the file - * excluding comments and preprocessor directives (thanks IBM - * for this wonderful feature...). - * - * Note: some cpps barf on this 'undefined control' (#pragma). - * Addition of the leading space seems to prevent barfage for now, - * and AIX will still see the directive. - */ -#ifdef _AIX - #pragma alloca /* keep leading space! */ -#endif - -#define SPEC_LEV /* for USE_OLDARGS (sp_lev.h) */ -#include "hack.h" -#include "sp_lev.h" - -#define ERR (-1) -/* many types of things are put in chars for transference to NetHack. - * since some systems will use signed chars, limit everybody to the - * same number for portability. - */ -#define MAX_OF_TYPE 128 - -#define MAX_NESTED_IFS 20 -#define MAX_SWITCH_CASES 20 - -#define New(type) \ - (type *) memset((genericptr_t) alloc(sizeof (type)), 0, sizeof (type)) -#define NewTab(type, size) (type **) alloc(sizeof (type *) * size) -#define Free(ptr) free((genericptr_t) ptr) - -extern void VDECL(lc_error, (const char *, ...)); -extern void VDECL(lc_warning, (const char *, ...)); -extern void FDECL(yyerror, (const char *)); -extern void FDECL(yywarning, (const char *)); -extern int NDECL(yylex); -int NDECL(yyparse); - -extern int FDECL(get_floor_type, (CHAR_P)); -extern int FDECL(get_room_type, (char *)); -extern int FDECL(get_trap_type, (char *)); -extern int FDECL(get_monster_id, (char *,CHAR_P)); -extern int FDECL(get_object_id, (char *,CHAR_P)); -extern boolean FDECL(check_monster_char, (CHAR_P)); -extern boolean FDECL(check_object_char, (CHAR_P)); -extern char FDECL(what_map_char, (CHAR_P)); -extern void FDECL(scan_map, (char *, sp_lev *)); -extern void FDECL(add_opcode, (sp_lev *, int, genericptr_t)); -extern genericptr_t FDECL(get_last_opcode_data1, (sp_lev *, int)); -extern genericptr_t FDECL(get_last_opcode_data2, (sp_lev *, int, int)); -extern boolean FDECL(check_subrooms, (sp_lev *)); -extern boolean FDECL(write_level_file, (char *,sp_lev *)); -extern struct opvar *FDECL(set_opvar_int, (struct opvar *, long)); -extern void VDECL(add_opvars, (sp_lev *, const char *, ...)); -extern void FDECL(start_level_def, (sp_lev * *, char *)); - -extern struct lc_funcdefs *FDECL(funcdef_new, (long,char *)); -extern void FDECL(funcdef_free_all, (struct lc_funcdefs *)); -extern struct lc_funcdefs *FDECL(funcdef_defined, (struct lc_funcdefs *, - char *, int)); -extern char *FDECL(funcdef_paramtypes, (struct lc_funcdefs *)); -extern char *FDECL(decode_parm_str, (char *)); - -extern struct lc_vardefs *FDECL(vardef_new, (long,char *)); -extern void FDECL(vardef_free_all, (struct lc_vardefs *)); -extern struct lc_vardefs *FDECL(vardef_defined, (struct lc_vardefs *, - char *, int)); - -extern void NDECL(break_stmt_start); -extern void FDECL(break_stmt_end, (sp_lev *)); -extern void FDECL(break_stmt_new, (sp_lev *, long)); - -extern void FDECL(splev_add_from, (sp_lev *, sp_lev *)); - -extern void FDECL(check_vardef_type, (struct lc_vardefs *, char *, long)); -extern void FDECL(vardef_used, (struct lc_vardefs *, char *)); -extern struct lc_vardefs *FDECL(add_vardef_type, (struct lc_vardefs *, - char *, long)); - -extern int FDECL(reverse_jmp_opcode, (int)); - -struct coord { - long x; - long y; -}; - -struct forloopdef { - char *varname; - long jmp_point; -}; -static struct forloopdef forloop_list[MAX_NESTED_IFS]; -static short n_forloops = 0; - - -sp_lev *splev = NULL; - -static struct opvar *if_list[MAX_NESTED_IFS]; - -static short n_if_list = 0; - -unsigned int max_x_map, max_y_map; -int obj_containment = 0; - -int in_container_obj = 0; - -/* integer value is possibly an inconstant value (eg. dice notation - or a variable) */ -int is_inconstant_number = 0; - -int in_switch_statement = 0; -static struct opvar *switch_check_jump = NULL; -static struct opvar *switch_default_case = NULL; -static struct opvar *switch_case_list[MAX_SWITCH_CASES]; -static long switch_case_value[MAX_SWITCH_CASES]; -int n_switch_case_list = 0; - -int allow_break_statements = 0; -struct lc_breakdef *break_list = NULL; - -extern struct lc_vardefs *vardefs; /* variable definitions */ - - -struct lc_vardefs *function_tmp_var_defs = NULL; -extern struct lc_funcdefs *function_definitions; -struct lc_funcdefs *curr_function = NULL; -struct lc_funcdefs_parm * curr_function_param = NULL; -int in_function_definition = 0; -sp_lev *function_splev_backup = NULL; - -extern int fatal_error; -extern int got_errors; -extern int line_number; -extern const char *fname; - -extern char curr_token[512]; - -typedef union -{ - long i; - char *map; - struct { - long room; - long wall; - long door; - } corpos; - struct { - long area; - long x1; - long y1; - long x2; - long y2; - } lregn; - struct { - long x; - long y; - } crd; - struct { - long ter; - long lit; - } terr; - struct { - long height; - long width; - } sze; - struct { - long die; - long num; - } dice; - struct { - long cfunc; - char *varstr; - } meth; -} YYSTYPE; -#define CHAR 257 -#define INTEGER 258 -#define BOOLEAN 259 -#define PERCENT 260 -#define SPERCENT 261 -#define MINUS_INTEGER 262 -#define PLUS_INTEGER 263 -#define MAZE_GRID_ID 264 -#define SOLID_FILL_ID 265 -#define MINES_ID 266 -#define ROGUELEV_ID 267 -#define MESSAGE_ID 268 -#define MAZE_ID 269 -#define LEVEL_ID 270 -#define LEV_INIT_ID 271 -#define GEOMETRY_ID 272 -#define NOMAP_ID 273 -#define OBJECT_ID 274 -#define COBJECT_ID 275 -#define MONSTER_ID 276 -#define TRAP_ID 277 -#define DOOR_ID 278 -#define DRAWBRIDGE_ID 279 -#define object_ID 280 -#define monster_ID 281 -#define terrain_ID 282 -#define MAZEWALK_ID 283 -#define WALLIFY_ID 284 -#define REGION_ID 285 -#define FILLING 286 -#define IRREGULAR 287 -#define JOINED 288 -#define ALTAR_ID 289 -#define LADDER_ID 290 -#define STAIR_ID 291 -#define NON_DIGGABLE_ID 292 -#define NON_PASSWALL_ID 293 -#define ROOM_ID 294 -#define PORTAL_ID 295 -#define TELEPRT_ID 296 -#define BRANCH_ID 297 -#define LEV 298 -#define MINERALIZE_ID 299 -#define CORRIDOR_ID 300 -#define GOLD_ID 301 -#define ENGRAVING_ID 302 -#define FOUNTAIN_ID 303 -#define POOL_ID 304 -#define SINK_ID 305 -#define NONE 306 -#define RAND_CORRIDOR_ID 307 -#define DOOR_STATE 308 -#define LIGHT_STATE 309 -#define CURSE_TYPE 310 -#define ENGRAVING_TYPE 311 -#define DIRECTION 312 -#define RANDOM_TYPE 313 -#define RANDOM_TYPE_BRACKET 314 -#define A_REGISTER 315 -#define ALIGNMENT 316 -#define LEFT_OR_RIGHT 317 -#define CENTER 318 -#define TOP_OR_BOT 319 -#define ALTAR_TYPE 320 -#define UP_OR_DOWN 321 -#define SUBROOM_ID 322 -#define NAME_ID 323 -#define FLAGS_ID 324 -#define FLAG_TYPE 325 -#define MON_ATTITUDE 326 -#define MON_ALERTNESS 327 -#define MON_APPEARANCE 328 -#define ROOMDOOR_ID 329 -#define IF_ID 330 -#define ELSE_ID 331 -#define TERRAIN_ID 332 -#define HORIZ_OR_VERT 333 -#define REPLACE_TERRAIN_ID 334 -#define EXIT_ID 335 -#define SHUFFLE_ID 336 -#define QUANTITY_ID 337 -#define BURIED_ID 338 -#define LOOP_ID 339 -#define FOR_ID 340 -#define TO_ID 341 -#define SWITCH_ID 342 -#define CASE_ID 343 -#define BREAK_ID 344 -#define DEFAULT_ID 345 -#define ERODED_ID 346 -#define TRAPPED_STATE 347 -#define RECHARGED_ID 348 -#define INVIS_ID 349 -#define GREASED_ID 350 -#define FEMALE_ID 351 -#define CANCELLED_ID 352 -#define REVIVED_ID 353 -#define AVENGE_ID 354 -#define FLEEING_ID 355 -#define BLINDED_ID 356 -#define PARALYZED_ID 357 -#define STUNNED_ID 358 -#define CONFUSED_ID 359 -#define SEENTRAPS_ID 360 -#define ALL_ID 361 -#define MONTYPE_ID 362 -#define GRAVE_ID 363 -#define ERODEPROOF_ID 364 -#define FUNCTION_ID 365 -#define MSG_OUTPUT_TYPE 366 -#define COMPARE_TYPE 367 -#define UNKNOWN_TYPE 368 -#define rect_ID 369 -#define fillrect_ID 370 -#define line_ID 371 -#define randline_ID 372 -#define grow_ID 373 -#define selection_ID 374 -#define flood_ID 375 -#define rndcoord_ID 376 -#define circle_ID 377 -#define ellipse_ID 378 -#define filter_ID 379 -#define complement_ID 380 -#define gradient_ID 381 -#define GRADIENT_TYPE 382 -#define LIMITED 383 -#define HUMIDITY_TYPE 384 -#define STRING 385 -#define MAP_ID 386 -#define NQSTRING 387 -#define VARSTRING 388 -#define CFUNC 389 -#define CFUNC_INT 390 -#define CFUNC_STR 391 -#define CFUNC_COORD 392 -#define CFUNC_REGION 393 -#define VARSTRING_INT 394 -#define VARSTRING_INT_ARRAY 395 -#define VARSTRING_STRING 396 -#define VARSTRING_STRING_ARRAY 397 -#define VARSTRING_VAR 398 -#define VARSTRING_VAR_ARRAY 399 -#define VARSTRING_COORD 400 -#define VARSTRING_COORD_ARRAY 401 -#define VARSTRING_REGION 402 -#define VARSTRING_REGION_ARRAY 403 -#define VARSTRING_MAPCHAR 404 -#define VARSTRING_MAPCHAR_ARRAY 405 -#define VARSTRING_MONST 406 -#define VARSTRING_MONST_ARRAY 407 -#define VARSTRING_OBJ 408 -#define VARSTRING_OBJ_ARRAY 409 -#define VARSTRING_SEL 410 -#define VARSTRING_SEL_ARRAY 411 -#define METHOD_INT 412 -#define METHOD_INT_ARRAY 413 -#define METHOD_STRING 414 -#define METHOD_STRING_ARRAY 415 -#define METHOD_VAR 416 -#define METHOD_VAR_ARRAY 417 -#define METHOD_COORD 418 -#define METHOD_COORD_ARRAY 419 -#define METHOD_REGION 420 -#define METHOD_REGION_ARRAY 421 -#define METHOD_MAPCHAR 422 -#define METHOD_MAPCHAR_ARRAY 423 -#define METHOD_MONST 424 -#define METHOD_MONST_ARRAY 425 -#define METHOD_OBJ 426 -#define METHOD_OBJ_ARRAY 427 -#define METHOD_SEL 428 -#define METHOD_SEL_ARRAY 429 -#define DICE 430 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 73, 73, 74, 57, 57, 56, 56, 76, - 76, 76, 76, 55, 55, 54, 54, 46, 46, 14, - 14, 75, 75, 26, 26, 22, 22, 23, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 60, 60, 60, 61, 61, 85, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 38, 38, 44, 44, 43, 43, 42, 42, 41, - 41, 39, 39, 40, 40, 129, 130, 100, 101, 98, - 45, 45, 31, 31, 31, 131, 133, 93, 134, 134, - 136, 135, 137, 135, 99, 138, 138, 139, 140, 94, - 141, 95, 142, 97, 144, 96, 143, 145, 143, 79, - 110, 110, 110, 83, 83, 65, 146, 147, 113, 148, - 112, 10, 10, 68, 68, 69, 69, 70, 70, 71, - 71, 87, 87, 15, 15, 13, 13, 16, 16, 11, - 11, 103, 103, 103, 1, 1, 2, 2, 105, 150, - 105, 149, 20, 20, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 35, 35, 35, 106, 152, 106, 151, 18, 18, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 120, 88, 104, 104, 121, 121, - 102, 117, 118, 109, 119, 82, 17, 17, 91, 114, - 108, 72, 72, 116, 115, 86, 107, 154, 111, 24, - 24, 80, 81, 81, 81, 92, 89, 90, 90, 3, - 3, 4, 4, 29, 29, 28, 28, 27, 27, 27, - 5, 5, 6, 6, 7, 7, 7, 12, 12, 12, - 8, 8, 9, 155, 155, 155, 132, 77, 77, 77, - 77, 32, 32, 32, 30, 30, 127, 127, 127, 33, - 124, 124, 124, 34, 34, 125, 125, 125, 36, 36, - 36, 36, 126, 126, 126, 37, 37, 37, 37, 123, - 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 50, 50, 157, 158, 158, 128, 128, 64, - 64, 63, 63, 62, 62, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 48, 48, 156, 47, 47, 47, - 153, 153, 153, 153, 51, 51, 52, 52, 53, 53, - 25, 25, 67, 67, 66, -}; -short yylen[] = { 2, - 0, 1, 1, 2, 3, 3, 5, 1, 1, 5, - 5, 3, 16, 0, 2, 0, 2, 0, 2, 1, - 1, 0, 3, 3, 1, 0, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 5, 3, 5, - 5, 5, 3, 3, 5, 5, 5, 7, 7, 7, - 5, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 3, 1, 3, 0, 0, 8, 4, 1, - 0, 1, 1, 5, 3, 0, 0, 9, 0, 2, - 0, 5, 0, 4, 1, 2, 1, 6, 0, 3, - 0, 6, 0, 4, 0, 4, 1, 0, 4, 3, - 1, 3, 3, 5, 5, 7, 4, 0, 10, 0, - 12, 0, 2, 5, 1, 5, 1, 5, 1, 5, - 1, 9, 5, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 7, 5, 1, 1, 1, 1, 3, 0, - 5, 4, 0, 3, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, - 1, 1, 3, 3, 0, 5, 2, 0, 3, 1, - 3, 1, 3, 3, 1, 1, 3, 1, 1, 1, - 3, 1, 1, 1, 5, 7, 5, 8, 1, 3, - 5, 5, 7, 7, 6, 5, 0, 2, 3, 3, - 3, 1, 5, 9, 5, 3, 3, 0, 10, 0, - 1, 7, 5, 5, 3, 5, 7, 9, 1, 1, - 1, 1, 1, 0, 2, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 1, 4, 1, 1, 4, 1, 1, 4, 1, - 4, 5, 1, 3, 1, 3, 1, 1, 4, 9, - 1, 1, 4, 1, 5, 1, 1, 4, 1, 1, - 5, 1, 1, 1, 4, 1, 1, 5, 1, 1, - 3, 1, 1, 3, 1, 4, 3, 3, 3, 3, - 3, 3, 1, 1, 3, 1, 3, 0, 1, 1, - 1, 1, 3, 0, 1, 1, 2, 2, 4, 6, - 4, 6, 6, 6, 6, 2, 6, 8, 8, 10, - 14, 2, 1, 3, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 10, 9, -}; -short yydefred[] = { 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 4, 0, 6, 0, 133, 0, 0, 0, 192, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 130, 0, 0, 0, 136, 145, 0, 0, 0, 0, - 93, 82, 73, 83, 74, 84, 75, 85, 76, 86, - 77, 87, 78, 88, 79, 89, 80, 90, 81, 5, - 0, 92, 91, 0, 30, 0, 29, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 149, - 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 0, 0, 0, 0, 94, - 95, 0, 0, 0, 0, 342, 0, 345, 0, 387, - 0, 343, 0, 153, 0, 27, 0, 9, 8, 7, - 0, 304, 305, 0, 0, 340, 0, 0, 0, 12, - 313, 0, 195, 196, 0, 0, 310, 0, 0, 308, - 0, 337, 339, 0, 336, 334, 0, 333, 228, 224, - 225, 330, 332, 0, 329, 327, 0, 326, 0, 0, - 281, 280, 0, 291, 292, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 383, 250, 0, 366, 0, 318, 0, 317, 0, 0, - 0, 0, 0, 403, 0, 0, 266, 267, 283, 282, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 259, 261, 260, 390, 388, 389, 163, 162, - 0, 184, 185, 0, 0, 0, 0, 96, 0, 0, - 0, 0, 126, 0, 0, 0, 0, 135, 0, 0, - 0, 0, 0, 0, 0, 362, 0, 0, 0, 396, - 398, 395, 397, 399, 400, 0, 0, 0, 0, 0, - 0, 103, 0, 0, 104, 0, 150, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 367, 368, 0, 0, 0, 376, 0, - 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 156, 0, 0, 151, 0, 0, 0, 0, 344, 352, - 0, 0, 0, 0, 349, 350, 351, 129, 0, 154, - 0, 0, 120, 118, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 341, 11, 262, 0, 10, - 0, 0, 314, 0, 0, 0, 198, 197, 0, 173, - 194, 0, 0, 0, 226, 0, 0, 203, 201, 245, - 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 324, 0, 0, 322, 0, 321, 0, 0, 0, 384, - 386, 0, 0, 293, 294, 0, 297, 0, 295, 0, - 296, 251, 0, 0, 0, 252, 0, 175, 0, 0, - 0, 0, 0, 256, 0, 0, 165, 164, 276, 401, - 402, 0, 177, 0, 0, 0, 0, 0, 265, 0, - 0, 147, 0, 0, 137, 274, 0, 0, 0, 356, - 0, 346, 134, 363, 98, 0, 0, 105, 0, 111, - 0, 106, 0, 107, 0, 102, 0, 101, 0, 100, - 28, 306, 0, 0, 316, 309, 0, 311, 0, 0, - 335, 393, 391, 392, 239, 236, 230, 0, 0, 235, - 0, 240, 0, 242, 243, 0, 238, 229, 244, 232, - 394, 0, 328, 0, 0, 0, 369, 0, 0, 0, - 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 319, 0, 0, 0, 0, 0, 0, 167, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 152, 146, 0, 0, 0, 127, 0, 0, - 0, 0, 121, 119, 112, 0, 114, 0, 116, 0, - 0, 0, 312, 193, 338, 0, 0, 0, 0, 0, - 331, 0, 246, 0, 0, 189, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 302, 301, - 272, 0, 0, 253, 0, 179, 0, 0, 254, 258, - 0, 0, 0, 0, 181, 0, 0, 187, 0, 186, - 159, 0, 0, 353, 354, 355, 0, 357, 0, 110, - 0, 109, 0, 108, 0, 0, 0, 234, 237, 241, - 231, 0, 298, 206, 207, 0, 211, 210, 212, 213, - 214, 0, 0, 0, 218, 219, 0, 299, 208, 204, - 0, 0, 248, 0, 372, 0, 377, 0, 373, 0, - 323, 374, 375, 0, 0, 0, 268, 303, 0, 0, - 0, 0, 0, 0, 190, 191, 0, 0, 0, 168, - 0, 0, 0, 0, 0, 0, 128, 113, 115, 117, - 263, 0, 0, 0, 0, 0, 0, 0, 19, 0, - 0, 325, 0, 0, 288, 289, 290, 0, 285, 0, - 0, 0, 174, 0, 0, 278, 166, 176, 0, 0, - 182, 264, 0, 143, 138, 140, 0, 300, 215, 216, - 217, 222, 0, 220, 378, 0, 379, 0, 0, 0, - 271, 269, 0, 0, 0, 170, 0, 169, 141, 0, - 0, 0, 0, 0, 0, 320, 287, 0, 405, 178, - 0, 180, 0, 144, 0, 223, 380, 15, 0, 404, - 171, 142, 0, 0, 0, 0, 20, 21, 0, 0, - 0, 13, 17, 381, -}; -short yydgoto[] = { 3, - 209, 449, 233, 271, 236, 486, 490, 671, 491, 351, - 757, 729, 689, 859, 294, 467, 614, 354, 578, 584, - 730, 80, 337, 822, 512, 133, 788, 789, 747, 345, - 81, 210, 258, 476, 814, 228, 218, 636, 425, 426, - 427, 428, 640, 638, 387, 733, 290, 375, 253, 696, - 329, 330, 331, 861, 835, 190, 4, 82, 83, 84, - 172, 314, 315, 316, 280, 264, 265, 500, 515, 678, - 687, 440, 5, 6, 10, 85, 254, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 277, 318, 478, 229, 219, 259, 529, 408, 697, - 173, 278, 626, 765, 766, 843, 830, 524, 130, 187, - 521, 319, 401, 295, 517, 272, 800, 841, 230, 359, - 220, 355, 580, 790, 196, 182, 530, 531, -}; -short yysindex[] = { 68, - 17, 31, 0, -217, 0, 68, -257, -226, 112, 5680, - 0, 136, 0, -136, 0, 170, 185, 201, 0, 225, - 229, 238, 244, 248, 251, 255, 266, 272, 275, 283, - 304, 309, 346, 366, 378, 380, 382, 383, 396, 397, - 398, 400, 401, 404, 405, 413, 415, -46, 417, 420, - 0, 426, 108, 489, 0, 0, 428, 101, -35, 449, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 432, 0, 0, 430, 0, 5680, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -190, 450, 0, -234, 62, -13, 41, 41, 40, -252, - -121, 109, 109, 1644, -34, 109, 109, 92, -34, -34, - -249, -20, -20, -20, -35, 458, -35, 109, 1644, 1644, - 1644, -160, -249, -174, 0, 1644, -34, 288, -35, 0, - 0, 439, 414, 109, 467, 0, -22, 0, 421, 0, - -9, 0, -14, 0, 163, 0, 385, 0, 0, 0, - -136, 0, 0, 423, 465, 0, 471, 473, 475, 0, - 0, 137, 0, 0, 490, 271, 0, 441, 496, 0, - 503, 0, 0, 276, 0, 0, 452, 0, 0, 0, - 0, 0, 0, 292, 0, 0, 470, 0, 512, 0, - 0, 0, 518, 0, 0, 523, 524, 526, -34, -34, - 109, 109, 540, 109, 542, 544, 545, 1644, 548, 5537, - 0, 0, 533, 0, 331, 0, 500, 0, 555, 558, - 559, 564, 347, 0, 571, 582, 0, 0, 0, 0, - 367, 584, 379, 592, 594, 595, 141, 596, 402, 597, - 588, 611, 0, 0, 0, 0, 0, 0, 0, 0, - 617, 0, 0, 628, 385, 638, 640, 0, 593, -35, - -35, 644, 0, 649, 159, -35, -35, 0, -35, -35, - -35, -35, -35, 651, 650, 0, 141, 465, 5680, 0, - 0, 0, 0, 0, 0, 642, -1, 4, 643, 647, - 653, 0, 141, 465, 0, 5680, 0, 0, -35, -234, - 445, 14, 455, 654, 614, 1644, 678, -35, 38, 476, - 338, 682, -35, 688, 385, 690, -35, 109, 385, 109, - 1644, 424, 431, 0, 0, 694, 696, 1298, 0, 109, - 109, 5435, 0, 360, 704, 1644, 702, -35, -165, -83, - 429, 491, 703, -20, 433, 0, 707, -24, 708, -20, - -20, -20, -35, 709, 10, 109, -91, -19, -121, 0, - 0, 9, 9, 0, 45, 655, -254, 560, 0, 0, - 75, 148, 79, 79, 0, 0, 0, 0, -14, 0, - 1644, 711, 0, 0, 16, 25, 27, 29, 141, 465, - 22, -10, -28, 631, 427, 0, 0, 0, 501, 0, - 715, 137, 0, 719, 505, 459, 0, 0, 503, 0, - 0, 381, 499, 2, 0, 403, 508, 0, 0, 0, - 0, 721, 723, 109, 109, 662, 743, 748, 746, 749, - 0, 750, 5448, 0, 701, 0, 751, 752, 753, 0, - 0, 554, 536, 0, 0, 754, 0, 726, 0, 774, - 0, 0, 775, 579, 785, 0, -165, 0, 581, 796, - 583, 798, 800, 0, 802, 535, 0, 0, 0, 0, - 0, 804, 0, 591, 806, 807, 521, 598, 0, 810, - 385, 0, 811, -35, 0, 0, 465, 801, 815, 0, - 814, 0, 0, 0, 0, 604, -35, 0, -234, 0, - -21, 0, 824, 0, 57, 0, 98, 0, 23, 0, - 0, 0, 825, 621, 0, 0, 827, 0, 493, 839, - 0, 0, 0, 0, 0, 0, 0, 823, 826, 0, - 828, 0, 830, 0, 0, 832, 0, 0, 0, 0, - 0, 841, 0, 848, -121, 641, 0, 857, 590, 1644, - 0, -35, -35, 1644, 859, -35, 1644, 1644, 864, 861, - 0, -249, 648, -148, 652, 135, 586, 0, 867, -5, - 868, 528, 587, 0, -35, 870, -234, 871, 6, 72, - 385, 9, 0, 0, 141, 793, 1, 0, 560, 166, - 141, 465, 0, 0, 0, 32, 0, 33, 0, 35, - -165, 873, 0, 0, 0, -234, -35, -35, -35, 40, - 0, 5526, 0, 876, -35, 0, 880, 174, 686, 881, - -165, 569, 882, 883, -35, 685, 900, 852, 0, 0, - 0, 902, 691, 0, 693, 0, 110, 908, 0, 0, - 928, -184, 465, 716, 0, 717, 900, 0, 929, 0, - 0, 932, 90, 0, 0, 0, 385, 0, 57, 0, - 98, 0, 23, 0, 936, 722, 465, 0, 0, 0, - 0, 56, 0, 0, 0, -234, 0, 0, 0, 0, - 0, 920, 921, 924, 0, 0, 925, 0, 0, 0, - 465, 727, 0, 141, 0, 699, 0, -35, 0, 945, - 0, 0, 0, 481, 943, 59, 0, 0, 744, 957, - 965, 963, 6, -35, 0, 0, 967, 977, 982, 0, - -184, 767, -50, 971, 905, 90, 0, 0, 0, 0, - 0, 987, 724, 465, -35, -35, -35, -261, 0, 991, - 576, 0, -35, 777, 0, 0, 0, 989, 0, 385, - 992, 780, 0, 38, 900, 0, 0, 0, 781, 385, - 0, 0, 983, 0, 0, 0, 784, 0, 0, 0, - 0, 0, 916, 0, 0, 758, 0, 93, 1004, 59, - 0, 0, 788, 1006, 1007, 0, 1010, 0, 0, 5680, - 1009, -261, 1016, 675, 1020, 0, 0, 1025, 0, 0, - 385, 0, 5680, 0, -165, 0, 0, 0, 1023, 0, - 0, 0, 1024, 109, -149, 1026, 0, 0, 876, 109, - 1028, 0, 0, 0, -}; -short yyrindex[] = { 1071, - 0, 0, 0, 5225, 0, 1072, 0, 0, 0, 53, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2985, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3174, 0, 0, - 0, 0, 0, 0, 3331, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5382, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 689, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1947, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1098, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 136, 0, 0, 0, 0, 0, 720, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3677, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1033, 0, 241, 247, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3866, 4023, 0, 951, 0, 0, 0, 0, - 0, 0, 0, 984, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2136, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2293, - 0, 0, 0, 0, 0, 0, 0, 1037, 0, 0, - 0, 0, 374, 531, 0, 0, 0, 0, 0, 0, - 0, 553, 0, 0, 0, 0, 0, 0, 42, 49, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 689, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4212, 0, 0, 1035, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4369, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4558, 0, 0, 0, - 1039, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2482, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 958, 0, 0, 0, 0, 0, - 50, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4715, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2639, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4904, 0, 0, 0, 959, 0, 0, 0, - 0, 0, 961, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1444, 0, 0, 909, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 961, 0, 0, 0, 0, - 0, 0, 0, 1601, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2828, 0, 5061, - 0, 0, 0, 0, 959, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1790, 0, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1043, 0, 0, 4715, 0, - 0, 0, 0, 0, -}; -short yygindex[] = { 0, - 410, 294, 0, 487, -329, -480, 0, 0, 438, 645, - 330, 0, 0, 0, 0, -474, 0, 0, 0, 0, - 0, -86, -287, 0, 0, 901, 0, 273, -629, 657, - 1047, -296, -297, -509, 264, -504, -494, 0, 0, 0, - 0, 0, 0, 0, 0, 242, -384, -137, 849, 0, - 0, 0, 0, 0, 0, 0, 0, 1046, 934, -371, - 0, 0, 0, 684, 710, 0, -48, 0, 0, 0, - 351, 0, 1100, 0, 0, 0, -133, 790, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -58, -130, -355, -375, 679, -84, 0, 0, 0, - 0, -167, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 949, 0, 0, 0, 0, - 975, 0, 0, 0, 792, 680, 504, 0, -}; -#define YYTABLESIZE 6091 -short yytable[] = { 186, - 181, 299, 211, 195, 177, 255, 252, 400, 237, 238, - 507, 518, 260, 261, 266, 499, 608, 177, 206, 273, - 514, 283, 284, 285, 282, 177, 206, 313, 296, 224, - 424, 423, 311, 309, 677, 310, 528, 312, 177, 639, - 302, 206, 637, 327, 59, 686, 519, 520, 518, 279, - 635, 332, 26, 439, 334, 26, 548, 760, 526, 537, - 231, 214, 518, 269, 267, 268, 188, 455, 539, 516, - 541, 459, 543, 755, 7, 699, 701, 550, 703, 224, - 214, 313, 297, 308, 292, 122, 311, 309, 8, 310, - 523, 312, 124, 123, 549, 125, 214, 286, 281, 812, - 335, 287, 288, 274, 275, 276, 9, 366, 367, 857, - 369, 313, 547, 773, 656, 313, 311, 309, 305, 310, - 311, 312, 189, 813, 317, 312, 333, 12, 756, 313, - 192, 263, 232, 406, 311, 270, 834, 224, 293, 312, - 538, 193, 194, 484, 545, 690, 603, 485, 206, 540, - 192, 542, 289, 544, 364, 365, 700, 702, 13, 704, - 705, 193, 194, 858, 669, 826, 122, 532, 14, 14, - 348, 670, 348, 124, 123, 643, 125, 313, 673, 131, - 740, 26, 311, 309, 313, 310, 234, 312, 132, 311, - 309, 235, 310, 770, 312, 313, 769, 430, 169, 410, - 311, 309, 327, 310, 768, 312, 643, 286, 444, 666, - 313, 287, 288, 15, 737, 311, 309, 736, 310, 510, - 312, 511, 176, 461, 458, 505, 460, 134, 471, 487, - 468, 488, 489, 623, 477, 176, 469, 470, 481, 304, - 533, 405, 135, 176, 633, 634, 222, 411, 412, 434, - 413, 414, 415, 416, 417, 653, 422, 528, 136, 562, - 304, 176, 509, 563, 564, 471, 692, 286, 305, 429, - 438, 287, 288, 26, 711, 26, 527, 262, 212, 471, - 435, 360, 137, 535, 360, 328, 138, 361, 498, 446, - 361, 201, 202, 513, 453, 139, 222, 212, 457, 201, - 202, 140, 223, 203, 204, 141, 26, 676, 142, 565, - 566, 567, 143, 212, 201, 202, 201, 202, 685, 483, - 579, 26, 26, 144, 568, 197, 198, 199, 200, 145, - 587, 588, 146, 691, 213, 495, 1, 2, 569, 570, - 147, 502, 503, 504, 785, 786, 787, 571, 572, 573, - 574, 575, 223, 213, 222, 447, 448, 307, 178, 179, - 317, 148, 205, 576, 853, 577, 149, 256, 257, 213, - 192, 178, 179, 347, 225, 474, 475, 205, 803, 178, - 179, 193, 194, 466, 688, 522, 207, 208, 192, 262, - 694, 695, 178, 179, 180, 226, 227, 178, 179, 193, - 194, 207, 208, 150, 201, 202, 215, 180, 632, 767, - 223, 347, 474, 475, 347, 180, 347, 347, 347, 347, - 176, 201, 202, 151, 225, 215, 203, 204, 180, 216, - 217, 180, 763, 180, 764, 152, 320, 153, 321, 154, - 155, 215, 322, 323, 324, 226, 227, 681, 216, 217, - 26, 26, 657, 156, 157, 158, 660, 159, 160, 663, - 664, 161, 162, 313, 347, 625, 347, 205, 311, 309, - 163, 310, 164, 312, 166, 201, 202, 167, 631, 708, - 709, 710, 225, 168, 205, 174, 683, 175, 183, 184, - 185, 207, 208, 191, 325, 313, 347, 279, 347, 300, - 311, 309, 821, 310, 301, 312, 303, 336, 207, 208, - 340, 306, 828, 339, 341, 707, 342, 313, 343, 552, - 344, 731, 311, 309, 26, 783, 26, 312, 347, 346, - 348, 348, 352, 658, 659, 313, 326, 662, 205, 349, - 311, 309, 353, 310, 313, 312, 350, 192, 356, 311, - 309, 558, 310, 851, 312, 358, 178, 179, 193, 194, - 357, 360, 207, 208, 256, 257, 361, 362, 348, 363, - 376, 348, 313, 348, 348, 348, 348, 311, 309, 368, - 310, 370, 312, 371, 372, 774, 796, 374, 377, 342, - 378, 561, 180, 342, 342, 342, 734, 342, 379, 342, - 583, 380, 381, 382, 383, 313, 744, 809, 810, 811, - 311, 309, 313, 310, 384, 312, 817, 311, 309, 816, - 310, 348, 312, 348, 313, 385, 386, 388, 601, 311, - 309, 396, 310, 347, 312, 390, 389, 391, 392, 393, - 395, 347, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 348, 397, 348, 347, 347, 347, 394, - 398, 741, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 399, 347, 347, 347, 347, 347, 347, 347, 781, - 347, 402, 63, 403, 65, 404, 67, 407, 69, 409, - 71, 418, 73, 419, 75, 347, 77, 442, 79, 421, - 431, 437, 347, 347, 432, 347, 443, 347, 347, 347, - 433, 441, 347, 347, 347, 347, 347, 347, 347, 307, - 856, 445, 313, 451, 818, 452, 863, 311, 309, 738, - 310, 454, 312, 456, 450, 462, 347, 464, 347, 465, - 347, 479, 463, 844, 480, 482, 494, 525, 493, 492, - 497, 501, 506, 496, 536, 551, 852, 553, 554, 556, - 347, 347, 557, 307, 585, 560, 586, 347, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 347, 347, 589, 590, 582, 591, 592, - 348, 596, 593, 594, 597, 598, 599, 602, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, - 307, 600, 307, 348, 348, 348, 603, 604, 605, 348, - 348, 348, 348, 348, 348, 348, 348, 348, 607, 348, - 348, 348, 348, 348, 348, 348, 606, 348, 609, 610, - 611, 612, 307, 613, 307, 615, 616, 617, 618, 619, - 620, 621, 348, 622, 595, 628, 624, 629, 627, 348, - 348, 630, 348, 255, 348, 348, 348, 643, 641, 348, - 348, 348, 348, 348, 348, 348, 170, 642, 644, 645, - 646, 651, 62, 647, 64, 648, 66, 649, 68, 650, - 70, 652, 72, 348, 74, 348, 76, 348, 78, 654, - 655, 466, 661, 665, 666, 668, 674, 680, 370, 672, - 675, 673, 679, 682, 684, 693, 706, 348, 348, 732, - 735, 739, 742, 743, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 745, 746, 748, 749, 370, 61, 750, 370, - 751, 753, 370, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 754, 761, 758, 759, 762, 771, 775, 776, 307, - 772, 777, 778, 779, 780, 782, 784, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 307, 307, 370, - 792, 791, 307, 307, 307, 793, 794, 797, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 798, 307, 307, - 307, 307, 307, 307, 307, 799, 307, 802, 804, 805, - 807, 815, 820, 370, 819, 823, 808, 824, 827, 832, - 829, 307, 831, 833, 836, 838, 839, 840, 307, 307, - 842, 307, 845, 307, 307, 307, 847, 848, 307, 307, - 849, 307, 307, 307, 307, 850, 854, 855, 864, 860, - 1, 3, 364, 365, 172, 26, 315, 358, 188, 359, - 148, 284, 307, 16, 307, 139, 752, 825, 667, 728, - 801, 338, 837, 559, 165, 846, 373, 385, 555, 171, - 862, 298, 534, 795, 508, 11, 307, 307, 420, 546, - 806, 291, 221, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 436, 698, 581, 0, 0, 0, 0, 385, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 0, 0, 0, 0, 370, 370, 370, 370, - 370, 370, 370, 370, 370, 370, 370, 370, 385, 0, - 0, 370, 370, 370, 0, 0, 0, 370, 370, 370, - 370, 370, 370, 370, 370, 370, 0, 370, 370, 370, - 370, 370, 370, 370, 0, 370, 0, 0, 0, 0, - 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, - 370, 0, 0, 0, 0, 0, 0, 370, 370, 0, - 370, 0, 370, 370, 370, 0, 0, 370, 370, 0, - 370, 370, 370, 370, 233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 370, 0, 370, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 370, 370, 0, 233, 0, - 0, 0, 370, 370, 370, 370, 370, 370, 370, 370, - 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, - 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 0, 385, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 233, 0, 233, - 385, 385, 385, 0, 0, 0, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 0, 385, 385, 385, 385, - 385, 385, 385, 0, 385, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 385, 385, 0, 385, - 0, 385, 385, 385, 0, 0, 385, 385, 0, 385, - 385, 385, 385, 205, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 385, 0, 385, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 385, 385, 0, 205, 0, 0, - 0, 385, 385, 385, 385, 385, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 385, 385, 0, - 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, - 0, 0, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 205, 0, 0, 233, 233, 233, - 0, 0, 0, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 0, 233, 233, 233, 233, 233, 233, 233, - 0, 233, 0, 0, 0, 0, 205, 0, 205, 0, - 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, - 0, 0, 0, 233, 233, 0, 233, 0, 233, 233, - 233, 0, 0, 233, 233, 0, 233, 233, 233, 233, - 209, 0, 0, 0, 0, 0, 0, 0, 0, 466, - 201, 202, 0, 0, 0, 0, 0, 233, 0, 233, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 233, 233, 0, 209, 0, 0, 0, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 239, 240, 241, 242, - 243, 0, 244, 205, 245, 246, 247, 248, 249, 0, - 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, - 0, 209, 0, 0, 0, 0, 0, 207, 208, 0, - 0, 0, 0, 205, 0, 0, 0, 251, 0, 0, - 0, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 209, 0, 209, 205, 205, 205, 0, - 0, 0, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 0, 205, 205, 205, 205, 205, 205, 205, 0, - 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 205, 0, 0, 0, 0, - 0, 0, 205, 205, 0, 205, 0, 205, 205, 205, - 0, 0, 205, 205, 0, 205, 205, 205, 205, 221, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 205, 0, 205, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 205, 205, 0, 221, 0, 0, 0, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 0, 0, 0, 0, 0, - 209, 0, 0, 0, 0, 0, 0, 0, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 221, 0, 0, 209, 209, 209, 0, 0, 0, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 0, 209, - 209, 209, 209, 209, 209, 209, 0, 209, 0, 0, - 0, 0, 221, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 209, 0, 0, 0, 0, 0, 0, 209, - 209, 0, 209, 0, 209, 209, 209, 0, 0, 209, - 209, 0, 209, 209, 209, 209, 199, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 201, 202, 0, 0, - 0, 0, 0, 209, 0, 209, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 209, 209, 0, - 0, 0, 0, 0, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 239, 240, 241, 242, 243, 0, 244, 205, - 245, 246, 247, 248, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 199, 0, 0, - 0, 0, 0, 207, 208, 0, 0, 0, 0, 221, - 0, 0, 0, 251, 0, 0, 0, 221, 221, 221, - 221, 221, 221, 221, 221, 221, 221, 221, 221, 200, - 0, 199, 221, 221, 221, 0, 0, 0, 221, 221, - 221, 221, 221, 221, 221, 221, 221, 0, 221, 221, - 221, 221, 221, 221, 221, 0, 221, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 221, 0, 0, 0, 0, 0, 0, 221, 221, - 0, 221, 0, 221, 221, 221, 0, 0, 221, 221, - 0, 221, 221, 221, 221, 227, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 221, 221, 0, 0, - 0, 0, 0, 221, 221, 221, 221, 221, 221, 221, - 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, - 221, 0, 0, 0, 0, 0, 199, 0, 0, 0, - 0, 0, 0, 0, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 227, 0, 0, 199, - 199, 199, 0, 0, 0, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 0, 199, 199, 199, 199, 199, - 199, 199, 0, 199, 0, 0, 0, 0, 227, 0, - 227, 0, 0, 0, 0, 0, 0, 0, 199, 0, - 0, 0, 0, 0, 0, 199, 199, 0, 199, 0, - 199, 199, 199, 0, 0, 199, 199, 0, 199, 199, - 199, 199, 157, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, - 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 199, 199, 0, 0, 0, 0, 0, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 227, 0, 0, 0, 0, - 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 0, 0, 157, 227, 227, - 227, 0, 0, 0, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 0, 227, 227, 227, 227, 227, 227, - 227, 0, 227, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 227, 0, 0, - 0, 0, 0, 0, 227, 227, 0, 227, 0, 227, - 227, 227, 0, 0, 227, 227, 0, 227, 227, 227, - 227, 202, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 227, 0, - 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 227, 227, 0, 0, 0, 0, 0, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 0, 0, 0, - 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 202, 0, 0, 157, 157, 157, 0, 0, - 0, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 0, 157, 157, 157, 157, 157, 157, 157, 0, 157, - 0, 0, 0, 0, 202, 0, 202, 0, 0, 0, - 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, - 0, 157, 157, 158, 157, 0, 157, 157, 157, 0, - 0, 157, 157, 0, 157, 157, 157, 157, 284, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 157, 0, 157, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, - 157, 0, 0, 0, 0, 0, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 202, 0, 0, 0, 0, 0, 0, 0, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 284, 0, 284, 202, 202, 202, 0, 0, 0, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 0, - 202, 202, 202, 202, 202, 202, 202, 0, 202, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, - 202, 202, 0, 202, 0, 202, 202, 202, 0, 0, - 202, 202, 0, 202, 202, 202, 202, 286, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 202, 0, 202, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 202, 202, - 0, 0, 0, 0, 0, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 0, 0, 0, 0, 0, 284, 0, - 0, 0, 0, 0, 0, 0, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, 286, 0, - 0, 284, 284, 284, 0, 0, 0, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 0, 284, 284, 284, - 284, 284, 284, 284, 0, 284, 0, 0, 0, 0, - 286, 0, 286, 0, 0, 0, 0, 0, 0, 0, - 284, 0, 0, 0, 0, 0, 0, 284, 284, 0, - 284, 0, 284, 284, 284, 0, 0, 284, 284, 0, - 284, 284, 284, 284, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 0, 284, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 284, 0, 0, 0, - 0, 0, 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, - 0, 0, 0, 0, 0, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 0, 0, 249, - 286, 286, 286, 0, 0, 0, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 0, 286, 286, 286, 286, - 286, 286, 286, 0, 286, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, - 0, 0, 0, 0, 0, 0, 286, 286, 0, 286, - 0, 286, 286, 286, 0, 0, 286, 286, 0, 286, - 286, 286, 286, 279, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 286, 0, 286, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 286, 286, 0, 0, 0, 0, - 0, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 0, - 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, - 0, 0, 249, 249, 249, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 279, 0, 0, 249, 249, 249, - 0, 0, 0, 249, 249, 249, 249, 249, 249, 249, - 249, 249, 0, 249, 249, 249, 249, 249, 249, 249, - 0, 249, 0, 0, 0, 0, 0, 0, 279, 0, - 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, - 0, 0, 0, 249, 249, 0, 249, 0, 249, 249, - 249, 0, 0, 249, 249, 0, 249, 249, 249, 249, - 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 249, 0, 249, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 249, 249, 0, 0, 0, 0, 0, 249, 249, - 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 249, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, - 0, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 0, 0, 161, 279, 279, 279, 0, - 0, 0, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 0, 279, 279, 279, 279, 279, 279, 279, 0, - 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, - 0, 0, 279, 279, 0, 279, 0, 279, 279, 279, - 0, 0, 279, 279, 0, 279, 279, 279, 279, 160, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 279, 0, 279, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 279, 279, 0, 0, 0, 0, 0, 279, 279, 279, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 0, 0, 0, 0, 0, - 161, 0, 0, 0, 0, 0, 0, 0, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 160, 0, 0, 161, 161, 161, 0, 0, 0, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 0, 161, - 161, 161, 161, 161, 161, 161, 0, 161, 0, 0, - 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, - 0, 0, 161, 0, 0, 0, 0, 0, 0, 161, - 161, 0, 161, 0, 161, 161, 161, 0, 0, 161, - 161, 0, 161, 161, 161, 161, 275, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 161, 0, 161, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 161, 161, 0, - 0, 0, 0, 0, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, - 0, 0, 0, 0, 0, 0, 0, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 0, - 0, 275, 160, 160, 160, 0, 0, 0, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 0, 160, 160, - 160, 160, 160, 160, 160, 0, 160, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 160, 0, 0, 0, 0, 0, 0, 160, 160, - 0, 160, 0, 160, 160, 160, 0, 0, 160, 160, - 0, 160, 160, 160, 160, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 160, 0, 160, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 160, 160, 0, 0, - 0, 0, 0, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 97, 0, 0, 275, - 275, 275, 0, 0, 0, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 0, 275, 275, 275, 275, 275, - 275, 275, 0, 275, 0, 0, 0, 0, 0, 0, - 97, 0, 0, 0, 0, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 275, 275, 0, 275, 0, - 275, 275, 275, 0, 0, 275, 275, 0, 275, 275, - 275, 275, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, - 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 275, 275, 0, 0, 0, 0, 0, - 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, - 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 0, 0, 99, 97, 97, - 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, - 97, 0, 97, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, - 0, 0, 0, 0, 97, 97, 0, 97, 0, 97, - 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, - 97, 247, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, - 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 97, 0, 0, 0, 0, 0, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 247, 0, 0, 99, 99, 99, 0, 0, - 0, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 0, 99, 99, 99, 99, 99, 99, 99, 0, 99, - 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, - 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, - 0, 99, 99, 0, 99, 0, 99, 99, 99, 0, - 0, 99, 99, 0, 99, 99, 99, 99, 257, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 0, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 99, 0, 0, 0, 0, 0, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, - 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 247, 0, 0, 257, 247, 247, 247, 0, 0, 0, - 247, 247, 247, 247, 247, 247, 247, 247, 247, 0, - 247, 247, 247, 247, 247, 247, 247, 0, 247, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, - 247, 247, 0, 247, 0, 247, 247, 247, 0, 0, - 247, 247, 0, 247, 247, 247, 247, 273, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 247, 0, 247, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 247, 247, - 0, 0, 0, 0, 0, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 247, 247, 247, 0, 0, 0, 0, 0, 257, 0, - 0, 0, 0, 0, 0, 0, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 273, 0, - 0, 257, 257, 257, 0, 0, 0, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 0, 257, 257, 257, - 257, 257, 257, 257, 0, 257, 0, 0, 0, 0, - 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, - 257, 0, 0, 0, 0, 0, 0, 257, 257, 0, - 257, 0, 257, 257, 257, 0, 0, 257, 257, 0, - 257, 257, 257, 257, 18, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 257, 0, 257, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 257, 257, 0, 0, 0, - 0, 0, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 0, 0, 0, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 0, 0, 18, - 273, 273, 273, 0, 0, 0, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 0, 273, 273, 273, 273, - 273, 273, 273, 0, 273, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 0, 0, 273, 273, 0, 273, - 0, 273, 273, 273, 0, 0, 273, 273, 0, 273, - 273, 273, 273, 277, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 273, 0, 273, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 273, 273, 0, 0, 0, 0, - 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, - 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 277, 0, 0, 18, 18, 18, - 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, - 0, 18, 0, 0, 0, 0, 0, 0, 277, 0, - 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 0, 18, 18, 0, 18, 0, 18, 18, - 18, 0, 0, 18, 18, 0, 18, 18, 18, 18, - 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 18, 0, 0, 0, 0, 0, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, - 0, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 0, 0, 270, 277, 277, 277, 0, - 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 0, 277, 277, 277, 277, 277, 277, 277, 0, - 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 277, 0, 0, 0, 0, - 0, 0, 277, 277, 0, 277, 0, 277, 277, 277, - 0, 0, 277, 277, 0, 277, 277, 277, 277, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 277, 0, 277, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 277, 277, 0, 0, 0, 0, 0, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 22, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 0, 0, 0, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 0, 0, 0, 270, 270, 270, 0, 0, 0, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 0, 270, - 270, 270, 270, 270, 270, 270, 0, 270, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 270, 0, 0, 0, 0, 0, 0, 270, - 270, 0, 270, 0, 270, 270, 270, 0, 0, 270, - 270, 0, 270, 270, 270, 270, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 270, 0, 270, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 270, 270, 0, - 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 25, 0, 473, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 0, 0, 250, 0, 0, - 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 0, 0, 0, 22, 22, 22, - 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, - 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, - 0, 0, 0, 22, 22, 0, 22, 0, 22, 22, - 22, 0, 0, 22, 22, 0, 22, 0, 22, 0, - 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, 0, 22, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 22, 0, 0, 0, 0, 0, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, - 0, 25, 0, 0, 0, 0, 0, 0, 0, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 0, 0, 0, 25, 25, 25, 0, 0, 0, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, - 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 0, - 0, 0, 0, 25, 595, 347, 0, 0, 0, 0, - 25, 25, 0, 25, 0, 25, 25, 25, 0, 0, - 25, 25, 0, 25, 0, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 25, 201, 202, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 201, 202, 0, 0, 0, 0, 0, 0, 25, 25, - 59, 0, 0, 0, 0, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 347, 0, 0, 0, 0, 0, - 0, 0, 0, 239, 240, 241, 242, 243, 0, 244, - 205, 245, 246, 247, 248, 249, 239, 240, 241, 242, - 243, 0, 244, 205, 245, 246, 247, 248, 249, 0, - 0, 0, 0, 0, 207, 208, 0, 0, 474, 475, - 712, 713, 0, 0, 251, 0, 0, 207, 208, 201, - 202, 714, 715, 716, 0, 0, 0, 251, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 717, 0, 718, 719, 720, 721, - 722, 723, 724, 725, 726, 727, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 239, 240, 241, 242, 243, - 192, 244, 205, 245, 246, 247, 248, 249, 0, 0, - 0, 193, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 207, 208, 0, 15, - 0, 0, 0, 0, 0, 0, 251, 16, 0, 0, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, - 0, 0, 26, 27, 28, 0, 0, 0, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 0, 38, 39, - 40, 41, 42, 43, 44, 0, 45, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 46, 0, 0, 0, 0, 0, 0, 47, 48, - 0, 49, 0, 50, 51, 52, 0, 0, 53, 54, - 0, 55, 0, 56, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 57, 0, 58, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, - 0, 0, 0, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, -}; -short yycheck[] = { 86, - 59, 169, 136, 134, 40, 40, 144, 295, 142, 143, - 395, 40, 146, 147, 148, 40, 497, 40, 40, 40, - 40, 159, 160, 161, 158, 40, 40, 37, 166, 40, - 328, 328, 42, 43, 40, 45, 408, 47, 40, 549, - 174, 40, 547, 40, 91, 40, 402, 403, 40, 40, - 545, 185, 0, 40, 185, 125, 432, 687, 313, 44, - 313, 40, 40, 313, 149, 150, 257, 355, 44, 399, - 44, 359, 44, 258, 58, 44, 44, 433, 44, 40, - 40, 37, 167, 93, 259, 44, 42, 43, 58, 45, - 46, 47, 44, 44, 123, 44, 40, 258, 157, 361, - 185, 262, 263, 152, 153, 154, 324, 241, 242, 259, - 244, 37, 123, 58, 589, 37, 42, 43, 177, 45, - 42, 47, 313, 385, 183, 47, 185, 385, 313, 37, - 385, 40, 385, 301, 42, 385, 44, 40, 313, 47, - 125, 396, 397, 309, 123, 620, 91, 313, 40, 125, - 385, 125, 313, 125, 239, 240, 125, 125, 385, 125, - 641, 396, 397, 313, 313, 795, 125, 93, 41, 58, - 43, 320, 45, 125, 125, 41, 125, 37, 44, 44, - 661, 0, 42, 43, 37, 45, 308, 47, 325, 42, - 43, 313, 45, 703, 47, 37, 701, 328, 91, 41, - 42, 43, 40, 45, 699, 47, 41, 258, 346, 44, - 37, 262, 263, 260, 41, 42, 43, 44, 45, 311, - 47, 313, 258, 361, 358, 393, 360, 58, 257, 313, - 368, 315, 316, 521, 372, 258, 370, 371, 376, 262, - 93, 300, 58, 258, 541, 543, 257, 306, 307, 336, - 309, 310, 311, 312, 313, 585, 258, 629, 58, 258, - 262, 258, 396, 262, 263, 257, 622, 258, 327, 328, - 257, 262, 263, 343, 650, 345, 407, 298, 257, 257, - 339, 41, 58, 421, 44, 123, 58, 41, 313, 348, - 44, 313, 314, 313, 353, 58, 257, 257, 357, 313, - 314, 58, 313, 317, 318, 58, 125, 313, 58, 308, - 309, 310, 58, 257, 313, 314, 313, 314, 313, 378, - 454, 269, 270, 58, 323, 264, 265, 266, 267, 58, - 464, 465, 58, 621, 313, 384, 269, 270, 337, 338, - 58, 390, 391, 392, 286, 287, 288, 346, 347, 348, - 349, 350, 313, 313, 257, 318, 319, 367, 394, 395, - 419, 58, 376, 362, 845, 364, 58, 402, 403, 313, - 385, 394, 395, 0, 385, 404, 405, 376, 763, 394, - 395, 396, 397, 312, 313, 341, 400, 401, 385, 298, - 390, 391, 394, 395, 430, 406, 407, 394, 395, 396, - 397, 400, 401, 58, 313, 314, 385, 430, 539, 697, - 313, 38, 404, 405, 41, 430, 43, 44, 45, 46, - 258, 313, 314, 58, 385, 385, 317, 318, 430, 408, - 409, 430, 343, 430, 345, 58, 274, 58, 276, 58, - 58, 385, 280, 281, 282, 406, 407, 615, 408, 409, - 269, 270, 590, 58, 58, 58, 594, 58, 58, 597, - 598, 58, 58, 37, 91, 524, 93, 376, 42, 43, - 58, 45, 58, 47, 58, 313, 314, 58, 537, 647, - 648, 649, 385, 58, 376, 58, 617, 387, 40, 58, - 61, 400, 401, 44, 332, 37, 123, 40, 125, 61, - 42, 43, 790, 45, 91, 47, 40, 123, 400, 401, - 46, 91, 800, 91, 44, 646, 44, 37, 44, 93, - 384, 652, 42, 43, 343, 45, 345, 47, 258, 40, - 0, 91, 257, 592, 593, 37, 374, 596, 376, 44, - 42, 43, 91, 45, 37, 47, 44, 385, 257, 42, - 43, 93, 45, 841, 47, 44, 394, 395, 396, 397, - 91, 44, 400, 401, 402, 403, 44, 44, 38, 44, - 38, 41, 37, 43, 44, 45, 46, 42, 43, 40, - 45, 40, 47, 40, 40, 716, 754, 40, 258, 37, - 91, 93, 430, 41, 42, 43, 655, 45, 44, 47, - 93, 44, 44, 40, 258, 37, 665, 775, 776, 777, - 42, 43, 37, 45, 44, 47, 41, 42, 43, 44, - 45, 91, 47, 93, 37, 44, 260, 44, 93, 42, - 43, 44, 45, 260, 47, 44, 258, 44, 44, 44, - 44, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 123, 44, 125, 283, 284, 285, 258, - 44, 93, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 44, 299, 300, 301, 302, 303, 304, 305, 738, - 307, 44, 395, 44, 397, 93, 399, 44, 401, 41, - 403, 41, 405, 44, 407, 322, 409, 44, 411, 58, - 58, 257, 329, 330, 58, 332, 93, 334, 335, 336, - 58, 257, 339, 340, 341, 342, 343, 344, 345, 0, - 854, 44, 37, 386, 783, 44, 860, 42, 43, 44, - 45, 44, 47, 44, 259, 312, 363, 44, 365, 44, - 367, 382, 312, 830, 41, 44, 44, 93, 258, 321, - 44, 44, 44, 321, 44, 125, 843, 257, 44, 41, - 387, 388, 258, 44, 44, 385, 44, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 124, 44, 385, 41, 44, - 260, 91, 44, 44, 44, 44, 44, 44, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 91, 258, 93, 283, 284, 285, 91, 44, 44, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 44, 299, - 300, 301, 302, 303, 304, 305, 258, 307, 258, 44, - 258, 44, 123, 44, 125, 44, 312, 44, 258, 44, - 44, 331, 322, 44, 257, 41, 46, 44, 58, 329, - 330, 258, 332, 40, 334, 335, 336, 41, 44, 339, - 340, 341, 342, 343, 344, 345, 388, 257, 386, 41, - 58, 41, 394, 58, 396, 58, 398, 58, 400, 58, - 402, 44, 404, 363, 406, 365, 408, 367, 410, 259, - 44, 312, 44, 40, 44, 258, 321, 321, 0, 258, - 44, 44, 385, 44, 44, 123, 44, 387, 388, 44, - 41, 41, 41, 41, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 258, 44, 93, 44, 38, 388, 258, 41, - 258, 44, 44, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 44, 44, 258, 258, 44, 41, 58, 58, 260, - 259, 58, 58, 257, 286, 41, 44, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 91, - 44, 258, 283, 284, 285, 41, 44, 41, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 41, 299, 300, - 301, 302, 303, 304, 305, 44, 307, 261, 58, 125, - 44, 41, 44, 125, 258, 44, 313, 258, 258, 124, - 58, 322, 259, 286, 41, 258, 41, 41, 329, 330, - 41, 332, 44, 334, 335, 336, 41, 383, 339, 340, - 41, 342, 343, 344, 345, 41, 44, 44, 41, 44, - 0, 0, 41, 41, 386, 125, 93, 41, 44, 41, - 123, 123, 363, 41, 365, 125, 677, 794, 602, 652, - 761, 191, 820, 449, 48, 832, 248, 0, 442, 54, - 859, 168, 419, 753, 395, 6, 387, 388, 319, 431, - 766, 163, 138, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 340, 629, 454, -1, -1, -1, -1, 41, -1, - -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 260, -1, - -1, -1, -1, -1, -1, -1, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 91, -1, - -1, 283, 284, 285, -1, -1, -1, 289, 290, 291, - 292, 293, 294, 295, 296, 297, -1, 299, 300, 301, - 302, 303, 304, 305, -1, 307, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - 322, -1, -1, -1, -1, -1, -1, 329, 330, -1, - 332, -1, 334, 335, 336, -1, -1, 339, 340, -1, - 342, 343, 344, 345, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 363, -1, 365, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 387, 388, -1, 44, -1, - -1, -1, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, - -1, -1, -1, -1, -1, 91, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, - -1, -1, -1, -1, -1, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 123, -1, 125, - 283, 284, 285, -1, -1, -1, 289, 290, 291, 292, - 293, 294, 295, 296, 297, -1, 299, 300, 301, 302, - 303, 304, 305, -1, 307, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 322, - -1, -1, -1, -1, -1, -1, 329, 330, -1, 332, - -1, 334, 335, 336, -1, -1, 339, 340, -1, 342, - 343, 344, 345, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 363, -1, 365, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 387, 388, -1, 44, -1, -1, - -1, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, - -1, -1, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 91, -1, -1, 283, 284, 285, - -1, -1, -1, 289, 290, 291, 292, 293, 294, 295, - 296, 297, -1, 299, 300, 301, 302, 303, 304, 305, - -1, 307, -1, -1, -1, -1, 123, -1, 125, -1, - -1, -1, -1, -1, -1, -1, 322, -1, -1, -1, - -1, -1, -1, 329, 330, -1, 332, -1, 334, 335, - 336, -1, -1, 339, 340, -1, 342, 343, 344, 345, - 0, -1, -1, -1, -1, -1, -1, -1, -1, 312, - 313, 314, -1, -1, -1, -1, -1, 363, -1, 365, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 387, 388, -1, 44, -1, -1, -1, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 369, 370, 371, 372, - 373, -1, 375, 376, 377, 378, 379, 380, 381, -1, - -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, - -1, 91, -1, -1, -1, -1, -1, 400, 401, -1, - -1, -1, -1, 260, -1, -1, -1, 410, -1, -1, - -1, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 123, -1, 125, 283, 284, 285, -1, - -1, -1, 289, 290, 291, 292, 293, 294, 295, 296, - 297, -1, 299, 300, 301, 302, 303, 304, 305, -1, - 307, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 322, -1, -1, -1, -1, - -1, -1, 329, 330, -1, 332, -1, 334, 335, 336, - -1, -1, 339, 340, -1, 342, 343, 344, 345, 0, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 363, -1, 365, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 387, 388, -1, 44, -1, -1, -1, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, -1, -1, -1, - 260, -1, -1, -1, -1, -1, -1, -1, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 91, -1, -1, 283, 284, 285, -1, -1, -1, 289, - 290, 291, 292, 293, 294, 295, 296, 297, -1, 299, - 300, 301, 302, 303, 304, 305, -1, 307, -1, -1, - -1, -1, 123, -1, 125, -1, -1, -1, -1, -1, - -1, -1, 322, -1, -1, -1, -1, -1, -1, 329, - 330, -1, 332, -1, 334, 335, 336, -1, -1, 339, - 340, -1, 342, 343, 344, 345, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 313, 314, -1, -1, - -1, -1, -1, 363, -1, 365, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 387, 388, -1, - -1, -1, -1, -1, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 369, 370, 371, 372, 373, -1, 375, 376, - 377, 378, 379, 380, 381, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, - -1, -1, -1, 400, 401, -1, -1, -1, -1, 260, - -1, -1, -1, 410, -1, -1, -1, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 123, - -1, 125, 283, 284, 285, -1, -1, -1, 289, 290, - 291, 292, 293, 294, 295, 296, 297, -1, 299, 300, - 301, 302, 303, 304, 305, -1, 307, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 322, -1, -1, -1, -1, -1, -1, 329, 330, - -1, 332, -1, 334, 335, 336, -1, -1, 339, 340, - -1, 342, 343, 344, 345, 0, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 363, -1, 365, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 387, 388, -1, -1, - -1, -1, -1, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, -1, -1, -1, 260, -1, -1, -1, - -1, -1, -1, -1, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 91, -1, -1, 283, - 284, 285, -1, -1, -1, 289, 290, 291, 292, 293, - 294, 295, 296, 297, -1, 299, 300, 301, 302, 303, - 304, 305, -1, 307, -1, -1, -1, -1, 123, -1, - 125, -1, -1, -1, -1, -1, -1, -1, 322, -1, - -1, -1, -1, -1, -1, 329, 330, -1, 332, -1, - 334, 335, 336, -1, -1, 339, 340, -1, 342, 343, - 344, 345, 0, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 363, - -1, 365, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 387, 388, -1, -1, -1, -1, -1, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - -1, -1, -1, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, -1, -1, 125, 283, 284, - 285, -1, -1, -1, 289, 290, 291, 292, 293, 294, - 295, 296, 297, -1, 299, 300, 301, 302, 303, 304, - 305, -1, 307, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 322, -1, -1, - -1, -1, -1, -1, 329, 330, -1, 332, -1, 334, - 335, 336, -1, -1, 339, 340, -1, 342, 343, 344, - 345, 0, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 363, -1, - 365, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 387, 388, -1, -1, -1, -1, -1, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, -1, - -1, -1, 260, -1, -1, -1, -1, -1, -1, -1, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 91, -1, -1, 283, 284, 285, -1, -1, - -1, 289, 290, 291, 292, 293, 294, 295, 296, 297, - -1, 299, 300, 301, 302, 303, 304, 305, -1, 307, - -1, -1, -1, -1, 123, -1, 125, -1, -1, -1, - -1, -1, -1, -1, 322, -1, -1, -1, -1, -1, - -1, 329, 330, 331, 332, -1, 334, 335, 336, -1, - -1, 339, 340, -1, 342, 343, 344, 345, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 363, -1, 365, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 387, - 388, -1, -1, -1, -1, -1, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 260, -1, -1, -1, -1, -1, -1, -1, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 123, -1, 125, 283, 284, 285, -1, -1, -1, - 289, 290, 291, 292, 293, 294, 295, 296, 297, -1, - 299, 300, 301, 302, 303, 304, 305, -1, 307, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 322, -1, -1, -1, -1, -1, -1, - 329, 330, -1, 332, -1, 334, 335, 336, -1, -1, - 339, 340, -1, 342, 343, 344, 345, 0, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 363, -1, 365, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 387, 388, - -1, -1, -1, -1, -1, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, -1, -1, -1, 260, -1, - -1, -1, -1, -1, -1, -1, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 91, -1, - -1, 283, 284, 285, -1, -1, -1, 289, 290, 291, - 292, 293, 294, 295, 296, 297, -1, 299, 300, 301, - 302, 303, 304, 305, -1, 307, -1, -1, -1, -1, - 123, -1, 125, -1, -1, -1, -1, -1, -1, -1, - 322, -1, -1, -1, -1, -1, -1, 329, 330, -1, - 332, -1, 334, 335, 336, -1, -1, 339, 340, -1, - 342, 343, 344, 345, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 363, -1, 365, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 387, 388, -1, -1, -1, - -1, -1, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 91, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, - -1, -1, -1, -1, -1, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, -1, 125, - 283, 284, 285, -1, -1, -1, 289, 290, 291, 292, - 293, 294, 295, 296, 297, -1, 299, 300, 301, 302, - 303, 304, 305, -1, 307, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 322, - -1, -1, -1, -1, -1, -1, 329, 330, -1, 332, - -1, 334, 335, 336, -1, -1, 339, 340, -1, 342, - 343, 344, 345, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 363, -1, 365, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 387, 388, -1, -1, -1, -1, - -1, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, - -1, -1, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 91, -1, -1, 283, 284, 285, - -1, -1, -1, 289, 290, 291, 292, 293, 294, 295, - 296, 297, -1, 299, 300, 301, 302, 303, 304, 305, - -1, 307, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, 322, -1, -1, -1, - -1, -1, -1, 329, 330, -1, 332, -1, 334, 335, - 336, -1, -1, 339, 340, -1, 342, 343, 344, 345, - 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 363, -1, 365, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 387, 388, -1, -1, -1, -1, -1, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 91, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 260, -1, -1, -1, -1, -1, -1, - -1, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, -1, -1, 125, 283, 284, 285, -1, - -1, -1, 289, 290, 291, 292, 293, 294, 295, 296, - 297, -1, 299, 300, 301, 302, 303, 304, 305, -1, - 307, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 322, -1, -1, -1, -1, - -1, -1, 329, 330, -1, 332, -1, 334, 335, 336, - -1, -1, 339, 340, -1, 342, 343, 344, 345, 0, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 363, -1, 365, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 387, 388, -1, -1, -1, -1, -1, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, -1, -1, -1, - 260, -1, -1, -1, -1, -1, -1, -1, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 91, -1, -1, 283, 284, 285, -1, -1, -1, 289, - 290, 291, 292, 293, 294, 295, 296, 297, -1, 299, - 300, 301, 302, 303, 304, 305, -1, 307, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, 322, -1, -1, -1, -1, -1, -1, 329, - 330, -1, 332, -1, 334, 335, 336, -1, -1, 339, - 340, -1, 342, 343, 344, 345, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 363, -1, 365, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 387, 388, -1, - -1, -1, -1, -1, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 260, - -1, -1, -1, -1, -1, -1, -1, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, -1, - -1, 125, 283, 284, 285, -1, -1, -1, 289, 290, - 291, 292, 293, 294, 295, 296, 297, -1, 299, 300, - 301, 302, 303, 304, 305, -1, 307, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 322, -1, -1, -1, -1, -1, -1, 329, 330, - -1, 332, -1, 334, 335, 336, -1, -1, 339, 340, - -1, 342, 343, 344, 345, 0, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 363, -1, 365, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 387, 388, -1, -1, - -1, -1, -1, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, -1, -1, -1, 260, -1, -1, -1, - -1, -1, -1, -1, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 91, -1, -1, 283, - 284, 285, -1, -1, -1, 289, 290, 291, 292, 293, - 294, 295, 296, 297, -1, 299, 300, 301, 302, 303, - 304, 305, -1, 307, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, 322, -1, - -1, -1, -1, -1, -1, 329, 330, -1, 332, -1, - 334, 335, 336, -1, -1, 339, 340, -1, 342, 343, - 344, 345, 0, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 363, - -1, 365, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 387, 388, -1, -1, -1, -1, -1, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - -1, -1, -1, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, -1, -1, 125, 283, 284, - 285, -1, -1, -1, 289, 290, 291, 292, 293, 294, - 295, 296, 297, -1, 299, 300, 301, 302, 303, 304, - 305, -1, 307, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 322, -1, -1, - -1, -1, -1, -1, 329, 330, -1, 332, -1, 334, - 335, 336, -1, -1, 339, 340, -1, 342, 343, 344, - 345, 0, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 363, -1, - 365, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 387, 388, -1, -1, -1, -1, -1, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, -1, - -1, -1, 260, -1, -1, -1, -1, -1, -1, -1, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 91, -1, -1, 283, 284, 285, -1, -1, - -1, 289, 290, 291, 292, 293, 294, 295, 296, 297, - -1, 299, 300, 301, 302, 303, 304, 305, -1, 307, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, -1, -1, 322, -1, -1, -1, -1, -1, - -1, 329, 330, -1, 332, -1, 334, 335, 336, -1, - -1, 339, 340, -1, 342, 343, 344, 345, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 363, -1, 365, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 387, - 388, -1, -1, -1, -1, -1, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 260, -1, -1, -1, -1, -1, -1, -1, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, -1, -1, 125, 283, 284, 285, -1, -1, -1, - 289, 290, 291, 292, 293, 294, 295, 296, 297, -1, - 299, 300, 301, 302, 303, 304, 305, -1, 307, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 322, -1, -1, -1, -1, -1, -1, - 329, 330, -1, 332, -1, 334, 335, 336, -1, -1, - 339, 340, -1, 342, 343, 344, 345, 0, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 363, -1, 365, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 387, 388, - -1, -1, -1, -1, -1, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, -1, -1, -1, 260, -1, - -1, -1, -1, -1, -1, -1, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 91, -1, - -1, 283, 284, 285, -1, -1, -1, 289, 290, 291, - 292, 293, 294, 295, 296, 297, -1, 299, 300, 301, - 302, 303, 304, 305, -1, 307, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - 322, -1, -1, -1, -1, -1, -1, 329, 330, -1, - 332, -1, 334, 335, 336, -1, -1, 339, 340, -1, - 342, 343, 344, 345, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 363, -1, 365, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 387, 388, -1, -1, -1, - -1, -1, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 91, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, - -1, -1, -1, -1, -1, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, -1, 125, - 283, 284, 285, -1, -1, -1, 289, 290, 291, 292, - 293, 294, 295, 296, 297, -1, 299, 300, 301, 302, - 303, 304, 305, -1, 307, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 322, - -1, -1, -1, -1, -1, -1, 329, 330, -1, 332, - -1, 334, 335, 336, -1, -1, 339, 340, -1, 342, - 343, 344, 345, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 363, -1, 365, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 387, 388, -1, -1, -1, -1, - -1, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, - -1, -1, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 91, -1, -1, 283, 284, 285, - -1, -1, -1, 289, 290, 291, 292, 293, 294, 295, - 296, 297, -1, 299, 300, 301, 302, 303, 304, 305, - -1, 307, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, 322, -1, -1, -1, - -1, -1, -1, 329, 330, -1, 332, -1, 334, 335, - 336, -1, -1, 339, 340, -1, 342, 343, 344, 345, - 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 363, -1, 365, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 387, 388, -1, -1, -1, -1, -1, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 91, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 260, -1, -1, -1, -1, -1, -1, - -1, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, -1, -1, 125, 283, 284, 285, -1, - -1, -1, 289, 290, 291, 292, 293, 294, 295, 296, - 297, -1, 299, 300, 301, 302, 303, 304, 305, -1, - 307, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, 322, -1, -1, -1, -1, - -1, -1, 329, 330, -1, 332, -1, 334, 335, 336, - -1, -1, 339, 340, -1, 342, 343, 344, 345, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 363, -1, 365, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 387, 388, -1, -1, -1, -1, -1, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 91, -1, -1, -1, -1, - 260, -1, -1, -1, -1, -1, -1, -1, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - -1, -1, -1, 283, 284, 285, -1, -1, -1, 289, - 290, 291, 292, 293, 294, 295, 296, 297, -1, 299, - 300, 301, 302, 303, 304, 305, -1, 307, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 0, 322, -1, -1, -1, -1, -1, -1, 329, - 330, -1, 332, -1, 334, 335, 336, -1, -1, 339, - 340, -1, 342, 343, 344, 345, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 363, -1, 365, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 387, 388, -1, - -1, -1, -1, -1, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 91, -1, 40, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 260, -1, -1, 40, -1, -1, - -1, -1, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, -1, -1, -1, 283, 284, 285, - -1, -1, -1, 289, 290, 291, 292, 293, 294, 295, - 296, 297, -1, 299, 300, 301, 302, 303, 304, 305, - -1, 307, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 322, -1, -1, -1, - -1, -1, -1, 329, 330, -1, 332, -1, 334, 335, - 336, -1, -1, 339, 340, -1, 342, -1, 344, -1, - -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 363, -1, 365, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 387, 388, -1, -1, -1, -1, -1, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, -1, -1, -1, -1, - -1, 260, -1, -1, -1, -1, -1, -1, -1, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, -1, -1, -1, 283, 284, 285, -1, -1, -1, - 289, 290, 291, 292, 293, 294, 295, 296, 297, -1, - 299, 300, 301, 302, 303, 304, 305, -1, 307, -1, - -1, 257, -1, -1, -1, 261, -1, -1, -1, -1, - -1, -1, -1, 322, 257, 258, -1, -1, -1, -1, - 329, 330, -1, 332, -1, 334, 335, 336, -1, -1, - 339, 340, -1, 342, -1, 344, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 363, -1, 365, 313, 314, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 313, 314, -1, -1, -1, -1, -1, -1, 387, 388, - 91, -1, -1, -1, -1, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 258, -1, -1, -1, -1, -1, - -1, -1, -1, 369, 370, 371, 372, 373, -1, 375, - 376, 377, 378, 379, 380, 381, 369, 370, 371, 372, - 373, -1, 375, 376, 377, 378, 379, 380, 381, -1, - -1, -1, -1, -1, 400, 401, -1, -1, 404, 405, - 315, 316, -1, -1, 410, -1, -1, 400, 401, 313, - 314, 326, 327, 328, -1, -1, -1, 410, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 349, -1, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 369, 370, 371, 372, 373, - 385, 375, 376, 377, 378, 379, 380, 381, -1, -1, - -1, 396, 397, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 400, 401, -1, 260, - -1, -1, -1, -1, -1, -1, 410, 268, -1, -1, - 271, 272, 273, 274, 275, 276, 277, 278, 279, -1, - -1, -1, 283, 284, 285, -1, -1, -1, 289, 290, - 291, 292, 293, 294, 295, 296, 297, -1, 299, 300, - 301, 302, 303, 304, 305, -1, 307, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 322, -1, -1, -1, -1, -1, -1, 329, 330, - -1, 332, -1, 334, 335, 336, -1, -1, 339, 340, - -1, 342, -1, 344, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 363, -1, 365, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 387, 388, -1, -1, - -1, -1, -1, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -}; -#define YYFINAL 3 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 430 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'","'.'","'/'",0,0,0,0,0,0, -0,0,0,0,"':'",0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,"'['",0,"']'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'{'", -"'|'","'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"CHAR","INTEGER","BOOLEAN","PERCENT", -"SPERCENT","MINUS_INTEGER","PLUS_INTEGER","MAZE_GRID_ID","SOLID_FILL_ID", -"MINES_ID","ROGUELEV_ID","MESSAGE_ID","MAZE_ID","LEVEL_ID","LEV_INIT_ID", -"GEOMETRY_ID","NOMAP_ID","OBJECT_ID","COBJECT_ID","MONSTER_ID","TRAP_ID", -"DOOR_ID","DRAWBRIDGE_ID","object_ID","monster_ID","terrain_ID","MAZEWALK_ID", -"WALLIFY_ID","REGION_ID","FILLING","IRREGULAR","JOINED","ALTAR_ID","LADDER_ID", -"STAIR_ID","NON_DIGGABLE_ID","NON_PASSWALL_ID","ROOM_ID","PORTAL_ID", -"TELEPRT_ID","BRANCH_ID","LEV","MINERALIZE_ID","CORRIDOR_ID","GOLD_ID", -"ENGRAVING_ID","FOUNTAIN_ID","POOL_ID","SINK_ID","NONE","RAND_CORRIDOR_ID", -"DOOR_STATE","LIGHT_STATE","CURSE_TYPE","ENGRAVING_TYPE","DIRECTION", -"RANDOM_TYPE","RANDOM_TYPE_BRACKET","A_REGISTER","ALIGNMENT","LEFT_OR_RIGHT", -"CENTER","TOP_OR_BOT","ALTAR_TYPE","UP_OR_DOWN","SUBROOM_ID","NAME_ID", -"FLAGS_ID","FLAG_TYPE","MON_ATTITUDE","MON_ALERTNESS","MON_APPEARANCE", -"ROOMDOOR_ID","IF_ID","ELSE_ID","TERRAIN_ID","HORIZ_OR_VERT", -"REPLACE_TERRAIN_ID","EXIT_ID","SHUFFLE_ID","QUANTITY_ID","BURIED_ID","LOOP_ID", -"FOR_ID","TO_ID","SWITCH_ID","CASE_ID","BREAK_ID","DEFAULT_ID","ERODED_ID", -"TRAPPED_STATE","RECHARGED_ID","INVIS_ID","GREASED_ID","FEMALE_ID", -"CANCELLED_ID","REVIVED_ID","AVENGE_ID","FLEEING_ID","BLINDED_ID", -"PARALYZED_ID","STUNNED_ID","CONFUSED_ID","SEENTRAPS_ID","ALL_ID","MONTYPE_ID", -"GRAVE_ID","ERODEPROOF_ID","FUNCTION_ID","MSG_OUTPUT_TYPE","COMPARE_TYPE", -"UNKNOWN_TYPE","rect_ID","fillrect_ID","line_ID","randline_ID","grow_ID", -"selection_ID","flood_ID","rndcoord_ID","circle_ID","ellipse_ID","filter_ID", -"complement_ID","gradient_ID","GRADIENT_TYPE","LIMITED","HUMIDITY_TYPE", -"STRING","MAP_ID","NQSTRING","VARSTRING","CFUNC","CFUNC_INT","CFUNC_STR", -"CFUNC_COORD","CFUNC_REGION","VARSTRING_INT","VARSTRING_INT_ARRAY", -"VARSTRING_STRING","VARSTRING_STRING_ARRAY","VARSTRING_VAR", -"VARSTRING_VAR_ARRAY","VARSTRING_COORD","VARSTRING_COORD_ARRAY", -"VARSTRING_REGION","VARSTRING_REGION_ARRAY","VARSTRING_MAPCHAR", -"VARSTRING_MAPCHAR_ARRAY","VARSTRING_MONST","VARSTRING_MONST_ARRAY", -"VARSTRING_OBJ","VARSTRING_OBJ_ARRAY","VARSTRING_SEL","VARSTRING_SEL_ARRAY", -"METHOD_INT","METHOD_INT_ARRAY","METHOD_STRING","METHOD_STRING_ARRAY", -"METHOD_VAR","METHOD_VAR_ARRAY","METHOD_COORD","METHOD_COORD_ARRAY", -"METHOD_REGION","METHOD_REGION_ARRAY","METHOD_MAPCHAR","METHOD_MAPCHAR_ARRAY", -"METHOD_MONST","METHOD_MONST_ARRAY","METHOD_OBJ","METHOD_OBJ_ARRAY", -"METHOD_SEL","METHOD_SEL_ARRAY","DICE", -}; -char *yyrule[] = { -"$accept : file", -"file :", -"file : levels", -"levels : level", -"levels : level levels", -"level : level_def flags levstatements", -"level_def : LEVEL_ID ':' STRING", -"level_def : MAZE_ID ':' STRING ',' mazefiller", -"mazefiller : RANDOM_TYPE", -"mazefiller : CHAR", -"lev_init : LEV_INIT_ID ':' SOLID_FILL_ID ',' terrain_type", -"lev_init : LEV_INIT_ID ':' MAZE_GRID_ID ',' CHAR", -"lev_init : LEV_INIT_ID ':' ROGUELEV_ID", -"lev_init : LEV_INIT_ID ':' MINES_ID ',' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled opt_fillchar", -"opt_limited :", -"opt_limited : ',' LIMITED", -"opt_coord_or_var :", -"opt_coord_or_var : ',' coord_or_var", -"opt_fillchar :", -"opt_fillchar : ',' CHAR", -"walled : BOOLEAN", -"walled : RANDOM_TYPE", -"flags :", -"flags : FLAGS_ID ':' flag_list", -"flag_list : FLAG_TYPE ',' flag_list", -"flag_list : FLAG_TYPE", -"levstatements :", -"levstatements : levstatement levstatements", -"stmt_block : '{' levstatements '}'", -"levstatement : message", -"levstatement : lev_init", -"levstatement : altar_detail", -"levstatement : grave_detail", -"levstatement : branch_region", -"levstatement : corridor", -"levstatement : variable_define", -"levstatement : shuffle_detail", -"levstatement : diggable_detail", -"levstatement : door_detail", -"levstatement : drawbridge_detail", -"levstatement : engraving_detail", -"levstatement : mineralize", -"levstatement : fountain_detail", -"levstatement : gold_detail", -"levstatement : switchstatement", -"levstatement : forstatement", -"levstatement : loopstatement", -"levstatement : ifstatement", -"levstatement : chancestatement", -"levstatement : exitstatement", -"levstatement : breakstatement", -"levstatement : function_define", -"levstatement : function_call", -"levstatement : ladder_detail", -"levstatement : map_definition", -"levstatement : mazewalk_detail", -"levstatement : monster_detail", -"levstatement : object_detail", -"levstatement : passwall_detail", -"levstatement : pool_detail", -"levstatement : portal_region", -"levstatement : random_corridors", -"levstatement : region_detail", -"levstatement : room_def", -"levstatement : subroom_def", -"levstatement : sink_detail", -"levstatement : terrain_detail", -"levstatement : replace_terrain_detail", -"levstatement : stair_detail", -"levstatement : stair_region", -"levstatement : teleprt_region", -"levstatement : trap_detail", -"levstatement : wallify_detail", -"any_var_array : VARSTRING_INT_ARRAY", -"any_var_array : VARSTRING_STRING_ARRAY", -"any_var_array : VARSTRING_VAR_ARRAY", -"any_var_array : VARSTRING_COORD_ARRAY", -"any_var_array : VARSTRING_REGION_ARRAY", -"any_var_array : VARSTRING_MAPCHAR_ARRAY", -"any_var_array : VARSTRING_MONST_ARRAY", -"any_var_array : VARSTRING_OBJ_ARRAY", -"any_var_array : VARSTRING_SEL_ARRAY", -"any_var : VARSTRING_INT", -"any_var : VARSTRING_STRING", -"any_var : VARSTRING_VAR", -"any_var : VARSTRING_COORD", -"any_var : VARSTRING_REGION", -"any_var : VARSTRING_MAPCHAR", -"any_var : VARSTRING_MONST", -"any_var : VARSTRING_OBJ", -"any_var : VARSTRING_SEL", -"any_var_or_arr : any_var_array", -"any_var_or_arr : any_var", -"any_var_or_arr : VARSTRING", -"any_var_or_unk : VARSTRING", -"any_var_or_unk : any_var", -"shuffle_detail : SHUFFLE_ID ':' any_var_array", -"variable_define : any_var_or_arr '=' math_expr_var", -"variable_define : any_var_or_arr '=' selection_ID ':' ter_selection", -"variable_define : any_var_or_arr '=' string_expr", -"variable_define : any_var_or_arr '=' terrainid ':' mapchar_or_var", -"variable_define : any_var_or_arr '=' monsterid ':' monster_or_var", -"variable_define : any_var_or_arr '=' objectid ':' object_or_var", -"variable_define : any_var_or_arr '=' coord_or_var", -"variable_define : any_var_or_arr '=' region_or_var", -"variable_define : any_var_or_arr '=' '{' integer_list '}'", -"variable_define : any_var_or_arr '=' '{' encodecoord_list '}'", -"variable_define : any_var_or_arr '=' '{' encoderegion_list '}'", -"variable_define : any_var_or_arr '=' terrainid ':' '{' mapchar_list '}'", -"variable_define : any_var_or_arr '=' monsterid ':' '{' encodemonster_list '}'", -"variable_define : any_var_or_arr '=' objectid ':' '{' encodeobj_list '}'", -"variable_define : any_var_or_arr '=' '{' string_list '}'", -"encodeobj_list : encodeobj", -"encodeobj_list : encodeobj_list ',' encodeobj", -"encodemonster_list : encodemonster", -"encodemonster_list : encodemonster_list ',' encodemonster", -"mapchar_list : mapchar", -"mapchar_list : mapchar_list ',' mapchar", -"encoderegion_list : encoderegion", -"encoderegion_list : encoderegion_list ',' encoderegion", -"encodecoord_list : encodecoord", -"encodecoord_list : encodecoord_list ',' encodecoord", -"integer_list : math_expr_var", -"integer_list : integer_list ',' math_expr_var", -"string_list : string_expr", -"string_list : string_list ',' string_expr", -"$$1 :", -"$$2 :", -"function_define : FUNCTION_ID NQSTRING '(' $$1 func_params_list ')' $$2 stmt_block", -"function_call : NQSTRING '(' func_call_params_list ')'", -"exitstatement : EXIT_ID", -"opt_percent :", -"opt_percent : PERCENT", -"comparestmt : PERCENT", -"comparestmt : '[' math_expr_var COMPARE_TYPE math_expr_var ']'", -"comparestmt : '[' math_expr_var ']'", -"$$3 :", -"$$4 :", -"switchstatement : SWITCH_ID $$3 '[' integer_or_var ']' $$4 '{' switchcases '}'", -"switchcases :", -"switchcases : switchcase switchcases", -"$$5 :", -"switchcase : CASE_ID all_integers ':' $$5 levstatements", -"$$6 :", -"switchcase : DEFAULT_ID ':' $$6 levstatements", -"breakstatement : BREAK_ID", -"for_to_span : '.' '.'", -"for_to_span : TO_ID", -"forstmt_start : FOR_ID any_var_or_unk '=' math_expr_var for_to_span math_expr_var", -"$$7 :", -"forstatement : forstmt_start $$7 stmt_block", -"$$8 :", -"loopstatement : LOOP_ID '[' integer_or_var ']' $$8 stmt_block", -"$$9 :", -"chancestatement : comparestmt ':' $$9 levstatement", -"$$10 :", -"ifstatement : IF_ID comparestmt $$10 if_ending", -"if_ending : stmt_block", -"$$11 :", -"if_ending : stmt_block $$11 ELSE_ID stmt_block", -"message : MESSAGE_ID ':' string_expr", -"random_corridors : RAND_CORRIDOR_ID", -"random_corridors : RAND_CORRIDOR_ID ':' all_integers", -"random_corridors : RAND_CORRIDOR_ID ':' RANDOM_TYPE", -"corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec", -"corridor : CORRIDOR_ID ':' corr_spec ',' all_integers", -"corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')'", -"room_begin : room_type opt_percent ',' light_state", -"$$12 :", -"subroom_def : SUBROOM_ID ':' room_begin ',' subroom_pos ',' room_size optroomregionflags $$12 stmt_block", -"$$13 :", -"room_def : ROOM_ID ':' room_begin ',' room_pos ',' room_align ',' room_size optroomregionflags $$13 stmt_block", -"roomfill :", -"roomfill : ',' BOOLEAN", -"room_pos : '(' INTEGER ',' INTEGER ')'", -"room_pos : RANDOM_TYPE", -"subroom_pos : '(' INTEGER ',' INTEGER ')'", -"subroom_pos : RANDOM_TYPE", -"room_align : '(' h_justif ',' v_justif ')'", -"room_align : RANDOM_TYPE", -"room_size : '(' INTEGER ',' INTEGER ')'", -"room_size : RANDOM_TYPE", -"door_detail : ROOMDOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos", -"door_detail : DOOR_ID ':' door_state ',' ter_selection", -"secret : BOOLEAN", -"secret : RANDOM_TYPE", -"door_wall : dir_list", -"door_wall : RANDOM_TYPE", -"dir_list : DIRECTION", -"dir_list : DIRECTION '|' dir_list", -"door_pos : INTEGER", -"door_pos : RANDOM_TYPE", -"map_definition : NOMAP_ID", -"map_definition : GEOMETRY_ID ':' h_justif ',' v_justif roomfill MAP_ID", -"map_definition : GEOMETRY_ID ':' coord_or_var roomfill MAP_ID", -"h_justif : LEFT_OR_RIGHT", -"h_justif : CENTER", -"v_justif : TOP_OR_BOT", -"v_justif : CENTER", -"monster_detail : MONSTER_ID ':' monster_desc", -"$$14 :", -"monster_detail : MONSTER_ID ':' monster_desc $$14 stmt_block", -"monster_desc : monster_or_var ',' coord_or_var monster_infos", -"monster_infos :", -"monster_infos : monster_infos ',' monster_info", -"monster_info : string_expr", -"monster_info : MON_ATTITUDE", -"monster_info : MON_ALERTNESS", -"monster_info : alignment_prfx", -"monster_info : MON_APPEARANCE string_expr", -"monster_info : FEMALE_ID", -"monster_info : INVIS_ID", -"monster_info : CANCELLED_ID", -"monster_info : REVIVED_ID", -"monster_info : AVENGE_ID", -"monster_info : FLEEING_ID ':' integer_or_var", -"monster_info : BLINDED_ID ':' integer_or_var", -"monster_info : PARALYZED_ID ':' integer_or_var", -"monster_info : STUNNED_ID", -"monster_info : CONFUSED_ID", -"monster_info : SEENTRAPS_ID ':' seen_trap_mask", -"seen_trap_mask : STRING", -"seen_trap_mask : ALL_ID", -"seen_trap_mask : STRING '|' seen_trap_mask", -"object_detail : OBJECT_ID ':' object_desc", -"$$15 :", -"object_detail : COBJECT_ID ':' object_desc $$15 stmt_block", -"object_desc : object_or_var object_infos", -"object_infos :", -"object_infos : object_infos ',' object_info", -"object_info : CURSE_TYPE", -"object_info : MONTYPE_ID ':' monster_or_var", -"object_info : all_ints_push", -"object_info : NAME_ID ':' string_expr", -"object_info : QUANTITY_ID ':' integer_or_var", -"object_info : BURIED_ID", -"object_info : LIGHT_STATE", -"object_info : ERODED_ID ':' integer_or_var", -"object_info : ERODEPROOF_ID", -"object_info : DOOR_STATE", -"object_info : TRAPPED_STATE", -"object_info : RECHARGED_ID ':' integer_or_var", -"object_info : INVIS_ID", -"object_info : GREASED_ID", -"object_info : coord_or_var", -"trap_detail : TRAP_ID ':' trap_name ',' coord_or_var", -"drawbridge_detail : DRAWBRIDGE_ID ':' coord_or_var ',' DIRECTION ',' door_state", -"mazewalk_detail : MAZEWALK_ID ':' coord_or_var ',' DIRECTION", -"mazewalk_detail : MAZEWALK_ID ':' coord_or_var ',' DIRECTION ',' BOOLEAN opt_fillchar", -"wallify_detail : WALLIFY_ID", -"wallify_detail : WALLIFY_ID ':' ter_selection", -"ladder_detail : LADDER_ID ':' coord_or_var ',' UP_OR_DOWN", -"stair_detail : STAIR_ID ':' coord_or_var ',' UP_OR_DOWN", -"stair_region : STAIR_ID ':' lev_region ',' lev_region ',' UP_OR_DOWN", -"portal_region : PORTAL_ID ':' lev_region ',' lev_region ',' STRING", -"teleprt_region : TELEPRT_ID ':' lev_region ',' lev_region teleprt_detail", -"branch_region : BRANCH_ID ':' lev_region ',' lev_region", -"teleprt_detail :", -"teleprt_detail : ',' UP_OR_DOWN", -"fountain_detail : FOUNTAIN_ID ':' ter_selection", -"sink_detail : SINK_ID ':' ter_selection", -"pool_detail : POOL_ID ':' ter_selection", -"terrain_type : CHAR", -"terrain_type : '(' CHAR ',' light_state ')'", -"replace_terrain_detail : REPLACE_TERRAIN_ID ':' region_or_var ',' mapchar_or_var ',' mapchar_or_var ',' SPERCENT", -"terrain_detail : TERRAIN_ID ':' ter_selection ',' mapchar_or_var", -"diggable_detail : NON_DIGGABLE_ID ':' region_or_var", -"passwall_detail : NON_PASSWALL_ID ':' region_or_var", -"$$16 :", -"region_detail : REGION_ID ':' region_or_var ',' light_state ',' room_type optroomregionflags $$16 region_detail_end", -"region_detail_end :", -"region_detail_end : stmt_block", -"altar_detail : ALTAR_ID ':' coord_or_var ',' alignment ',' altar_type", -"grave_detail : GRAVE_ID ':' coord_or_var ',' string_expr", -"grave_detail : GRAVE_ID ':' coord_or_var ',' RANDOM_TYPE", -"grave_detail : GRAVE_ID ':' coord_or_var", -"gold_detail : GOLD_ID ':' math_expr_var ',' coord_or_var", -"engraving_detail : ENGRAVING_ID ':' coord_or_var ',' engraving_type ',' string_expr", -"mineralize : MINERALIZE_ID ':' integer_or_var ',' integer_or_var ',' integer_or_var ',' integer_or_var", -"mineralize : MINERALIZE_ID", -"trap_name : STRING", -"trap_name : RANDOM_TYPE", -"room_type : STRING", -"room_type : RANDOM_TYPE", -"optroomregionflags :", -"optroomregionflags : ',' roomregionflags", -"roomregionflags : roomregionflag", -"roomregionflags : roomregionflag ',' roomregionflags", -"roomregionflag : FILLING", -"roomregionflag : IRREGULAR", -"roomregionflag : JOINED", -"door_state : DOOR_STATE", -"door_state : RANDOM_TYPE", -"light_state : LIGHT_STATE", -"light_state : RANDOM_TYPE", -"alignment : ALIGNMENT", -"alignment : a_register", -"alignment : RANDOM_TYPE", -"alignment_prfx : ALIGNMENT", -"alignment_prfx : a_register", -"alignment_prfx : A_REGISTER ':' RANDOM_TYPE", -"altar_type : ALTAR_TYPE", -"altar_type : RANDOM_TYPE", -"a_register : A_REGISTER '[' INTEGER ']'", -"string_or_var : STRING", -"string_or_var : VARSTRING_STRING", -"string_or_var : VARSTRING_STRING_ARRAY '[' math_expr_var ']'", -"integer_or_var : math_expr_var", -"coord_or_var : encodecoord", -"coord_or_var : rndcoord_ID '(' ter_selection ')'", -"coord_or_var : VARSTRING_COORD", -"coord_or_var : VARSTRING_COORD_ARRAY '[' math_expr_var ']'", -"encodecoord : '(' INTEGER ',' INTEGER ')'", -"encodecoord : RANDOM_TYPE", -"encodecoord : RANDOM_TYPE_BRACKET humidity_flags ']'", -"humidity_flags : HUMIDITY_TYPE", -"humidity_flags : HUMIDITY_TYPE ',' humidity_flags", -"region_or_var : encoderegion", -"region_or_var : VARSTRING_REGION", -"region_or_var : VARSTRING_REGION_ARRAY '[' math_expr_var ']'", -"encoderegion : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'", -"mapchar_or_var : mapchar", -"mapchar_or_var : VARSTRING_MAPCHAR", -"mapchar_or_var : VARSTRING_MAPCHAR_ARRAY '[' math_expr_var ']'", -"mapchar : CHAR", -"mapchar : '(' CHAR ',' light_state ')'", -"monster_or_var : encodemonster", -"monster_or_var : VARSTRING_MONST", -"monster_or_var : VARSTRING_MONST_ARRAY '[' math_expr_var ']'", -"encodemonster : STRING", -"encodemonster : CHAR", -"encodemonster : '(' CHAR ',' STRING ')'", -"encodemonster : RANDOM_TYPE", -"object_or_var : encodeobj", -"object_or_var : VARSTRING_OBJ", -"object_or_var : VARSTRING_OBJ_ARRAY '[' math_expr_var ']'", -"encodeobj : STRING", -"encodeobj : CHAR", -"encodeobj : '(' CHAR ',' STRING ')'", -"encodeobj : RANDOM_TYPE", -"string_expr : string_or_var", -"string_expr : string_expr '.' string_or_var", -"math_expr_var : INTEGER", -"math_expr_var : dice", -"math_expr_var : '(' MINUS_INTEGER ')'", -"math_expr_var : VARSTRING_INT", -"math_expr_var : VARSTRING_INT_ARRAY '[' math_expr_var ']'", -"math_expr_var : math_expr_var '+' math_expr_var", -"math_expr_var : math_expr_var '-' math_expr_var", -"math_expr_var : math_expr_var '*' math_expr_var", -"math_expr_var : math_expr_var '/' math_expr_var", -"math_expr_var : math_expr_var '%' math_expr_var", -"math_expr_var : '(' math_expr_var ')'", -"func_param_type : CFUNC_INT", -"func_param_type : CFUNC_STR", -"func_param_part : any_var_or_arr ':' func_param_type", -"func_param_list : func_param_part", -"func_param_list : func_param_list ',' func_param_part", -"func_params_list :", -"func_params_list : func_param_list", -"func_call_param_part : math_expr_var", -"func_call_param_part : string_expr", -"func_call_param_list : func_call_param_part", -"func_call_param_list : func_call_param_list ',' func_call_param_part", -"func_call_params_list :", -"func_call_params_list : func_call_param_list", -"ter_selection_x : coord_or_var", -"ter_selection_x : rect_ID region_or_var", -"ter_selection_x : fillrect_ID region_or_var", -"ter_selection_x : line_ID coord_or_var ',' coord_or_var", -"ter_selection_x : randline_ID coord_or_var ',' coord_or_var ',' math_expr_var", -"ter_selection_x : grow_ID '(' ter_selection ')'", -"ter_selection_x : grow_ID '(' dir_list ',' ter_selection ')'", -"ter_selection_x : filter_ID '(' SPERCENT ',' ter_selection ')'", -"ter_selection_x : filter_ID '(' ter_selection ',' ter_selection ')'", -"ter_selection_x : filter_ID '(' mapchar_or_var ',' ter_selection ')'", -"ter_selection_x : flood_ID coord_or_var", -"ter_selection_x : circle_ID '(' coord_or_var ',' math_expr_var ')'", -"ter_selection_x : circle_ID '(' coord_or_var ',' math_expr_var ',' FILLING ')'", -"ter_selection_x : ellipse_ID '(' coord_or_var ',' math_expr_var ',' math_expr_var ')'", -"ter_selection_x : ellipse_ID '(' coord_or_var ',' math_expr_var ',' math_expr_var ',' FILLING ')'", -"ter_selection_x : gradient_ID '(' GRADIENT_TYPE ',' '(' math_expr_var '-' math_expr_var opt_limited ')' ',' coord_or_var opt_coord_or_var ')'", -"ter_selection_x : complement_ID ter_selection_x", -"ter_selection_x : VARSTRING_SEL", -"ter_selection_x : '(' ter_selection ')'", -"ter_selection : ter_selection_x", -"ter_selection : ter_selection_x '&' ter_selection", -"dice : DICE", -"all_integers : MINUS_INTEGER", -"all_integers : PLUS_INTEGER", -"all_integers : INTEGER", -"all_ints_push : MINUS_INTEGER", -"all_ints_push : PLUS_INTEGER", -"all_ints_push : INTEGER", -"all_ints_push : dice", -"objectid : object_ID", -"objectid : OBJECT_ID", -"monsterid : monster_ID", -"monsterid : MONSTER_ID", -"terrainid : terrain_ID", -"terrainid : TERRAIN_ID", -"engraving_type : ENGRAVING_TYPE", -"engraving_type : RANDOM_TYPE", -"lev_region : region", -"lev_region : LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'", -"region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'", -}; -#endif -#ifdef YYSTACKSIZE -#undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE - -/*lev_comp.y*/ -#define YYABORT goto yyabort -#define YYREJECT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse() -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if ((yys = getenv("YYDEBUG")) != 0) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if ((yyn = yydefred[yystate]) != 0) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) != 0 && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, shifting to state %d\n", - YYPREFIX, yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) != 0 && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; - goto yynewerror; -yynewerror: - yyerror("syntax error"); - goto yyerrlab; -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) != 0 && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, error recovery discards token %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, reducing by rule %d (%s)\n", - YYPREFIX, yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 5: -{ - if (fatal_error > 0) { - (void) fprintf(stderr, - "%s: %d errors detected for level \"%s\". No output created!\n", - fname, fatal_error, yyvsp[-2].map); - fatal_error = 0; - got_errors++; - } else if (!got_errors) { - if (!write_level_file(yyvsp[-2].map, splev)) { - lc_error("Can't write output file for '%s'!", - yyvsp[-2].map); - exit(EXIT_FAILURE); - } - } - Free(yyvsp[-2].map); - Free(splev); - splev = NULL; - vardef_free_all(vardefs); - vardefs = NULL; - } -break; -case 6: -{ - start_level_def(&splev, yyvsp[0].map); - yyval.map = yyvsp[0].map; - } -break; -case 7: -{ - start_level_def(&splev, yyvsp[-2].map); - if (yyvsp[0].i == -1) { - add_opvars(splev, "iiiiiiiio", - VA_PASS9(LVLINIT_MAZEGRID, HWALL, 0,0, - 0,0,0,0, SPO_INITLEVEL)); - } else { - int bg = (int) what_map_char((char) yyvsp[0].i); - - add_opvars(splev, "iiiiiiiio", - VA_PASS9(LVLINIT_SOLIDFILL, bg, 0,0, - 0,0,0,0, SPO_INITLEVEL)); - } - add_opvars(splev, "io", - VA_PASS2(MAZELEVEL, SPO_LEVEL_FLAGS)); - max_x_map = COLNO-1; - max_y_map = ROWNO; - yyval.map = yyvsp[-2].map; - } -break; -case 8: -{ - yyval.i = -1; - } -break; -case 9: -{ - yyval.i = what_map_char((char) yyvsp[0].i); - } -break; -case 10: -{ - int filling = (int) yyvsp[0].terr.ter; - - if (filling == INVALID_TYPE || filling >= MAX_TYPE) - lc_error("INIT_MAP: Invalid fill char type."); - add_opvars(splev, "iiiiiiiio", - VA_PASS9(LVLINIT_SOLIDFILL, filling, - 0, (int) yyvsp[0].terr.lit, - 0,0,0,0, SPO_INITLEVEL)); - max_x_map = COLNO-1; - max_y_map = ROWNO; - } -break; -case 11: -{ - int filling = (int) what_map_char((char) yyvsp[0].i); - - if (filling == INVALID_TYPE || filling >= MAX_TYPE) - lc_error("INIT_MAP: Invalid fill char type."); - add_opvars(splev, "iiiiiiiio", - VA_PASS9(LVLINIT_MAZEGRID, filling, 0,0, - 0,0,0,0, SPO_INITLEVEL)); - max_x_map = COLNO-1; - max_y_map = ROWNO; - } -break; -case 12: -{ - add_opvars(splev, "iiiiiiiio", - VA_PASS9(LVLINIT_ROGUE,0,0,0, - 0,0,0,0, SPO_INITLEVEL)); - } -break; -case 13: -{ - int fg = (int) what_map_char((char) yyvsp[-11].i), - bg = (int) what_map_char((char) yyvsp[-9].i); - int smoothed = (int) yyvsp[-7].i, - joined = (int) yyvsp[-5].i, - lit = (int) yyvsp[-3].i, - walled = (int) yyvsp[-1].i, - filling = (int) yyvsp[0].i; - - if (fg == INVALID_TYPE || fg >= MAX_TYPE) - lc_error("INIT_MAP: Invalid foreground type."); - if (bg == INVALID_TYPE || bg >= MAX_TYPE) - lc_error("INIT_MAP: Invalid background type."); - if (joined && fg != CORR && fg != ROOM) - lc_error("INIT_MAP: Invalid foreground type for joined map."); - - if (filling == INVALID_TYPE) - lc_error("INIT_MAP: Invalid fill char type."); - - add_opvars(splev, "iiiiiiiio", - VA_PASS9(LVLINIT_MINES, filling, walled, lit, - joined, smoothed, bg, fg, - SPO_INITLEVEL)); - max_x_map = COLNO-1; - max_y_map = ROWNO; - } -break; -case 14: -{ - yyval.i = 0; - } -break; -case 15: -{ - yyval.i = yyvsp[0].i; - } -break; -case 16: -{ - add_opvars(splev, "o", VA_PASS1(SPO_COPY)); - yyval.i = 0; - } -break; -case 17: -{ - yyval.i = 1; - } -break; -case 18: -{ - yyval.i = -1; - } -break; -case 19: -{ - yyval.i = what_map_char((char) yyvsp[0].i); - } -break; -case 22: -{ - add_opvars(splev, "io", VA_PASS2(0, SPO_LEVEL_FLAGS)); - } -break; -case 23: -{ - add_opvars(splev, "io", - VA_PASS2((int) yyvsp[0].i, SPO_LEVEL_FLAGS)); - } -break; -case 24: -{ - yyval.i = (yyvsp[-2].i | yyvsp[0].i); - } -break; -case 25: -{ - yyval.i = yyvsp[0].i; - } -break; -case 26: -{ - yyval.i = 0; - } -break; -case 27: -{ - yyval.i = 1 + yyvsp[0].i; - } -break; -case 28: -{ - yyval.i = yyvsp[-1].i; - } -break; -case 96: -{ - struct lc_vardefs *vd; - - if ((vd = vardef_defined(vardefs, yyvsp[0].map, 1))) { - if (!(vd->var_type & SPOVAR_ARRAY)) - lc_error("Trying to shuffle non-array variable '%s'", - yyvsp[0].map); - } else - lc_error("Trying to shuffle undefined variable '%s'", - yyvsp[0].map); - add_opvars(splev, "so", VA_PASS2(yyvsp[0].map, SPO_SHUFFLE_ARRAY)); - Free(yyvsp[0].map); - } -break; -case 97: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-2].map, SPOVAR_INT); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-2].map, SPO_VAR_INIT)); - Free(yyvsp[-2].map); - } -break; -case 98: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, SPOVAR_SEL); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 99: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-2].map, SPOVAR_STRING); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-2].map, SPO_VAR_INIT)); - Free(yyvsp[-2].map); - } -break; -case 100: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, SPOVAR_MAPCHAR); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 101: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, SPOVAR_MONST); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 102: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, SPOVAR_OBJ); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 103: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-2].map, SPOVAR_COORD); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-2].map, SPO_VAR_INIT)); - Free(yyvsp[-2].map); - } -break; -case 104: -{ - vardefs = add_vardef_type(vardefs, yyvsp[-2].map, SPOVAR_REGION); - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-2].map, SPO_VAR_INIT)); - Free(yyvsp[-2].map); - } -break; -case 105: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, - SPOVAR_INT | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 106: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, - SPOVAR_COORD | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 107: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, - SPOVAR_REGION | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 108: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-6].map, - SPOVAR_MAPCHAR | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-6].map, SPO_VAR_INIT)); - Free(yyvsp[-6].map); - } -break; -case 109: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-6].map, - SPOVAR_MONST | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-6].map, SPO_VAR_INIT)); - Free(yyvsp[-6].map); - } -break; -case 110: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-6].map, - SPOVAR_OBJ | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-6].map, SPO_VAR_INIT)); - Free(yyvsp[-6].map); - } -break; -case 111: -{ - int n_items = (int) yyvsp[-1].i; - - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, - SPOVAR_STRING | SPOVAR_ARRAY); - add_opvars(splev, "iso", - VA_PASS3(n_items, yyvsp[-4].map, SPO_VAR_INIT)); - Free(yyvsp[-4].map); - } -break; -case 112: -{ - add_opvars(splev, "O", VA_PASS1(yyvsp[0].i)); - yyval.i = 1; - } -break; -case 113: -{ - add_opvars(splev, "O", VA_PASS1(yyvsp[0].i)); - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 114: -{ - add_opvars(splev, "M", VA_PASS1(yyvsp[0].i)); - yyval.i = 1; - } -break; -case 115: -{ - add_opvars(splev, "M", VA_PASS1(yyvsp[0].i)); - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 116: -{ - add_opvars(splev, "m", VA_PASS1(yyvsp[0].i)); - yyval.i = 1; - } -break; -case 117: -{ - add_opvars(splev, "m", VA_PASS1(yyvsp[0].i)); - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 118: -{ - yyval.i = 1; - } -break; -case 119: -{ - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 120: -{ - add_opvars(splev, "c", VA_PASS1(yyvsp[0].i)); - yyval.i = 1; - } -break; -case 121: -{ - add_opvars(splev, "c", VA_PASS1(yyvsp[0].i)); - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 122: -{ - yyval.i = 1; - } -break; -case 123: -{ - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 124: -{ - yyval.i = 1; - } -break; -case 125: -{ - yyval.i = 1 + yyvsp[-2].i; - } -break; -case 126: -{ - struct lc_funcdefs *funcdef; - - if (in_function_definition) - lc_error("Recursively defined functions not allowed (function %s).", yyvsp[-1].map); - - in_function_definition++; - - if (funcdef_defined(function_definitions, yyvsp[-1].map, 1)) - lc_error("Function '%s' already defined once.", yyvsp[-1].map); - - funcdef = funcdef_new(-1, yyvsp[-1].map); - funcdef->next = function_definitions; - function_definitions = funcdef; - function_splev_backup = splev; - splev = &(funcdef->code); - Free(yyvsp[-1].map); - curr_function = funcdef; - function_tmp_var_defs = vardefs; - vardefs = NULL; - } -break; -case 127: -{ - /* nothing */ - } -break; -case 128: -{ - add_opvars(splev, "io", VA_PASS2(0, SPO_RETURN)); - splev = function_splev_backup; - in_function_definition--; - curr_function = NULL; - vardef_free_all(vardefs); - vardefs = function_tmp_var_defs; - } -break; -case 129: -{ - struct lc_funcdefs *tmpfunc; - - tmpfunc = funcdef_defined(function_definitions, yyvsp[-3].map, 1); - if (tmpfunc) { - int l; - int nparams = (int) strlen(yyvsp[-1].map); - char *fparamstr = funcdef_paramtypes(tmpfunc); - - if (strcmp(yyvsp[-1].map, fparamstr)) { - char *tmps = strdup(decode_parm_str(fparamstr)); - - lc_error("Function '%s' requires params '%s', got '%s' instead.", - yyvsp[-3].map, tmps, decode_parm_str(yyvsp[-1].map)); - Free(tmps); - } - Free(fparamstr); - Free(yyvsp[-1].map); - if (!(tmpfunc->n_called)) { - /* we haven't called the function yet, so insert it in the code */ - struct opvar *jmp = New(struct opvar); - - set_opvar_int(jmp, splev->n_opcodes+1); - add_opcode(splev, SPO_PUSH, jmp); - /* we must jump past it first, then CALL it, due to RETURN. */ - add_opcode(splev, SPO_JMP, NULL); - - tmpfunc->addr = splev->n_opcodes; - - { /* init function parameter variables */ - struct lc_funcdefs_parm *tfp = tmpfunc->params; - while (tfp) { - add_opvars(splev, "iso", - VA_PASS3(0, tfp->name, - SPO_VAR_INIT)); - tfp = tfp->next; - } - } - - splev_add_from(splev, &(tmpfunc->code)); - set_opvar_int(jmp, - splev->n_opcodes - jmp->vardata.l); - } - l = (int) (tmpfunc->addr - splev->n_opcodes - 2); - add_opvars(splev, "iio", - VA_PASS3(nparams, l, SPO_CALL)); - tmpfunc->n_called++; - } else { - lc_error("Function '%s' not defined.", yyvsp[-3].map); - } - Free(yyvsp[-3].map); - } -break; -case 130: -{ - add_opcode(splev, SPO_EXIT, NULL); - } -break; -case 131: -{ - yyval.i = 100; - } -break; -case 132: -{ - yyval.i = yyvsp[0].i; - } -break; -case 133: -{ - /* val > rn2(100) */ - add_opvars(splev, "iio", - VA_PASS3((int) yyvsp[0].i, 100, SPO_RN2)); - yyval.i = SPO_JG; - } -break; -case 134: -{ - yyval.i = yyvsp[-2].i; - } -break; -case 135: -{ - /* boolean, explicit foo != 0 */ - add_opvars(splev, "i", VA_PASS1(0)); - yyval.i = SPO_JNE; - } -break; -case 136: -{ - is_inconstant_number = 0; - } -break; -case 137: -{ - struct opvar *chkjmp; - - if (in_switch_statement > 0) - lc_error("Cannot nest switch-statements."); - - in_switch_statement++; - - n_switch_case_list = 0; - switch_default_case = NULL; - - if (!is_inconstant_number) - add_opvars(splev, "o", VA_PASS1(SPO_RN2)); - is_inconstant_number = 0; - - chkjmp = New(struct opvar); - set_opvar_int(chkjmp, splev->n_opcodes+1); - switch_check_jump = chkjmp; - add_opcode(splev, SPO_PUSH, chkjmp); - add_opcode(splev, SPO_JMP, NULL); - break_stmt_start(); - } -break; -case 138: -{ - struct opvar *endjump = New(struct opvar); - int i; - - set_opvar_int(endjump, splev->n_opcodes+1); - - add_opcode(splev, SPO_PUSH, endjump); - add_opcode(splev, SPO_JMP, NULL); - - set_opvar_int(switch_check_jump, - splev->n_opcodes - switch_check_jump->vardata.l); - - for (i = 0; i < n_switch_case_list; i++) { - add_opvars(splev, "oio", - VA_PASS3(SPO_COPY, - switch_case_value[i], SPO_CMP)); - set_opvar_int(switch_case_list[i], - switch_case_list[i]->vardata.l - splev->n_opcodes-1); - add_opcode(splev, SPO_PUSH, switch_case_list[i]); - add_opcode(splev, SPO_JE, NULL); - } - - if (switch_default_case) { - set_opvar_int(switch_default_case, - switch_default_case->vardata.l - splev->n_opcodes-1); - add_opcode(splev, SPO_PUSH, switch_default_case); - add_opcode(splev, SPO_JMP, NULL); - } - - set_opvar_int(endjump, splev->n_opcodes - endjump->vardata.l); - - break_stmt_end(splev); - - add_opcode(splev, SPO_POP, NULL); /* get rid of the value in stack */ - in_switch_statement--; - - - } -break; -case 141: -{ - if (n_switch_case_list < MAX_SWITCH_CASES) { - struct opvar *tmppush = New(struct opvar); - - set_opvar_int(tmppush, splev->n_opcodes); - switch_case_value[n_switch_case_list] = yyvsp[-1].i; - switch_case_list[n_switch_case_list++] = tmppush; - } else lc_error("Too many cases in a switch."); - } -break; -case 142: -{ - } -break; -case 143: -{ - struct opvar *tmppush = New(struct opvar); - - if (switch_default_case) - lc_error("Switch default case already used."); - - set_opvar_int(tmppush, splev->n_opcodes); - switch_default_case = tmppush; - } -break; -case 144: -{ - } -break; -case 145: -{ - if (!allow_break_statements) - lc_error("Cannot use BREAK outside a statement block."); - else { - break_stmt_new(splev, splev->n_opcodes); - } - } -break; -case 148: -{ - char buf[256], buf2[256]; - - if (n_forloops >= MAX_NESTED_IFS) { - lc_error("FOR: Too deeply nested loops."); - n_forloops = MAX_NESTED_IFS - 1; - } - - /* first, define a variable for the for-loop end value */ - Sprintf(buf, "%s end", yyvsp[-4].map); - /* the value of which is already in stack (the 2nd math_expr) */ - add_opvars(splev, "iso", VA_PASS3(0, buf, SPO_VAR_INIT)); - - vardefs = add_vardef_type(vardefs, yyvsp[-4].map, SPOVAR_INT); - /* define the for-loop variable. value is in stack (1st math_expr) */ - add_opvars(splev, "iso", VA_PASS3(0, yyvsp[-4].map, SPO_VAR_INIT)); - - /* calculate value for the loop "step" variable */ - Sprintf(buf2, "%s step", yyvsp[-4].map); - /* end - start */ - add_opvars(splev, "vvo", - VA_PASS3(buf, yyvsp[-4].map, SPO_MATH_SUB)); - /* sign of that */ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_SIGN)); - /* save the sign into the step var */ - add_opvars(splev, "iso", - VA_PASS3(0, buf2, SPO_VAR_INIT)); - - forloop_list[n_forloops].varname = strdup(yyvsp[-4].map); - forloop_list[n_forloops].jmp_point = splev->n_opcodes; - - n_forloops++; - Free(yyvsp[-4].map); - } -break; -case 149: -{ - /* nothing */ - break_stmt_start(); - } -break; -case 150: -{ - int l; - char buf[256], buf2[256]; - - n_forloops--; - Sprintf(buf, "%s step", forloop_list[n_forloops].varname); - Sprintf(buf2, "%s end", forloop_list[n_forloops].varname); - /* compare for-loop var to end value */ - add_opvars(splev, "vvo", - VA_PASS3(forloop_list[n_forloops].varname, - buf2, SPO_CMP)); - /* var + step */ - add_opvars(splev, "vvo", - VA_PASS3(buf, forloop_list[n_forloops].varname, - SPO_MATH_ADD)); - /* for-loop var = (for-loop var + step) */ - add_opvars(splev, "iso", - VA_PASS3(0, forloop_list[n_forloops].varname, - SPO_VAR_INIT)); - /* jump back if compared values were not equal */ - l = (int) (forloop_list[n_forloops].jmp_point - - splev->n_opcodes - 1); - add_opvars(splev, "io", VA_PASS2(l, SPO_JNE)); - Free(forloop_list[n_forloops].varname); - break_stmt_end(splev); - } -break; -case 151: -{ - struct opvar *tmppush = New(struct opvar); - - if (n_if_list >= MAX_NESTED_IFS) { - lc_error("LOOP: Too deeply nested conditionals."); - n_if_list = MAX_NESTED_IFS - 1; - } - set_opvar_int(tmppush, splev->n_opcodes); - if_list[n_if_list++] = tmppush; - - add_opvars(splev, "o", VA_PASS1(SPO_DEC)); - break_stmt_start(); - } -break; -case 152: -{ - struct opvar *tmppush; - - add_opvars(splev, "oio", VA_PASS3(SPO_COPY, 0, SPO_CMP)); - - tmppush = (struct opvar *) if_list[--n_if_list]; - set_opvar_int(tmppush, - tmppush->vardata.l - splev->n_opcodes-1); - add_opcode(splev, SPO_PUSH, tmppush); - add_opcode(splev, SPO_JG, NULL); - add_opcode(splev, SPO_POP, NULL); /* discard count */ - break_stmt_end(splev); - } -break; -case 153: -{ - struct opvar *tmppush2 = New(struct opvar); - - if (n_if_list >= MAX_NESTED_IFS) { - lc_error("IF: Too deeply nested conditionals."); - n_if_list = MAX_NESTED_IFS - 1; - } - - add_opcode(splev, SPO_CMP, NULL); - - set_opvar_int(tmppush2, splev->n_opcodes+1); - - if_list[n_if_list++] = tmppush2; - - add_opcode(splev, SPO_PUSH, tmppush2); - - add_opcode(splev, reverse_jmp_opcode( yyvsp[-1].i ), NULL); - - } -break; -case 154: -{ - if (n_if_list > 0) { - struct opvar *tmppush; - - tmppush = (struct opvar *) if_list[--n_if_list]; - set_opvar_int(tmppush, - splev->n_opcodes - tmppush->vardata.l); - } else lc_error("IF: Huh?! No start address?"); - } -break; -case 155: -{ - struct opvar *tmppush2 = New(struct opvar); - - if (n_if_list >= MAX_NESTED_IFS) { - lc_error("IF: Too deeply nested conditionals."); - n_if_list = MAX_NESTED_IFS - 1; - } - - add_opcode(splev, SPO_CMP, NULL); - - set_opvar_int(tmppush2, splev->n_opcodes+1); - - if_list[n_if_list++] = tmppush2; - - add_opcode(splev, SPO_PUSH, tmppush2); - - add_opcode(splev, reverse_jmp_opcode( yyvsp[0].i ), NULL); - - } -break; -case 156: -{ - /* do nothing */ - } -break; -case 157: -{ - if (n_if_list > 0) { - struct opvar *tmppush; - - tmppush = (struct opvar *) if_list[--n_if_list]; - set_opvar_int(tmppush, - splev->n_opcodes - tmppush->vardata.l); - } else lc_error("IF: Huh?! No start address?"); - } -break; -case 158: -{ - if (n_if_list > 0) { - struct opvar *tmppush = New(struct opvar); - struct opvar *tmppush2; - - set_opvar_int(tmppush, splev->n_opcodes+1); - add_opcode(splev, SPO_PUSH, tmppush); - - add_opcode(splev, SPO_JMP, NULL); - - tmppush2 = (struct opvar *) if_list[--n_if_list]; - - set_opvar_int(tmppush2, - splev->n_opcodes - tmppush2->vardata.l); - if_list[n_if_list++] = tmppush; - } else lc_error("IF: Huh?! No else-part address?"); - } -break; -case 159: -{ - if (n_if_list > 0) { - struct opvar *tmppush; - tmppush = (struct opvar *) if_list[--n_if_list]; - set_opvar_int(tmppush, splev->n_opcodes - tmppush->vardata.l); - } else lc_error("IF: Huh?! No end address?"); - } -break; -case 160: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MESSAGE)); - } -break; -case 161: -{ - add_opvars(splev, "iiiiiio", - VA_PASS7(-1, 0, -1, -1, -1, -1, SPO_CORRIDOR)); - } -break; -case 162: -{ - add_opvars(splev, "iiiiiio", - VA_PASS7(-1, yyvsp[0].i, -1, -1, -1, -1, SPO_CORRIDOR)); - } -break; -case 163: -{ - add_opvars(splev, "iiiiiio", - VA_PASS7(-1, -1, -1, -1, -1, -1, SPO_CORRIDOR)); - } -break; -case 164: -{ - add_opvars(splev, "iiiiiio", - VA_PASS7(yyvsp[-2].corpos.room, yyvsp[-2].corpos.door, yyvsp[-2].corpos.wall, - yyvsp[0].corpos.room, yyvsp[0].corpos.door, yyvsp[0].corpos.wall, - SPO_CORRIDOR)); - } -break; -case 165: -{ - add_opvars(splev, "iiiiiio", - VA_PASS7(yyvsp[-2].corpos.room, yyvsp[-2].corpos.door, yyvsp[-2].corpos.wall, - -1, -1, (long)yyvsp[0].i, - SPO_CORRIDOR)); - } -break; -case 166: -{ - yyval.corpos.room = yyvsp[-5].i; - yyval.corpos.wall = yyvsp[-3].i; - yyval.corpos.door = yyvsp[-1].i; - } -break; -case 167: -{ - if ((yyvsp[-2].i < 100) && (yyvsp[-3].i == OROOM)) - lc_error("Only typed rooms can have a chance."); - else { - add_opvars(splev, "iii", - VA_PASS3((long)yyvsp[-3].i, (long)yyvsp[-2].i, (long)yyvsp[0].i)); - } - } -break; -case 168: -{ - long rflags = yyvsp[0].i; - - if (rflags == -1) rflags = (1 << 0); - add_opvars(splev, "iiiiiiio", - VA_PASS8(rflags, ERR, ERR, - yyvsp[-3].crd.x, yyvsp[-3].crd.y, yyvsp[-1].sze.width, yyvsp[-1].sze.height, - SPO_SUBROOM)); - break_stmt_start(); - } -break; -case 169: -{ - break_stmt_end(splev); - add_opcode(splev, SPO_ENDROOM, NULL); - } -break; -case 170: -{ - long rflags = yyvsp[-2].i; - - if (rflags == -1) rflags = (1 << 0); - add_opvars(splev, "iiiiiiio", - VA_PASS8(rflags, - yyvsp[-3].crd.x, yyvsp[-3].crd.y, yyvsp[-5].crd.x, yyvsp[-5].crd.y, - yyvsp[-1].sze.width, yyvsp[-1].sze.height, SPO_ROOM)); - break_stmt_start(); - } -break; -case 171: -{ - break_stmt_end(splev); - add_opcode(splev, SPO_ENDROOM, NULL); - } -break; -case 172: -{ - yyval.i = 1; - } -break; -case 173: -{ - yyval.i = yyvsp[0].i; - } -break; -case 174: -{ - if ( yyvsp[-3].i < 1 || yyvsp[-3].i > 5 || - yyvsp[-1].i < 1 || yyvsp[-1].i > 5 ) { - lc_error("Room positions should be between 1-5: (%li,%li)!", yyvsp[-3].i, yyvsp[-1].i); - } else { - yyval.crd.x = yyvsp[-3].i; - yyval.crd.y = yyvsp[-1].i; - } - } -break; -case 175: -{ - yyval.crd.x = yyval.crd.y = ERR; - } -break; -case 176: -{ - if ( yyvsp[-3].i < 0 || yyvsp[-1].i < 0) { - lc_error("Invalid subroom position (%li,%li)!", yyvsp[-3].i, yyvsp[-1].i); - } else { - yyval.crd.x = yyvsp[-3].i; - yyval.crd.y = yyvsp[-1].i; - } - } -break; -case 177: -{ - yyval.crd.x = yyval.crd.y = ERR; - } -break; -case 178: -{ - yyval.crd.x = yyvsp[-3].i; - yyval.crd.y = yyvsp[-1].i; - } -break; -case 179: -{ - yyval.crd.x = yyval.crd.y = ERR; - } -break; -case 180: -{ - yyval.sze.width = yyvsp[-3].i; - yyval.sze.height = yyvsp[-1].i; - } -break; -case 181: -{ - yyval.sze.height = yyval.sze.width = ERR; - } -break; -case 182: -{ - /* ERR means random here */ - if (yyvsp[-2].i == ERR && yyvsp[0].i != ERR) { - lc_error("If the door wall is random, so must be its pos!"); - } else { - add_opvars(splev, "iiiio", - VA_PASS5((long)yyvsp[0].i, (long)yyvsp[-4].i, (long)yyvsp[-6].i, - (long)yyvsp[-2].i, SPO_ROOM_DOOR)); - } - } -break; -case 183: -{ - add_opvars(splev, "io", VA_PASS2((long)yyvsp[-2].i, SPO_DOOR)); - } -break; -case 188: -{ - yyval.i = yyvsp[0].i; - } -break; -case 189: -{ - yyval.i = (yyvsp[-2].i | yyvsp[0].i); - } -break; -case 192: -{ - add_opvars(splev, "ciisiio", - VA_PASS7(0, 0, 1, (char *) 0, 0, 0, SPO_MAP)); - max_x_map = COLNO-1; - max_y_map = ROWNO; - } -break; -case 193: -{ - add_opvars(splev, "cii", - VA_PASS3(SP_COORD_PACK((yyvsp[-4].i), (yyvsp[-2].i)), - 1, (int) yyvsp[-1].i)); - scan_map(yyvsp[0].map, splev); - Free(yyvsp[0].map); - } -break; -case 194: -{ - add_opvars(splev, "ii", VA_PASS2(2, (int) yyvsp[-1].i)); - scan_map(yyvsp[0].map, splev); - Free(yyvsp[0].map); - } -break; -case 199: -{ - add_opvars(splev, "io", VA_PASS2(0, SPO_MONSTER)); - } -break; -case 200: -{ - add_opvars(splev, "io", VA_PASS2(1, SPO_MONSTER)); - in_container_obj++; - break_stmt_start(); - } -break; -case 201: -{ - break_stmt_end(splev); - in_container_obj--; - add_opvars(splev, "o", VA_PASS1(SPO_END_MONINVENT)); - } -break; -case 202: -{ - /* nothing */ - } -break; -case 203: -{ - struct opvar *stopit = New(struct opvar); - - set_opvar_int(stopit, SP_M_V_END); - add_opcode(splev, SPO_PUSH, stopit); - yyval.i = 0x0000; - } -break; -case 204: -{ - if (( yyvsp[-2].i & yyvsp[0].i )) - lc_error("MONSTER extra info defined twice."); - yyval.i = ( yyvsp[-2].i | yyvsp[0].i ); - } -break; -case 205: -{ - add_opvars(splev, "i", VA_PASS1(SP_M_V_NAME)); - yyval.i = 0x0001; - } -break; -case 206: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[0].i, SP_M_V_PEACEFUL)); - yyval.i = 0x0002; - } -break; -case 207: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[0].i, SP_M_V_ASLEEP)); - yyval.i = 0x0004; - } -break; -case 208: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[0].i, SP_M_V_ALIGN)); - yyval.i = 0x0008; - } -break; -case 209: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[-1].i, SP_M_V_APPEAR)); - yyval.i = 0x0010; - } -break; -case 210: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_FEMALE)); - yyval.i = 0x0020; - } -break; -case 211: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_INVIS)); - yyval.i = 0x0040; - } -break; -case 212: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_CANCELLED)); - yyval.i = 0x0080; - } -break; -case 213: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_REVIVED)); - yyval.i = 0x0100; - } -break; -case 214: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_AVENGE)); - yyval.i = 0x0200; - } -break; -case 215: -{ - add_opvars(splev, "i", VA_PASS1(SP_M_V_FLEEING)); - yyval.i = 0x0400; - } -break; -case 216: -{ - add_opvars(splev, "i", VA_PASS1(SP_M_V_BLINDED)); - yyval.i = 0x0800; - } -break; -case 217: -{ - add_opvars(splev, "i", VA_PASS1(SP_M_V_PARALYZED)); - yyval.i = 0x1000; - } -break; -case 218: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_STUNNED)); - yyval.i = 0x2000; - } -break; -case 219: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_M_V_CONFUSED)); - yyval.i = 0x4000; - } -break; -case 220: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[0].i, SP_M_V_SEENTRAPS)); - yyval.i = 0x8000; - } -break; -case 221: -{ - int token = get_trap_type(yyvsp[0].map); - - if (token == ERR || token == 0) - lc_error("Unknown trap type '%s'!", yyvsp[0].map); - Free(yyvsp[0].map); - yyval.i = (1L << (token - 1)); - } -break; -case 222: -{ - yyval.i = (long) ~0; - } -break; -case 223: -{ - int token = get_trap_type(yyvsp[-2].map); - if (token == ERR || token == 0) - lc_error("Unknown trap type '%s'!", yyvsp[-2].map); - - if ((1L << (token - 1)) & yyvsp[0].i) - lc_error("Monster seen_traps, trap '%s' listed twice.", yyvsp[-2].map); - Free(yyvsp[-2].map); - yyval.i = ((1L << (token - 1)) | yyvsp[0].i); - } -break; -case 224: -{ - int cnt = 0; - - if (in_container_obj) - cnt |= SP_OBJ_CONTENT; - add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT)); - } -break; -case 225: -{ - int cnt = SP_OBJ_CONTAINER; - - if (in_container_obj) - cnt |= SP_OBJ_CONTENT; - add_opvars(splev, "io", VA_PASS2(cnt, SPO_OBJECT)); - in_container_obj++; - break_stmt_start(); - } -break; -case 226: -{ - break_stmt_end(splev); - in_container_obj--; - add_opcode(splev, SPO_POP_CONTAINER, NULL); - } -break; -case 227: -{ - if (( yyvsp[0].i & 0x4000) && in_container_obj) - lc_error("Object cannot have a coord when contained."); - else if (!( yyvsp[0].i & 0x4000) && !in_container_obj) - lc_error("Object needs a coord when not contained."); - } -break; -case 228: -{ - struct opvar *stopit = New(struct opvar); - set_opvar_int(stopit, SP_O_V_END); - add_opcode(splev, SPO_PUSH, stopit); - yyval.i = 0x00; - } -break; -case 229: -{ - if (( yyvsp[-2].i & yyvsp[0].i )) - lc_error("OBJECT extra info '%s' defined twice.", curr_token); - yyval.i = ( yyvsp[-2].i | yyvsp[0].i ); - } -break; -case 230: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[0].i, SP_O_V_CURSE)); - yyval.i = 0x0001; - } -break; -case 231: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_CORPSENM)); - yyval.i = 0x0002; - } -break; -case 232: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_SPE)); - yyval.i = 0x0004; - } -break; -case 233: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_NAME)); - yyval.i = 0x0008; - } -break; -case 234: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_QUAN)); - yyval.i = 0x0010; - } -break; -case 235: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_O_V_BURIED)); - yyval.i = 0x0020; - } -break; -case 236: -{ - add_opvars(splev, "ii", VA_PASS2((int) yyvsp[0].i, SP_O_V_LIT)); - yyval.i = 0x0040; - } -break; -case 237: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_ERODED)); - yyval.i = 0x0080; - } -break; -case 238: -{ - add_opvars(splev, "ii", VA_PASS2(-1, SP_O_V_ERODED)); - yyval.i = 0x0080; - } -break; -case 239: -{ - if (yyvsp[0].i == D_LOCKED) { - add_opvars(splev, "ii", VA_PASS2(1, SP_O_V_LOCKED)); - yyval.i = 0x0100; - } else if (yyvsp[0].i == D_BROKEN) { - add_opvars(splev, "ii", VA_PASS2(1, SP_O_V_BROKEN)); - yyval.i = 0x0200; - } else - lc_error("DOOR state can only be locked or broken."); - } -break; -case 240: -{ - add_opvars(splev, "ii", - VA_PASS2((int) yyvsp[0].i, SP_O_V_TRAPPED)); - yyval.i = 0x0400; - } -break; -case 241: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_RECHARGED)); - yyval.i = 0x0800; - } -break; -case 242: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_O_V_INVIS)); - yyval.i = 0x1000; - } -break; -case 243: -{ - add_opvars(splev, "ii", VA_PASS2(1, SP_O_V_GREASED)); - yyval.i = 0x2000; - } -break; -case 244: -{ - add_opvars(splev, "i", VA_PASS1(SP_O_V_COORD)); - yyval.i = 0x4000; - } -break; -case 245: -{ - add_opvars(splev, "io", VA_PASS2((int) yyvsp[-2].i, SPO_TRAP)); - } -break; -case 246: -{ - long dir, state = 0; - - /* convert dir from a DIRECTION to a DB_DIR */ - dir = yyvsp[-2].i; - switch (dir) { - case W_NORTH: dir = DB_NORTH; break; - case W_SOUTH: dir = DB_SOUTH; break; - case W_EAST: dir = DB_EAST; break; - case W_WEST: dir = DB_WEST; break; - default: - lc_error("Invalid drawbridge direction."); - break; - } - - if ( yyvsp[0].i == D_ISOPEN ) - state = 1; - else if ( yyvsp[0].i == D_CLOSED ) - state = 0; - else if ( yyvsp[0].i == -1 ) - state = -1; - else - lc_error("A drawbridge can only be open, closed or random!"); - add_opvars(splev, "iio", - VA_PASS3(state, dir, SPO_DRAWBRIDGE)); - } -break; -case 247: -{ - add_opvars(splev, "iiio", - VA_PASS4((int) yyvsp[0].i, 1, 0, SPO_MAZEWALK)); - } -break; -case 248: -{ - add_opvars(splev, "iiio", - VA_PASS4((int) yyvsp[-3].i, (int) yyvsp[-1].i, - (int) yyvsp[0].i, SPO_MAZEWALK)); - } -break; -case 249: -{ - add_opvars(splev, "rio", - VA_PASS3(SP_REGION_PACK(-1,-1,-1,-1), - 0, SPO_WALLIFY)); - } -break; -case 250: -{ - add_opvars(splev, "io", VA_PASS2(1, SPO_WALLIFY)); - } -break; -case 251: -{ - add_opvars(splev, "io", - VA_PASS2((int) yyvsp[0].i, SPO_LADDER)); - } -break; -case 252: -{ - add_opvars(splev, "io", - VA_PASS2((int) yyvsp[0].i, SPO_STAIR)); - } -break; -case 253: -{ - add_opvars(splev, "iiiii iiiii iiso", - VA_PASS14(yyvsp[-4].lregn.x1, yyvsp[-4].lregn.y1, yyvsp[-4].lregn.x2, yyvsp[-4].lregn.y2, yyvsp[-4].lregn.area, - yyvsp[-2].lregn.x1, yyvsp[-2].lregn.y1, yyvsp[-2].lregn.x2, yyvsp[-2].lregn.y2, yyvsp[-2].lregn.area, - (long) ((yyvsp[0].i) ? LR_UPSTAIR : LR_DOWNSTAIR), - 0, (char *) 0, SPO_LEVREGION)); - } -break; -case 254: -{ - add_opvars(splev, "iiiii iiiii iiso", - VA_PASS14(yyvsp[-4].lregn.x1, yyvsp[-4].lregn.y1, yyvsp[-4].lregn.x2, yyvsp[-4].lregn.y2, yyvsp[-4].lregn.area, - yyvsp[-2].lregn.x1, yyvsp[-2].lregn.y1, yyvsp[-2].lregn.x2, yyvsp[-2].lregn.y2, yyvsp[-2].lregn.area, - LR_PORTAL, 0, yyvsp[0].map, SPO_LEVREGION)); - Free(yyvsp[0].map); - } -break; -case 255: -{ - long rtyp = 0; - switch(yyvsp[0].i) { - case -1: rtyp = LR_TELE; break; - case 0: rtyp = LR_DOWNTELE; break; - case 1: rtyp = LR_UPTELE; break; - } - add_opvars(splev, "iiiii iiiii iiso", - VA_PASS14(yyvsp[-3].lregn.x1, yyvsp[-3].lregn.y1, yyvsp[-3].lregn.x2, yyvsp[-3].lregn.y2, yyvsp[-3].lregn.area, - yyvsp[-1].lregn.x1, yyvsp[-1].lregn.y1, yyvsp[-1].lregn.x2, yyvsp[-1].lregn.y2, yyvsp[-1].lregn.area, - rtyp, 0, (char *)0, SPO_LEVREGION)); - } -break; -case 256: -{ - add_opvars(splev, "iiiii iiiii iiso", - VA_PASS14(yyvsp[-2].lregn.x1, yyvsp[-2].lregn.y1, yyvsp[-2].lregn.x2, yyvsp[-2].lregn.y2, yyvsp[-2].lregn.area, - yyvsp[0].lregn.x1, yyvsp[0].lregn.y1, yyvsp[0].lregn.x2, yyvsp[0].lregn.y2, yyvsp[0].lregn.area, - (long) LR_BRANCH, 0, - (char *) 0, SPO_LEVREGION)); - } -break; -case 257: -{ - yyval.i = -1; - } -break; -case 258: -{ - yyval.i = yyvsp[0].i; - } -break; -case 259: -{ - add_opvars(splev, "o", VA_PASS1(SPO_FOUNTAIN)); - } -break; -case 260: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SINK)); - } -break; -case 261: -{ - add_opvars(splev, "o", VA_PASS1(SPO_POOL)); - } -break; -case 262: -{ - yyval.terr.lit = -2; - yyval.terr.ter = what_map_char((char) yyvsp[0].i); - } -break; -case 263: -{ - yyval.terr.lit = yyvsp[-1].i; - yyval.terr.ter = what_map_char((char) yyvsp[-3].i); - } -break; -case 264: -{ - add_opvars(splev, "io", - VA_PASS2(yyvsp[0].i, SPO_REPLACETERRAIN)); - } -break; -case 265: -{ - add_opvars(splev, "o", VA_PASS1(SPO_TERRAIN)); - } -break; -case 266: -{ - add_opvars(splev, "o", VA_PASS1(SPO_NON_DIGGABLE)); - } -break; -case 267: -{ - add_opvars(splev, "o", VA_PASS1(SPO_NON_PASSWALL)); - } -break; -case 268: -{ - long irr; - long rt = yyvsp[-1].i; - long rflags = yyvsp[0].i; - - if (rflags == -1) rflags = (1 << 0); - if (!(rflags & 1)) rt += MAXRTYPE+1; - irr = ((rflags & 2) != 0); - add_opvars(splev, "iiio", - VA_PASS4((long)yyvsp[-3].i, rt, rflags, SPO_REGION)); - yyval.i = (irr || (rflags & 1) || rt != OROOM); - break_stmt_start(); - } -break; -case 269: -{ - break_stmt_end(splev); - if ( yyvsp[-1].i ) { - add_opcode(splev, SPO_ENDROOM, NULL); - } else if ( yyvsp[0].i ) - lc_error("Cannot use lev statements in non-permanent REGION"); - } -break; -case 270: -{ - yyval.i = 0; - } -break; -case 271: -{ - yyval.i = yyvsp[0].i; - } -break; -case 272: -{ - add_opvars(splev, "iio", - VA_PASS3((long)yyvsp[0].i, (long)yyvsp[-2].i, SPO_ALTAR)); - } -break; -case 273: -{ - add_opvars(splev, "io", VA_PASS2(2, SPO_GRAVE)); - } -break; -case 274: -{ - add_opvars(splev, "sio", - VA_PASS3((char *)0, 1, SPO_GRAVE)); - } -break; -case 275: -{ - add_opvars(splev, "sio", - VA_PASS3((char *)0, 0, SPO_GRAVE)); - } -break; -case 276: -{ - add_opvars(splev, "o", VA_PASS1(SPO_GOLD)); - } -break; -case 277: -{ - add_opvars(splev, "io", - VA_PASS2((long)yyvsp[-2].i, SPO_ENGRAVING)); - } -break; -case 278: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MINERALIZE)); - } -break; -case 279: -{ - add_opvars(splev, "iiiio", - VA_PASS5(-1L, -1L, -1L, -1L, SPO_MINERALIZE)); - } -break; -case 280: -{ - int token = get_trap_type(yyvsp[0].map); - if (token == ERR) - lc_error("Unknown trap type '%s'!", yyvsp[0].map); - yyval.i = token; - Free(yyvsp[0].map); - } -break; -case 282: -{ - int token = get_room_type(yyvsp[0].map); - if (token == ERR) { - lc_warning("Unknown room type \"%s\"! Making ordinary room...", yyvsp[0].map); - yyval.i = OROOM; - } else - yyval.i = token; - Free(yyvsp[0].map); - } -break; -case 284: -{ - yyval.i = -1; - } -break; -case 285: -{ - yyval.i = yyvsp[0].i; - } -break; -case 286: -{ - yyval.i = yyvsp[0].i; - } -break; -case 287: -{ - yyval.i = yyvsp[-2].i | yyvsp[0].i; - } -break; -case 288: -{ - yyval.i = (yyvsp[0].i << 0); - } -break; -case 289: -{ - yyval.i = (yyvsp[0].i << 1); - } -break; -case 290: -{ - yyval.i = (yyvsp[0].i << 2); - } -break; -case 297: -{ - yyval.i = - MAX_REGISTERS - 1; - } -break; -case 300: -{ - yyval.i = - MAX_REGISTERS - 1; - } -break; -case 303: -{ - if ( yyvsp[-1].i >= 3 ) - lc_error("Register Index overflow!"); - else - yyval.i = - yyvsp[-1].i - 1; - } -break; -case 304: -{ - add_opvars(splev, "s", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 305: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_STRING); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 306: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_STRING | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - } -break; -case 307: -{ - /* nothing */ - } -break; -case 308: -{ - add_opvars(splev, "c", VA_PASS1(yyvsp[0].i)); - } -break; -case 309: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_RNDCOORD)); - } -break; -case 310: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_COORD); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 311: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_COORD | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - } -break; -case 312: -{ - if (yyvsp[-3].i < 0 || yyvsp[-1].i < 0 || yyvsp[-3].i >= COLNO || yyvsp[-1].i >= ROWNO) - lc_error("Coordinates (%li,%li) out of map range!", - yyvsp[-3].i, yyvsp[-1].i); - yyval.i = SP_COORD_PACK(yyvsp[-3].i, yyvsp[-1].i); - } -break; -case 313: -{ - yyval.i = SP_COORD_PACK_RANDOM(0); - } -break; -case 314: -{ - yyval.i = SP_COORD_PACK_RANDOM(yyvsp[-1].i); - } -break; -case 315: -{ - yyval.i = yyvsp[0].i; - } -break; -case 316: -{ - if ((yyvsp[-2].i & yyvsp[0].i)) - lc_warning("Humidity flag used twice."); - yyval.i = (yyvsp[-2].i | yyvsp[0].i); - } -break; -case 317: -{ - /* nothing */ - } -break; -case 318: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_REGION); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 319: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_REGION | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - } -break; -case 320: -{ - long r = SP_REGION_PACK(yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - - if (yyvsp[-7].i > yyvsp[-3].i || yyvsp[-5].i > yyvsp[-1].i) - lc_error("Region start > end: (%ld,%ld,%ld,%ld)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - - add_opvars(splev, "r", VA_PASS1(r)); - yyval.i = r; - } -break; -case 321: -{ - add_opvars(splev, "m", VA_PASS1(yyvsp[0].i)); - } -break; -case 322: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_MAPCHAR); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 323: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_MAPCHAR | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - } -break; -case 324: -{ - if (what_map_char((char) yyvsp[0].i) != INVALID_TYPE) - yyval.i = SP_MAPCHAR_PACK(what_map_char((char) yyvsp[0].i), -2); - else { - lc_error("Unknown map char type '%c'!", yyvsp[0].i); - yyval.i = SP_MAPCHAR_PACK(STONE, -2); - } - } -break; -case 325: -{ - if (what_map_char((char) yyvsp[-3].i) != INVALID_TYPE) - yyval.i = SP_MAPCHAR_PACK(what_map_char((char) yyvsp[-3].i), yyvsp[-1].i); - else { - lc_error("Unknown map char type '%c'!", yyvsp[-3].i); - yyval.i = SP_MAPCHAR_PACK(STONE, yyvsp[-1].i); - } - } -break; -case 326: -{ - add_opvars(splev, "M", VA_PASS1(yyvsp[0].i)); - } -break; -case 327: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_MONST); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 328: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_MONST | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - } -break; -case 329: -{ - long m = get_monster_id(yyvsp[0].map, (char)0); - if (m == ERR) { - lc_error("Unknown monster \"%s\"!", yyvsp[0].map); - yyval.i = -1; - } else - yyval.i = SP_MONST_PACK(m, - def_monsyms[(int) mons[m].mlet].sym); - Free(yyvsp[0].map); - } -break; -case 330: -{ - if (check_monster_char((char) yyvsp[0].i)) - yyval.i = SP_MONST_PACK(-1, yyvsp[0].i); - else { - lc_error("Unknown monster class '%c'!", yyvsp[0].i); - yyval.i = -1; - } - } -break; -case 331: -{ - long m = get_monster_id(yyvsp[-1].map, (char) yyvsp[-3].i); - if (m == ERR) { - lc_error("Unknown monster ('%c', \"%s\")!", yyvsp[-3].i, yyvsp[-1].map); - yyval.i = -1; - } else - yyval.i = SP_MONST_PACK(m, yyvsp[-3].i); - Free(yyvsp[-1].map); - } -break; -case 332: -{ - yyval.i = -1; - } -break; -case 333: -{ - add_opvars(splev, "O", VA_PASS1(yyvsp[0].i)); - } -break; -case 334: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_OBJ); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 335: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_OBJ | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - } -break; -case 336: -{ - long m = get_object_id(yyvsp[0].map, (char)0); - if (m == ERR) { - lc_error("Unknown object \"%s\"!", yyvsp[0].map); - yyval.i = -1; - } else - /* obj class != 0 to force generation of a specific item */ - yyval.i = SP_OBJ_PACK(m, 1); - Free(yyvsp[0].map); - } -break; -case 337: -{ - if (check_object_char((char) yyvsp[0].i)) - yyval.i = SP_OBJ_PACK(-1, yyvsp[0].i); - else { - lc_error("Unknown object class '%c'!", yyvsp[0].i); - yyval.i = -1; - } - } -break; -case 338: -{ - long m = get_object_id(yyvsp[-1].map, (char) yyvsp[-3].i); - if (m == ERR) { - lc_error("Unknown object ('%c', \"%s\")!", yyvsp[-3].i, yyvsp[-1].map); - yyval.i = -1; - } else - yyval.i = SP_OBJ_PACK(m, yyvsp[-3].i); - Free(yyvsp[-1].map); - } -break; -case 339: -{ - yyval.i = -1; - } -break; -case 340: -{ } -break; -case 341: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_ADD)); - } -break; -case 342: -{ - add_opvars(splev, "i", VA_PASS1(yyvsp[0].i)); - } -break; -case 343: -{ - is_inconstant_number = 1; - } -break; -case 344: -{ - add_opvars(splev, "i", VA_PASS1(yyvsp[-1].i)); - } -break; -case 345: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_INT); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - is_inconstant_number = 1; - } -break; -case 346: -{ - check_vardef_type(vardefs, yyvsp[-3].map, - SPOVAR_INT | SPOVAR_ARRAY); - vardef_used(vardefs, yyvsp[-3].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[-3].map)); - Free(yyvsp[-3].map); - is_inconstant_number = 1; - } -break; -case 347: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_ADD)); - } -break; -case 348: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_SUB)); - } -break; -case 349: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_MUL)); - } -break; -case 350: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_DIV)); - } -break; -case 351: -{ - add_opvars(splev, "o", VA_PASS1(SPO_MATH_MOD)); - } -break; -case 352: -{ } -break; -case 353: -{ - if (!strcmp("int", yyvsp[0].map) || !strcmp("integer", yyvsp[0].map)) { - yyval.i = (int)'i'; - } else - lc_error("Unknown function parameter type '%s'", yyvsp[0].map); - } -break; -case 354: -{ - if (!strcmp("str", yyvsp[0].map) || !strcmp("string", yyvsp[0].map)) { - yyval.i = (int)'s'; - } else - lc_error("Unknown function parameter type '%s'", yyvsp[0].map); - } -break; -case 355: -{ - struct lc_funcdefs_parm *tmp = New(struct lc_funcdefs_parm); - - if (!curr_function) { - lc_error("Function parameters outside function definition."); - } else if (!tmp) { - lc_error("Could not alloc function params."); - } else { - long vt = SPOVAR_NULL; - - tmp->name = strdup(yyvsp[-2].map); - tmp->parmtype = (char) yyvsp[0].i; - tmp->next = curr_function->params; - curr_function->params = tmp; - curr_function->n_params++; - switch (tmp->parmtype) { - case 'i': - vt = SPOVAR_INT; - break; - case 's': - vt = SPOVAR_STRING; - break; - default: - lc_error("Unknown func param conversion."); - break; - } - vardefs = add_vardef_type( vardefs, yyvsp[-2].map, vt); - } - Free(yyvsp[-2].map); - } -break; -case 360: -{ - yyval.i = (int)'i'; - } -break; -case 361: -{ - yyval.i = (int)'s'; - } -break; -case 362: -{ - char tmpbuf[2]; - tmpbuf[0] = (char) yyvsp[0].i; - tmpbuf[1] = '\0'; - yyval.map = strdup(tmpbuf); - } -break; -case 363: -{ - long len = strlen( yyvsp[-2].map ); - char *tmp = (char *) alloc(len + 2); - sprintf(tmp, "%c%s", (char) yyvsp[0].i, yyvsp[-2].map ); - Free( yyvsp[-2].map ); - yyval.map = tmp; - } -break; -case 364: -{ - yyval.map = strdup(""); - } -break; -case 365: -{ - char *tmp = strdup( yyvsp[0].map ); - Free( yyvsp[0].map ); - yyval.map = tmp; - } -break; -case 366: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_POINT)); - } -break; -case 367: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_RECT)); - } -break; -case 368: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_FILLRECT)); - } -break; -case 369: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_LINE)); - } -break; -case 370: -{ - /* randline (x1,y1),(x2,y2), roughness */ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_RNDLINE)); - } -break; -case 371: -{ - add_opvars(splev, "io", VA_PASS2(W_ANY, SPO_SEL_GROW)); - } -break; -case 372: -{ - add_opvars(splev, "io", VA_PASS2(yyvsp[-3].i, SPO_SEL_GROW)); - } -break; -case 373: -{ - add_opvars(splev, "iio", - VA_PASS3(yyvsp[-3].i, SPOFILTER_PERCENT, SPO_SEL_FILTER)); - } -break; -case 374: -{ - add_opvars(splev, "io", - VA_PASS2(SPOFILTER_SELECTION, SPO_SEL_FILTER)); - } -break; -case 375: -{ - add_opvars(splev, "io", - VA_PASS2(SPOFILTER_MAPCHAR, SPO_SEL_FILTER)); - } -break; -case 376: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_FLOOD)); - } -break; -case 377: -{ - add_opvars(splev, "oio", - VA_PASS3(SPO_COPY, 1, SPO_SEL_ELLIPSE)); - } -break; -case 378: -{ - add_opvars(splev, "oio", - VA_PASS3(SPO_COPY, yyvsp[-1].i, SPO_SEL_ELLIPSE)); - } -break; -case 379: -{ - add_opvars(splev, "io", VA_PASS2(1, SPO_SEL_ELLIPSE)); - } -break; -case 380: -{ - add_opvars(splev, "io", VA_PASS2(yyvsp[-1].i, SPO_SEL_ELLIPSE)); - } -break; -case 381: -{ - add_opvars(splev, "iio", - VA_PASS3(yyvsp[-5].i, yyvsp[-11].i, SPO_SEL_GRADIENT)); - } -break; -case 382: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_COMPLEMENT)); - } -break; -case 383: -{ - check_vardef_type(vardefs, yyvsp[0].map, SPOVAR_SEL); - vardef_used(vardefs, yyvsp[0].map); - add_opvars(splev, "v", VA_PASS1(yyvsp[0].map)); - Free(yyvsp[0].map); - } -break; -case 384: -{ - /* nothing */ - } -break; -case 385: -{ - /* nothing */ - } -break; -case 386: -{ - add_opvars(splev, "o", VA_PASS1(SPO_SEL_ADD)); - } -break; -case 387: -{ - add_opvars(splev, "iio", - VA_PASS3(yyvsp[0].dice.num, yyvsp[0].dice.die, SPO_DICE)); - } -break; -case 391: -{ - add_opvars(splev, "i", VA_PASS1(yyvsp[0].i)); - } -break; -case 392: -{ - add_opvars(splev, "i", VA_PASS1(yyvsp[0].i)); - } -break; -case 393: -{ - add_opvars(splev, "i", VA_PASS1(yyvsp[0].i)); - } -break; -case 394: -{ - /* nothing */ - } -break; -case 403: -{ - yyval.lregn = yyvsp[0].lregn; - } -break; -case 404: -{ - if (yyvsp[-7].i <= 0 || yyvsp[-7].i >= COLNO) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of level range (x1)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - else if (yyvsp[-5].i < 0 || yyvsp[-5].i >= ROWNO) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of level range (y1)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - else if (yyvsp[-3].i <= 0 || yyvsp[-3].i >= COLNO) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of level range (x2)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - else if (yyvsp[-1].i < 0 || yyvsp[-1].i >= ROWNO) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of level range (y2)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - yyval.lregn.x1 = yyvsp[-7].i; - yyval.lregn.y1 = yyvsp[-5].i; - yyval.lregn.x2 = yyvsp[-3].i; - yyval.lregn.y2 = yyvsp[-1].i; - yyval.lregn.area = 1; - } -break; -case 405: -{ -/* This series of if statements is a hack for MSC 5.1. It seems that its - tiny little brain cannot compile if these are all one big if statement. */ - if (yyvsp[-7].i < 0 || yyvsp[-7].i > (int) max_x_map) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of map range (x1)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - else if (yyvsp[-5].i < 0 || yyvsp[-5].i > (int) max_y_map) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of map range (y1)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - else if (yyvsp[-3].i < 0 || yyvsp[-3].i > (int) max_x_map) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of map range (x2)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - else if (yyvsp[-1].i < 0 || yyvsp[-1].i > (int) max_y_map) - lc_error( - "Region (%ld,%ld,%ld,%ld) out of map range (y2)!", - yyvsp[-7].i, yyvsp[-5].i, yyvsp[-3].i, yyvsp[-1].i); - yyval.lregn.area = 0; - yyval.lregn.x1 = yyvsp[-7].i; - yyval.lregn.y1 = yyvsp[-5].i; - yyval.lregn.x2 = yyvsp[-3].i; - yyval.lregn.y2 = yyvsp[-1].i; - } -break; - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state 0 to\ - state %d\n", YYPREFIX, YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) != 0 && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/sys/share/nhlan.c b/sys/share/nhlan.c deleted file mode 100644 index b9384ace1..000000000 --- a/sys/share/nhlan.c +++ /dev/null @@ -1,45 +0,0 @@ -/* NetHack 3.6 nhlan.c $NHDT-Date: 1432512786 2015/05/25 00:13:06 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (c) Michael Allison, 1997 */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * Currently shared by the following ports: - * WIN32 - * - * The code in here is used to take advantage of added features - * that might be available in a Local Area Network environment. - * - * Network Username of player - */ - -#include "hack.h" -#include - -#ifdef LAN_FEATURES - -void -init_lan_features() -{ - lan_username(); -} -/* - * The get_lan_username() call is a required call, since some of - * the other LAN features depend on a unique username being available. - * - */ -char lusername[MAX_LAN_USERNAME]; -int lusername_size = MAX_LAN_USERNAME; - -char * -lan_username() -{ - char *lu; - lu = get_username(&lusername_size); - if (lu) { - Strcpy(lusername, lu); - return lusername; - } else - return (char *) 0; -} -#endif /*LAN_FEATURES*/ -/*nhlan.c*/ diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c index 6e26cef4e..24495392b 100644 --- a/sys/share/pcmain.c +++ b/sys/share/pcmain.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pcmain.c $NHDT-Date: 1543465755 2018/11/29 04:29:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.101 $ */ +/* NetHack 5.0 pcmain.c $NHDT-Date: 1693359605 2023/08/30 01:40:05 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.133 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -12,8 +12,6 @@ #include #endif -#include - #if !defined(AMIGA) && !defined(__DJGPP__) #include #else @@ -24,6 +22,7 @@ #include /* for getcwd() prototype */ #endif +char *exepath(char *); char orgdir[PATHLEN]; /* also used in pcsys.c, amidos.c */ #ifdef TOS @@ -35,28 +34,25 @@ long _stksize = 16 * 1024; #ifdef AMIGA extern int bigscreen; -void NDECL(preserve_icon); +void preserve_icon(void); +void amiga_self_assign(void); #endif -STATIC_DCL void FDECL(process_options, (int argc, char **argv)); -STATIC_DCL void NDECL(nhusage); - -#if defined(MICRO) || defined(OS2) -extern void FDECL(nethack_exit, (int)); -#else -#define nethack_exit exit -#endif +static void process_options(int argc, char **argv); +static void nhusage(void); -#ifdef EXEPATH -STATIC_DCL char *FDECL(exepath, (char *)); -#endif +#ifdef PORT_HELP +#if defined(MSDOS) +void port_help(void); +#endif /* MSDOS */ +#endif /* PORT_HELP */ -int FDECL(main, (int, char **)); +int main(int, char **); -extern boolean FDECL(pcmain, (int, char **)); +extern boolean pcmain(int, char **); #if defined(__BORLANDC__) -void NDECL(startup); +void startup(void); unsigned _stklen = STKSIZ; #endif @@ -66,16 +62,14 @@ unsigned _stklen = STKSIZ; */ int #ifndef __MINGW32__ -main(argc, argv) +main(int argc, char *argv[]) #else -mingw_main(argc, argv) +mingw_main(int argc, char *argv[]) #endif -int argc; -char *argv[]; { boolean resuming; - sys_early_init(); + early_init(argc, argv); resuming = pcmain(argc, argv); moveloop(resuming); nethack_exit(EXIT_SUCCESS); @@ -84,12 +78,10 @@ char *argv[]; } boolean -pcmain(argc, argv) -int argc; -char *argv[]; +pcmain(int argc, char *argv[]) { - register int fd; - register char *dir; + NHFILE *nhfp; + char *dir; #if defined(MSDOS) char *envp = NULL; char *sptr = NULL; @@ -129,14 +121,15 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ #ifdef TOS long clock_time; if (*argv[0]) { /* only a CLI can give us argv[0] */ - hname = argv[0]; + gh.hname = argv[0]; run_from_desktop = FALSE; } else #endif - hname = "NetHack"; /* used for syntax messages */ + gh.hname = "NetHack"; /* used for syntax messages */ choose_windows(DEFAULT_WINDOW_SYS); + #if !defined(AMIGA) && !defined(GNUDOS) /* Save current directory and make sure it gets restored when * the game is exited. @@ -156,6 +149,10 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ if (dir == (char *) 0) dir = exepath(argv[0]); #endif +#if defined(AMIGA) && defined(HACKDIR) + if (dir == (char *) 0) + dir = HACKDIR; +#endif #ifdef _MSC_VER if (IsDebuggerPresent()) { static char exepath[_MAX_PATH]; @@ -183,34 +180,34 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ int fd; boolean have_syscf = FALSE; - (void) strncpy(hackdir, dir, PATHLEN - 1); - hackdir[PATHLEN - 1] = '\0'; + (void) strncpy(gh.hackdir, dir, PATHLEN - 1); + gh.hackdir[PATHLEN - 1] = '\0'; #ifdef NOCWD_ASSUMPTIONS { int prefcnt; - fqn_prefix[0] = (char *) alloc(strlen(hackdir) + 2); - Strcpy(fqn_prefix[0], hackdir); - append_slash(fqn_prefix[0]); + gf.fqn_prefix[0] = (char *) alloc(strlen(gh.hackdir) + 2); + Strcpy(gf.fqn_prefix[0], gh.hackdir); + append_slash(gf.fqn_prefix[0]); for (prefcnt = 1; prefcnt < PREFIX_COUNT; prefcnt++) - fqn_prefix[prefcnt] = fqn_prefix[0]; + gf.fqn_prefix[prefcnt] = gf.fqn_prefix[0]; #if defined(MSDOS) /* sysconf should be searched for in this location */ envp = nh_getenv("COMMONPROGRAMFILES"); if (envp) { - if ((sptr = index(envp, ';')) != 0) + if ((sptr = strchr(envp, ';')) != 0) *sptr = '\0'; if (strlen(envp) > 0) { - fqn_prefix[SYSCONFPREFIX] = + gf.fqn_prefix[SYSCONFPREFIX] = (char *) alloc(strlen(envp) + 10); - Strcpy(fqn_prefix[SYSCONFPREFIX], envp); - append_slash(fqn_prefix[SYSCONFPREFIX]); - Strcat(fqn_prefix[SYSCONFPREFIX], "NetHack\\"); + Strcpy(gf.fqn_prefix[SYSCONFPREFIX], envp); + append_slash(gf.fqn_prefix[SYSCONFPREFIX]); + Strcat(gf.fqn_prefix[SYSCONFPREFIX], "NetHack\\"); } } - /* okay so we have the overriding and definitive locaton + /* okay so we have the overriding and definitive location for sysconf, but only in the event that there is not a sysconf file there (for whatever reason), check a secondary location rather than abort. */ @@ -227,7 +224,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ /* No SYSCF_FILE where there should be one, and without an installer, a user may not be able to place one there. So, let's try somewhere else... */ - fqn_prefix[SYSCONFPREFIX] = fqn_prefix[0]; + gf.fqn_prefix[SYSCONFPREFIX] = gf.fqn_prefix[0]; /* Is there a SYSCF_FILE there? */ fd = open(fqname(SYSCF_FILE, SYSCONFPREFIX, 0), O_RDONLY); @@ -242,13 +239,13 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ * overridden */ envp = nh_getenv("USERPROFILE"); if (envp) { - if ((sptr = index(envp, ';')) != 0) + if ((sptr = strchr(envp, ';')) != 0) *sptr = '\0'; if (strlen(envp) > 0) { - fqn_prefix[CONFIGPREFIX] = + gf.fqn_prefix[CONFIGPREFIX] = (char *) alloc(strlen(envp) + 2); - Strcpy(fqn_prefix[CONFIGPREFIX], envp); - append_slash(fqn_prefix[CONFIGPREFIX]); + Strcpy(gf.fqn_prefix[CONFIGPREFIX], envp); + append_slash(gf.fqn_prefix[CONFIGPREFIX]); } } #endif @@ -259,6 +256,8 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ #endif } #ifdef AMIGA + /* Point NetHack: at our program directory; covers CLI and WB launch. */ + amiga_self_assign(); #ifdef CHDIR /* * If we're dealing with workbench, change the directory. Otherwise @@ -268,7 +267,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ if (argc == 0) chdirx(HACKDIR, 1); #endif - ami_wininit_data(); + ami_wininit_data(WININIT); #endif initoptions(); @@ -280,15 +279,15 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ } #endif -#if defined(TOS) && defined(TEXTCOLOR) +#if defined(TOS) if (iflags.BIOS && iflags.use_color) set_colors(); #endif - if (!hackdir[0]) + if (!gh.hackdir[0]) #if !defined(LATTICE) && !defined(AMIGA) - Strcpy(hackdir, orgdir); + Strcpy(gh.hackdir, orgdir); #else - Strcpy(hackdir, HACKDIR); + Strcpy(gh.hackdir, HACKDIR); #endif if (argc > 1) { if (argcheck(argc, argv, ARG_VERSION) == 2) @@ -297,7 +296,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ if (argcheck(argc, argv, ARG_DEBUG) == 1) { argc--; argv++; - } + } if (argc > 1 && !strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page @@ -315,7 +314,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ } if (!*dir) error("Flag -d must be followed by a directory name."); - Strcpy(hackdir, dir); + Strcpy(gh.hackdir, dir); } if (argc > 1) { /* @@ -324,7 +323,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ */ if (!strncmp(argv[1], "-s", 2)) { #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) - chdirx(hackdir, 0); + chdirx(gh.hackdir, 0); #endif #ifdef SYSCF initoptions(); @@ -364,7 +363,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ * code parallel to other ports. */ #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) - chdirx(hackdir, 1); + chdirx(gh.hackdir, 1); #endif #if defined(MSDOS) @@ -383,13 +382,6 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ process_options(argc, argv); #endif -#ifdef MFLOPPY - set_lock_and_bones(); -#ifndef AMIGA - copybones(FROMPERM); -#endif -#endif - /* strip role,race,&c suffix; calls askname() if plname[] is empty or holds a generic user name like "player" or "games" */ plnamesuffix(); @@ -419,40 +411,35 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ * overwritten without confirmation when a user starts up * another game with the same player name. */ - Strcpy(lock, plname); - regularize(lock); + Strcpy(gl.lock, svp.plname); + regularize(gl.lock); getlock(); #else /* What follows is !PC_LOCKING */ #ifdef AMIGA /* We'll put the bones & levels in the user specified directory \ -jhsa */ - Strcat(lock, plname); - Strcat(lock, ".99"); + Strcat(gl.lock, svp.plname); + Strcat(gl.lock, ".99"); #else -#ifndef MFLOPPY - /* I'm not sure what, if anything, is left here, but MFLOPPY has + /* I'm not sure what, if anything, is left here, but old MFLOPPY had * conflicts with set_lock_and_bones() in files.c. */ - Strcpy(lock, plname); - Strcat(lock, ".99"); - regularize(lock); /* is this necessary? */ + Strcpy(gl.lock, svp.plname); + Strcat(gl.lock, ".99"); + regularize(gl.lock); /* is this necessary? */ /* not compatible with full path a la AMIGA */ #endif -#endif #endif /* PC_LOCKING */ /* Set up level 0 file to keep the game state. */ - fd = create_levelfile(0, (char *) 0); - if (fd < 0) { + nhfp = create_levelfile(0, (char *) 0); + if (!nhfp) { raw_print("Cannot create lock file"); } else { - hackpid = 1; - write(fd, (genericptr_t) &hackpid, sizeof(hackpid)); - nhclose(fd); + svh.hackpid = 1; + Sfo_int(nhfp, &svh.hackpid, "svh.hackpid"); + close_nhfile(nhfp); } -#ifdef MFLOPPY - level_info[0].where = ACTIVE; -#endif /* * Initialize the vision system. This must be before mklev() on a @@ -460,13 +447,13 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ */ vision_init(); - display_gamewindows(); + init_sound_disp_gamewindows(); /* * First, try to find and restore a save file for specified character. * We'll return here if new game player_selection() renames the hero. */ attempt_restore: - if ((fd = restore_saved_game()) >= 0) { + if ((nhfp = restore_saved_game()) != 0) { #ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); #endif @@ -479,15 +466,15 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ pline("Restoring save file..."); mark_synch(); /* flush output */ - if (dorecover(fd)) { + if (dorecover(nhfp)) { resuming = TRUE; /* not starting new game */ if (discover) You("are in non-scoring discovery mode."); if (discover || wizard) { - if (yn("Do you want to keep the save file?") == 'n') + if (y_n("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else { - nh_compress(fqname(SAVEF, SAVEPREFIX, 0)); + nh_compress(fqname(gs.SAVEF, SAVEPREFIX, 0)); } } } @@ -525,10 +512,8 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ return resuming; } -STATIC_OVL void -process_options(argc, argv) -int argc; -char *argv[]; +static void +process_options(int argc, char *argv[]) { int i; @@ -563,11 +548,11 @@ char *argv[]; #endif case 'u': if (argv[0][2]) - (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); + (void) strncpy(svp.plname, argv[0] + 2, sizeof(svp.plname) - 1); else if (argc > 1) { argc--; argv++; - (void) strncpy(plname, argv[0], sizeof(plname) - 1); + (void) strncpy(svp.plname, argv[0], sizeof(svp.plname) - 1); } else raw_print("Player name expected after -u"); break; @@ -575,15 +560,15 @@ char *argv[]; case 'I': case 'i': if (!strncmpi(argv[0] + 1, "IBM", 3)) { - load_symset("IBMGraphics", PRIMARY); + load_symset("IBMGraphics", PRIMARYSET); load_symset("RogueIBM", ROGUESET); switch_symbols(TRUE); } break; - /* case 'D': */ + /* case 'D': */ case 'd': if (!strncmpi(argv[0] + 1, "DEC", 3)) { - load_symset("DECGraphics", PRIMARY); + load_symset("DECGraphics", PRIMARYSET); switch_symbols(TRUE); } break; @@ -621,15 +606,6 @@ char *argv[]; flags.initrace = i; } break; -#ifdef MFLOPPY -#ifndef AMIGA - /* Player doesn't want to use a RAM disk - */ - case 'R': - ramdisk = FALSE; - break; -#endif -#endif #ifdef AMIGA /* interlaced and non-interlaced screens */ case 'L': @@ -656,8 +632,8 @@ char *argv[]; } } -STATIC_OVL void -nhusage() +static void +nhusage(void) { char buf1[BUFSZ], buf2[BUFSZ], *bufptr; @@ -673,12 +649,12 @@ nhusage() */ (void) Sprintf(buf2, "\nUsage:\n%s [-d dir] -s [-r race] [-p profession] " "[maxrank] [name]...\n or", - hname); + gh.hname); ADD_USAGE(buf2); (void) Sprintf( buf2, "\n%s [-d dir] [-u name] [-r race] [-p profession] [-[DX]]", - hname); + gh.hname); ADD_USAGE(buf2); #ifdef NEWS ADD_USAGE(" [-n]"); @@ -686,11 +662,6 @@ nhusage() #ifndef AMIGA ADD_USAGE(" [-I] [-i] [-d]"); #endif -#ifdef MFLOPPY -#ifndef AMIGA - ADD_USAGE(" [-R]"); -#endif -#endif #ifdef AMIGA ADD_USAGE(" [-[lL]]"); #endif @@ -703,9 +674,7 @@ nhusage() #ifdef CHDIR void -chdirx(dir, wr) -char *dir; -boolean wr; +chdirx(const char *dir, boolean wr) { #ifdef AMIGA static char thisdir[] = ""; @@ -733,7 +702,7 @@ boolean wr; #ifdef PORT_HELP #if defined(MSDOS) void -port_help() +port_help(void) { /* display port specific help file */ display_file(PORT_HELP, 1); @@ -743,13 +712,20 @@ port_help() /* validate wizard mode if player has requested access to it */ boolean -authorize_wizard_mode() +authorize_wizard_mode(void) { - if (!strcmp(plname, WIZARD_NAME)) + if (!strcmp(svp.plname, WIZARD_NAME)) return TRUE; return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + #ifdef EXEPATH #ifdef __DJGPP__ #define PATH_SEPARATOR '/' @@ -761,15 +737,12 @@ authorize_wizard_mode() char exepathbuf[EXEPATHBUFSZ]; char * -exepath(str) -char *str; +exepath(char *str) { char *tmp, *tmp2; - int bsize; if (!str) return (char *) 0; - bsize = EXEPATHBUFSZ; tmp = exepathbuf; Strcpy(tmp, str); tmp2 = strrchr(tmp, PATH_SEPARATOR); @@ -779,4 +752,67 @@ char *str; } #endif /* EXEPATH */ +#if defined(CROSS_TO_MSDOS) + +void +get_nhuuid(void) +{ + unsigned char stmp[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + if (svn.nhuuid[0]) + return; + + /* FIXME: fill in a useful valid UUID somehow */ + Snprintf(svn.nhuuid, sizeof svn.nhuuid, "%s", (char *) stmp); +} + +void +free_nhuuid(void) +{ + int i; + + for (i = 0; i < SIZE(svn.nhuuid); i++) { + svn.nhuuid[i] = 0; + } +} +#endif + +#if defined(CROSS_TO_AMIGA) +void msmsg +VA_DECL(const char *, fmt) +{ + VA_START(fmt); + VA_INIT(fmt, const char *); + Vprintf(fmt, VA_ARGS); + flushout(); + VA_END(); + return; +} + +unsigned long +sys_random_seed(void) +{ + unsigned long seed = 0L; + unsigned long pid = (unsigned long) getpid(); + boolean no_seed = TRUE; + +#ifdef AMIGA_STRONG_RANDOM_SEED_HERE + /* hypothetical - strong seed code is required */ + /* then has_strong_seed could be set */ +#endif + if (no_seed) { + seed = (unsigned long) getnow(); /* time((TIME_type) 0) */ + /* Quick dirty band-aid to prevent PRNG prediction */ + if (pid) { + if (!(pid & 3L)) + pid -= 1L; + seed *= pid; + } + } + return seed; +} +#endif + /*pcmain.c*/ diff --git a/sys/share/pcsys.c b/sys/share/pcsys.c index 14d0e4591..5ceaa4410 100644 --- a/sys/share/pcsys.c +++ b/sys/share/pcsys.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pcsys.c $NHDT-Date: 1524689500 2018/04/25 20:51:40 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.31 $ */ +/* NetHack 5.0 pcsys.c $NHDT-Date: 1596498283 2020/08/03 23:44:43 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.42 $ */ /* Copyright (c) 2012 by Michael Allison */ /* NetHack may be freely redistributed. See license for details. */ @@ -10,12 +10,11 @@ #include "hack.h" #include "wintty.h" -#include #include -#if !defined(MSDOS) && !defined(WIN_CE) /* already done */ +#if !defined(MSDOS) && !defined(WIN_CE) && !defined(CROSS_TO_AMIGA) #include #endif -#ifdef __GO32__ +#if defined(__GO32__) || defined(CROSS_TO_AMIGA) #define P_WAIT 0 #define P_NOWAIT 1 #endif @@ -28,12 +27,7 @@ #define filesize filesize_nh #endif -#if defined(MICRO) || defined(OS2) -void FDECL(nethack_exit, (int)); -#else -#define nethack_exit exit -#endif -STATIC_DCL void NDECL(msexit); +static void msexit(void); #ifdef MOVERLAY extern void __far __cdecl _movepause(void); @@ -43,18 +37,12 @@ extern unsigned short __far __cdecl _movefpaused; #define __MOVE_PAUSE_DISK 2 /* Represents the executable file */ #define __MOVE_PAUSE_CACHE 4 /* Represents the cache memory */ #endif /* MOVERLAY */ - -#ifdef MFLOPPY -STATIC_DCL boolean NDECL(record_exists); -#ifndef TOS -STATIC_DCL boolean NDECL(comspec_exists); -#endif -#endif +FILE * fopenp(const char *name, const char *mode); #if defined(MICRO) void -flushout() +flushout(void) { (void) fflush(stdout); return; @@ -71,9 +59,11 @@ static const char *COMSPEC = #ifdef SHELL int -dosh() +dosh(void) { +#ifndef NOCWD_ASSUMPTIONS extern char orgdir[]; +#endif char *comspec; #ifndef __GO32__ int spawnstat; @@ -132,248 +122,14 @@ dosh() return 0; } #endif /* SHELL */ - -#ifdef MFLOPPY - -void -eraseall(path, files) -const char *path, *files; -{ - char buf[PATHLEN]; - char *foundfile; - - foundfile = foundfile_buffer(); - Sprintf(buf, "%s%s", path, files); - if (findfirst(buf)) - do { - Sprintf(buf, "%s%s", path, foundfile); - (void) unlink(buf); - } while (findnext()); - return; -} - -/* - * Rewritten for version 3.3 to be faster - */ -void -copybones(mode) -int mode; -{ - char from[PATHLEN], to[PATHLEN], last[13]; - char *frompath, *topath; - char *foundfile; -#ifndef TOS - int status; - char copy[8], *comspec; -#endif - - if (!ramdisk) - return; - - /* Find the name of the last file to be transferred - */ - frompath = (mode != TOPERM) ? permbones : levels; - foundfile = foundfile_buffer(); - last[0] = '\0'; - Sprintf(from, "%s%s", frompath, allbones); - topath = (mode == TOPERM) ? permbones : levels; -#ifdef TOS - eraseall(topath, allbones); -#endif - if (findfirst(from)) - do { -#ifdef TOS - Sprintf(from, "%s%s", frompath, foundfile); - Sprintf(to, "%s%s", topath, foundfile); - if (_copyfile(from, to)) - goto error_copying; -#endif - Strcpy(last, foundfile); - } while (findnext()); -#ifdef TOS - else - return; -#else - if (last[0]) { - Sprintf(copy, "%cC copy", switchar()); - - /* Remove any bones files in `to' directory. - */ - eraseall(topath, allbones); - - /* Copy `from' to `to' */ - Sprintf(to, "%s%s", topath, allbones); - comspec = getcomspec(); - status = spawnl(P_WAIT, comspec, comspec, copy, from, to, "> nul", - (char *) 0); - } else - return; -#endif /* TOS */ - - /* See if the last file got there. If so, remove the ramdisk bones - * files. - */ - Sprintf(to, "%s%s", topath, last); - if (findfirst(to)) { - if (mode == TOPERM) - eraseall(frompath, allbones); - return; - } - -#ifdef TOS -error_copying: -#endif - /* Last file didn't get there. - */ - Sprintf(to, "%s%s", topath, allbones); - msmsg("Can't copy \"%s\" to \"%s\" -- ", from, to); -#ifndef TOS - if (status < 0) - msmsg("can't spawn \"%s\"!", comspec); - else -#endif - msmsg((freediskspace(topath) < filesize(from)) - ? "insufficient disk space." - : "bad path(s)?"); - if (mode == TOPERM) { - msmsg("Bones will be left in \"%s\"\n", *levels ? levels : hackdir); - } else { - /* Remove all bones files on the RAMdisk */ - eraseall(levels, allbones); - playwoRAMdisk(); - } - return; -} - -void -playwoRAMdisk() -{ - int c; - - msmsg("Do you wish to play without a RAMdisk? [yn] (n)"); - - /* Set ramdisk false *before* exit-ing (because msexit calls - * copybones) - */ - ramdisk = FALSE; - c = tgetch(); - if (c == 'Y') - c = 'y'; - if (c != 'y') { - settty("Be seeing you...\n"); - nethack_exit(EXIT_SUCCESS); - } - set_lock_and_bones(); - return; -} - -int -saveDiskPrompt(start) -int start; -{ - char buf[BUFSIZ], *bp; - char qbuf[QBUFSZ]; - - int fd; - - if (sysflags.asksavedisk) { - /* Don't prompt if you can find the save file */ - if ((fd = open_savefile()) >= 0) { - (void) nhclose(fd); - return 1; - } - clear_nhwindow(WIN_MESSAGE); - pline("If save file is on a save disk, insert that disk now."); - mark_synch(); - Sprintf(qbuf, "File name (default \"%s\"%s) ?", SAVEF, - start ? "" : ", cancels save"); - getlin(qbuf, buf); - clear_nhwindow(WIN_MESSAGE); - if (!start && *buf == '\033') - return 0; - - /* Strip any whitespace. Also, if nothing was entered except - * whitespace, do not change the value of SAVEF. - */ - for (bp = buf; *bp; bp++) - if (!isspace((uchar) *bp)) { - strncpy(SAVEF, bp, PATHLEN); - break; - } - } - return 1; -} - -/* Return 1 if the record file was found */ -STATIC_OVL boolean -record_exists() -{ - FILE *fp; - - fp = fopen_datafile(RECORD, "r", TRUE); - if (fp) { - fclose(fp); - return TRUE; - } - return FALSE; -} -#endif /* MFLOPPY */ - -#ifdef TOS -#define comspec_exists() 1 -#else -#ifdef MFLOPPY -/* Return 1 if the comspec was found */ -STATIC_OVL boolean -comspec_exists() -{ - int fd; - char *comspec; - - if ((comspec = getcomspec())) - if ((fd = open(comspec, O_RDONLY)) >= 0) { - (void) nhclose(fd); - return TRUE; - } - return FALSE; -} -#endif /* MFLOPPY */ -#endif - -#ifdef MFLOPPY -/* Prompt for game disk, then check for record file. - */ -void -gameDiskPrompt() -{ - if (sysflags.asksavedisk) { - if (record_exists() && comspec_exists()) - return; - (void) putchar('\n'); - getreturn("when the game disk has been inserted"); - } - if (comspec_exists() && record_exists()) - return; - - if (!comspec_exists()) - msmsg("\n\nWARNING: can't find command processor \"%s\"!\n", - getcomspec()); - if (!record_exists()) - msmsg("\n\nWARNING: can't find record file \"%s\"!\n", RECORD); - msmsg("If the game disk is not in, insert it now.\n"); - getreturn("to continue"); - return; -} -#endif /* MFLOPPY */ #endif /* MICRO */ /* - * Add a backslash to any name not ending in /, \ or : There must + * Add a backslash to any name not ending in /, \ or : There must * be room for the \ */ void -append_slash(name) -char *name; +append_slash(char *name) { char *ptr; @@ -388,13 +144,16 @@ char *name; } void -getreturn(str) -const char *str; +getreturn(const char *str) { #ifdef TOS msmsg("Hit %s.", str); +#else +#ifdef CROSS_TO_AMIGA + (void) printf("Hit %s.", str); #else msmsg("Hit %s.", str); +#endif #endif while (pgetchar() != '\n') ; @@ -430,8 +189,7 @@ VA_DECL(const char *, fmt) #endif FILE * -fopenp(name, mode) -const char *name, *mode; +fopenp(const char *name, const char *mode) { char buf[BUFSIZ], *bp, *pp, lastch = 0; FILE *fp; @@ -479,8 +237,7 @@ const char *name, *mode; #if defined(MICRO) || defined(OS2) void -nethack_exit(code) -int code; +nethack_exit(int code) { msexit(); exit(code); @@ -492,10 +249,10 @@ int code; extern boolean run_from_desktop; /* set in pcmain.c */ #endif -STATIC_OVL void -msexit() +static void +msexit(void) { -#ifdef CHDIR +#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) extern char orgdir[]; #endif @@ -503,10 +260,6 @@ msexit() #ifndef TOS enable_ctrlP(); /* in case this wasn't done */ #endif -#ifdef MFLOPPY - if (ramdisk) - copybones(TOPERM); -#endif #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) chdir(orgdir); /* chdir, not chdirx */ chdrive(orgdir); @@ -514,12 +267,11 @@ msexit() #ifdef TOS if (run_from_desktop) getreturn("to continue"); /* so the user can read the score list */ -#ifdef TEXTCOLOR if (colors_changed) restore_colors(); -#endif #endif wait_synch(); + term_curs_set(1); return; } #endif /* MICRO || OS2 */ diff --git a/sys/share/pctty.c b/sys/share/pctty.c index cd7d65588..f06dfe475 100644 --- a/sys/share/pctty.c +++ b/sys/share/pctty.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pctty.c $NHDT-Date: 1432512787 2015/05/25 00:13:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ +/* NetHack 5.0 pctty.c $NHDT-Date: 1596498284 2020/08/03 23:44:44 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.13 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2005. */ /* NetHack may be freely redistributed. See license for details. */ @@ -18,7 +18,7 @@ char erase_char, kill_char; * Called by startup() in termcap.c and after returning from ! or ^Z */ void -gettty() +gettty(void) { erase_char = '\b'; kill_char = 21; /* cntl-U */ @@ -33,13 +33,12 @@ gettty() /* reset terminal to original state */ void -settty(s) -const char *s; +settty(const char *s) { #if defined(MSDOS) && defined(NO_TERMS) gr_finish(); #endif - end_screen(); + term_end_screen(); if (s) raw_print(s); #if !defined(TOS) @@ -49,15 +48,14 @@ const char *s; /* called by init_nhwindows() and resume_nhwindows() */ void -setftty() +setftty(void) { - start_screen(); + term_start_screen(); } #if defined(TIMED_DELAY) && defined(_MSC_VER) void -msleep(mseconds) -unsigned mseconds; +msleep(unsigned mseconds) { /* now uses clock() which is ANSI C */ clock_t goal; @@ -79,7 +77,7 @@ VA_DECL(const char *, s) VA_INIT(s, const char *); /* error() may get called before tty is initialized */ if (iflags.window_inited) - end_screen(); + term_end_screen(); putchar('\n'); Vprintf(s, VA_ARGS); putchar('\n'); diff --git a/sys/share/pcunix.c b/sys/share/pcunix.c index f1cf7144e..6ecd7dae9 100644 --- a/sys/share/pcunix.c +++ b/sys/share/pcunix.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pcunix.c $NHDT-Date: 1432512787 2015/05/25 00:13:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */ +/* NetHack 5.0 pcunix.c $NHDT-Date: 1596498285 2020/08/03 23:44:45 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.42 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -18,8 +18,8 @@ extern char orgdir[]; #endif #if defined(TTY_GRAPHICS) -extern void NDECL(backsp); -extern void NDECL(clear_screen); +extern void backsp(void); +extern void term_clear_screen(void); #endif #if 0 @@ -30,54 +30,16 @@ static struct stat buf; static struct stat hbuf; #endif -#ifdef PC_LOCKING -static int NDECL(eraseoldlocks); +#if defined(PC_LOCKING) && !defined(SELF_RECOVER) +static int eraseoldlocks(void); #endif -#if 0 -int -uptodate(fd) -int fd; -{ -#ifdef WANT_GETHDATE - if(fstat(fd, &buf)) { - pline("Cannot get status of saved level? "); - return(0); - } - if(buf.st_mtime < hbuf.st_mtime) { - pline("Saved level is out of date. "); - return(0); - } -#else -#if (defined(MICRO)) && !defined(NO_FSTAT) - if(fstat(fd, &buf)) { - if(moves > 1) pline("Cannot get status of saved level? "); - else pline("Cannot get status of saved game."); - return(0); - } - if(comp_times(buf.st_mtime)) { - if(moves > 1) pline("Saved level is out of date."); - else pline("Saved game is out of date. "); - /* This problem occurs enough times we need to give the player - * some more information about what causes it, and how to fix. - */ -#ifdef MSDOS - pline("Make sure that your system's date and time are correct."); - pline("They must be more current than NetHack.EXE's date/time stamp."); -#endif /* MSDOS */ - return(0); - } -#endif /* MICRO */ -#endif /* WANT_GETHDATE */ - return(1); -} -#endif - -#ifdef PC_LOCKING +#if defined(PC_LOCKING) +#if !defined(SELF_RECOVER) static int -eraseoldlocks() +eraseoldlocks(void) { - register int i; + int i; /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization @@ -85,22 +47,23 @@ eraseoldlocks() */ for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) { /* try to remove all */ - set_levelfile_name(lock, i); - (void) unlink(fqname(lock, LEVELPREFIX, 0)); + set_levelfile_name(gl.lock, i); + (void) unlink(fqname(gl.lock, LEVELPREFIX, 0)); } - set_levelfile_name(lock, 0); + set_levelfile_name(gl.lock, 0); #ifdef HOLD_LOCKFILE_OPEN really_close(); #endif - if (unlink(fqname(lock, LEVELPREFIX, 0))) + if (unlink(fqname(gl.lock, LEVELPREFIX, 0))) return 0; /* cannot remove it */ return (1); /* success! */ } +#endif /* SELF_RECOVER */ void -getlock() +getlock(void) { - register int fd, c, ci, ct, ern; + int fd, c, ci, ct; int fcmask = FCMASK; char tbuf[BUFSZ]; const char *fq_lock; @@ -117,9 +80,9 @@ getlock() } /* regularize(lock); */ /* already done in pcmain */ - Sprintf(tbuf, "%s", fqname(lock, LEVELPREFIX, 0)); - set_levelfile_name(lock, 0); - fq_lock = fqname(lock, LEVELPREFIX, 1); + Sprintf(tbuf, "%s", fqname(gl.lock, LEVELPREFIX, 0)); + set_levelfile_name(gl.lock, 0); + fq_lock = fqname(gl.lock, LEVELPREFIX, 1); if ((fd = open(fq_lock, 0)) == -1) { if (errno == ENOENT) goto gotlock; /* no such file */ @@ -135,13 +98,13 @@ getlock() if (iflags.window_inited) { #ifdef SELF_RECOVER - c = yn("There are files from a game in progress under your name. " + c = y_n("There are files from a game in progress under your name. " "Recover?"); #else pline("There is already a game in progress under your name."); pline("You may be able to use \"recover %s\" to get it back.\n", tbuf); - c = yn("Do you want to destroy the old game?"); + c = y_n("Do you want to destroy the old game?"); #endif } else { #if defined(MSDOS) && defined(NO_TERMS) @@ -187,8 +150,8 @@ getlock() #else /*SELF_RECOVER*/ if (recover_savefile()) { #if defined(TTY_GRAPHICS) - if (WINDOWPORT("tty")) - clear_screen(); /* display gets fouled up otherwise */ + if (WINDOWPORT(tty)) + term_clear_screen(); /* display gets fouled up otherwise */ #endif goto gotlock; } else { @@ -209,8 +172,6 @@ getlock() gotlock: fd = creat(fq_lock, fcmask); - if (fd == -1) - ern = errno; unlock_file(HLOCK); if (fd == -1) { #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) @@ -218,8 +179,8 @@ getlock() #endif error("cannot creat file (%s.)", fq_lock); } else { - if (write(fd, (char *) &hackpid, sizeof(hackpid)) - != sizeof(hackpid)) { + if (write(fd, (char *) &svh.hackpid, sizeof(svh.hackpid)) + != sizeof(svh.hackpid)) { #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) chdirx(orgdir, 0); #endif @@ -240,14 +201,13 @@ getlock() #endif /* PC_LOCKING */ void -regularize(s) +regularize(char *s) /* * normalize file name - we don't like .'s, /'s, spaces, and * lots of other things */ -register char *s; { - register char *lp; + char *lp; for (lp = s; *lp; lp++) if (*lp <= ' ' || *lp == '"' || (*lp >= '*' && *lp <= ',') diff --git a/sys/share/pmatchregex.c b/sys/share/pmatchregex.c index cb3d58455..a4bf0c119 100644 --- a/sys/share/pmatchregex.c +++ b/sys/share/pmatchregex.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 pmatchregex.c $NHDT-Date: 1544482890 2018/12/10 23:01:30 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.2 $ */ +/* NetHack 5.0 pmatchregex.c $NHDT-Date: 1737691300 2025/01/23 20:01:40 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.10 $ */ /* Copyright (c) Sean Hunt 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -20,7 +20,7 @@ struct nhregex { }; struct nhregex * -regex_init() +regex_init(void) { struct nhregex *re; @@ -30,9 +30,7 @@ regex_init() } boolean -regex_compile(s, re) -const char *s; -struct nhregex *re; +regex_compile(const char *s, struct nhregex *re) { if (!re) return FALSE; @@ -43,17 +41,14 @@ struct nhregex *re; return TRUE; } -const char * -regex_error_desc(re) -struct nhregex *re UNUSED; +char * +regex_error_desc(struct nhregex *re UNUSED, char *errbuf) { - return "pattern match compilation error"; + return strcpy(errbuf, "pattern match compilation error"); } boolean -regex_match(s, re) -const char *s; -struct nhregex *re; +regex_match(const char *s, struct nhregex *re) { if (!re || !re->pat || !s) return FALSE; @@ -62,12 +57,13 @@ struct nhregex *re; } void -regex_free(re) -struct nhregex *re; +regex_free(struct nhregex *re) { - if (re) { - if (re->pat) - free((genericptr_t) re->pat); - free((genericptr_t) re); - } + assert(re != NULL); /* regex_free() is declared with NONNULLPTR1 */ + + if (re->pat) + free((genericptr_t) re->pat); + free((genericptr_t) re); } + +/*pmatchregex.c*/ diff --git a/sys/share/posixregex.c b/sys/share/posixregex.c index 0b4ba218d..676e7dbe7 100644 --- a/sys/share/posixregex.c +++ b/sys/share/posixregex.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 posixregex.c $NHDT-Date: 1434446947 2015/06/16 09:29:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.5 $ */ +/* NetHack 5.0 posixregex.c $NHDT-Date: 1596498286 2020/08/03 23:44:46 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.7 $ */ /* Copyright (c) Sean Hunt 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -29,12 +29,6 @@ * successful and FALSE otherwise. re is invalidated regardless of * success. * - * const char *regex_error_desc(struct nhregex *re) - * Used to retrieve an error description from an error created involving - * re. Returns NULL if no description can be retrieved. The returned - * string may be a static buffer and so is only valid until the next - * call to regex_error_desc. - * * boolean regex_match(const char *s, struct nhregex *re) * Used to determine if s (or any substring) matches the regex compiled * into re. Only valid if the most recent call to regex_compile on re @@ -42,6 +36,17 @@ * * void regex_free(struct nhregex *re) * Deallocate a regex object. + * + * char *regex_error_desc(struct nhregex *re, char *outbuf) + * Used to retrieve an explanation for an error encountered by + * regex_compile() or regex_match(). The explanation is copied into + * outbuf[] and a pointer to that is returned. regex_error_desc() + * should be called before regex_free() but outbuf[] may be used after + * that. outbuf[] must be able to hold at least BUFSZ characters. + * + * One possible error result is "out of memory" so freeing the failed + * re should be done to try to recover memory before issuing any error + * feedback. */ const char regex_id[] = "posixregex"; @@ -52,9 +57,9 @@ struct nhregex { }; struct nhregex * -regex_init() +regex_init(void) { - return (struct nhregex *) alloc(sizeof(struct nhregex)); + return (struct nhregex *) alloc(sizeof (struct nhregex)); } boolean @@ -67,19 +72,20 @@ regex_compile(const char *s, struct nhregex *re) return TRUE; } -const char * -regex_error_desc(struct nhregex *re) +char * +regex_error_desc(struct nhregex *re, char *errbuf) { - static char buf[BUFSZ]; - - if (!re || !re->err) - return (const char *) 0; - - /* FIXME: Using a static buffer here is not ideal, but avoids memory - * leaks. Consider the allocation more carefully. */ - regerror(re->err, &re->re, buf, BUFSZ); - - return buf; + if (!re) { + Strcpy(errbuf, "no regexp"); + } else if (!re->err) { + Strcpy(errbuf, "no explanation"); + } else { + errbuf[0] = '\0'; + regerror(re->err, &re->re, errbuf, BUFSZ); + if (!errbuf[0]) + Strcpy(errbuf, "unspecified regexp error"); + } + return errbuf; } boolean @@ -104,3 +110,5 @@ regex_free(struct nhregex *re) regfree(&re->re); free(re); } + +/*posixregex.c*/ diff --git a/sys/share/random.c b/sys/share/random.c index cc865c4e5..bb045e01a 100644 --- a/sys/share/random.c +++ b/sys/share/random.c @@ -12,26 +12,26 @@ * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Several minor changes were made for the NetHack distribution to satisfy * non-BSD compilers (by definition BSD compilers do not need to compile * this file for NetHack). These changes consisted of: - * - changing the sccsid conditions to nested ifdefs from defined()s - * to accommodate stupid preprocessors - * - giving srandom() type void instead of allowing it to default to int - * - making the first return in initstate() return a value consistent - * with its type (instead of no value) - * - ANSI function prototyping in extern.h - therefore include hack.h - * instead of stdio.h and remove separate declaration of random() from - * the beginning of function srandom - * - moving sccsid after hack.h to allow precompiled headers, which - * means the defined()s would be ok again... - * - change fprintf(stderr, "x(%d)y\n", z) to impossible("x(%d)y", z) - * - remove useless variable `j' from srandom() - * - cast result of pointer subtraction to long since ptrdiff_t could - * be bigger than that and trigger warnings when assigning to long + * - changing the sccsid conditions to nested ifdefs from defined()s + * to accommodate stupid preprocessors + * - giving srandom() type void instead of allowing it to default to int + * - making the first return in initstate() return a value consistent + * with its type (instead of no value) + * - ANSI function prototyping in extern.h - therefore include hack.h + * instead of stdio.h and remove separate declaration of random() from + * the beginning of function srandom + * - moving sccsid after hack.h to allow precompiled headers, which + * means the defined()s would be ok again... + * - change fprintf(stderr, "x(%d)y\n", z) to impossible("x(%d)y", z) + * - remove useless variable `j' from srandom() + * - cast result of pointer subtraction to long since ptrdiff_t could + * be bigger than that and trigger warnings when assigning to long * * $NHDT-Date: 1432512787 2015/05/25 00:13:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.5 $ */ @@ -42,7 +42,7 @@ #else #ifdef LIBC_SCCS #ifndef lint -static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; +static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; #endif #endif /* LIBC_SCCS and not lint */ @@ -56,7 +56,7 @@ static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; * initialized to contain information for random number generation with that * much state information. Good sizes for the amount of state information are * 32, 64, 128, and 256 bytes. The state can be switched by calling the - * setstate() routine with the same array as was initiallized with + * setstate() routine with the same array as was initialized with * initstate(). * By default, the package runs with 128 bytes of state information and * generates far better random numbers than a linear congruential generator. @@ -125,19 +125,19 @@ static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; #define MAX_TYPES 5 /* max number of types above */ -static int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; +static const int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; -static int seps[MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; +static const int seps[MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; /* * Initially, everything is set up as if from : - * initstate( 1, &randtbl, 128 ); + * initstate( 1, &randtbl, 128 ); * Note that this initialization takes advantage of the fact that srandom() * advances the front and rear pointers 10*rand_deg times, and hence the * rear pointer which starts at 0 will also end up at zero; thus the zeroeth * element of the state information, which contains info about the current * position of the rear pointer is just - * MAX_TYPES*(rptr - state) + TYPE_3 == TYPE_3. + * MAX_TYPES*(rptr - state) + TYPE_3 == TYPE_3. */ static long randtbl[DEG_3 + 1] = { @@ -158,7 +158,7 @@ static long randtbl[DEG_3 + 1] = { * away with just one pointer, but the code for random() is more efficient *this * way). The pointers are left positioned as they would be from the call - * initstate( 1, randtbl, 128 ) + * initstate( 1, randtbl, 128 ) * (The position of the rear pointer, rptr, is really 0 (as explained above * in the initialization of randtbl) because the state table pointer is set * to point to randtbl[1] (as explained below). @@ -240,7 +240,7 @@ unsigned x; char * initstate(seed, arg_state, n) -unsigned seed; /* seed for R. N. G. */ +unsigned seed; /* seed for RNG */ char *arg_state; /* pointer to state array */ int n; /* # bytes of state info */ { @@ -348,7 +348,7 @@ char *arg_state; * random: * If we are using the trivial TYPE_0 R.N.G., just do the old linear * congruential bit. Otherwise, we do our fancy trinomial stuff, which is the - * same in all ther other cases due to all the global variables that have been + * same in all the other cases due to all the global variables that have been * set up. The basic operation is to add the number at the rear pointer into * the one at the front pointer. Then both pointers are advanced to the next * location cyclically in the table. The value returned is the sum generated, diff --git a/sys/share/sounds/.gitattributes b/sys/share/sounds/.gitattributes deleted file mode 100644 index 763caf51d..000000000 --- a/sys/share/sounds/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* NH_filestag=(file%s_for_Amiga_and_Macintosh_versions) diff --git a/sys/share/sounds/README b/sys/share/sounds/README deleted file mode 100644 index 74bddea30..000000000 --- a/sys/share/sounds/README +++ /dev/null @@ -1,34 +0,0 @@ -README for the AIFF files: - -These files are sound files for the instruments in NetHack. -There are 11 sounds, one for each distinct instrument. -The sounds are in 8-bit 22kHz AIFF format, which should be -readable by a broad range of platforms. Since the sounds -came from Rolands S-750 sample library (most of them) there -should be no copyright on them when we treat them like we -do here (as instruments) - indeed, the sample library I -got from Roland didn't even bear a (c) symbol. - -Some of the sounds are very adequate (Drum of Earthquake, -Wooden Flute, Magic Harp) while some are less true to the -original name (how does a Frost Horn sound?) Actually, I -don't know what a Bugle is (Bugle horn?) so I took a trumpet -sound for that. Correct me if I'm wrong. - -What does this have to do with the main code? Well, nothing -so far. There are some places that are #ifdef MAC and calls -mac_speaker; that function takes an object and a tune (in -capital letters A-G) and plays the tune with the given -instrument. When playing a specific tune, that tune is of -course used. For "improvise," I use middle "C." - -Ideally, we should do something equal with sound that we -have with displays, so we can use one common set of calls -in the main code, and have ports do whatever seems appropriate -for the available hardware. - -Any comment on the sounds or their use is welcome: - - Jon W{tte - Mac Team - nethack-bugs@nethack.org diff --git a/sys/share/sounds/bell.uu b/sys/share/sounds/bell.uu deleted file mode 100644 index ec6a17afc..000000000 --- a/sys/share/sounds/bell.uu +++ /dev/null @@ -1,407 +0,0 @@ -begin 644 Bell -M``1"96QL```````````````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$``````````````$0B```! -MSJ<]K>2G/:WQ``````````````````````````````"!@6<2``!&3U)-``!$ -M&D%)1D934TY$``!"'@`````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M_P````#_``#___[^``$#`_W]_OG[!@L%_??S^P``!P_X[/_\_@`&!__^[O@) -M^?<*%/CF!OWL"Q0&\?+]^`'__@C[^`@#]_3Q^0L%_Q8$U><%_PXD!^OVY=0( -M+`_]``#DT?8='`H.!N'=Y/`H(/@5!\_-!AL"%PSY^M#H&P'_(`O:]`SA^QWX -M_A?PZP[YZ`@,]@H+ZO\"[``$_`L)Z/89[M\6$OD`_?X`Z>06)?'S#?3H[0,: -M#O[]]^7P$__['/SJ_/CT!@SY`@OQ\PCX]@@&_O0`!/O\\PH*Z_H/!>OX%_;I -M#A'W\?SY^0L`"!CQXO?\]`DD#/'ZY^#_"!,8$O'?^^GG&B@&]03WUND.&1?^ -M^P#LXO8/%0[_\?<`Z/0;$?SW__OL^PD!_@<*[O(3]>WX!0'_"03W^/;Y"PCT``[PYPD(_@?^]/X#[_H9 -M`?;]\_[]^`L0^.P(`-\,&/H$`?'R`OK[%0GP_?_U^/@3$NOX%/S>_ACW^`[Z -M_OSU`O__`@3Z^P;O_!#L^A[^Y`P0WO@7^?L,_/?Z\0`._/D1_.\)_NX&"/0` -M!OG\"/?U#/_W`04&^/8$__/W#0CZ"/SR`_KN"A[_Y_\(\?+\$QKUZ?\-].D. -M&@7OZ0H&Z/H?&>7J#OON`Q(.]?$#]_0)%`#P!_OO!OP'%_CL`PCC^R3^^0CV -M\_OU"!O]\!(`UP@8Z_P7`>__!03\Y@0D\.0?&.+C!@L&]?HH"X3$O\#]NT"!/P,$??U_>_\#00%"OOQ`/SS"Q($^O/X_/?[%Q;Q^`#O -M]`@/$`CNZ0;^Y0XI!^SQ`/;R"!$/`?#R]O[_!A<&]OCU]P(%!@L&[_4([_L; -M_NL*#._T#@/Z"OCW#/7L!!0*]OD#^?;[#`_W\04%]?@/#.?W%?_X!O[Q^P?[ -M"QGO[@/S]`\4^_D&]>S^"1`"]`4'\>8%&`#S"`_Q[/L$#@;U`0_TX0L4[_P1 -M_O,'__,#`OC]#@7_^?#^`/P*$`'X]_GS`@_\"0SKZ`<,[@,E^N@%_N;T'1'^ -M!O?S\.L+)@WS^@3TX/T/#Q7S^0GCYA`B_/06_-GR%@CT^@X&^`+[^_;M`QP/ -MZ_L'X>8/'PS]^_/V[/4=$0'\_.OH"`$%$`C\[/O[ZPT8_/H,^=_^#/8&&/GM -M"OOL`P3Y!!'_]@'R]0+S$"+TX@0%XOP;&P4#!_OGU?\N"?@7!^+;^@\)#A$-\MON_OX0&@\$Z]_U -M`?X-(`SP]O+G^`@4$P#]`>G9`QT#`A((\.+L`A,#!QWYY>[U`0L6!0<$V.@' -M!0\*#`+PZN@+$08+``'\Y.T/$P`!"_CC]@L)`P`6"-7N$`CT`!H"[N?^&??M -M%![NW!(0X?47&>_G"0?XZP<;^.D#%/KC!"("V/TJ^OV -M(2_TU?P%XO@D%@7YVO`.\_!.'V^]H+.P;M`O+B``X* -M)0K5XP'Z`R8=`?#@W?$8*!L(\.?6YPP>-17KY>K@Z2 -M[M'[#`D:`>P,!-CN(`SX"07T]_?U#@?X"P7O]P7W_Q<%]0+][_C_!A4%\OC[ -M_OX`_@T/ZO0&`OOX`@L*]?P,\NT)!OP0!?#^^.T(%O?Z%?CR`OC\!0`*&?': -M"P7>!"D2]^_N_O_N#RK^YOWXZP`)#!/\]@#MZQ`6]@L.XO'\]@\9_/45\M$+ -M&0,#`0'UZ^T0&O@&"NOM!0+]#Q'XZOH&]O84#O`"">CW#_O]&?WE"O_D"!7X -M!`CK_@CO^Q[[Z1?ZY@P+\OL5^?0-]/L,^/<("?/[#/KS`@W^\P4)\_D0_?<$ -M`_CZ"/T"`_7__O\"`@`$">SQ#@3V"!+P]`+P]10:^/P'[./\%`H,#_;F[/S_ -M"B`3^.CN]_0&'"``W>O_^?<7)`SMX?`"!/X;(.[C^_3K#",-!@#CZ/CY#BX/ -M[_SFU/HD&Q$+]>_>X!$F#@4*\MOR_@4;$P+X]^_M`Q$1`OL&]>K\"`P'_?<' -M!>O[$P3Z_?H""OOV#`3L``O^!@SX]O_X_`L*_P7YZ0,+^086!^KR`_4&#@(' -M`?;E_18$"0'_`^_K_QX'\@L"]O?W``\-]0`/^>GZ"PK^^Q`)Z?$&!``*!?D' -M^>\!!`8'_?P*_.@!$_H"$//U"?7M$AOY\P;^]/<#%@CU]P``^/H+%P+M^PS[ -M]``)#_OM!0WR]18%\P@"]``'^`$*[_X2]O49"=X`$_/X%!'X].[S$`7_%1#N -MX0,"_P\("O_MY_T5^00@`.7Q!/W_%0D``^SH!1(``!``[/3^!A`!_`GXZ?T1 -M__L4_^T"_/0#$`H``?'V!/D!$`OZ\?D``_\!$@'N^O\$`OT!`__U_P7]"/_X -M#`3N^0S]^`X!^P?T\`P&]PP0\_`!^?H)"0\%[/L`[OH8$?H&^>;Y_@09$?[] -M\N3Z#0D4$O#U]MP%+@;R&PC(Z1$($@T``/;=\1T/!1+ZZO?U]10;_/C^[^X, -M#@H0`.OF`@G^#Q7^Y^S[`Q(2!PKWVNL)"Q(5`?3W[>02(`@'_/;T]>\**?SI -M"@?M[PX-!`3U_@;\]@(0__3[`@4'`/L#__;Y!PX(`//X!_CW#Q#_]P#Y]@<$ -M!0[_]O?\__L,$@CY[?O^`08*%P;IY_\&]PT?"?+M]_4#$`\2_>KP_OP!&`SZ -M`_OL^`P("0?U!`CCZ"(=YO\?^>?V`@8+`P`4]]L"#_C_&!'[]._T`O\&&P_X -M]?+M]Q$9"P4#]^3K"`\+"@0#_NSK"0\"#`_Y\?CO_!0-!0H![/+^_PT2`?O_ -M]/`"#@4""P3V\_X!_@L,!?OJ^@4!``H6]_/]_0KW\@H5!/$%_NSX!A,.!/SY -M[NH'$`\,`OGR\.D.(@,("?#?\@X)#P\(!=O;#AC_""$`X^KM#1P!`!#ZV?@8 -M`?\)!/OU``0)_?0&`/<&"__[!/[R^@P+`O[\`_KN^PL4`/T)]/#\!P4$#_;Q -M!OKY#POY_`#S`A+W_!7VX?\/!@L,]/C_Y?P?#/P'_N'Z#_X($`'W^??X#`H` -M!/GY`?T""PGY\OD"`P$2#_/H^0$`$@X'!.3=`Q@'#B#QV>_X`1[O!QH(`A'^WNH+#P4,%P#?Y0`+ -M!`X:`^WL^`(##Q`&^NSV`P`!%!7NZ@D![@4?!/#[__KX!1,+]/<'^?`+$_[\ -M!/SY^OP*#?SY"P#G^!(*^005_>+V#P#Z$Q/V[_GW_@@,%`GO\P#S\@X<#?GS -M^_OH^"0@^O,`\>7_%!,*__;Q]/D'&1'Z\OWU[08;$/?Y]^[Y!1<5`_;O\>\# -M&1@*^.[L]?X*(Q7U[_3N\!,="`'Y\._\"!$1`?3T]OH($PS]]O?R_!`4#/WR -M[?+^#!X1^OCLXOH?%0GX^P<1$`OU[/,$"0,-"_SK\@@)!P@"__/M_Q(/`@C\Z/<&``L:!>_Q -M]?H)"PD2_^;Q!0,%$@W\\_#V!PD)$`;S[?D#!`T-"/[O\/D("@41"_;I]@C_ -M_P\4!?#S__SZ`1$3`??Y^_3U#A@*!/_VY^T($A$.#OO>Z04*"1@<^N'H]@(. -M$Q$P3U[>GV#Q80!0'XY.L-%@8$!_WP\OX/%_[W -M"?_I]A@+]@GL`PL-$@KY[^[V!1$1"OOO^/;T$1H&]_KZ -M[O@,%Q'U]/WS]045%`/QZ_\`]0X=!_'R]O,#$!`)_O;L\PD/!PD*\>3Y"@P. -M"OSV[^T#%Q8'^_+M\_P0&PP`]^CE`A8+$1CVVNS^`1$>#?KQX^X.$`P3"N[D -M]OP)%0L%_.[L_PL+$@GR\OGQ_1D3_/[][?(&"PT1_?'Y^/(#&0O[`_SN]P<- -M"`4`^OCS_PL'`P+^^?W__PP+^_P!^O<%!_\%!?SY`0(``P0!_P(`^?\'__@! -M"@+^`P+_^?H#"`0!!?_V^?\#!@8(!?OV_`#Y!1`*_O?Y^OL`"A0']?C[_O\% -M#`;]]_W^_@@$_P4$^OP$_/T-"/O^__;Z!04)#?[V^_OY!0X)!0'X\O3["Q4) -M`@;WYO(("P\5`?/U[.\+&@T("O#E^``'$1,&]?3P]0,,%PK\^?7W^@@0"P/V -M]/;_"@4*"??R_@+]$!+T]@/S]1(2_P8!ZO8%`A`4^_3\[_$)#Q04]^?X_/$+ -M(0X#^>;G_@@)&Q;\Z^KT_`P5%`7S\>[T!0X4#/_S\?CY"1`*!OCT^/S]"!,$ -M]_W]^OX$"@C\]/T$_O\&`P'^_/\"`/T"`OX"`O[^_P#]_04%_?T%`_/[#0;] -M``7^]OC\"@_\_07_\_@'!@D(^_GY]OD"#1$*^^_Y^/4,%PS_^O'I]@0/&P[W -M]OCKZA(C"/T']=SP"PT4%0+V\.?V$1$($`#F[?D`%!8$!?K<\1@&_!X.W.@" -M^P08$P3[Y^<%"@44%_OAZ/T%"`\:"^OE\O\($1,&^//O\`(8$@`!^^_T``8/ -M$OOS__CR"!<$_0+X]/H("08+_/7V_@7^"@H$_.[\!@0`!!#^\O?^!?\"#@CW -M]0$`^@0.!_[[^_CY!0D&"0/[]_3Y"!,#`@_XXO4)!0H3"?KTZ_8."`D3!_#K -M^/D&$PL*`/+P]`4+$`GY_?;R^PH6!_W_]O7]!0L-!O/Y`O'\%PW[`@'P^`<` -M"1/^\OC]``$!"A+^[?T&^_\#!@H`\O@*`O,#$@?W^@?]]P`"!PD$]?L']_<* -M#`@$^O+]`?@'%`C_^/+X_P,+%0;T^?7P`P\-#@CSZ?O__`\7"?GR[?('#PD. -M#/7F[P$+#!`-^NWL^`$,&0\"\NGQ^@<1%PWX[^?S!0H3&0CL[?3P!!<4#@3O -MY_;[`QH4`O_QX_4+"@\5`?'R[O<-%`X&^?#R]0`1$`WV`0D-"07[ -M[N\`"PD-"?OT\?8%$`H%!/+L_08#"Q,!]/3X`@4'"0CZ[OT!_0@."/GV_`$! -M^P80`?'U`@0`!0T$]O7_`P(*!OCU^@0'!`0$_/#Z"@L&!/[S]/L&#P<``?OQ -M]@@."@3[^O;R_@\0!?_V]/G_"1`+_?3S]@0(!P\%\.S\!@4*"@7\[.\##@H& -M!?[T\/H,#04$`//T`08)!0$`^??]!P8!`OOZ_P`$!0/]_OST`@\"_`'^^_O_ -M"`P!^/W^^``)"`'Z^/S__`81`O/X`?O]"@@#_?7V``8#"`C]]OC]`0<(!/[W -M]OL"!0@)_O?Z^_X'#0#Z_O3U!`H'!0#V]O_^`PT'^OCZ^/T%!@D#]_;\`0(% -M!?_^^?@""`+\`/[Y_P<$``+^^?L`!@OU`P\3!OWX -M\O+\#`\*`/?Z^/@%"P8!`/KW_@$"!@,`__O[``(``0/__@#^___^`@0!_@(! -M^?L``@0%!`#[^/L``P<*`_CW^/L`!PP)__3V_?P!"PP"^/?Y_``%#0;W^?[[ -M_`<+`?KZ^P`!`0<%_/7^!/\`!`/]^/P"`P(#`OSY_@(``0,"_/C^`P4!_P(! -M^O8""P/^`/WY^OX#"@?\^_WY_04'!?_\^OP``08&_OS]_OT!!0(!_/D``?X" -M!@'Z_0#\``0"`/W^____`0`````0`!````````/P`____@``` -M``$!``9156YI=',````````````````````````````````````````!`@`& -M('-A;7!S```````````````````````````````````````````````````` -M````````````)P`O``__]O_Y``$````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````!`````7@```!X````5@`````` -M````````````````````````````````````!$)E;&R!`@```$%)1D939#)A -M`````````````!*L`````$%)1D939#)A```````````````````````````` -M````ISVMY```1"(```'.``````````````````(E`/____X!,0`````````` -M``````````````````````````````````$````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````!H`*0`/`FH#,0`J``,";0,]`"D`#P)!`R(!`````!H` -M*0`/`5`!\0`J``,";0,]`````````````````!H`+``6`3X!W``J``,";0,] -M`````````````````!H``````````````````````````````````````0`` -M``%X````>````%8`<;B\'*8````<`%8``%=S=&$``P`*``'__P`````````` -M``+__P```!X```````/__P```#P```````3__P```%H````````````````` -I```````````````````````````````````````````````````````` -` -end diff --git a/sys/share/sounds/bugle.uu b/sys/share/sounds/bugle.uu deleted file mode 100644 index 57a1fa2c6..000000000 --- a/sys/share/sounds/bugle.uu +++ /dev/null @@ -1,328 +0,0 @@ -begin 644 Bugle -M``5"=6=L90`````````````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$``!H`10```````#8B```! -MSJ<]K=:G/:W>``````````````````````````````"!@7%5``!&3U)-```V -M&D%)1D934TY$```T'@`````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````/____\```$"`@("`@("`@("`0("`0```/_^_O\```$"`@,#`P0$!@D- -M#Q`0"P/Y[>+GCX>+G\/?\``(#!0<'!00$!`,"```!`P8'!P8%!`,#!0<( -M!P8%!`(!`0#__O[^_O\``@,$!PH,#`L+#`\2%1@:&1<5$Q`,!/CHU+^TM+6Y -MQ=/C\OP!`/W[^OCV]OC[``4+#`H&!`(``````@0%!PD*"@H)"`8$`P,#`P(" -M`0$!______\!`P4'"0L-#@X,"PH*#1$5&AT?("(>$?[CR+.HIZRUO\?.U=SF -M\?C\_OW[^??Y`@T4%A0/"08&!@<)"@D(!P4%!P@(!@0#`@("!`8("`8%!`," -M`0$!`@,$!08'!P<("@P.#A`3&2`F*"@E'Q'[XC("%F;37^0\9%PP!_/OX]?;]!@X1$`\,!P/_ -M_P``_OW_!`L0$A(0#0D&!`,#!0@)"`<&!`+^^OCW]O;Y_P4+#Q$1$`P)!P8' -M"Q$7&R(I+"85_=_"J)2*CZ"ZV?@.%Q8-`OKV]/'Q^`(+$144$`L$__W]_?S] -M``4*#A(4%1,/"@8"``$$!P@("`<%`O[[]_7T]OL`!0D-$!$/#`D'!PH/%!HA -M)RHH'@OPU;VGD(*(H\?M"AD<$P?\]_7S\?/[!`L.$`\-"P<"__[^_?X"!PP0 -M$Q46$PX)!0$``00&!P<'!@,`^_CV]/3W_`((#1`1$`X*"`<)#1(8'2(F)!L) -M\=C`JY>,E;#0[P<6&!`$^_;T\>_R^@,+#Q$2$0X)`P``__W^`08,$!06%A0/ -M"@8"```"!`8&!@4#`/WY]O3S]?H`!@P1$Q,1#@P+"PX1%1H>(1\7!_#4NJRH -MIZ>NPN']$!81!OWX]O3R\O@"#105$@P(!00#`@#^_P$&"P\3%A@7$PP&`?[_ -M`@0%!04$`P'^^_CW]_CZ_P0*#A$1$`X+"0D+#Q,8'2`A&PWXX'QL/^^/+MJ:;E9VZX0(6'!@. -M!?WY]?/S^``(#A$1#PT-#`H&`O_]_@,(#1$5%A83#@D%`@$"`@("`P0$`P'^ -M^O?U]??\`PH.$1,2#PT,#`T/$109'1\;#OKCRK2GGIB@NMX`%AX:$`;_^_?U -M]/?^!@P/#P\.#@T+!P+^^_P!!@L/$Q87%`\*!@,"`P,"`@("`@(!__SY]_?Y -M_0$'#1`2$@\,"PL-#Q(6&QX?'!'_Z=&[J)B,E+?B`Q@?&0\'`?WY]O;Y_P8* -M#0T-#@\."P?O^8'&AX8#@8`_?KW]?C^!`D,#0T-#@T*!0'^ -M_?X`!`@,$!(3$0X*!P4#`@$````!`@(!__W[^?GY_`$'"PX.#@T+"0D*#1$5 -M%QD9%P\![MG$LJ&5G\#H"1H=%PX&`/SX]O;Y_P4*#0T-#0X-"@4!_?O\_P0( -M#!`3$Q$."@<%`P$`__\``0(#`@#^^_GX^?P!!@H-#@T,"PD)"@P/$Q87&!'*LIV6K-;[ -M$1L9$@L%__OY^?G[_@$%"`H,#@\."03_^_K\``,&"@X1$0\-"@@&`P#^_?X` -M`0("`@#]^OCW^?P!!@D+#`P+"0@("0H-$!,4%10/!/3@R;"F;?C`Q08%`T(`_WZ^_S]_O\``0($!@H-#@P(`P$` -M```!!`@,#0X-#`P+"08#`/_^_O__````__SZ^?K]`04'"`D*"0D("`H,#Q(2 -M$1$/"O_OV<*JF:;/]@T8%Q`*!0#\^OO\_O\```$"!`<+#0P*!@,"`0$!`@4) -M#`T-#`P,"PD&`@#__O[^_O[___W[^?G\``0&"`D)"0D("`D+#A$2$A$/#`7Y -MZ-*ZI)RUWP`2&!0-!P+]^OO\_@````$!`@,&"@P*!P4#`P,#`@,&"@P-#`P, -M#`L)!0(`__[^_O[^_O[]^OG[_@(&!P@("`@("`@*#`\1$A(2$`L"]-_'K)BA -MR?$+&!@1"@4`^_K\_O\!`0$!`0(%"`H+"08$`P,#`P,%"`L,#`L+#`L*!P0" -M`/_______O[]_/GY_``$!P@)"0@("`@)"@T/$!$1$0T'^^K3NJ.=M^$!%!D3 -M#`8!_?KZ_/\!`@("`0$"!0@*"0<%!`0$!`,$!@D,#`P+"PP+"08$`@'____^ -M_?W]_/KY^OX#!P@)"0@(!P<("0P/$1$2$0\*`/'=Q:R:IL[U#AD7#P@#_OKY -M^_T!`P,"`@$!`@4'"`<%!`0%!00$!0@+#0P+"PL+"PD&!`,!___^_?W\^_KY -M^?P!!0@)"@D(!P<'"`H-$!$2$0\+!/KIU+F=F+CE!A<:$PL%__KX^?S_`@0$ -M`P$!`0,%!P8%!`0$!04$!`8)#`P*"@L+"PH'!00#`?_^_OW]_/OY^?K_`P<) -M"@H)!P<'!@@*#A`1$!`."/_QW<6GE:O:_A0;%@T'`?SY^/K]`00%!`(!`0($ -M!@8$`P,$!04%!08("@L*"0H+"PH(!@4$`@#^_OW\_/OY^/G\`04("@L*"`<& -M!@<)#1`1$`\-"@/WYM&TFJ'*\PX;&1`)`_SX]_G[_P,&!@,!`0$#!04$`P,$ -M!08&!@8'"0L+"@D*"PL)!P8&!0,`_O[]_/OY]_C[``0'"0L+"0<&!@8("PX0 -M$!`."P;\[-:YGI_"[`D8&A(*!/WX]OCZ_@(%!@0"`0(#!`0#`@("!`8&!@8& -M"`H+"@D*"@H)!P4%!@4!__[]_/OY^/CZ_@(&"`H+"PD'!@8'"@X0$1$/#`?_ -M\-S!I9RWX0(6&Q4-!O_Y]O?Y_``$!@8$`@("`P,"`0$"!`8'!P<&"`H+"PH) -M"@H)"`<&!P<$`?[]_/OY]_;Y_0$%!PD+"PD'!@8&"0P0$1`/#`@"]^3+JI:I -MUOL2'!@/"`'Z]O;X^_\#!08%`P("`@,"`0`!`P4'!P<&!PD+"@D)"0D)"`<& -M!P@&`P#__?OY]_;W^P`$!@@+#`L(!P8%!PL.$!$0#@D"^>G4M9F@RO,.'!L3 -M"P3\]O7W^OX"!0<&!`(!`0("```!`@4'!P<&!PD*"PH("`D("`<&!PD(!0'_ -M_?SZ^/;W^O\#!0<*#`P*"`8&!PH-#P\/#@H#^^W:OZ*;O.D)&AT6#0;]]_3V -M^?T!!0<(!@0"`0$!`/__`@0'"`<'!P@*"PH)"0D(!P8&!PD*!P,`_OW[^/;U -M^/T!!0<)#`P*"`8%!@D,#@\0#PP&__/BRJN8K=L`%AX9#P@!^?3U^/S_!`<( -M!P4#`0$!`/__`0,%!P<'!P@*#`L)"0@(!P8%!@D+"@8!__[\^O;T]OL`!`8( -M"@P,"PD'!@<+#0\0#@P(`/7DSK"7I-'[$QX<$PH#^O3S]OK^`@8("`8$`@$! -M`/[^``(%!P<'!P@*#`P*"`@(!@4%!0@+"P<#`/[]^O?T]?G^`@4'"@P-#`H( -M!@8)#`X/#PT)`_GKU[R@G+_M"QL>%0P%_?7R]/C]`04("0@%`@```/_^_P$$ -M!@<'!P<)"PP+"0@(!P8$!`<+#`H$`/_^_/GU]/?\`00&"0L,#`L)"`<)#`X/ -M#PX*!/OMV;ZAF+;F"1L?&`\(__?S\_?[``0("0D&`P$``/_^_@`$!@<'!P<( -M"PP+"0@(!P4$!`4)#`L&`O_^_/KV]/;[``,%"`H,#`L)"`<("@X0#PX*!?[R -MX3.M9R][0T=(!@0"0'X\_/U^?X"!@D*"0<#`?_]_/W_`@8'!P<'"0L, -M"PD(!P4$`P,%"0P-"@4!_OW[^/?Y_@(%!04'"0D)"0D)"PP.#Q`."0+WZ=6] -MHINYYPD;(!D0"@+Y]/+T^/T!!0@*"0<$`?_]_/S_`@4'"`<'"`L,#`H(!P8$ -M`P,%"`P-"P8"__W[^/?Y_@,%!08("@H)"0D)"@L-#Q`/#`7Z[-G!I9BPX`4: -M(1H2"P3Z]/+T^/P!!0@*"0@%`@#^_/S^`@4'"`<'"`L,#`H(!P8$`P,$!PL- -M#`@#__[\^??X_0$$!04'"0H)"0D)"PP.#P\."P3Y[-O%JYNLV/\6(!P3#0;] -M]O/S]OL`!`<)"@@%`@#^_/S^`04'"`@'"`H,#0L)!P8$`P,#!@H-#`D$`/[\ -M^??W^P`$!04'"0D)"0D)"@P-#A`/#`?]\-_)K9BDT/H4(!T4#@?^]O+R]?K_ -M`P<)"@@&`P#^_/O]`00'"`@'"`H,#`L)!P8%`P,#!0H-#0D%`?_]^O?W^@`# -M!04'"`D)"0D)"@L-#A`0#@C_\^+-LIJ?Q_01'Q\6#PC_]_+R]?G^`@8)"@D' -M!`'^_/O]``,&"`@'!PD,#0P)!P8%`P("!0D-#0H&`O_]^_CV^?X#!@8&"`D) -M"`@("0H,#A`1#@D!]N?3N9V8N^L,'2`8$`H"^?3S]?G^`@8("0D'!`'__/O] -M``,&!P<'!PD+#0P)!P8%`P("!`@,#0L&`O_]^_CV^/T"!08&"`H*"0@("0H, -M#A`1#PH"^.G6O:*9MN0'&R`9$0L#^O3R]/C]`04("0D(!0+__?O]_P(%!P@' -M!PD+#0T+"`8%!`,"`P@,#@L'`P#^^_CV]_P"!08&"`D)"0@("`D+#0\1$`P& -M_.['Q8."/_X]/3W^P`$!@@)!P0"`/_^_?\! -M`P8'!P<'"0P-"P@&!00#`@(&"@T,"`0!__WZ]_;Y_@,&!@<)"@D)"`@)"@T/ -M$!`."0'VY]&VG9S`ZPH<'Q%0T(`/GU]??[_P,'"0D'`P$`__[^_P$$ -M!@<'!P@)#`T*!@4$`P,#!`<+#0P(!`'__?KV]?G^`@4&"`L,"PD(!P<("PX/ -M$`X+!?OMV;^DG+CE!QH?%P\)`OKU]/;Z_P,&"0H(!`$`__[^_@`#!@<'!P<) -M#`T+!P4$!`,#`P8*#@T)!0'__?GV]?C]`@0&!PH+"@D'!04&"0T0$1`-"`/Y -MZ=.TEYS)]Q(>'!,+!?WV]/7Y_0$%!PD(!0(`___^_O\!!`8'!@<("PT,"`4$ -M`P("`P4)#0T*!@(`__SX]?;Z``,%!@@*"@D(!P8'"0P/#P\-"@3\[=:XF9?! -M\0\='A0,!P#X]/3W^P`$!PD(!@(``/_^_O\!!`8'!P<'"@P,"04$`P("`P0( -M#`T+!P,`_OSX]?7Y_@($!@D+"PH)!P8&!PH-#P\-"@;_\^#'J)BPWP,8'Q@/ -M"0+Z]//V^P`$!PD)!@,!`/___OX``@4'!P8&"`P-"P<%!`,#`P0'"PT,"`0! -M__WZ]O7W_``#!0<)"PH)!P<&!PD,#@\/#0@#^>G2LI:?SOD3'QL1"@7]]_3V -M^?X"!0@)!P0"````__X``@0&!P8'"`H-#`@%!`,#`P0%"0T,"04!`/[\^?7V -M^P`#!`8)"PL*"`<&!@@+#0T-#0L&_N[8NIJ:PO`.'AX4#`<`^/3U^/P`!`<) -M"`4"````__[_`00'"`<'"`H,#`D&!`,#`P0%"`P-"@8"`/_\^?7U^?X"`P4( -M"PL*"0@'!P@+#0T-#0L'`//?Q:.5L^0&&A\8#@D"^?3T]_L`!`<)"`4#`0`` -M__[_``,&!P<&!@@+#`H'!00#`P0%"`P.#`<#`/_]^O;U^/T!`P4'"0L*"`<' -M!@<*#`X.#@P(`_CFS:J3IM;_%A\:$0H#_/;T]OK^`@8("`8$`0``__[^``,% -M!P<&!@<*#`H'!00#`P0$!@D-#`@$`?_]^_?U]_P``P0%"`H*"0@'!P<)#0X. -M#0L(`_KKU+:;H,GT$!T<$PP&_O?T]?C]`04("0@%`@``__W]_P$%!P<'!@<* -M#`P)!00#`@,$!0D,#0H%`@#^_/CV]OK_`0,%"`H+"@@'!@<(#`X.#@T*!O_S -MW\.BEK?G"!L?%@X(`?GT]/?[_P,'"0@&`P$``/[]_@`$!@<'!@<)"PP)!@0$ -M`P,$!0@,#@L'`P#__?KW]OG^`0,%!PD*"@@'!@8'"@X0$`X+!@'VY'A0, -M!?WW]/7X_0$%"`D(!@(``/_]_?\!!0<'!@8'"@P,"08$`P(#!`4)#0X+!@(` -M__SX]?;Z_@(#!0@*"PD(!P8&"`L.#PX-"P@!]>'$H9.TY0<:'Q<."`'Y]/3W -M^_\#!PD)!@,!``#^_?X!`P8'!P<'"0L,"@8$`P,#`P0'#`X+!@(`__WY]O7X -M_0$#!`<*"PH(!P8&!PH-#P\-"P<"^>G1L)>ET_P4'QL2"@/[]?+U^?X"!@D) -M!P0!``#__?X``P4'!P8&"`L,"P<%!`,#!`0&"@T,"`,`__W[]_7W^_\"!`8) -M"@H)!P<&!PD-#@X.#0H'__#:O)R8O^X,'1\5#`7^]_/T^/P!!0@)"`4"```` -M_O[_`00&!P8&!PD,#`D%!`,#`P0&"0P-"@4"`/[\^?;V^?X!`P4("@H)"`<& -M!@@+#@X.#0L)`_;BQJ.3K^(%&2`9#P@!^O3T]_O_`P<)"0<#`0``__[_`0,& -M!P<&!P@+#`H&!`0#`P0%!PL-"P8"`/_\^?;U^/T``@0("@L*"0<&!@<+#@\- -M#`H(!/OJT;"5I-+[$Q\<$0H#^_7S]?K^`@8)"0<$`0``__[^``(%!P<&!@@* -M#`H'!00#`P0%!PL-#`@#`/_]^_CV]_O_`0,&"0L+"0@'!@<)#`X-#0T+!__P -MVKZ?F;WL"QT?%@T&__CS]/?\`04("0@&`@``__[^_P($!@<'!@<)#`P)!@0# -M`P0%!@D,#0H%`0#^_/GW]_K^`0,%"`H*"@D(!P8(#`X.#0T+"`'TX,6EE*_A -M!1D@&0\(`?KT]/;Z_P0'"0@&!`$``/[]_@$#!@<'!@8("PP)!@4$`P,$!0<+ -M#0L&`@#^_/KW]OC\``($!PH+"@D(!P8'"@T.#@X,"@7ZZ=&QEJ'/^!(@'1(* -M`_SU\_7Y_@(&"0D'!0$``/_]_@`#!0<'!@8'"@P+!P4$`P,$!0<*#0T(!`#^ -M_?OX]O?[_P$#!@@*"@D(!P8&"0P.#@X."P;^[MB[FYC`[PX?(!8,!O_X\_3X -M_``%"`D(!@(```#^_O\!!`8'!@8'"0L+"`8%!`,$!08(#`T*!0'__OSY]_?Z -M_@$#!0@*"PH)"`<&"0T/#@T,"@G0L)6AT/L4(!T3#`7]]?+T^/P!!0@)"`8"``#__?W_`@4' -M!P<&!PD+"P@%!`,#!`0&"`P-"@0`_OW[^/;W^_\"`P4("@H*"0@'!PD-#@X- -M#`D$_.[8NIR=Q?$-'A\5#0;_]_+S]_L`!`@)"0<$`?___?S^``,&"`<&!PD+ -M#`D&!00#!`0%!PL-"P8"__[\^??W^OX!`P0'"0H*"0<'!PD,#@X.#@L&`/+= -MP:&7N.@(&R`8#PD"^?/S]OK^`P<)"0@%`?___?S]``,&"`@'!P@*#`H'!00# -M`P0$!@H-#0D$`/_]^OCV^?T!`P0&"0H*"0@'!@<*#0\/#PP'`?;DRJ>3K-X" -M&"$<$0H#^O3R]?G]`@8)"@@&`@#__OS]_P(&"`@'!@@*#`L'!00#`P,$!0D- -M#@H%`?_]^_?V^/P``@,%"`H*"0@(!P<*#A`/#@L&`OKKU+.8HL_Y$Q\=%`P% -M_?7R]/C\`04("@D'`P#__OS\_@$$!P@'!P<)"PP)!@4$`P,$!0@,#@L&`O_] -M_/GV]_K^`0,%!PD)"0D("`@*#0X.#@T*!?WMU;66F\GU$!\>%0T'__?R\_?[ -M``0'"0H(!`'__OS\_@$$!P@'!@8("PP)!P4$`P,#`P8*#@T'`O_^_/GV]OK^ -M`0,$!PD*"0D("`<("PT.#@T*!O[QW+^>F;[L"QT@%P\(`/?R\O7Z_P,'"0H( -M!@+__OS[_?\#!@@'!@<("PP*!P4$`P,#`P4*#0T)!`#^_?KV]?C^`0,$!PD* -M"@D("`@)"PX.#@T+!O[QW+Z=E[OJ"AP@&!`*`OGS\O3Y_@(&"`H)!@(`_OS[ -M_/X"!@@(!P<("@L*"`8%!`,#`P4)#0X*!0'^_?OW]?C]`0,$!@D*"@D)"`@( -M"@P-#@X+!O_TXLBHF;/@`Q@@&A(+!/KT\O3X_@(%"`H)!P0`__W[_/X!!0@( -M!P8("@P+"`8%!`,#`P0(#`X+!@+__OOX]OC]`0,$!0<)"0D)"`@)"PP-#@X, -M"`'TXL>GFK/@`Q@?&A(,!?SU\O3X_`$%!PD)!P0!__W[^_T`!`<(!P8'"0L+ -M"0<%!`,"`@,&#`X,"`,`_OSY]_C\``,$!0<)"0D)"`@("0P.#@X,!P#UY -M&Q(,!_[W]/3W^P`$!@@)"`4"`/W[^_S_`P8(!P8&"`H+"0<%!`,"`0($"`P, -M"04!__WZ^/?Z_P($!`4'"`@(!P<'"`D+#`T,"`/Z[=J]I*K/]@X<'!,-!P#X -M]/3V^_\#!0<("`8"`/W[^_S_`@8'!P8&"`H+"0<%!0,"`0$#!PL,"@8"`/[[ -M^/?Z_@($!`4'"`@("`<'"`D+#0X-"0+Z[=O!IZG-]`P;'!,-"`'Y]/3V^OX" -M!0<)"`8#`/[\^_S^`04'!P8&!PH+"@@&!0,"`0`"!@H,"@<#`/[[^/?Y_@($ -M!`4&"`@'!P<'"`D*#`T,"07^\N+)K*?&[@D8'!4-"`+Z]?3V^OX"!`8("`<# -M`?_\^_S^``0&!@8&!PD+"@@&!0,"`0`!!0H,"@<#`?_\^??X_0$$!`0&!P<' -M!P<'!P@)"PP,"@7_]>7-KZ;#ZP87&A,-"0/\]O3V^?T!!`8("`8#`?_]^_S^ -M``,&!@4%!@@*"@@&!`,!```!!0D+"0<$`?_]^O?X_``#!`0%!P<'!P<&!P@) -M"@L+"07_]>;1MZW#Z`04&10-"03\]O7V^?T!`P4&!P8#`?_]^_S]``,%!@4% -M!@@*"@@&!00"`0```P@*"0<$`?_]^OCY_``#!`0%!@<'!P<&!@@*"@P,"03_ -M]^K6O:Z_Y`$2&14."@7]]_7V^?P``P4&!P8$`?_]_/S]_P,%!04%!@<)"@@& -M!`0"`0```P<*"@<$`@#^^_GX^_\#!`0%!@<'!@8&!@@)"@L+"@S9P*^] -MX/X0&!4."@7_^?;V^/P``P4&!P8$`@#^_/S]``($!@4%!0<)"0@&!`0"`0`` -M`@8)"0<%`@#^_/GX^_\"!`0%!@8&!@8&!@<("0H+"@@#^^_?Q[*XVOH-%A8/ -M"@8`^O;V^/O_`P0&!P8$`@#^_/S]_P($!04$!08("0@&!`0#`?__`04)"0<% -M`@#^_/GX^OX"!`0$!@<'!@8%!08("0H*"08!^O#BS+>[VO@+%A8/"08`^O?V -M^/S_`@0%!@8%`@#^_?S]_P$#!04$!`8("0@&!`0#`0#_`00("0<%`P'__/KY -M^OX"`P0$!08&!@8%!08'"`D*"@@#_?/FT;RZU/,'$Q4/"@^T.T##Q00"@<#_OGW^/O^`0,$!08%`@#__OW]_@`" -M!`0$!`4&"`@&!`,#`@$```(&"`<%`P$`_OSZ^OT``@,#!`4&!04%!`4&!P@) -M"0<$`?KQXLV^RNC_#1,1"P<#_OKX^/O]`0,$!04%`P'__OW]_@`"`P0$!`0& -M!P@&!`,#`@'__P$%"`<%`P(!__SZ^OP``@,#!`0%!@4%!04%!@<("`<$`/GP -MX]#"S>C^#!(0"P<$__KX^/K]``($!`4%`P'__OW]_@`!`P0$`P0%!P@'!0,# -M`@#__P$$!P<%`P$!__WZ^OS_`0,#!`4%!04%!00%!@<'"`<%`OWTY]7$RN/Z -M"1$0"P<$__OX^/K]``(#!`4%`P'__OW]_O\!`@,#`P,%!@<&!0,"`@$`_P`# -M!@<%`P(!__W[^OO^`0,#`P0%!04%!`0$!08'"`<%`OWUZMC'RN+Y"!`0"P<% -M`/SY^?K]``(#!`0$`P$`__[]_O\!`@,#`P,$!@<&!0,"`@$`_P`#!@<%`P$! -M`/[\^OO_`0(#`P0%!04$!`0$!08&!P<%`?WVZ]S-SN'W!@X/"P<%`?SY^?K] -M_P$#!`0$`P$`__[]_O\!`@,#`P,$!08&!0,"`@$`_P`"!0<%`P$``/[\^_S^ -M`0(#`P0$!04%!`0$!04&!@8$`O[Y\.+2S=WS`PP/#`@%`?WZ^OO\_P$"`P0$ -M`P(`__[^_O\``@,#`P,$!08&!0,#`@$`__\"!08&!`(``/_]^_O]``("`@,$ -M!`0$!`0$!`4&!P8%`O[X\./4S]_T`PP."P<%`O[[^OK\_@$"`P0$`P(`__[^ -M_O\``0(#`P,#!`4&!0,"`@$`__\!!`8%!`(!`/_]^_S^``$"`@,$!`0$!`,# -M!`4%!@8%`O_[\^C:T=OP_PD-"P<%`O_[^OK\_@`"`P,$`P(`__[]_O\``0(# -M`P(#!`4&!0,"`@$`__\!!`8%!`(!`/_]_/O]_P$"`@(#!`0$!`0$!`0$!08% -M`P#\].G;T]SP_P@-"P<%`O_\^OO\_@`!`@,#`P(`__[^_O\``0(#`P(#`P0% -M!0,"`@$`__\!`P4%!`(!`/_^_/S]_P$"`@(#!`0$`P,#`P,$!04%`P']]^_A -MU=KM_`8,"P<%`__\^_O\_@`!`@,#`P(!__[^_O__`0("`@("`P0%!`,"`@$` -M`/\``@0%!`(!`/_^_?S]_P$"`@(#`P,#`P,#`P0$!04$`P'^^?'EV]SK^@4* -M"P<%`P#]^_O\_O\!`@,#`P(!`/_^_O__``$"`@("`P0%!`,"`@$``/\``@0% -M!`(!``#__?S]_@`!`@("`P,#`P,"`@,$!`4%`P'_^_3JWMOH^`,)"P@%`P#] -M_/O\_?\!`@(#`P(!`/_^_O__``$"`@("`@,$!`,"`0$``/\``0,$`P(!``#_ -M_?S\_@`!`0("`P,#`P("`@,#!`0$`P'__/;NXMWG]@$'"@@%`P'^_/S\_?\` -M`0("`P(!`/_^_O[_``$!`@("`@,$!`,"`0$``/__`0,$`P(!``#__OS\_@`! -M`0$"`@,#`@("`@,#`P0$`P(`_?CPYN#F]/\&"0@%`P'__?S\_?\``0("`@(! -M`/___O__```!`@(!`@(#!`,"`0$``/__`0(#`P(!``#__OW]_O\!`0$"`@(" -M`@("`@(#`P,#`P(`_?GRZN/G]/\%"`<%`P'__?S\_?X``0$"`@(!`/___O__ -M```!`0$!`0(#`P,"`0$``/__``(#`P(!``#__OW]_O\``0$!`@("`@("`@(" -M`P,#`P(!__OU[N;G\OT#!P<%`P(`_OW]_?X``0$"`@(!``#_____```!`0$! -M`0("`P,"`0$!``#_``$#`P(!``#___[]_O\``0$!`0("`@(!`0("`@(#`P(! -M__WX\>GH\/L"!@<%`P(`_OW]_?[_``$!`@$!``#______P`!`0$!`0$"`P(! -M`0$```#_``$"`@(!````__[]_O\```$!`0("`@(!`0$"`@("`@$!__WZ]>[K -M\/D`!`8%`P(`_OW]_?[_``$!`0$!``#______P```0$!`0$!`@("`0$```#_ -M``$"`@(!````__[^_O\````!`0$!`0$!`0$!`@("`@(!`/[[]_'M\/G_`P4$ -M`P(`__[]_O[_```!`0$!``#______P````$!`0$!`@(!`0$````````!`@(! -M````___^_O\``````0$!`0$!`0$!`0$"`@$!`/_]^?3P\OC^`@0$`P(!__[^ -M_O[_```!`0$!``#______P````$!```!`0$!`0`````````!`0$!````___^ -M_O__``````$!`0$!`0$!`0$!`0$!`/_^^_?S\O?]`0,$`@$!`/_^_O[__P`` -M`0$!``#______P`````````!`0$!`0```````````0$!````_____O\````` -M```!`0$!`````0$!`0$!``#^_?KV]/?\``(#`@$!`/_^_O[__P`````````` -M______\``````````0$!`````````````0$!`````/______```````````` -M``````$!`0$!``#__OSX]_C\_P$"`@$``/_______P``````````______\` -M`````````````````````````````````/______```````````````````` -M``````#__OW\^OK\_P`!`0$``/_______P``````````________```````` -M`````````````````````````/_______P`````````````````````````` -M___^_/S]_P```0````#_______\``````````/______```````````````` -M`````````````````/_______P``````````````````````````________ -M_P````````#_______\```````````#__P`````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````````````!#3TU-````$@`! -M```T%@`(0`VL1````````$U!4DL````"``!)3E-4````%#P``'\`?P`````` -M````````````05!03````:A39#)A``(````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`I`````````````````````````````````````````````````````````` -M```````````````````````$"```````"0`C`````````````````'@````$ -M``0```````#\`/___X`````!`0`&455N:71S```````````````````````` -M`````````````````0(`!B!S86UP````%8``````%;^`/___X`````!`2`&455N:71S```3""YP9P5" -M=6=L90(```!!249&4V0R80`````````````2JP````!!249&4V0R80`````` -M`````````````````````````*<]K=8``#8B```!S@```!T`+P`/__;_^0`! -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````:`"D`#P)J`S$`*@`#`FT# -M/0`I``\"00,B`0`````:`"D`#P%0`?$`*@`#`FT#/0`````````````````: -M`"P`%@$^`=P`*@`#`FT#/0`````````````````:```````````````````` -M``````````````````$````!>````'@```!6`'&XO!RF````'`!6``!7```````#__\````\```````$__\` -M``!:```````````````````````````````````````````````````````` -,```````````````` -` -end diff --git a/sys/share/sounds/erthdrum.uu b/sys/share/sounds/erthdrum.uu deleted file mode 100644 index c95e8bc0e..000000000 --- a/sys/share/sounds/erthdrum.uu +++ /dev/null @@ -1,863 +0,0 @@ -begin 644 Drum_Of_Earthquake -M`!)$CK[>_P\O3V^/K\_@`"`P4("PT.#A`3%A<7%A@<(B8G)B0E*2XQ+RHG*"XU -M.SLW,2XR.T-&0SLS,39`2U-434`Q)2,K/$U96E%`+!H-!@P>.UMQSGX=S7TLS'PKZZM[6TM;:Y -MO<''SM?AZ_<#$!PI-$!*5%QE;&]O<'!O;FYN;6YM;FUL;6UN;FYO;W!P;VUJ -M9V1?6U=44U-55EA:7%UA9FQQ='1R<&UJ:&AI:FQN<')T=7-Q;V]N;FQH8EU8 -M5E-03$E&0T`^.SHX-S4U-#0T-34U-C8V-C4T,S$N*R@E(AX:%A(."04`_/CW -M]_;U]?7U]?7U]?7U]/3S\O+Q\/#O[^[N[>WL[.OJZ>CGYN7CXN#?W=S;VMG7 -MU=/1T='0SLG#P+Z[N;BWM[>WM[>WM[>WMK:UL["LJ*6BGYV;FIJ;FYN9EY:6 -MF)N>H:*AGYZ;L[_+S]?;W^/CY -M^/?U\_/T]_P`!`<*"PL+"PL+"PL,#`L)!@+__?O\``8&5D5T8X-3@W+1T2#@\-!__\_P8-$!`+`?3JYN?L\O?\`0<-$A89 -M'2`C*#`\3%ME:FYP;VMD5T8U*R@D&Q`)!0+]^/;RZ^'6RL"[NL#(SQJJ2@G)B8F)>0AX&`A(F. -ME9VCIJ*9CXB*E:2QN\/+T=+3UM[DY^7CYN[Z!A`7'B0J*R3EZ.OL[.OM\_H``P0$ -M`P'__P(&"@X/#0D%`@($"`T0$Q,1#0H'!00$!`,!__WZ]>_HY.+BY>KR^@0. -M&2$C(!H3#`<$`P(#!0D-$A<;'A\?'AT9%!`,"0@*#A0:'B`>&!$+!@/_^O3K -MX=C0R,*^O+NZNKF[OL+(S=/7VMW?X-_/BX>'A -MX>'BX^3DY.#:U-7>Z.GDX-_7CX^3CW=?2U=G:T\G"O\'*V.;O\.K@ -MUM7B]0`#`O_^_/S[^OKY]O/O[.GFX^'>V]C6T\['O[>PK*NNL;2VM[BYO+_# -MQ\S/T]78V^'I\?;W]O#FW-O@Y.'>V]?5U-76U]C8V=O@Z//]!`4#`PH4'2$B -M)2@K*RHH(QD,`/;R\O?_!0L0$Q46%A44$A`/#@X.#Q`/#@L'`_[X]/#N[>_T -M_0D6(2@K*24B'AL9&1D;'!P;&184%!05%186%A45%!,1$`X,"PL+#`T.#P\0 -M$1(3$0P#^.SDX.#@X>3G[//^"QHG,#0T,2XM+B\O+BPI)R8E)BKL[O#O[.?AWM[BZO/\`P@*"04!_?T##QH>&A00#A`1$`L&`O_\ -M^?7QZ=_6TM+5V^/P`1`;'A@-_O+L[.[P[^ODWMK9V=WD[OH$"@P,"PH("`L0 -M%!01#@D%`@("`?[\_/S]_?X!!@L2&!P>'1L7$0P("0P/#@L(`_[Z^_\$!@0! -M_OOW\>GCWMW=WMWKS_`0)"@<# -M_OGS[>SP]/;U]/;Z_P$!``($!`#\^?7R\/'U^P$'"PT,"`+[].[JZ>ON[O#W -M`PX3$Q8=)"HL+"PO-CHY-C@^0D`\.CP]-B@:#P?_^?C[_/COY^;K]/X$`?CR -M]/GZ^?L`!`/]]N[FW-#'Q,K0S\G#P\;*S,W0UM[DZ.KN]?X'$APE*2PN+BTI -M(A<-"0H+!OWV\>OEXMW4RL3%RL[.R<&^P\K+P[FWO\G.RL?+UN+J[?'V^?;O -MY=G,OK"DG)>8G*&FJ:VSN\3,SL[-T-?>XN+CY>CIZ>GJ[?'U^P`%"@P.#P\/ -M#Q`3%A40"P\8(B@J*RTQ-SLY,S`V1%%64TD[+R8C(R8J+"PJ)2`;&1@8&1D7 -M%A,1#P\/$!`0#PX.#Q(6&AT='!XD*2HI)2(?&Q@5%!,3$A`.#`H(!@0#`/WZ -M^/;T\>K>T<2]N;.JH9N:G:*EI:2DI:BJIY^6DY:;GIZ(!T6#P<`^?;U\^WC -MVM75V>#I]``)#@T+#!`1#@8`_P'_^O3P\?;_"A09&AH:&1<6%101#@L)"`H- -M#0L(!0(`__[^``(#`__[]_7U]O?Y^OOY]._L[.[Q\O#IW];3VN7N]/CZ]^_H -MY>CM\/#KY-_?Y.GM[_#U_04+#A$5'"0I*B&QD8&1D8%A$* -M`_SV\O'R\_/R\.[O\O7Z_P4,%!XJ.45+2D0^.SHX-#`N+S$P+"(5"@0? -M(R0F+#(S+B(5"P@)#`X1$`T*"@\7(2DM*RS[#AXI -M+2LC&1`.$!(4$0P%_OO[_O_]^?;W^/;MX=G6V-O>W]S;W>3O^/X!`P0#`O_Z -M]/+V_PH3%A00#@\3%QD:'!X?'1P;'!T='!H6$`?]\^SFY.3FZ_'U]_?W^/K^ -M`@8+$18:'!TA*35!1T8],28A(B&QP<&QD7&R(G)!L0"08'#!(9'AX8#@4```$!__OY -M^/GZ^??W^/O_`P@0&2(G*2HK*B4>&!88'!\C)B@H)B,@'AL9%0X$_/CW^/O^ -M``#\]O+T]_?SZN#9U]C>Z/+X^OO\`0H5'R0B&0\'!08'!0#[]O/S]_\+%R$I -M+"LE'!$%^_;X``P7("8H*"8A&Q<4#PC^]>[IYN+@X.3J[O#Q\O/U]_?V]_K_ -M!`@*#`P+#`X3&1T=&Q81#0L+#`\1$Q(1#Q$7'1X:$PT)!@4&"`L.$1,3$Q49 -M("P -MK*FEHJ*FKK.QJ*&@IZZQKJFGK+2ZO\'#P\+#Q[T^@`#`OSU[NCDY>KR^P('"PX1$A$."@7_^/+LZ.;E -MY.3DYNKO]OT$"0P.#0H&`@#]^?/JX-;.Q\&\NKFYN+FYM[2OK:^TN;W`PL;, -MTM;5TLW,S,W,RLG*S,[1T]+,Q+NSKZ^QM+6UL["MJJ>CHJ.FJZ^RM;J_QLS1 -MU-;8W-_?V]+(P+V^Q,S3V-K:V=K=X>7J\/C_!0L4'RHS.3Y%35)444M$.S0N -M*20?'!H7$`?\\^_P]/GZ]_3S]OL``/[[^?O\^O3KX]W;WN;Q_`@3&QT:%!`1 -M%1LA)BDK*RDD'!$'`/T`!PP,"`0#`P0$!P\9(R@G(AT;'"`A'QL7$PX(`OS[ -M_@($__?PZ^KL[_+V^?K[_0,-&28O,S0S,S,U-34T,C$N*R -MW-O;WN3M]P`'"PH'`?W]`@@.$`\-#`P-#`D%`?[[^_X!!0<(!@#W[NKL\O?X -M]_;X^_\!!0L4'RCDXN'?W=O9V-?8VMWBYNGK[_7_"Q@B*2TN+2TM+2TL*2,=&!45 -M%A<<(RPR,BTF(1\?'AP7$@T(!`#]_/KY^/CW]O;V^/K]__[Y\>KDXN+AW]W< -MW-O;W-_EZNKHYNCO^@81&1P;%0X&`/W[^OOZ^OCV\N[LZ^OJZ.?HZNWR]_O\ -M^_CU]?;Y_@0*#1`2%!<6$PX)!0(`__\``0(%"0T1%!<:'!\D*"TO,3(S-38V -M-30S-CQ$351:7V)B8%Q74DU'0#8L(QP8%Q@<'R`?'1L9&1PB*"PK*"4C)"8H -M+#`V/$%%1TA)2DI)14`\.ST].3`E'1H<("0C'ACM\._LZ.;EY.3CX^3GZ^WMZ^OP^`$%!0'[]?/S^/X% -M"P\3%QL>(2(C)28G*"@F(AL2"/_Y]?/Q[^WL[O'V_``"`P0(#`X-"`'Y\_+T -M^/S_`/[Y]/'P\O/S\.KBV=+.R\K)R,?(R\_4V=W?W][;UM35W.7L[>GAW-O? -MY.CIZNOM[^_KY=[8U=+,P[JWN+W&T=SCY-_8TM'7W^?L\?;Z_?[___[Z].WI -MZ.?FY.3FYN+8S<*[M[:XNKV_P<+!O[V\O+R[M["II:6GJJRNK["PL+&SMKJ] -MO\+$Q<7%Q<;*T-;OKY]_6T=+7 -MX.GP\_+R]/?Z_/W^_P(#`OWU[.;DY.+>VM?6UM;5U-+/SKJ[._Q -M\>_N[.SM\//U]?/NZ>7BX-S5RKVQJ**=FYJ;G9^?GZ*KM;JYM+"RN+_#P\#` -MP\G0U=KAZ?#R\.WN]/L``?[Y]/#N\//X_/\!`@0)#A`-!P'Z\^WHY.#=V=71 -MSLS+S,O'P;_!QLK+R<7"P<'"PL3)TMOBZ.SR^?X!`P,#`/W[^??V]?3R[^KE -MX-_?X.'AX-_=V]C5U-?=Y.GN\O;X^?GX^/K^`P4"^O/P\O;Y^OT!"`P-"PD) -M"@H)!@0"`P@1&B`A'!4."@8#_OKW]OCZ_/[_``$!`0("__GPY][7T];=Y^[R -M\O'O[.CFY^KL[N_N[>[O\?+S\_/S\_/S]?7R[>?BWMW>W=C3SLS+R\G'QL7& -MR,O/T]?:W-[AY.CL[N[MZNCGZ.ON[^[LZ>?DXN'AXN3EY^KM\?7X^_X``0$# -M!@D,$!,5%QLB*C`T,S$R-CHZ-S0S-3H^0#\]/D)'2TY/45)24$Q(1DA*3$M' -M/S65545%)/3$I-5%YH;W)R<&MH9VAK;7!Q#=W-W>WM[?X^KN\?/V^P`"`?SY -M^OT``P+__?O\_?W]^_CV]?3T]/?[`0<-#PT&_O?R[NKIZNWP\O+P[NWL[O'U -M^?S^``0(#!`3%1D=("(B(1\;%Q$+!@+_^_;PZ>/AX^CN\_?Y_/X!!`<)"PP- -M#`D$_?CT\>_N[^_O[NSKZ>CGY^?FY./CX^'#AWMC2SLS+R\W2 -MV-SCEXN#@W][V -MM[N_PL3%QL;&Q<"\NKN^O[Z[NKJ[OL+&R]#6W>/I[O'T]_K^`0(!_OW^`@0# -M__OX]O7R[>;>U]35VN#FZ>KGX^#=W=[@X^?JZ>?CX-W9U='-S,O*R,;#P<"_ -MP,+%RM'7V]S=W=W=W=S=WN'CY./@WMO:V=O>X^?GY.'AXN'>VMG;WN#?VM74 -MUMKXN;HY^7DY.3DXN#?WM[=W=S;VMK;W>#BX>#?WM[>WM[>X./GZN[R -M]?;U\_3V^OW__OW[^/CY_0$%"0P/#P\/#@\/#Q$1$0X+"`8%!08&!@4$`@#] -M^??U\_#LY=_7T,K&PKZXL:NHIJ6EIZNTO\W9X.+AX.+FZ>CCW=C6U=73T]37 -MV=G7UM?:W^/GZ>SP\_;W]_7T\_/S\O#MZNGJ[.[N[>OJZNSM[>SL[>WM[>OI -MY^3BW]W;VMK;V]O9U];7V=O>W^'CYNCIZ>KM[_'R\_3U]?+N[.SP]?K_`P4# -M`?[\^_GU[^C@V=31S&A82#PX-#`D%`/W\_@(%!P4" -M_OS[_0`%"Q(:("(@'1@5$0X)!@0"`/SX]/+R]/?Z^_S_`@4%`OWW]/+T]_O] -M_/GW]_GZ^??U]//Q[>CDX^/CXM_;U]75V-SAZ?#W_``"!0<("`<&!@D-#P\- -M"@D+$!@='QX='2`B(R(A(B4K,#0V-C8U,S$N+"PM,38\0D9)2$5`.C0N*RHI -M)R,>&QL=("$A(B0H*RXO,#$S-SH\/#HW,S`K)R$;%A(1$A48&AXB)2@H)R4D -M(B$@'Q\@'QT9%`\,"08%!08("`@("0H*"0D*"@@"^O+N[_/Y_P,$`P(!`@,% -M!PL0%1@8%A,1$1(4&!TB)BHN-3Q"2$Q-2T=$0D`_/3LZ.3H\/T1(2TQ)14`\ -M.CL]0$)#1$9&0SPT+2DH*2HH(QT9&1XF+S8\/CX]/#HW-3,U.#Q`1$E/4U=7 -M5$])0CLV,S(S,S,Q,"XO,C<\/C\^/C]#1TQ26%YA8%U955-24E%/2TA&145$ -M03TZ.#;BX-[>WM[>WM[?X>3FY>/@W=W=W^'DYN;FY>;FY^?FY.'@X.'D -MZ.KL[.OJZ>OM\//U]O;W^/K[_/OY]O+O[.KHY^;CX-W;V=?5U-78VMO:V-;4 -MTM+3U-75U-+1T,_.SM#3V-O>W][>W^'E[//X_/W^_P$$"A$7'2`B)"4F)B4B -M'AL8%Q83#@<`^O;S\_3W^_W^^_CU\_/T^/X%#!`/#`<"`/_^_P$#!0<&`P#\ -M^OK\_P$"`@("`@(`_/?QZ^7@W-G8UM74U=?:W-W;U]/1T=/3TL_-SM'4U]G; -MW=_AX=_=W-O:V=;3T,S)Q\?(R\_3UM?6T]#-S<_2UM?5TWM[F]PL?*S,S-T-;>YN[U^_\!_O?PZN?GZ>KH -MY>'>W=_CZ.[T^/KZ^?CX^OO\^_KX]?'LZ.3BX>#?WM[?X-_>V];/R=I*NQM;>XNKN^P<7+ -MTMG?Y.;FX^#+FZN_S^/S_`/_\^?GZ_?\` -M`0$!`0$#!0@+#0X-#`L*"@<"_/7Q\//W_``"!`8*#Q4:'B(G+#$U.#DX-S0Q -M+BLI)R0A'1D8&!L>'Q\=&!,."@<%`P$`__\```#__?S\_/S\_/S\^_GV]?C^ -M!@X4&!L='R`B)"8H*2DH)R'!P>(20G*2HI*2@F(QX7$0P(!0']^OCW -M]_CZ_/\#!@<'!@0"`0$"`0#^_/KX]O/O[.OL[_/U]?/Q\?'S]OK_!0L.#PX. -M#@\/#P\-#`H'`OWX]?/S\_3V^?O\_/KZ^_W_``#__/KW]?3U]_L!!PT2%!44 -M$Q,3%!46%A85%!47&1H9%Q45%A86%!(1$1$2%!<9&1@6%103$@\,"0<&!@8' -M!P@("Q`7(2HS.C]"0T$^/#HX-C(N*20>%Q(/#Q$5&!H;'!\B)"8G)B4B'QX? -M(R(",E)B@H*"@F)2,A'QX='1X@(B0D)"0E)BDJ*RLK+"PJ*"0A'AT< -M'!\B)"4C(!T;'!\C)RDG)!\;&1D:'!\A(R0C(!L6$1`4&B`E*"DI*2LP.$!' -M2TU/3T]-245"04%!/SLV,BXL*24A'1H8%!`-"@D)"@P/$A,2#PP)"`H-$!06 -M&!@8%Q45%AD<'1T='1\A(R4F)RDK+3`R-#4U-3(N*B0?&Q<5%!,2$A07&QT< -M&A<5%!,3%!8;("0G*"@H*"@G)R&143$A$1$A06%103%!@>(RWN[_'S\_3U]_O_`@0$ -M`O_\^//LY=[9U];6U-/0S'CY./AX.'BY.3CX=[;V=?5TL_-S,S,S,W-S]#/SLO*RLO,SVM;6VN;N\O+N[O+[!Q3CXN'@WMS9 -MUM/0S\[0TM78V]W>W]_?W][;UM#*QL/"PL+#Q,7%Q<3"P<'%R]+9W^3HZ^[Q -M]?G]``(!_OOW]O;V]_?W]_?V]?/Q[^WLZ^KJ[.[P[NKDWMK8V-K;V]K7TLW( -MQ<3&R+@W]_?W^#AX-W8T,G# -MP,#"Q+CX^3DX^'?W=O8U='.R\K)R;L\?/T]??Z -M_/OY]._KZ>CIZNSO\?/T]/3V^?T!`P8("@H)!@0#`P(`_OOY]_7T]/;X^_[_ -M__[[^/;U]O7T\_/T]_K]_O___P$#!@H-#0P*"`<'!P@)"0H*"0@'!@4%!00# -M`?[Z]O/R\_7W^/?U\O'Q\_?\``0&!P4$`P0&"0P/$105%100#0L)"`8$`P0& -M"0P.$1,5%QD;&QH8%Q<7%Q<6%!$."P@&!0,`_?GU\.SJZNOL[N[M[.OJZ^WP -M\_;Y_@,*$AHA)B@F(Q\;&AD:'!X>'1D4#0;_^_O]``,$!`,$!`4%`P(````! -M`@,"`?_[^/;X_``"`@#\]O'P\?/V_`(("PP,"0/\]_3P[.ON]?T%#!(4$@T' -M`__\^_X!!`8(#!0;'QT6"O_Y^?T!`P,!_P`"!0@,$!48&AH:&1@:'B0J+S4Z -M/D`^.S'R`?'!8. -M!O[X]?/T]OCY^/7Q[N[P\_7U]/+R\O3W^_W^_?W]_P(&"0H*"PP/$A49'!X? -M'AT<'!T?(RXN;R^P<+!O[Z^ -MOKV\NKBWM[BXM[6TM;BZN[N\O+R_Q,K0TM+1S\_/T-#0S\W+RLG)R\_2T]/2 -MS\O(Q<+!P,'"Q,7&Q\;$P;^]OL#$R,W2UMG;M\?/R\?'R\_/OZN7AX.#B -MY.;IZ^[P\_7W^?GX]_7S\_/U]?7S\._N[_'R\O+Q\?'Q\._P\?+T]//S\_/S -M\_'P[^[O[^_P\/'R\_3T\_'NZ^KHYN7DYN?IZNKJZNKGX][8U=/3U-;6U='. -MR\O-T-/5U=+/R\K*S='4U=73T,[.T-/7VMS=W=[BY^SP\?+Q\O+T]??Y^_O[ -M^/;S\O+S]?;W^?O^`04("@P-#A`2%!87&1H:&182#PP*"`@&`_WW\>SHY>'> -MV]C6T]'.SVM+2UN+S`Q,C,S]+4U]K>XN7FX]W7TOO\_?Y^OKX]_;X^?O[^_KX^/CX^OO]_?OZ^/?W^/K]``,$`P(" -M`@($!0<(!P8$`@(#!08'!P<'"0P1%APB)RPO,3$P+"_O\?3V]_?U]??Z_@(&"0H*"PX3%QD9&AL='!H7 -M%1,2$0\-#`P.$!$1$1(4%Q@8%1$."P<"_?S]`00%`P$"!0H1%QD8%A04%186 -M%A46&1XB(R,?&Q<4$A(4&2`F*2'Q\=&QD9&!@8&!<5$@X+"`8&!04& -M!@8&!@8'"0P/$1$/#@\2%AL@)"DN,C4V-C8X.CU`0#TX,BTL+3(V.S]"1DA+ -M3$U-34Y/3DM$.C`H(B$B)2DK*RDG)RDM,SI!2$]35%-134E&1$-!/CPY.#D[ -M/C\_/#(B#AX>'@W=K7UM?7U];6U]?6UM75V-WD -M[/+V]_?V]O7T\_#KY=[6T,O(R,C(QL/`O;N\OL'$Q\G+S,W,R\G)RLS.SLS) -MQ,"]O;Z_P,"_OKV]O;V]OL##QLG,T-38V=K9V-C8V-C8V-C8V-G9V][AYNKM -M[_#P[^_P\?+T]?7U]/7V]_CY^/?T\>_N[>[P\O+Q[NKFX^+CY>GL[N_P\?3X -M_0$#!`,"`0($!PD+"PD&`?[Z]_3Q[^[O\/+S]/7U]O?W]O/MYM_9U-'.R\C% -MP\+#QHJ6HJJJKK*ZQM+6TL[&OKJZPM+G`QLO/T=+1T,W)QL*_O+JYN+BV -MM+&NK*RLK:^SN+[$R -MW-O:V]S>X.'BXN/CX^/CY.;GZ.CHZ>KKZ^OKZNGHY^?HZN[S^/O]_O\``0$! -M`/_^_?OZ^/?V]?3S\.SHY-_;U];5U=34U-77V-G;W=_BY>CJ[.[Q]?C\_@`` -M`0(#!@D-$!(4%187&!D:&AL<'1X@(R8I*BLI)R0B(!\@(2(D)"0C(B`>'!L< -M'!P9$@H`^//P[N[MZ^KHZ.GK[>_Q\_7W^/CY^OO]_O[\^O?U\_'P[^[M[.SK -MZ^OKZ^KHZ.CK[?#R\_/Q[^SIZ.CIZ^WP\_7U]/+P[_#R\_/P[NSL[O'U^?T" -M!@D*"PL*"@D("`<&!`'^^_GW]O;W^/GY^?GX^/CY^_S\^_CS[NKFX^'@X>/F -MY^CHZ>WR^?X``/___OSW\NWJZ.CK[_/V]_?V]_G[_0`$"Q(9'2`C)2@J*B@F -M)"(@'R$F+3,W.3@U,BXH(!D4$A4:("0G*"@I*2HK+2\Q,S4X/$%'35%45E53 -M3TM&0T`^.SDW-34W.C]#2$M-3D]04E165UA:7F)G:VYP<&]L:&->6%-/3DU- -M3$I'0CPV,"PI*2DI*BLN,SI!14A(24I,3U%14$]/3U%24E!-245"/CHW-#,S -M,S0U-C8T,B\M*B'!D6$Q`.#0P*"`4"__W\_/S]_O_^_/KW]/+P[^[N -M[>WM[>OJZ.CHZNWP\_;Y_/X``0,$!04#`/[\_/S]_OW]_O\!`@(!__SY]O+N -M[.OK[.[N[N_P\?/U]O;R[>;AWMW>W^#AXN/CXN'AX^?L\O@`!P\7'B0I+"XP -M,#`O+"DG)B@I*2(R8G -M)B0B("`@(2`>&Q82#@P-#@X-"0/]^??U\_#MZ^KJZ>?EX^+BX^7GZNSO\?+R -M\?'Q\O3V^?O]_OWZ]_/P[>OJZ^[R]??V]?7U]OCY^_W_`00&"0L+"@@%`?_\ -M^O?S[^OGY>/BX-_?WM[>WM[>W]_?WM[>X.'CY.3CX>#AY.CN\_;W]_;U]/3S -M\O#O[N_P\?+R\O'O[>GFY./CX^/CX^+@W]W=W-K7T]#.S,G'Q\K0U]O=W=S; -MV]O:V-;4TM'1TM34U-+/R\;"OKRYM[2RL+"PL;.VN;N[N[N\O;_!Q,C+SM#0 -MT-'2T]+0SCK[>[N[N_P\?'R\_3U]O;T\>WJY^;EY./A -MW]WVM71S]#3U]O=W^'DY^OM -M[O#R]?;V]//S]?CY]_/NZ>7BW]W/FZ.CG -MY>+>VMC6U]K=X.+DY>?I[?'W_0,(#`X-"PH*"@L-#@\."P<#`/[_`0,$!`0# -M`?[Y]?+Q\?'P[NKFX^'@W]_?X.+DYN7AW-?5U=?7GY^?FY^CK[>[MZ^GH -MZ>SQ]_S_`0#^^_GW]?3R[^WL[>_S]_O]_P`"!`8'"`@*#!$6&AT='!L<'B`@ -M'AL9&!D:&AD8&!D9&AD9&!<6%1$-"`0"`P8*#A$3%!03$Q,2$1$1$1(2$A$1 -M$Q47%A$,"`<("PP,"@@'"`@'!0,"`P4'"`<&!08(#!`5&AXB)2'R$C)2&Q@6%105%144$Q$.#`H)"0D*"PT.#P\/#P\.#@\0$Q47%Q84 -M$A`/#@T+"0D*#0\1$1`.#0L*"`<&!04%!@<("`<&!04$!`0$!`0$!`,#`P0% -M!@<'!@4$!`4&"`D*"@H*"PT.#P\.#0T.$!,7&QXA)"DN,C8X.3DY.##AX^;IZ^SL[>WN[_#P[^[M[>SKZ>;CX-[;V=?5 -MU=75UM;6U=/1T,[,RL?$PL"_O;RZN;FZO+[!PL+!O[V\O+V_P<+"PL+#Q#BX=_ -MW^#@X.#@W][7EYN;GZ.ON\O;Z_@(&"0P.$!$3%AD;'1P9%1`, -M"0@'!@4#`?[[^/7R\?'Q\>_KY^3BX>#@X-_?W][WMWKL[O+W^P`#!@D)"`8$`O_\^?;T\_+S\_3U]??Y -M_``%"`H+"PD'!`("`P8("PX0$1(3%!47%Q@8&AP>(2(B(B$@'QX<&A@6%!(1 -M$1$3%AH='R`A(R,C(A\=&QL<'R(E)20A'QT;&QP<'1T>'B`B)"8G)R8F)B'A\?'QX='!T>(2(B(1X;&1@8&1H: -M&1<4$0X,#0X1$A,3$Q06&1XB)B@I*2DJ*RTN+S`Q,C0V.#@V,S`M*R@F(R`= -M'!P='A\?'AT;&AD9&1D9&AL<'!L<'1X@(2$?'AP;&QL<'!T='AX>'AT<'!L; -M'!P='B`A(B,C(B`>'1T='AX<&183$1$3%QH<'1X@(R8J+2\O+RXM+2\P,3(S -M-#,R,"TK*RLK*B'R`@("`@'QX<&QH:&AD8%Q@9&QT?(2(B(!T:%A(0#P\0 -M$1(4%187&!@7%A86%Q@:'!X@(B,D)24E)"(?'!D7%A86%A44$A`.#`H(!0," -M`0``___^_@`"!`4%`P#]^_O\_@$%"0T/$!`/#P\.#0L)!P8&!P<("`<'!@<' -M"`D*"@H+"PP-#@X-"P<"_OKW]O;W^/GZ^OKZ^OK[_?\``0(#`P4'"`H*"@H) -M"0D)"`8$`O_]^_O[^_S\_?W^``(%!PD+"PL*"@H*#`T0$Q88&QT='1P<&QP= -M'1X>'R`B)"4E)2,@'1@4$0X,"@D(!P4$`@$`_OSZ]_7T]/3U]?7U]O;V]?;W -M^?S^```````!`0,$!0<*#`\2%!04$A$0$!`/#@P*"0@("`@(!P8$`?[[^/?V -M]_GZ^_OZ^??U\N_MZ^KIZ.?FY>3DY.7EY^GL[O#P[^WKZNGJZ^SL[.SKZ^SN -M\//V^/GZ^_O\_?W\^OGY^?K[^OCV\_+P\/#Q\O/T]//Q\._N[NWJZ.3@W=K6 -MU-+1T-#0T,[-S,[1U=O@Y.?HY^;FY>7FY^GK[>[O\/#P\/#P\?/V^/KY^/7S -M\?'S]_P!!08&!`(`````__W[^/7S\O#NZ^CFYN;FY^GJZ^SL[.OIZ.;EX^+B -MX>'AX>'AXN+BX^+AW][=W-W>X.#@W]W:U]32T=#/SLW+R,7#PL'!P<+$QLG+ -MS,W.S\_0T='1TM/5U=;5U=33T]34U=;7V-G:VMO;W>#DZ.ON[^_O[>OIY^7B -MW]O8UM74T]'/SLW-SKJZ>?DX>#@XN3FZ.KKZ^KIY^7BW]S9UM/0S;GZ.CHY^;DXM_WLZNCEXM_>W^'DYN?HZ.GJZ^SN[_'T -M]?;V]?/Q\._O\/'R\_/T]?;W^/GZ^_W]_OW\^_O\_?[^_?KV\^_MZ^KIZ.?E -MXN#?W]_?WMW;V=C8V-K>XN;I[?#S]OG[_/S\_?\!!`<*#0\1$1(2$Q,3$A$0 -M$!`/#0L(!0(`__[]_/O\_?\!`@0%!PD,#A`1$`X,"08#`?_^_O[^__\```$! -M`@0&"@X2%186%1,1#PX-#`L)!@+__?W\_/W]_?\!!`<("`<&!@<*#0\/#@P* -M"0D+#A`1$`X+"0<&!PD*"PH(!@0"`@,%!P@)"@L,#A`1$A,3$Q(0#PX.#Q$2 -M%!04%!47&AXB)"8G*"LN,C4W.3DX.#'AX>'A\@(2(B(B(B(R0E)RHL -M+2TL*RDG)2,B(2$A("`?'AX='A\@(B,C(A\;&!43$Q,2$1`/#@T-#@X0$A89 -M'!X>'AT<&QH8%Q85$Q(1$!`/#PX.#@X/$106&!H;&QL<'1\A(B(B(2`?'!D6 -M$Q`/#@\0$1$1$`\0$A8:'B(E)R -M'1P:&1@7%A44$Q(2$A(1$1`/#@P*"`4"_OOX]O;U]//Q\.[LZNGIZ>GK[.WN -M[_#P\?+R\_/R\O+T]OG\_P(%!P@)"0@'!@4%!08&!@4$!`,"`@$````!`@0% -M!04$!08("@P,"P@&!04&"`D*"@D("`D+#0\1$Q47&AP>'QX<&1<4$@\.#`H( -M!@4%!@<'!P8$`@#_``$"`P0$!`0#`@$````"`P0$`@#\^?7R\.WJY^3AW]W< -MV]K9V-C9V][BY>?GY^?FYN7EY>;EY>3CXN+BX>'@W]W=W-SWM[=V]K8U];6U]C: -MV]W?X.+DY>?HZ>KK[.SKZ^KIZ.CHY^;DX^/DY>;HZ.CGY>+@WMS:V-;5U-+2 -MTM/5V-O>X>/DY>3DY.3DY./BX>#@W][>WMW=W=W=WM[@XN7HZNOKZ^KJZNKK -MZ^OKZNKIZ>CHZ.GIZNKJZ>?FYN?HZ>OL[.SL[.SM[>[N[N[O\/'R\_7V^/K] -M_P$$!@D,#A`1$`X+"0@&!00$`P,#`@(!__WZ^/;V]O;W^/CW]O;V]_G\_@`! -M`0#__O[^_O[_``($!0<)"@L,#0X.#@P*!P/__?OZ^?CU\_'P[_#P\?'Q\?'Q -M\?'P[^[LZ^GGY>3CXN#?W=S+DY>;GY^CIZ^WO\/+S]/7V]O;V]O?Y -M^_W^_OW\^_KY^/?V]?7U]O;V]?7U]O?X^?GZ^_S]__\`___^_?W]_/S\_/OZ -M^?CX^OT"!@H,#`L)"`@("`@&!0(!`/\```$#!0<)"@H*"@H+#A$3%145$Q(2 -M$Q,3$A`.#`L+#`P-#`L+"@H*"PL,#`T.$!,8'2$D)B8E)20E)B@J+"TM+2TM -M+2TM+"PL+"TN+R\P,#$R,S0T,S(R,C(T-38V-C0S,C(R,S0U-C&A<4$A`0$!`1$1(4%1<9&AL<'!P<'!P<'!L:&1D9&AL<'!H9&!<6%A86 -M%Q<8&!@8&!@7%Q<6%103$A$0#@X.#Q`2$Q03$A$0#PX.#Q`2%!<9'!\A(2$@ -M'Q\A)"@L+S(T-CWJY^7DY.7EYN?H -MZ>OL[>[N[^_O\/'S]/7U]?7U]//Q[NKGY./CX^3DY./BX>'@X>'AX>'BXN+B -MXN+BXN+BX^/DY.3DX^/CY.7FY>3AW][>W^#BX^/BXN'BX^7HZNSM[>OJZ>CG -MY^?FYN7EYN;GY^CHY^?GY^;DX^+AX>#?W=O8U=+/S,K(Q\;%Q<;'R,G*S=#4 -MV-K'AXN/EYN?GYN7DX^+@W]W;VMC7UM;5U=75U=/1SLS)Q\7$ -MPL"_O;V\O;Z^OKV]O;[`P<+#Q<;'Q\?'QCJ[>[P\/'Q\?'O[NSJ -MZ.7CX=_>W=S;GY^CIZ>KK[.[O\/#Q\?'R\_/S\>_LZNGIZ>OL -M[O#Q\O+S]/3U]O;U]/+Q\?'R]/;X^?GY]_7S\>_LZ>?EY.3CX>#>W=W=WN#B -MX^7FYN?IZNSN\?/U]_?W]O;U]O?Y^_W__P#___[^______[^_O[^______[\ -M^OCV]//R\?+R\_3U]//P[.CDX=_?W^#BX^3DX^/CY.;HZ^WO\?/V^OX"!@H, -M#0T-#`L*"0@'!@0#`@$`__[]_?S\^_OZ^OGY^?KZ^?GX^/GY^?CW]O7V]O;V -M]_CY^_W_`0,#`P'__?S[^_O[^OGX]_;T\O+R\O/T]O?Z_0$$!@@*"@L+"PH) -M"0@)"@P.#Q`1$1$0$`\.#0T-#0X.#@\/$!$3%!87&!D9&1D9&1D9&1H;&QH8 -M%Q86%Q<8&!@8&1L='A\@(B0G*BPN+R\P,C0V.#DZ.3@V-#,R,3$Q,"\M+"LJ -M*RPN,#`P+RXL*RLK*RPL+"PL+"PN+S$R,C(Q,"\N+BXM+"HH)RW-K9U];5U=34U-34U-35UM?9VMOX.'CY>7E -MY>3DY.;HZNSN[N[N[>[N[^_P\?+S]/3S\O'P\/#Q\O+S\_/T]/7U]?7V]_G[ -M_@$$!@@*#`X0$1(3$A$/#@P*"`<&!00#`0#__O[]_/OX]/'MZ^KIZ>GJZNKJ -MZNKKZ^SM[>SJZ.7CXN'AXN3EY>;EY>3DY.7GZNWO\?/U]_G[_?[^_OW\^??S -M[^OGX^'>W-O:V-?5T]+1T-#1T='2T]35UM?8V-G9V=G9V=K:V]S=WM_AX^7G -MZ.GHYN3AWMS;VMG8U];4U-/2T=#/SLS+RLG(R,G)R#?W]_@X.#@WMS;VMK;V]O; -MV]K9V-?7U]C9V=K9V-;4T;HZ>KK[>_R\_/S\_/S\_+Q\.[M[.OKZ^KIZ.;CX=[=W-SWN[N_P\?+Q\?#O[^_N[>OIZ.;EY>7E -MY.3CX^/DY>;IZ^[P\O3V]_G[_/W]_?W]_?W]_O[__P```/__```!`@,#!`0$ -M!08'"`H,#0T-#`L*"0@'!@4$`P$`_OW\^_KY^/CX^?O\_?[^_OW]_/SZ^?;T -M\_+R\_3V]_GZ^_S]_?[_``$"`@,#`P,$!`0#`0#^_/OY^/?W]_CY^_S_`00& -M"`H+#`P,"PH*"0H*#`T0$A48&QTA)"'1T<'!P='1X? -M("$B(R0D)24E)B@H*2DH*"8E(R(@'QT;&A@8%Q<6%A45%146%Q@8&1@8&1D; -M'!X@(2(C)"8G*"HK+2XO,#$Q,"\M+"PK*RLL+"PK*RDI*"'R`?'Q\?(2,E)R_MZ^CFY./CX^3FZ.KM[N_N[NWL[.OK -MZ>CGY^GJ[>_P\?'R\O/U]_CZ_/\``@,$!@@)"PT.#PX.#`L*"@H*"@D)"`<& -M!00"`?____[^_?SZ^?CW]_CY^_W_`0,%!@<("@L,#0T-#0T-#0X/#Q`1$1(2 -M%!47&!D8%Q43$`X,"PL*"@H*"PL+"PP,#`P+"@<%`O_]_/O\_/W]_O\``@4( -M"PT/$1,4%187%Q@7%Q44$A`.#0P,#`P-#0X/$1,6&!H;'!T='1P;&1@7%Q87 -M%Q<8&!D9&QP='R`@(2(B(R,C(R,A'QP9%A,0#@P+"@D(!P4#`@$```#___[] -M_?W^_O[^_OW\^OCW]O7U]//R\.WJYN/@W][?X.'AXN+BX>'@X-[=W-O:V=C7 -MUM32T,W+RX.'BXN/DYN?IZNSL[>WN[N_P\O/T]/3S -M\?#O[^_N[>SKZ^KJZ>GGYN3BX-W;V=?5T]'.S,G'Q[N[NWM[.SL[.SM[N[O -M[^[N[N[N[^_P\/#P\/#O[NWM[>WN[_#Q\O+S\_/T]?;X^OO\_?W]_?S[^OCV -M]?3T]/3T\_'O[.GGY>3CY.7FY^CIZ>GIZ>GIZ>KK[>_R]??Y^OKZ^OKZ^?GX -M]_;U]//Q\.[LZ^KIZ>GIZNKK[.SL[.SKZNGHZ.GIZNOK[.SKZ^SM[_+U^/O] -M``($!08'!P<'!P8&!04$!`0%!04%!04%!`0$`P,#!`4&"`D)"@L,#0\1$Q05 -M%A<7&!@8%Q86%A<:'2$D)B8F)B4E)28G*2HK*BDG)2,B(2`?'AT<&QH9&!85 -M$Q$/#0L)!P4#`0#__P`!`P0%!@<'!P@)"PX0$Q47&1P>(2,D)24E)"0D)"4F -M*"DK+"PL*RHJ*2DI*2@G)B0C(B`@("`@("`?'QX='!L:&!<5%!,2$1$1$1$1 -M$A05%A86%A87&1L?(B4H*2HJ*BDI*2@H*"'1T< -M&QL;'!T>'1P;&QH:&AH:&1@7%1,0#PT,#`P,#`T-#0X.#Q$2$Q46%QD;'B`C -M)"8G*"DJ+"TO+R\N+BXO,#(T-#0T,S(Q,#`O+BPI*" -M("(C(R(A'QX='1T<&QD7%!(0#P\/#P\.#@T-#0T-#0T.#@\/#PX-#`L)!P4# -M`0#^_/KX]O3S\O'P[^[N[>WM[>SLZNGGY>/BX>'AXN/CX^/BXN+CY>;HZNOL -M[>[N[_#R\_3S\_+Q\?+S]OCZ^_S]_?[_```!`0$!`0```````/____[^_?W\ -M_/S\_@`"!`4&!P@("0H*"PH*"0@&!@8&!@8&!@8%!`,!__[]_?W]_/OY]_;T -M]/3U]O?X^/GY^?GY^/CX^/?V]/'NZ^?CX-[W^'BX^3EY^CJZ^SM[>WL[.KIZ.?FYN;FYN7DX^/CX^/BXN+AX>+B -MX^3EYNCIZNOKZ^OKZ^SN\/+T]O?X^/GZ_/W^_O___O[^_?W\_/OZ^?CW]_?X -M^?K[^_S\_/O[^?CV]/+Q[^WKZ>?DX=_W^#@X.#AX>'BX^/CX^/C -MXN#=VM;2S\O)QL/`OKR[N[JZN;>VM;6UMK>XNKR]OK_!PL/$QL?'Q\;$P\/# -MQ,7'R,G+R\S,S,S+R\O+S,W.T-'1TM/5UM?8VMO+CY.3EY^GK[>_P\?+S]/7V]_CX^/?V]?/Q[^[L[.OJZ>CGYN7DX^/BXN+B -MXN/EY^GK[>[O[_#Q\O+S\_/S\O'P[^[M[.SKZNGHYN7EY>7EY>;GZ.GJZ^WN -M[_#Q\O/S\_/S]/3U]?7U]//R\?'Q\O+S\_/R\O+S]?CZ_?\``0(#!`4'"`D* -M"0@&!0,"`0$!`/_^_?S[^OKZ^OKY^?GY^OO\_/W]_?[^_O[]_?S[^??V]?3T -M]/7U]?7V]_?X^?GZ^?GY^?KZ^_O[^OGY^/CX^/GZ^OKZ^?GX^/CX^/GZ^_O[ -M^_KZ^OGY^?GZ^OO\_O__`````0$"!`4&!@8&!@<'"`D*"PL*"`8%!`,#!`4& -M!P@("`@("`@("0L+#`T-#@\1$Q06&!D:&QL;&QL;&QP<'1T='1P;&AD7%A44 -M$Q,3$Q,3$A$0#PX,"PH)"`@("`D)"0D)"@H+"PP,#0X0$1(4%186%Q<7%Q86 -M%A85%145%145%!04%!45%A85%!,2$1$1$1`0#PX-#`P,#0X.#Q`0$!$1$1$1 -M$1$0$`\.#0L*"0@(!P<&!04%!@<("@P-#@\/#@T-#`P-#@\1$A,4%187&!@8 -M%Q<6%104%!04%!04%!04%!04%!45%Q@9&1D8%Q43$A`/#Q`0$1$0#PX,"PH* -M"PP-#Q`1$A(4%1<8&AP='1T>'R`B)"4F)B4D)"0D)"4F)R@H)R4C(2`?'Q\@ -M("$A(2(C)"8H*BPM+S`P,3(S-#4V-C8U-#,R,3`P+RXN+2TL+"PM+2\P,3$R -M,S,S,S,S,S,S,C(R,C(S,S,R,C$O+BPJ*"8E)"0D)",C(R,C)"4E)28F)B8F -M)B8F)20C(2`?'QX>'AT<&QH8%A44%!04%!04%!03$Q,2$A(1$A(2$Q,3%!47 -M&!H;&QL;&AD9&!<6%104%!45%145%!(0#@T-#0X/$!(3%!45%104%!,2$1`/ -M#0P,"PL+"PL,#`P+"PH*"0D*"@L,#`P-#`P-#0T.#@\/#P\.#@T,"PH*"0D( -M"`<&!@8'!P<(!P<&!04%!08&!@4$`P(!`````/____[^_O__``````#__OW[ -M^_KZ^_S]_O_____]_/O[^_O\^_OZ^?GX^/CX]_;U]/3T]/3T]/3T]/3T]/3T -M]/3S\_+Q\._N[>SKZNGHY^;FYN;FY^?GYN7EY>7EYN;FYN?HZ>OM[_'R\O/S -M]/7W^/GZ^OGX]_;U\_+Q[^[M[.SKZNGHY^?GY^?GZ.CHZ>GJZ^SL[>[N[^_O -M[NSKZNGIZ>GIZ.CGYN7DX^/BXN'AX>'AX>+BX^/DY./BX=[X.'BXN/CY.7FY^?GY^?FYN;FYN?HZ>GIZ.CGYN;F -MYN;EY>3DXN'?WMW+BXN+BX>'AX>'AX>'AX.#@W]_?W]_@X.#@X>'B -MX^7FY^CHZ>GIZ>GHZ.CGYN;FYN;FYN7EY.+AX-_>W]_@X>+CX^/BXN/CY.;G -MZ.GJZNGIZ.;EY./BXN+AX>'@X>'BXN/CY.3DY>;GZ.GJZNKJZNKJZNKJZNGH -MY^;EY./BX>#@W]_?W]_@X>+CX^/DY./CY.3FY^CIZ>CGY^;FY^CHZ>KJZ^OK -MZ^SL[>WM[.SM[>[N[NWLZNGHY^?GY^?GYN;FYN;FY>7DY./DY.3EY>7EYN;F -MY>7DX^+BXN+BXN/CX^3DY.3DY./CX^/DY.7EY>;EY>;GZ.KL[_'S]/7V]O;V -M]_?W]_CX^/CW]O7T\O'P\/#P\/#O[NWLZ^OJZNKJZ>CFY>7FZ.KL[_+T]_G[ -M_@`"`P0#`P(!```!`0$!`/_^_?W\_/W\_/S[^OKY^?GY^?CX^/CX^/CX^?GY -M^OK[^_OZ^OKZ^OO\_?\``0(#!`4&!P@*#0\1$Q04%!05%145%145%186%A<7 -M%A87&!D:&QP<'!P<'1\@(2$A(!\?'AX='1P;&A@6%!(1$`\/#P\/#P\/$!`1 -M$1,4%1<9&QT?(2(C(R,C(B$@'QT;&A@7%Q85%102$1`.#0T-#0X/#Q`0$`\/ -M#Q`0$!`0$1$1$1(2$Q,4%!46%A86%145%A87&!D:&AH:&QP<'1X>'R`A(2(B -M(B(B(B(B(2$A(!\?'AT<&AD8%Q85%145%186%Q86%144$Q,4%!05%!03$Q,3 -M%!05%145%145%A87&!@9&1H;'!T>'R`A("`?'AT<&QH:&AD9&!<7%A86%A87 -M%Q@9&AL<'1T='1P:&1<6%!,3$A$0#P\.#@X.#P\/#Q`0$!`/#Q`0$!$2$Q,4 -M%!,3$A(3$Q04%145%144%!03$A$1$!`0$!$3%!46%Q<7%Q@8&1H;&QL<'!T= -M'AX>'A\@("$B(R,C(R,C(R0D)",C(B(A'QT;&185$Q(1$`X,"PH)"0H*"PT. -M#Q`1$Q05%A<8&!@8%Q<7%A86%A86%A45%186%QD;'1X@(2(C(R,C(R,C(R,D -M)"4E)B8F)24E)",C(B(A(2$A(B,C(R,C(B$@(!\>'1L:&1<5%!,2$A,4%A@: -M'!T?(2,E)RDI*2CGYN;FY>7CXN#?W=W=W=[>W=S:V-;5U-34U-/3T]+2TM/3 -MT]/3T]/3T]/2TM'1T=+2T]/3TM+2T='1T='1T='1T='1T='2T]/3T]+1T,_/ -MS\_/S\_/S\_1TM37V-K;W-S>W^'BX^3DX^/BXN'@X-_=W-SSL[.SKZNGHY^?GY^?GYN7EY./CX^+BX>#?WM[=W-S#?WMW=W=[?X.'AXN+CX^3EYN;FYN;FYN7EYN;GY^CH -MY^?FY>7EY>;GY^?GY^?GY^CHZ.CHY^?FYN7EY>7EYN;GY^?GY^?HZ.CIZ>GH -MY^;EX^+@WMW;GZ.CHZ.CHY^?HZ.GJZ^SN -M[_#Q\O/S\_/S\O+R\?'Q\?'R\O/T]?;W^?K\_@`!`P4&!P@("`@'!P<'!P@( -M"`@("`@("0D)"0D(!P<&!04$!`0#`P(!`0````$!`0("`@,#`P("`@(#`P0% -M!08%!04%!04%!04&!P<("0H+"PP,#`T.#Q$3%!87&!D:&AH:&1D9&!@8&!<7 -M%Q<8&1H<'A\@(2$A(2$@(!\>'!L9%Q85%!,2$1`/#@X-#0T.#Q`2$Q05%A<7 -M%Q<8&!@8&1D9&!@8&!<7%A44$Q(2$A$1$1`0$!`1$A,5%QD;'1\@(B,D)28G -M*"DJ*RLK*BHI*"@I*2DJ*BDI*"@H*"DJ*BLK+"PM+C`R,S0U-C4U-#(Q+RXM -M+"LJ*"'A\?("`?("`A(2(C(R(B(2$A(2(B(B$@ -M'QX=&QL:&AH:&QP='AX?("`A(B,D)B'AT<'!L:&AD8&!<6%144%!05%!04$Q,3$Q,4%!45%144$Q(1$1$1$1(2 -M$Q,3%!46%Q@8&!D9&1H;&QL;&AD8%Q86%104$Q$0$`\.#@T-#0T-#0T,#`P, -M#`P,#`P+"@@'!@4$`P(!`/_^_?W^_O[___\```(#!0<)"PP-#@\0$!$1$1$1 -M$!`/#@T,#`L*"0D("0D*"PP-#@\/$!`1$1(2$Q46%Q<7%A85%!,2$A(1$1`/ -M#@T-#0X/$!`1$!`/#P\/#Q`0$!`0#PX.#0T,#`P,#0T-#@X.#@X.#@T,"PL* -M"@H)"0@(!P8%!00$!`4&!P@("`@'!P8&!P<("`@("`<'!@4%!00$`P(!`/__ -M_P```/____________[^_?S[^OKY^/?V]?3T]/3S\_+R\O'Q\?'Q\?+R\O+R -M\_/S\_/T]/7V]_CX^?GX^/CW]O;U]//R\?#P[^[M[.SL[.SLZ^OKZNKIZ.CF -MY>7DX^/CY.3DY>;FYN;FY>3CXN'AX>+BXN+BXN'AXN+CY.3EY>7EYN;GY^CH -MZ.CGYN7EY>7EY>7DY.3CX^/CX^/CXN+BX>'@W][=W-SWM[?X.'B -MX^/CX^+AX-[=W-O;V]S=WM[?X.'CY>?IZNSM[N[O[_#P\/#P\?'Q\?'Q\?#P -M[^_O[N[M[>WL[.OKZNKIZ>GHZ.?GY^?HZ.GIZ>GIZ.?FY>/BX>'@X.#@X.#@ -MX.#@W]_?W]_?W]_?W]_?W]_?W]_?X.#@X>'BXN+BXN'AX>'BX^/CX^/CXN+C -MX^7FY^CIZ>GIZNKJZNKIZ.;EY.3CX^/DY./CX^/CX^3DY>;FY^CHZ>GJZ^SN -M[_'S]/;X^OO\_?W]_?S\_/O[^OGX]_?V]?3S\O'P\/#P\/'Q\?#O[^[MZ^OJ -MZ>?FY>3CXN+AX>'AX.#@X.#@X.#AX>'@X.#@W]_?W]_?W^#@X.#AX>+CX^/C -MX^/CXN+BXN/CX^/CX^/CX^3DY>7EY>7FYN;FYN;FY>7EY>7FYN?GZ.?GY^;F -MYN;GZ.GJZ^SL[>[O\/#Q\O+S]/3U]?7T]/3S\_+R\O+R\_3U]OCY^OO]_@`! -M`P4&!P@("0D)"`@'!P<'!P<'!P<&!@8'!P<("`D*"@L,#`P,"PL+"PL+"@H) -M"0D)"0H+"PP+"PL+"PP-#0X/$!`0$!`/#P\.#0T-#0T,#`L*"@H*"@H+"PH* -M"@D)"`@("`@)"@L,#0X/#Q`0$1$1$1$1$1$1$1`/#0P,#`T.#Q$2$Q46&!D: -M&QL<'!P<'1T='!P<&QL:&1D9&1D9&1D9&!@8%Q86%103$A$0$!`0#P\/#@X- -M#0P,"PL+"PL*"@H)"0D("`@("`D)"@L+#`T-#@\/$!`1$1(2$A(2$1$1$!`0 -M$!`0$!`0$!`1$1(3%187&!D9&1D9&1@8&!<7%Q<7%Q<7%Q<8&!D9&AL;'!P= -M'1X?(2(C)"4E)B8F)24E)24E)28F)B'AX='1T<&QL;&QP<'1X>'R`@("$A(2(C)"0E)24D)",C(B`?'AT<&QL; -M&QH:&AH:&AH9&!<6%104$Q,2$A$0#@T,"PH)"`<'!P<'!P<&!@8'"`@)"0H* -M"PL+#`P,#0T-#@X.#@X.#@X/#Q`0$1$1$!`0$!`0$!`0$!`0$!`0$!`0$!$1 -M$1`/#PX-#`P,#`T-#0T-#`L+"@H*"@L+#`P,#0T-#@X/#Q`1$A,3%!05%145 -M%145%!03$Q,3%!04%!45%!03$Q$0#PT,"@D)"`<&!00"`0````````$!`0$! -M`0$"`@,$!04&!P@)"0H+#`T/$!$2$Q,3%!04%!03$Q,2$1`/#@X-#0T-#`P, -M#`P-#0T.#@\/#P\/#PX-#0P+"@D("`@("0D*"@H)"0@("`@(!P<'!@8%!04% -M!04&!@8%!04%!`0$!`,#`P,#`@("`@$!`/_^_?W\_/OZ^?CW]O3S\_+R\?'P -M\._O[^_P\/'R\O/S]/7V]_?X^/GY^?GY^?CW]_;V]?7U]?3T]//S\_3T]?7U -M]?3U]?7U]?7U]?7T]//S\O+Q\?#O[N[M[N[N[N[O[^_P\/'R\_7V]_G[_/[^ -M______[^_?W\^_OZ^??V]?7T\_/R\O'Q\/#P\/#P\/#P\/#O[^[M[>SLZ^OK -MZNKIZ.?FYN7EY.3DX^/BXN+CX^3EYN?HZ>GJZNOL[>[O[^[N[>SKZ^KJZNKI -MZ>CGY^;EY>3DX^'@W][=W=W=W=W=WM[>WMW=W=W=WM[?W]_>W=W'AX.#@W]_?X.#@X.#AX>+CY.7EYN;F -MYN;EY>7EY>7DY./CXN'?W][>W=W=W=W+BXN/C -MY.7FY^?HZ.GIZNOL[>[N[^_O\/#Q\?'Q\?'Q\?'R\O+Q\?#O[^[N[N[M[>SL -M[.SL[.WM[N[O\/#Q\O/S\_3T]?7V]_?X^/CX^?GY^OK[^_O[^_O[_/S\_?W] -M_?W\_/S\_/S\_?W\_/S[^_O[^_S\_?[^_P`!`@(#`P,#`P("`@$!`0("`@$! -M`0```0$!`0#__OW\^_O[^_OZ^OKZ^OGY^OKZ^OKY^?GX^/?V]?7T]//S\O+R -M\O+R\O/T]?;W^/CX^/CX]_;V]?/S\O'P\/#P\/'Q\?+R\_/T]/7U]?7T]//S -M\_/S\_/S]/3T]?7V]O?X^/GY^OKY^?GY^?GZ^OK[^_S\_?[^_O_______O[^ -M_O[^_?W]_?W]_?W]_?W^_@`!`@,$!`4%!`0$`P,"`0$```#______P````$! -M`0("`@("`@("`@("`@("`P0%!@<("0H*"PP-#@\/$!`0$!`0$!`0$1(2$Q05 -M%A87&1H;'1X@(2$B(B(B(2$A("`?'QX>'AX>'AX='1T='1T>'AX>'1T='1T= -M'A\?("$A(2$A(2`@'Q\?'AX>'AT='!L;&AH:&AH;&QP<'1T='AX>'A\?'QX> -M'1T<'!P<'!L;&AH9&!@8&!<7%Q<7%Q<6%A45%145%A86%Q<7%Q<7&!@8&!D9 -M&1D9&!@8&!<6%A85%A<7&!@9&!@8&!<7%Q<7%Q86%A44$Q,2$1$0$!`0$!`/ -M#Q`0$1(3$Q,4%!05%A87%Q<7%A44%!,3$A(2$A(2$A(3$Q04%186%Q<7%A85 -M%145%144%!03$Q,3$Q(2$A$0#PX.#0T-#0T.#@\/$!`1$A,3%!45%145%186 -M%A85%144%!,3$Q,3$Q,3$Q,3$Q,2$A$0#PX.#0P+"PH*"@H+"PL,#0T.#@\/ -M#P\/#P\.#@T-#`P,#`L+"@H)"0D)"@H)"0D("`D)"@H*"PL+"PP,#0T.#Q`0 -M$`\.#0P+"@D(!P8&!00#`P("`@$!```!`0$"`@("`@("`@("`@(!`0`````! -M`0$!```````!`0("`@(#`P,#`P("`0#__OW\^_KY^?CW]_?V]O;U]?7V]O?W -M^/GY^OK[_/S]_O__``$"`@(#`P,#`P,#`P("`@$!`0````#____^_O[]_?W\ -M_/O[^_S\_?W]_O[^_O[__P``````__[]_/KZ^?CW]_;U]?3T]/7U]?;V]O;U -M]?7T]//S\_+R\?#O[N[M[>SLZ^OKZ^OKZ^OKZ^OKZ^OJZ>GHZ.CHZ.GIZNOL -M[>WN[N[M[>WM[N[O\/'R\_3V]_CY^OO\_/S\_/S\_/S\_/O[^OGY^/?V]?3S -M\_+R\O/S]/3T]?7U]?7U]O;V]O;U]?3T\_/S\_/T]/7U]?7U]?7U]O?X^?GY -M^?GX^/?V]O7T\_+Q\/#O[^_O[^[N[>WL[.OKZNKJZ>GHZ.?FYN7EY>7DY./C -MXN+BX>'AX.#?WM[=W=W=W=W>WM_@X>'AXN+BXN+CX^3DY.3DY.3DX^/BXN+B -MXN/DY>;GY^?GY^?GY^?HZ>GJZNKJZNKKZ^OL[.SLZ^OKZ^OKZ^OL[.SL[>WN -M[N_P\/'R\O/S]/3U]?7U]?;V]O;V]O7U]?7U]?7T]/3T]//S\_/S\_3T\_/S -M\O'P[^_N[>WM[>WM[>[N[N[N[N[N[N[O[^[N[N[N[^_P\/#P[^_O[^_P\/'R -M\O+R\O+Q\?'Q\?'P\/#P\/'R\_3U]O?X^/GZ^_S]_?[_`````0``___^_?S[ -M^_O[_/S]_O\```$"`@,#`P,#`P,#`P,"`@$!`/___________O[^_O[^_O[] -M_?W\_/S\_/S\_?W]_?[^_O[_____````___^_OW\_/O[^OKZ^?GY^?KZ^_O] -M_O\!`@,$!08&!@<&!@8%!`0#`P("`0#__OW\_/S[^_O[_/S]_?[^_O______ -M``````#_____```!`@,$!`4%!@8&!P<'!P@("0D*"PP,#0X.#P\/$!`0$!`/ -M#PX.#0P,"PL+"PL,#`T-#@X.#@X.#@\0$1(3%!46%A87%A85%103$Q(1$1`/ -M#@P+"0<&!`,"`0````````$!`@("`P,#!`0$!`0$!`0%!08&!@<'!P<'!@8% -M!04%!`0%!04&!@<("0D*"PL,#`P-#`P,"PH)"0@(!P<'!@8&!@8'"`D*"@L+ -M"PL,#`T.#P\0$1$1$1$1$1$2$A,4%146%Q<7%Q86%144$Q,3$A(2$A(2$Q,4 -M%146%A87%Q<8&!@8%Q<7%A44$Q(2$1$1$1(2$A(2$A(2$A(3$Q04%!45%145 -M%145%145%144%!04%!,3$Q,3%!04%!04%!04%!,3$Q(2$A(2$A(3$Q,3$Q,4 -M%146%Q@9&AL<'!T>'Q\@(2$A("`@'Q\>'AT<'!L:&1D8%Q85%!,2$1$0$`\/ -M#@T,#`P,#`T-#@X/#P\0$!`0#P\.#0P+"@D)"`<'!P8&!@8&!@8&!P<'!P<' -M!P8&!@8&!@8&!04$!`,#`P("`0$``/____\```$"`P0$!04%!04%!00$`P(! -M`/__________```````!`0$"`@,$!`0$`P,#`P,#`P,#`P("`@("`@("`P,# -M`P,#`P,$!`4%!04%!04%!`0$`P,"`@(#!`0%!@<("`@("0D*"PP,#0T.#@X. -M#0T-#`P+"PH*"0D("`@("`<'!P<&!@8&!P<'!P<("`@("0D("`@'!@4$!`," -M`@$`__[]_?[^__\``0$"`P0$!04%!04$`P,"`0$!````______[^_O[^_O[^ -M_O[^_____P````$!`0$!`0``_________OW]_/OZ^?CV]?3R\?'P\/#P\/#P -M\/'Q\?'R\O/T]/7V]O;V]O;U]?3S\O'P[^[N[>WM[.SL[.SKZ^OL[.SL[.WM -M[>WM[>SL[.OKZNKIZ.CGY^?GY^?GY^;EY>3DY.7EYN;FY^?GZ.CHZ>GJZ^SL -M[>[N[^_P\/'Q\?+R\O/S\_/S\_+R\?'P\._P\/#P\?'Q\?'Q\?+R\_3T]?7V -M]O;V]O;W^/CY^?KZ^?GY^/CW]_;V]O7U]?7U]?7U]/3T\_/S\_+R\O+R\O/S -M\_/S\_/T]//S\_/R\O'Q\._O[NWLZ^KJZ>CHY^?GZ.CHZ>GIZNKIZ>GHY^?F -MY>7EY>7DY.3DY.7EYN;GY^CHZ>GJZNKJZNGIZ>CHZ.CHY^?GYN;FY>7DX^/B -MXN+BXN+BXN+BXN+CX^3EY>;GZ.GJZ^SM[>[N[^_P\?'R\O+R\?'P[^[N[>WM -M[>WL[.SKZ^KJZ>GIZ>CHZ.CHZ.CHY^?GY^?GY^?GZ.CHZ.GIZ>GJZNKJZNKJ -MZ>GIZ>GJZNKKZ^SL[>[N[N_O[_#P\?'R\O/T]/7U]O;V]O?W]_CX^?GY^OKZ -M^?GY^/CW]_?W^/CX^?GY^OK[^_O[_/S\_/S[^_O[^_O[^_S\_/S]_?[__P`` -M`0$!`0$"`@(#`P,#`P0$!`4%!08&!@8&!P<'!@8%!00$!`0$!`0$!`4%!@<' -M"`D)"0D*"@H*"@D)"0@(!P<'!P<'!@8&!@<'"`@)"0D*"@H)"0D)"0D("`<' -M!@8%!00$!`0$!`0$!04%!04&!@8&!@8&!04%!@8&!P<'!P@("0H+#`P,#`P+ -M"PL*"@H*"@H*"@H*"@H*"@H+"PL+"PL+"PL+"PL+"PL+"PL+"PL,#`T-#0X. -M#@\/$!`0$1$1$A(3$Q,4%!05%145%145%186%A86%A87%Q<7%Q<7%Q<6%A45 -M%!,3$Q(3$Q,3$Q,3$Q,3$Q,4%!04%145%145%!04%!03$Q(2$A$1$1$1$A(2 -M$A(2$A(2$Q,3$Q,3$Q04%!45%145%145%145%!04$Q,2$A$1$!`0#Q`0$!`0 -M$!`0$1$1$A(2$Q,3$Q04%!04%145%146%A87%Q<7&!@7%Q<7%Q<7%A86%145 -M%186%Q<7&!@8&!@7%Q<7%A86%A85%145%104%!04%144%!,3$A$0#PX-#`P+ -M"@D(!P8%!`0#`P("`@("`@("`@,#!`0$!`0$!`0#`P,#`P,#`P,#`P,$!`4% -M!@<("0D*"@L+#`T-#@X.#@X.#@X-#0T-#0T-#0T-#0T-#0T-#@X.#P\/$!`1 -M$1$2$A(3$A(2$1$1$1`0$1$1$1(2$A(2$A(2$1$1$!`0$!`0$`\/#P\/#P\/ -M#P\/#@X-#0P,#`P,"PL+"@H)"0@(!P<&!@8&!@8&!P<'"`@)"0H+"PL+#`L+ -M"PL*"@H*"0D("`<&!00#`0#__OW]_/O[^OGY^/CW]_?W]_?W]_?W]_?W]_?V -M]O;W]_?W]_?W]_?W]_?V]O;V]?7U]?7T]/3T]/7U]?7U]?7U]?7U]?7T]/3S -M\_+R\O+R\O+S\_/T]/7U]?;V]_CX^/CX^/?W]_;V]O7U]?3U]?7U]?7U]/3S -M\_/S\_/S\_/S\_3T]/7U]?;V]_CX^?GZ^OKZ^OKY^?CX]_?W]_?W]_?X^/CY -M^?GY^?GY^?GY^?GY^?CX^/CX^/CX^/CY^?KZ^OKZ^OKZ^OKZ^OGY^?GY^?CX -M]_?V]O7U]?7U]?7T]/3T]/3T]?7U]?7U]?7U]?7U]?3T\_/R\O+Q\?'Q\?'Q -M\?+R\O+R\O'Q\._O[N[M[>WM[.SL[.OKZ^OKZ^OL[.SL[.WM[>WM[>WM[.SL -M[.OKZ^OKZNKIZ.?GYN;EY>7EY>7FYN;GY^?HZ.CHZ.CHZ.CHZ.?GY^?FYN7E -MY.3DX^3DY>7FYN?GY^CHZ.GIZ>KJZNKJZNKJZ^OKZ^OKZ^OKZNKKZ^OK[.SM -M[N_P\/'R\O/S\_/S\_/S\_/S\_/R\O+R\O+S\_/S]/3T]?7U]O;W]_CY^?KZ -M^OKZ^?GX^/CW]_;V]O;V]O;U]?7T]/3T]/3T]//S\_/R\O+R\?'Q\/#P\/'Q -M\?'Q\?'R\O+S\_3T]/3S\_/T]/3T]/3T]/7U]?;W]_CX^?K[^_S\_/W]_?W] -M_?S\^_O[^OKZ^OKZ^OKZ^OKZ^OO[^_O[^_S\_/S[^_O[^_KZ^OGY^?CX^/CX -M^/CX]_?W]_;V]_?W]_?W]_?W]_?W]_CX^/GY^?GY^/CX^/CX^/CX^/CX^/CY -M^?GZ^OK[^_S]_?[__P```0$!`0$"`@(#`P,#`P,$!`0$!`,#`P0$!`4%!@8& -M!P<'!P<'!@8%!04%!04%!04%!04%!@8&!@8%!00$!`,#`P,#`P,#`P0$!08' -M"`@)"0H*"@L+"PL+"PL+"PL+"PH*"@D)"0D("`@("`@("`@'!P<'!P<'!P8& -M!@8%!04%!08&!P<'!P@("`D)"@L+"PL+"PL+"PH*"@H*"0D)"0D)"0D)"0D) -M"0D)"0D)"0D)"0D)"0H*"PL+"PP,#`P,#`P+"PH*"0D("`@(!P<'!P8'!P@( -M"0D*"@L+"PP,#0T.#@\/$!`0$!`0#P\/#P\/#P\/#PX.#@\/#Q`0$!`0$!`0 -M$1$1$1$1$1$0$!`/#P\/#@X.#@T-#`P,#`P,#0T.#@\0$1$2$Q04%145%145 -M%145%146%A86%A86%A86%A86%Q<7%Q@8&1H:&AL;'!P='1T>'AX>'AX='1T< -M'!P<'!P<'!P<'!L;&QL:&AH9&1@8%Q<7%A86%A45%145%145%146%A87%Q<8 -M&!@8&!@8&!<7%Q<6%A44%!,2$A$1$!`0#P\/#Q`0$!`1$1`0$!`/#P\/#P\/ -M#P\.#@X-#`P+"PL+"PH*"@H)"0@("`@(!P<'!P8&!@8%!04%!00$!`0$`P,# -M`P,#`P,#`@("`0$!`````````0$!`0$!`0$!`0$```#______O[_______\` -M``$!`@,#!`0$!`0$!`,"`@$``/___O[^_O[^_O[^_O[___\``````0$!`0$` -M`/____[^_O[^_O[^_O[^_O[^____`````0$!`@("`@,#`P0$`P,#`@("`0`` -M_____O[^_O[^_O[^________________``````````````#___[^_O[^_O[^ -M_O[^_O[^_O[^_O____[^_OW]_/S\_/O[^OKY^?GX^/CW]_;V]O;V]O;U]?7U -M]?7U]?3T]//S\O+Q\?'Q\?'Q\?'R\O'Q\?+R\O/S\_3T]//S\_/S\_/S\_/S -M\_/S\_/S]/3T]/3T\_/S\_/S\_/S\O+R\O+R\?'Q\/#O[^_N[N[M[>WL[.SK -MZ^OKZ^OKZ^OKZ^OKZNKJZNKJZNOKZ^OLZ^OKZNKJZNGIZ>KJZNKKZ^OL[.WM -M[N[O[_#P\/'Q\?'Q\?'Q\/#P\/#P\/'Q\?'R\O+R\O+R\O+R\O+R\O+R\O+R -M\O+R\O+R\O/S\_/T]/3T\_/S\_/S]/3U]?;V]_?X^/GZ^OKZ^OGY^?CX^/?W -M]_?V]O7U]/3T]/3U]?7U]?;V]_?X^/CX^/CX]_?W]_;V]O7U]/3T]/3T]/3U -M]?7V]_?X^?KZ^_S\_?W]_O[^_OW]_?W\_/O[^OKY^/CX^/CW]_?W]O;V]O;V -M]O;V]O;U]?7U]?7U]?7T]/3S\_/R\O+R\O+R\?'Q\?'Q\?'Q\?'Q\?'Q\O+R -M\O/S]/3U]?7U]?7U]?7U]?7U]/3S\_+R\O'Q\?#P\/#P\?'R\O/T]/7U]O;V -M]_?W]_?W]_?V]O7U]?7U]?;V]O;V]_?W^/CX^/CX^/CX^/GY^?GY^?KZ^OO\ -M_/W]_O[^_____P````$!`0$!`0$!`@("`P,#`P0$!`0$!`0$!`0$!`0$`P,# -M`P,#`P,#`P0$!`0$!04%!04%!04%!04$!`0$!`,#`P,#`P("`@("`P,#`P0$ -M!04%!@8&!P<'"`@("`@("`@("`@("`@("`<'!P<'!P8&!@8%!04%!04%!04% -M!04%!04%!04%!`0$`P,"`@(!`0$!`0$!`0$"`P,$!`0$!04%!04%!04%!04$ -M!`0#`P,#`P,$!`,#`P,#`P(#`P,#!`0$!04%!@8&!P<'!P8&!@8&!@8%!04% -M!04%!04%!08&!@<'"`@)"0D*"@H+"PL+"PL+"PP,#`T-#0T.#@X.#@X.#P\/ -M#@X.#P\/#P\0$!`0$1$1$A(2$A(2$Q(2$A$1$1`0$`\/#P\.#@X.#@X.#P\/ -M#P\/#Q`0$!$1$1$1$1$1$!`0$!`/#P\/#@X.#@T-#0T-#`P,#`P,#0T-#0T- -M#0T-#0X.#@X.#@X-#0T-#0P,#`P,#`L+"PL+"PL,#`P,#0T-#@X.#@X.#@T- -M#0P,"PL*"@H)"0D)"`@("`@("`D)"0D*"@H*"PL,#`P-#0T-#0P,#`P,"PL+ -M"PL+"@H*"@H*"0D)"0D)"0D)"`@("`@'!P8&!04%!04$!`0$!`0$!`0$!`0$ -M!`0$!`0$!`4%!04%!@8'!P<'"`@(!P<'!@8&!@4%!04%!04$!`0$!`0$!`4% -M!04%!@8&!@8&!@8%!04%!`0$`P,#`@(!`0$!`````0$!`0("`@,#!`0%!04& -M!@8%!04%!04%!04%!04%!04%!@8%!04%!@8&!@8&!@<'!P<("`@("`@("`@( -M"`@'!P<'!P8&!@8&!@8&!@4%!04%!04%!04%!04%!`0$`P,"`0$``/___O[^ -M_?W]_/S\_/S\_/S[^_O[^_O[^_O[_/S\_/O[^OKZ^?GY^?GX^/?W]O;U]?7T -M]//S\_+R\O+R\O+S\_/S]/3U]?;V]O;V]O;V]O;V]_?W]_CX^/GY^?GY^?GY -M^/CX^/CX^/CX^/CX^/CX^/CY^?GY^?GY^?GY^?CX]_?V]O;V]O;V]_?W]_CX -M^/CY^?GY^?GY^?KZ^OO[_/S]_?W]_?[^_OW]_?S[^_KY^/CX]_?W]O;V]O;W -M]_?X^/CX^/CX^/CX^/?W]O;U]?3T]/3S\_/S\_3T]/7U]?;V]O?W]_?W]_?V -M]O;V]O7U]?3T]/3T]/3T]/3T]/3T]//S\_/S\O+R\O+R\_/S\_/T]/3T]/7U -M]?7U]O;V]O;V]O;V]O;V]O;U]?7U]/3T]/3T\_/S]/3T]/3T]//S\_/R\O'Q -M\/#P\/#P\/#P\/#P\/'Q\O+R\_/S]/3T]/3T]//S\_/S\_/S\_/S\_/S]/3T -M]/3T]/3S\_/S\_+R\O+R\_/S\_/S\_/S\_3T]/3U]?7U]?7U]?;V]O;V]O;W -M]_?W]_CX^/CX^?GY^OKZ^_O[_/S\_/S]_?W]_?W]_?W]_/S[^_KZ^OGY^?GY -M^?GY^OKZ^OKZ^OKY^?GY^/CW]_;V]O;V]O;V]_?W^/CX^?GZ^OO[_/S\_?W] -M_O[^_O[^_?W]_?W]_?S\_/S\^_O[^_O[^OKZ^OKZ^OKZ^OKZ^OK[^_O[^_O[ -M_/S\_/S[^_OZ^OKY^?GY^/CX^?GY^OK[^_S\_/W]_O[___\```````````$! -M`0$"`@("`@("`@("`@$!`0$!`@("`P,#!`0$!`0%!04&!@8&!@8'!P<'!P<' -M!P<'!P<'!P<'!P8&!@8&!@8&!@8&!@8&!P<'!P<'!P<'!P<'!P<("`@("`D) -M"0D)"@H*"PL+"PL+"@H*"@D)"0D("`@("`@("`D)"0@("`@("`@("`@("0D) -M"0D*"@H*"@H*"0D)"0@("`@'!P<'!P<("`@("`D)"0D)"@H*"@H*"@H)"0@( -M!P<&!@8%!@8&!@8&!P<'!P<'!P<'!P<'"`@("`@(!P<'!P<'!P<("`@("`@( -M"`@)"0D*"0D)"`@(!P<'!@8&!@8&!@8&!@8%!04%!04%!`0$!`0$!`,#`P,# -M!`0$!04%!@8'!P@("`@("`@("`@("`@'!P<'!P<&!@8&!@8&!@<'!P<'!P@( -M"`@("`D)"0D)"0D)"0H*"@L+"PP,#0T-#0X.#@X.#@X-#0T,#`P,#`P,#`P, -M#0T-#0T.#@X.#P\/$!`0$!`0$!`0#P\/#P\/#P\/#PX.#@X.#0T-#0T-#0T, -M#`P,#`P,#`P,#`P+"PL*"@H)"0D)"0D)"0D)"0D)"0D)"0D)"0D("`@(!P<' -M!@8&!@4%!04%!04%!00$!`0$!`0$!`0$!`0$!`0#`P,#`@("`@$!`0$!`0(" -M`@("`P,#!`0$!`0$!`0#`P("`@$!`0$!````````````````````________ -M___^_O[^_O[^_?W]_?W]_/S\_/S\_/S\_/S\_/S\_/W]_?W^_O[^_O______ -M___________^_O[^_O[^_?W]_?W]_?W]_?W]_?[^_O[^_O[_______[^_O[^ -M_O[^_O[^_O[^_O___P```````0$!`@("`@,#`P,#`P,#`P,#`P,#`P,#`P(" -M`@(!`0$!`````````````/_____^_O[^_?W]_?W]_?S\_/O[^_KZ^OGY^OKZ -M^OKZ^OK[^_OZ^OKZ^?GY^?CX^/CX]_?W]_;V]O;U]?7U]?7U]?7U]?7U]?7U -M]?7U]?7U]?7U]?7U]?7T]/3T]/3T\_/S\_/S]/3T]/3T]/3T]/3T]/3T]/7U -M]?7V]O;V]O;V]O;V]O7U]?3T]//S\_/S\_3T]/7U]O;V]_?W]_?W]_;V]O;V -M]O;V]O7U]O;V]O;V]O;W]_?W]_?W^/CX^/CX]_?W]_?W]_;V]O;V]O;U]?3T -M]/3S\_/S\_/R\O+R\O+R\_/S\_/S\_/T]/3T]/3T\_/S\_/S\_/S\_3T]?7U -M]O;V]_?W]_?X^/CX^/CX^/CY^?GY^?GY^?CX^/CX^/CW]_?W]_?W]_?W]_?W -M]_CX^/CX^/CX^/GY^?GY^?GY^/CX^/?W]_;V]O;V]_?W]_CX^/CY^?GY^OGY -M^?GX^/CX]_?W]_?V]O;V]_?W]_?W]_CX^/CX^/CX^/CX^/CY^?KZ^_O\_/S] -M_?W]_?W]_?W]_?S\_/S\_/W]_?W]_?[^_O____________\`````________ -M_________O[^_O[______P````$!`@(#`P,#`P,#!`0$!`0$!`0#`P,"`@(" -M`@("`@("`@("`@("`P,#`P,#`P,#`P0$!`0$!`0$!`0$!`0$`P0$!`0$!`4% -M!04%!04%!04&!@8&!P<'!P8&!@8%!04%!04%!`0$!`0$!`0$!`0$!`0$!`0$ -M!`0$!`0$`P,#`P,#`P,#`P,#!`0$!`0$!`0$!`0%!04&!P<("`@)"0D*"@H* -M"@H*"@H*"@D)"0@("`@("`@("`@("`@("`@("`@(!P<'!@8&!@4%!00$!`0$ -M`P,#`P,#`P,#`P,#`P0$!`0$!`0$!04%!04%!04%!`0$!`0$!`0#`P,#`P,# -M`P,#`P0$!`0$!`0%!04%!04%!04%!`0$!`0$`P,#`P,#!`0$!`0%!04&!@8& -M!P<'!P@("`@'!P<'!P<'!P8&!@8&!@8&!P<'!P@("`@("`@("`@(!P<'!P<' -M!P<'"`@("`D)"0D)"0D)"0D)"0D)"0D)"`@(!P<'!P<&!@8&!@4%!04%!04% -M!04%!04&!@8&!P<'"`@("0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0H*"@D) -M"0D("`@("`<'!P<&!@8&!@<'!P<("`@("`@'!P<'!P<'!P8&!@8&!@8&!@8' -M!P<'!P<'!P@("`<'!P<'!P8&!@8&!@8&!04%!00$!`0$!`0$!`0$!`0$!`0$ -M!`0$!`0$`P,#`@("`@(!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0```````/__________`````````````0$!`0$!`0$!`0$!`0$" -M`@("`@("`@("`@("`@$!`0$``````/__________```````````````````` -M```````````````````!`0$!`0``````_____O[^_?W]_?W]_?S\_/S\_/S\ -M_/S\_/S\_/S\_/S\_/O[^_O[^_KZ^OKZ^OGY^?GY^?GY^?KZ^OKZ^OKZ^?KZ -M^OKZ^OGY^?GY^/CX^/CX]_?W]_?W^/CX^/CX^/CX^/CX^/CX^/CX^/?W]_?W -M]_?W]_?W]_?X^/CX^/GY^?GY^?GY^?GX^/CW]_?W]O;V]O7U]?7U]O;V]O?W -M]_?W]_CX^/CY^?GY^?GY^OKZ^OKZ^?GY^?GY^?GY^/CX^/CY^?GY^?GY^?GY -M^OKZ^OKZ^OO[^_O[^_O[^_O[^OKZ^OKZ^?GY^?CX^/CX^/CX^/CX^/CY^?GY -M^?GY^?GY^?GY^?CX^/CX^/CX]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W -M]_?W]_?W]_?X^/CX^/CX^/CX^/GY^?GZ^OK[^_O[_/S\_/O[^_O[^_O[^_O[ -M^_KZ^OKZ^OKZ^OKZ^OK[^_O[^OKZ^OKZ^_O[^_O[^_O\_/S\_/S\_/S\_/S\ -M_/S\_/O\_/S\_/S\^_O\_/S\_/S\^_O[^_OZ^OKZ^OKY^?GY^?GZ^OKZ^OKZ -M^OO[^_O[_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/W]_?W]_?W]_O[^_O[^ -M_O[^_O[^_O[^_O[^_O[^_O[^_OW]_?W]_?W]_?W]_?W]_?W]_O[^_O[^_O[_ -M__________________[^_O[^_?W]_?S\_/S[^_O[^_OZ^OKZ^OKZ^_O[^_O[ -M^_O[^_S\_/S\_/S\_?W]_?[^_O[^_O[^_O_______O[^_O[^_O[^_O______ -M`````````0$!`0$!`0$!`0("`@("`@("`@("`@("`@("`@("`@("`@("`P,# -M`P,$!`0$!`0%!04%!04%!@8&!@8%!04%!04%!04%!04%!04&!@8&!@8&!@4% -M!04%!08&!@8&!@8'!P<'!P@("`@("`@("`D)"0D)"0D*"@H*"@H*"@H*"@L+ -M"@H*"@H*"@H*"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D("`@("`@' -M!P<'!P8&!@8'!P<'!P@("`@("0D)"0D)"0D)"0D)"0D("`@'!P<'!P8&!@8& -M!@4%!04%!04&!@8&!@8&!P<'!P<'!P<'!P<'!@8&!@8%!04%!`0$!`0$!`0$ -M!`0$!`0$!`0$!`0#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,# -M`P,$!`0$!`0$!`4%!04%!04%!@8&!@8&!@<'!P<'!P<'!P<'!P<'!P@("`@( -M"`@("`@("`@("`@("`@("`@("`@("`@'!P@("`@("`@("`@("`@("`@("`@( -M"`@("`@("`@("`@("`@("`<'!P<'!P<'!P8&!@8&!@8%!04%!04%!00$!`0$ -M!`0#`P,#`P("`@("`0$!`0$``````````/__________________________ -M_____________O[^_O[^_O[]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] -M_?W^_O[]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?S\_/S\_/S[ -M^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^OKZ^OKZ^OGY^?GY -M^?GY^?GZ^OKZ^OK[^_O[^_O[^_O[^_O[^_O[^_O\_/S\_/S\_/S\_/S\_/S\ -M_/S\_/O[^_O[^_O\_/S\_/S\_/W]_?W]_?W]_?W]_?S\_/S\_/S\_/S\_/S\ -M_/S[^_O[^_O[^_O[^_O[^_O[^_O[^_O\_/S\_/S\_/S\_/S\_/O[^_O[^_KZ -M^OKZ^OKY^?GY^?GY^?GY^?GY^?GY^?GY^?GY^?GY^?GY^/CX^/CX^/CX^/CX -M^/GY^?GY^?GY^?GY^?CX^/CX^/CX^/CX^/CX^/CY^?GY^?GY^?GY^?KZ^OKZ -M^OKZ^OKZ^OKY^?GY^?GX^/CX^/CX^/CX^/CX^/CY^?GY^OKZ^_O[^_O[^_O[ -M^_O[^_O[^_O[^_O[^_O[_/S\_/S\_/S\_/S\^_O[^_O[^_O\_/S\_/S\_/S\ -M_/S\_/S]_?W\_/S\_/S\_/S\_/S\_/S\_/S\_/W]_?W]_?W]_?W]_?W]_?[^ -M_O[^_O[^_O______________`````````0$!`0$!`0$!`0$!`0$!`0$````` -M`````````/____________________________[^_O[^_O[^_O[^_O[^_?W] -M_?W]_?W]_?W]_/S\_/S\_/S\_/S\_/S\_/S]_?W]_?W]_?W]_?W]_?W]_?W] -M_?[^_O[^_O[^_O[^_O[^_O[^_O[^_O[______________P```````0$!`0$! -M`0$!`0$"`@("`@("`0$!`0$!`0$!`0$!`````0$!`0$!`0$!`0("`@("`@(" -M`@("`@("`0$!`0$!`0$"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(" -M`@("`@$!`0$!`0$!`0$!`0$!`0$!`0("`@("`@(#`P,#`P0$!`0$!`0$!`0$ -M!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0%!04% -M!04%!04%!04%!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$ -M!`0#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,# -M`P,#`P,#`P,#`P,#`@("`@("`@("`@("`@,#`P,#`P,#`P,#`P,#`P,#`P,# -M`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P("`@("`@("`@("`0$!`0$! -M`0$!`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@,# -M`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`@("`@("`@("`@("`@("`@("`@(" -M`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(#`P,#`P,#`P,#`P,#`P," -M`@("`@("`@("`@("`0$"`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$!`0$!`0$```````````````````#_________________ -M_____P```````````/__________________________________________ -M``````````#______________________________________P#_________ -M_________O[^_O[^_O[]_?W]_?W]_?W]_?W]_?W]_?S\_/S\_/S\_/S\_/S\ -M_/S\_/S\^_O[^_O[^_O[^_O\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\ -M_/S\_/S]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] -M_?W]_?W]_?W]_?W]_?W]_?W\_/S\_/S\_/S\_/S\_/S\_/S\_?W]_?W]_?W] -M_?W]_?W]_?W]_?W]_/S\_/S\_/S\_/S\_/S\_/S]_?W]_?W]_?W]_?W]_?W] -M_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\^_O[^_O[^_O[^_O[^_O[^_O[ -M^_O[^_O[_/S\_/S\_/S\_/S\_?W\_/S\_/S\_/S]_?W]_?W]_?W]_?W]_?W] -M_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] -M_?W]_?W]_?W]_?W]_?W]_?W]_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ -M_O[^_O______________________________________```````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````0$!`0$!`0$!`0$!`0$!`0`````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`@("`@("`@("`@("`@("`@("`@(" -M`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(" -M`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`0$!`0$!`0$!`@(" -M`@("`@("`@("`@("`@("`@("`@("`@$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$!`0$````````````````````````````````````````` -M``````````````````````````````````````$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M`````````````0$!``````````````````````$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0`````````````` -M````````````````````````````````````````____________________ -M____________________________________________________________ -M____________________________________________________________ -M____________________________________________________________ -M____________________________________________________________ -M______________________________________________[^_O[^_O[^_O[^ -M_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ -M_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ -M_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ -M_O[^_O[^_O[^_O[^_O[^_O[^_O[^________________________________ -M____________________________________________________________ -M____________________________________________________________ -M____________________________________________________________ -M____________________________________________________________ -M____`````/__________________________```````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``!#3TU-````$@`!``"2```(0`VL1````````$U!4DL````"``!)3E-4```` -M%#P``'\`?P``````````````````05!03````:A39#)A``(```````````#K -M`.P!+@$O?_\`HP#L`2Y__W__`````````````````&>0,```G(@`.`!B`#@` -MU@!+`&(`2P#6`$\`YP!/`/<`O@#G`+X`]P##`1X`PP%@`,0!'0#$`1X`Q`%@ -M`,0!80#%`1P`Q0$=`,4!80#%`6(`TP$<`-,!'0#3`6$`TP%B`-0!'0#4`1X` -MU`%@`-0!80#5`1X`U0%@```````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````$"```````"0`C```````` -M`````````'@````$``0``````-'^`/___X`````!`2`&455N:71S```3""YP -M9W-Z```)'E!!5",```DJ3%=25P```````0)&!B!S86UP3[_P``(F`21')U;2!/9B!%87)T -M:'%U86ME(`(```!!249&4V0R80``04E&1E-D,F$!`/____\````````````` -M``````````"G/9LK``"4#````>BDX[7XIIM-4@``````+`#B`1`".P$``+0! -M*0&`__C_[````````(`````````````````````````````-`````2$'4V-R -M:7!T3[_P``````M@!*`7(!W@$``)``Q@$`__C_ -MXP```````(```````````````@``````&@`I``\!JP)@`"H``P)M`ST`O0#! -M`8("40$`````&@`I``\!4`'Q`"H``P)M`ST`````X#;__P``````&@`L`!8! -M/@'<`"H``P)M`ST#,P)M_,$";0``````&@`````````````````````````` -M`&`````````!`````7X```!^````:@!QVJ04D@```!P`:@`!5W-T80`#`!)3 -M1$]#````0@`!__\````&```````"__\````D```````#__\```!"```````$ -M__\```!@``````/H__\````````````````````````````````````````` -!`/\` -` -end diff --git a/sys/share/sounds/firehorn.uu b/sys/share/sounds/firehorn.uu deleted file mode 100644 index ad98c64f4..000000000 --- a/sys/share/sounds/firehorn.uu +++ /dev/null @@ -1,299 +0,0 @@ -begin 644 Fire_Horn -M``E&:7)E($AO[R]/+T]P0*^_O__@#X]/X0'QX3`^WL]^SD[OH" -M`/3LY^7JY.P/("OQ[>CH[_#P`Q,1"``%!_[]].ST_P'Z\>[N[_8` -M_PT:`?;^]?C_]OP.(2\H%PH2("`J,BLT,!DA,!X+"`<1(1\#X=74V.?S_0@& -M_N[0N[B]S=[O`Q06_>3G\@@?)SA$/28,_O'Q`0\<+S,D$?7:U.?MZO\3$@3R -MXS<6X -ML;G4`!D7#@#\`@H>-DI985D_'0\0#`P5*3HY,1CV[_'GX>[T^`'YY]+`OKB] -MX/L$_N73S\K0W^WY!1`4#P/NW=KI^OX!`.;-R\S/V.'BY_;HR;FSLK"[W/+Z -M^>GG[.3D\0`'#!($\NOCZO@%&BHH'A,-!?OV]?8!&B(/]>;>W-W6U^SX[-O3 -MU=K@Z?<1*B\;`_?U``T*#R`H(Q+][N3CY^O_%!L9!N[AY_7V_Q8?'QT2!@#^ -M`0PA+R\@`_/]"A0<+$%!.S,<#@?^_`D?+"PI%O;EYN_["Q,(^_#CW-S?Y?L> -M+B\U)@L"`@0'$RKK\?<$$0_^ -MXM'0UN?^$AXD(1D-`?;U`1$N3$XX&?KEX_D0'2D@"?GCRL#*VN\/)1X-^N;< -MWNCT_@@*`_OOX-'*T^X+'!X3_]_'Q,G7[P0-$0W[[.[MWN0!#PX/`^OJ^0(0 -M'B@Q.#8@!_GP[/H7)B8E&@;Z]?3R[>[T`0;OX.3CW.7]"R`\*04#`OCW]^_J -M\.W9SM+-RN(#"@+WX=_T^N_H[?'S"!0!\O/T\?/_!?[SX]KG^?W\`@4'!?GS -M_00$"!HL,"@7#10I,QX,$A43&B`>%@W_^0XG*1T0"Q`=*28>*C0E%@KXZ^/5 -MS=SN[>+:UMKP`OOZ"@X'!PH-$`P.&"U`-R4?%PL(#A`6*"\C&Q8%\>#,Q=KJ -MX]KCZ>+O`OK]#`P*$QL2_>[=U.D'(CHW&?OV_?KX_@`""PKZ[N?;U-KBY>CK -MY.+R]^OI[_/]#0GNX^WV]_+R^`()_>[S_/P"#!(:(!<)_O;O[_7X]O+JV-T,W)!,(!0T?,3(D$O_V\^KL^P<2'2(<"_KM -MZP`G.S`B&`?^``8,&2\Z/#TQ%OKHY?`&'B,7`O/IXM_A\`03&18/`_7KZ?@5 -M*3(S)10(`0@8'R$I-#SW_0H-`//GXN3H\@$,$0X"[N7D[`89&A@1 -M"`(#"!$D+B8C)!\8$@L%#!89$@'NW=?@[OL&#`?[\^;3S\_.V>OW\^+5UM[A -MY>[_$Q,$]=S&R]74W.[X^^_5Q,'(V^SS^P$#__;OYN#:W_X9&0+IUL_H_/?[ -M`P+X[O/VZ^3AX_'Y[]?$P\;,T]C?Z>WFW=G=Y>KP\_7WZM#&U.L#%!<0#`C\ -M\_'NY^GX`/WWZ-3*TN#L^0'Z[.+AY_,#!@@3'!H.`/7MZ_`$'BHE'1P<'",L -M)RDW,A\+^.;@ZO+W#2(:"0/__0,,$!4F,B8/_>OB\?T&&B8:`?7PZ.;H\0H@ -M)"`9$/[EV.,`(B8/!0T-_P$.&C9(-RPN)QT+\_,-)"DI+S@X*!X>)34X*2`C -M)B(6#17M`1HE%?ST^_?R_P@1'1<'^OS]]OD"#AD0[<.OKK;+X?'Z_??FVL_#T>P! -M%A\?&/O8LJ;']1$7#P7_^-[&T_0-%!43^,^VL;W9_A<>(B09!?/T!QXY2$8[ -M*`7>V@4O.3@W)Q("Z]O;Z`(?,SP['_'2T.L+&1PA*RD.[^X%'#%"2DM(+P#> -MX?L7+3@T*!D(^/@$"!0L+AD!X<:[P]OO_08&!/;?VN?Z"QLP03H@"/KY$#!) -M54X[&/3K^0X;%@X2&0C@O**IOLS@[.WHT+JRN]3D[0$8'`GVY,K$U.H'(281 -M\NKW!`T0$!DE'P3JV<_+TND!#@T`]?'W^_3Q\@$0#@@&"Q,1#B)-8$(3]/8. -M%PX%_P8+`>_H]OGJZ^[JZN_OZ?+]_/X#_.OM^.WM_?GM]0L."Q@.!",[.3$G -M'A81"OOU^?OS\??LV=7D`A03#P@!_?G]`@<1("HD'!\@(B4?'RDV.BX:`.SQ -M_?;O^P@![-O+O,/;]`0&`_3>U=/=\/O]_/+ODXM7$ -MR^4"&Q7^\>KEW^+^'"$6"_KKZ>CDX_(/'QT8"?3O\O@&#PL(!_CGX.'HY^CT -M`0?[XLG"UNX&'"$;"_'8R,3+U.3Y%2\R&P8'%2(N,R@<&A,#]O7X]?L,%QP- -MZM7:[?7T`Q44"P$"$Q;]V/R!A4&Z>L$ -M&A8(&#([+AD8'AL1_?4+)3`H&!TT.S`B&!L:__,"#PW_\O4&$`P$^?H&"Q(< -M(RH@"@D9'!$$^?<##PH"`0,&!`$#"Q4._OK]_??JZ/8!!/OU\.'B[_H,%!,+ -M^_'MXM''S>'X!PT%[-G>[_OX\/#FV]O/Q='=X>+=YOCNU,G(U>S\`0,#^NWN -M]O7O[_7\"A#^Y]G6Y/+T]0(-!0+_ZNX)$1$;)B@@&1<>)B??W-KD_08'#0?\]?3NW^#V#A82#@D- -M$0\6&A4)^O3HW^;EZ?@(#O[IX-?7V^H*'1@*!`0$#1,2'2XS*2$8"/?GX_$* -M&`#DW=GGD[.WG]/GM]?CEV^'?V^X!]N7BYN/F^`0'!0`!"`P+"`/Z!!TC&`/LY-[7 -MW^;@Y.O@U-7,P\S0R=#G[^7>WM;0W.39VN\`$1L7$@X)"QTM)QL:$/_[_OGQ -M]P82&A\6`/7NY_0%!/___?GY]_H"^_P-%1@9$P#GY@(5#@XC)Q\>#O?^$QHD -M.#XS)!$""!X@#`@6'QT2^-O;?Y_,,)BL@'R(?)"XH'!TC%@,#`O+M_`8+%!<'\O(! -M"Q0<$P+X[-_C[-W)T>?Y"A<0__X&"APN)`X!]NGJY]#/ZOT#_??Y]O'W_PL; -M&@/MXN/]%/_DZ_C[^?;S]?TF)Q8,"A$;$_SS_@X1#0D,#@<4,3(?$0+N -MZ?D&!?SU^000%Q`-"`85(AX8&0??U>/FY.'K\\=W*N;J^L:_.[?H+$O[O[=S`Q^X'_^;9 -MX.WZ].H`)"TA#O7Q_O/7U_L9#.[I[.OJV'-W@LG%?7JY^3A -MX.+P!A(:'1``^.WI_A<6_//^`?;Q]/4#%QTJ0#\A!O7P`A<;"OX.&0T1(R@G -M*2XU,"$-_?S\^__TW>#Y!P@.%0'Q_PH9+2,.#0[]\@@6!O\+$!8G+1X?+#$\ -M.B47%A4)!104^_+\]_4'!_#J_PP1'!H*_.W;T]OEW-;D[?+\`O\&&B`6$`;P -MVOJUM+G\^KCW,_1Z/7_%R(-\N+=]1@4^_H/$P#U]_T/)C0Q+"X;_/3S -M`!D9!_\'#`3X[>7E^`T-$1X4^_'Y`@3_^/D($1$-"0D'$"HP%O?DVM'/U=KG -MZ>;IV]7H[]_<^A(2$P_\\O+Q]?\&_O7\].;N^OD#'"@J*!/X[?+W^/CTY^?U -M[=G=V\7(X^SN!AH&[N??W^#8U>'[#!,7%14;("(O1$(I&A$&`O7@Y/X4(RDA -M#O;BW-_L"1T6#Q01`-_)S=CB[?H$_>34U>#V"@X'%"$0]MW#M\7?\PL>%/GB -MW./C]A$+$"$5^^7=Y>_X"!XW/2D0!`D;*"$5$PS^]NO@Y.WZ#!@8#@<$^_?X -M`A,.^>_T_OSV]_X-%A$1'"DN+2/7UMK:\@P%]OCX\_GZ^0((#@O_!/G? -MW./L`Q+^ZP`+``85'24V.A\4'A0`^?3S"B`1`Q(;%Q,2$!,6"@86$/'!-G-U-++T^\+ -M(RD7#A,6$`,%'#=#,Q/WZ=S"MJM3Z"Q8? -M*C(>_N[W$2,H(AD0\'T!081)2(+\-/$TNOP\!4W*A86"P`(`OX;(_S;TL_<]`$!"B@O%!0M+RC6R]/CZO\9%AG8TN'W!@D!`B(^+A\B(!4`X-#P -M$0;U]P0(^.[S_`\@'QPG)PCHT];Z"0('"Q,:$@7_"!PF*RP>#0#PW=WU^N_O -M]P4&_/C]_P`'#Q@H*!/][N?BZ?\*"Q,2!P8+!P87*BL=%`X#\]K.S/>W.SZ_/+EXM_1NJRSP=+FZ>S^!_?K]`,:,"8."Q((\NSZ!P@"]>CI[>;> -MW_$,"OT!`O74N+2]SMG4W>KNZMO<]`XC*27R`1LV -M-"<@&`OZ^0L9'2,G*B<@&1,3&2$P/#8@#0'Y_@L3$@L)"?WOZN[Z!@4)%0W[ -M`0H&!P\0$187#P@&`@03'RTZ-R84#PX,#`8#"`+NWM_HZ^WT`!0>$//@XM_7 -MWNKX!@3Z_`@0"_T!%2(C&PP)$0P!`@@.$@?LX.GJW=OG\@`&]NW_"_?E[O?T -M\?'P^Q,;$0\1&20?%A,>(1`.'1T3!_?U`@D&!PT0"P$$!O;^&!86)B(1`?3R -M]OL'%!\:`//U[N\"$`X8)P[MZN+:Z/3X^_OOW-38V];A_0@)!>_AYM_7Y/L* -M$0P`_0,(`?D/*R@@%//:ULBYS_7\]N[6Q\G/R\?6YN;@TL;-U=;>`!P7#PL' -M$!$&`0TN2$(G%`K^\.#D!!P2]^3@W=?8W>X/$^[4S,&^OL'WR`0H0#PP+`??[^/<4,283$PL+&1@A+RCR`Q,;&!,1#@T-"0H0 -M`/,##?GL[_8""`0+%@KY^_WNY.GLW=7K^.GL^O\.%@P0&1()`P()$AD9#`P> -M'`3]!Q@H(Q4>*A7\^OT!`._>U=;F\.?A[@#^]@4;&PC]_@01"OC\_?D%`N_M -M]O3GY_T2%0S\\P$$W\G8X^?N[.?N_O_N[0HF)A(!!`KNQ\+*TN'HXN/NZM?) -MT.O[].KI[^O/M+?(T=OG\OW]\>GA[!,G&Q,7&A+YY_'Z\?8%#141`O+G]`\8 -M%1<3!?3K9W.?K`1LA(B(/_OGOZ_L"_0PE)`OW^@(%$2(J.4$C -M$!,#]?O\`2`R'0/\`@8#%CQ485(D#0P"_PCG -MYN7CY.GN^/;K_A48(B`/%1@(!0G_\.KKZ^_W^O3V"`G\`@<``0$%#?O@U]K= -MX^GK[O/[#1H8("`,"0@#"@7Y]_3T]O/V!Q<<'Q\8'1\5%1(4$O3F\?3U^?+R -M`0;\!!HF-#DE%`X']^7CX^'?UL_;[N;;[0`(&R4>(B47`.3:U\_7Z/0!_.7@ -M]Q(>*2XH)!7YX,_0U,_/T]WNZM/-VN7H[/;U[.GHWL_.S\G,W.ORZ^'E\@08 -M)S4],!8'^^GL_``$"0+QX=K?[/H$"`S^V\;/VMOCY-G:X-S;V-/?]A`F.D'EYNS["1\R+2XI$/[S\/H(#/?;T]SK\_@)'#5'04=$(PX.#Q`9 -M$_';V-WH\?G^!10._P8&]?#S\?/^\-+&P\[E]``+#Q47'C4X*2(@(2(<"_;I -MXN?U_@8/"P'S\@(#^_T"`P,'!/#CVN'X`@@%]_P$#"`D&!04#0+]]>OJ\@DD -M,2\8!0P-#Q\9#!(4`NKHZN+CY>T%$@KW[OL(J(B4@`^_QZMG6V-WT"`#N -MZO7W`B$J(2(6^^?9R,+/UN8$"OOT]@`'%RPQ+R8/^.[JVK]^>'.RLO( -MUO#_`?CLY=O-O+[8ZO<*"??M[?<#%"\W*R$6"O_RY^3M^0(-#__NYN/@Z/S_ -M^/7O[.?@U,O4XNX!`^[DY>CU#1X:#PG__/SJV-_K[?\<(143$A0A)RLN*2,< -M%0T`]>_J\`$:(0X(#ADL,#`T*1X?(!\.^.WJ\`0:&@T-$1,8$QDF&0<'"@?Z -MY]7.X/\=)QX=)BPK*38^+!4/%1D0]=?2Y/@+#_[W^O'G[/?_]NOR^_?CR+W% -MT.4&%A8=&@8$%B@H%@H0&Q<`ZM[F]P,3'QP4_NKN_`D+`O\-&PSNV];;Y_83 -M)2$7`N_U#1\B&!0:%@;NX_,`!!,I+"`9">_T"!$4"P+_].32P\K?Z_H:*AH- -M`_+^'C$[.B@9"O7?S=#D]`<<%/WZ[=KL"A8C)`KRY]S'N<+8\0\@%@L4$@82 -M)R\V+0OR[>38V>+N_`'\\>?@T<35]0@0`N37U,:ZO\_D^P/W[O<'"`,3+3,H -M%/WV_/GL\0@9(A@"^?KTY>+W#Q(']-S/T,S&UN_OZ>OEW^7O\OL:)Q4)_N?? -MWMC?\@8,"`7U\0$,#A@L+A@1">[FY-_G^PL,$10*"A$4'S9-33TT*!,'`/L" -M"P@%#A$&`@8-%2$M*AL:&@?Z\NOKZNOP``D%#!4:*CI&13,I(A4/"P8#!0@* -M$`L!!P@&!/\)$0#U\^?;U]#"P='>Z>OI^@L*"A`A*1H)_/@``/CV_`8)"P;^ -M!PT"^?T*"?[[]_CYZMO8W^GN\.OP!PP"`Q$C*B0:$0P$_/H`!P4&!P`&%Q$# -M!A]P@(#1PE)1\6$@GV[/#^%"7F^Q&147'2`>$P/_"A@6!_SU_0H!_`<'^>GBYNGCTKZ]U>OKY./L -M!!<3#Q88$`3Z`Q,2`O/R!1D;!_?V_@'TZ_8"!@+]!`X$Z]O:Y//W\._S]_KY -M_@@-$A`3)BL5__CY``D0#@P.#`D$_P(*#@P'!P+PW-+8Z?D$!PD)"`T-"A,; -M(RDD'!0,`/?^"Q8B(QP1"0?_^/X)&R06`_WWY]G@[O<"!__[!`H#_@<3(RTE -M&!(-_?']#1`,`??Y^O+CVN+L\?'DUMC4Q'J]?OX]@42$`;]^OKU -M\_D,'AT._??\^_SZ]0`'^O'R[>'8T=_[`_/?U-3:WNCU^@$$^O/U]_3O[P,9 -M'!4)_OK]`@X6$!`2"`0'!OKN\?P'#0D!^?/V_@\A'148&AH8%A,.#A(7&1P@ -M&`T'"!H@!_D!`?GX^/7V]_;[!0H+!_OV`A(2`/L#`@0-$AHA%P<'%1P?'0\' -M"@T`[.KP[.7CZ//WY=GA[??^`/O[!PO_\_H`]^_S^P,)`OCZ!1$9'!4*`/GS -M[O7_\^3H[>WLY./O_`0#`/CIX^7HZ_X4$04("`$`_OK]"QD@*B<.^?3R]@PA -M%/_]^.OGYN+K`1$9(!D#]O?X^Q(N*Q@0"08,"0<-%B,R.#`="?SS\@4@&O[Q -MY^#DZ.WZ#Q\@(!@(_O/O^!$K(0+W]?;]_OT)&!H4$Q$'^>36W/H2`M_/S,S/ -MS];L_?[W^/OV[N+9Z@D6`N?AXN;M[/()&!0+#A`*`?'J]@H3`.+3T=/5U.+] -M`OCR[^WIX-33Z`0-_NGBXM_D\/T0&QD0"PX,`OCX!1(;$_OP[NOM[_8*&AD1 -M$1(/#`@(#ATN)@\)"P@'!081'2,A&AH9$`8$"0X/`_'L[_'T\O0%%1<1$142 -M#/_X_P8,!O3P``H&_O\*#@\.#0\1"?GX`?[X[=[?[O3JXN;N^`'__08(]^_] -M"07\\>7K``;\^`$*"Q`6%181_O4%$P?WZM?7Y^SI[?3Z_@,+"P?^\?0/)R(2 -M!_GQ]OK]`@,$#!<=&0W]]0`8*",5"?;I[//[`?S[!Q,:%`/S[_\7)209"_KL -MZ?+_"08%#1D?&@W]]`$8)R48`^;/S=GL^_T!"Q`/"O[PZ_4*&QX7!>S?X^_[ -M!@@$"`T,!OONY^W["`L"[]2]NLO[Q\_#KZ.S["`?]\^7:W^_\!@D' -M`@('!@0&!PL4%PS\[]S'R-[R_O_X[^OLZN?M^`$+#P3U[^73U_('$`\%_?K] -M^?#Y#!8?(1("__3>W?$`"0D!_/CU[NCY#A8<(!@+"`+S]0H7%A`/$`\+!@86 -M*"LD'A('`O;H\0(%!0<'#0X'`@(+&!,*"P3[_P,!!1`0!P'^``+^_0$(#Q$, -M`_CO\/7W^?WU[.GHZO#S]?L#!@/_]^GAZ_L$"@P(__;S\O/W_``)$A41`^S= -MX._X^O__]NSGZ?+_!P8*$1(/!O/F[?T#!@L*"`/_`@<-$Q$5'2`B'@[_!1$. -M"0T,`O?Q\_H#"`(!!@8&!?OW`Q,3#PX(`/SY^P,0%A(4%@X*"OWR_0H$_@#\ -M]._IZO8&#P\)`/7R\^WJ_`X0#@T%_?GR[?0`!`+^]>_MZ^;E\O_Y\?#NZ^;; -MV.GZ_O[Y[>3@V=7=\?_\]/+U^?7O\/H#!@8$``#]\_/_#`\%]_#R]/#L[_?^ -M`@'\].SDW^H!$!0*_/;X^OC[!0P-#`H)!?[V\@(<*286`OCX\_/_!PL0$A$1 -M#0'S\0(8)"8;"@/_^?L&#Q,4%1<8$P/V]P06)241_?;R]/\.%!`0#PP-!_OR -M]`$/&AP/`?KS\P$+"`0#^_K^^?#M]`(,%!<*^?'J[/T,$`X'_?K[]>_M\/D% -M#0P$^/'O\?\*!@,"^_?W\N_R\_G___[YZ=_>Y?H$__OW\>[MZ^_U]?C^_/[^ -M]/+X!!$4#0<%`_\```,)"0T4$`T*`/T!"!,6"@0%_//X`0P6%0\+`?S\^/D" -M#!88#PD'`?T``@0(!@,%_O/O[O'X!!`2#`P.`_;W_``("PH,!_SX]_H`!`@% -M_?\"^?3U\>_T]/3Z^/#P]OO]_@0#_/T!_/GX\N_S]/7Y[^;N]_\$!`<%^_L# -M!`<-"00%`O[ZZ^/M^@8-"P@#]>[Q]OO^^OD!!0'][^3M^P_T^@0.#`D(`?P"#!(0#`P0 -M#P;]]._Z`@80$`P(_/8`#1(2"@,$`??S\O'Z`00(`_GRZ.OZ!@X.!@(%_^WH -MZ^WX!0H,"P7Z[_#[!PX/"@4!^NWM\_8!"@L-"?[RZO#]"1$3#0H)_>KBX-SF -M]/K]^_7OZNWX`@8$`?[Y\>SO\_0!#0L%_?/N[_0`"PT*!@#^_/?Y_?T$#PX& -M_?H``P0.&R`<%0P&`/K\`0$'#@7UZN?N]?P(%AL4#`/^__[]__X'$`7W\/+^ -M"`L4'A\8#@4#`?T!!P8+#P+QY>/L]?P&#Q`(__GV]O?\`?X!!?GKYN;P_P@- -M#PL#_?K[_/G_"@D*#0#PZNGP_`((#Q$+`P`!_OT#!OWZ_.[AY.CQ`@T.#0L' -M`P$```$#!/_^_O+IZ>CM_`$!`P,!``$#!`4("00"`OGQ\_SL\_K]_/T#!0(`_?X!^O+U^OO[]_#N\/7Z^P$* -M#`L*!P<'_O7U]O?U[^GJ[_+V^?P"!04%`@#^]O+U^?O\^_?V]OC\_?\%!P8' -M!P8"_/?W]O7V]/'Q\?+X_?X``@4)"PH(`P`"`0```?_]^_X%"0@*#`P.#@L& -M`/[^_?O[^_K[_@('"@D)"`8&!P@'!`$"`?\``?_]_P,)#@\/$`\.#`@#_OGV -M]/+R]/7T]/;[_OW_`0$#!0,"__S[^_K[_?W[^/?[`00%!@<+#0H%`/KX]_;V -M^?W]_/K\``$"!0<*"P@&`OOV]/+S]_OZ]_7X_/\"!`<+#`H(`_SW]?/S]?CZ -M^OO^`0$#"`T1$1`0#PL%`O\``@4'!@8*#`L-$!`1$0\.#`7^^O?V]_G\_?O] -M`0(#!08&!@4&!P+]^OCX^/K]__\#!P<'"@H)!P,#`_WT\._N\//U]//U^?S] -M_P$#!`'___WY]_7R\O?\^_G[_P(%"`H-#@P)!?_X\_+R\_?[^_GY^_T``P0& -M!@0#`P'\^?CX^?S^_OX!`P,"!@H.#@P*!P/]^/7T]?CZ^?G[_@`#"`L-#Q`. -M"@8"``#^^_S_`0$#!@<("PP+"PD&`__Z]_?V]OCZ^?C]`@0$!PD)"0<$`@#\ -M^OO[^?K[^/;[`@4&!PD)"`7^^_GU\_/S\_7V\_#T^_W^`00("P@"__WZ^/CY -M^?O^^OC]`P8&!PH-#PP&`?WX]?/R\O;Z^?G^`P4#`P4("@@%!`/_^_KY^/?W -M]_G^`P,!`0,%!`(!``#]^/7T\O#R\O3[!`<'!PD+#`L)"`D)"`<%`P$!```% -M#1`0#@T,"04#`0$"`0$!_OOZ^/K_!@H+"PH)"`4`_?W^_O[^_/W__?P!"`P- -M#`L*!P+\^/?X^/CX^/?V]//V_/\!`@($`P'^^OGY]_;W^/G[^_O_!0@("`D+ -M"@8`_/KX]/#P\?/U]??]`0("`0(#!`,!`/[[^/?V]?;Y^_X#!P8$!`0#`@#_ -M_O[]^/7S\_3V^?T#"0L*"`D+"@@("0D(!@+^^_O^`0,%"0L+"@D(!P4%!`,# -M`?_]_/S^_P(%"`D'!04'!0#\_/[]_/KY^/G\_/T"!P@&`P,$`_[Y]_;V]?/Q -M\/+V]_;X_?___?X"`P'__?S[^??W^/G\_P$#!00"`0,'!@'^_/GV\N_P\_;Z -M_?[_`0'^_@`$!@0#`@#]^?7T]/;Z_O\``@(``/\``0```/[Z]O3S\_7Z_P,% -M!@4%!`0$!@4%!@8$!`,"`@,%"`D*#`L*"0D*"@D(!P,!__SZ^OS_`P8%`P,$ -M!`,$!`,#`__]_?W\_?X!!`8&!@8'!P8$`P$`__OX]O7U^/G[_P$!`/___P$# -M!`0$`__[^OGY^OP``P4%`P("`0``__\`__SY]_3R\_7X_0`````!``#__O[_ -M`/[\^OGX]_?X^_W^_P$"`@+__?S]_?S[^OGX]_?X^_X``00%!04%!`,!```` -M``$!`0("`P,"`@0&!P@'!@,!`/_^_?S[^_W^_P$!``$"`P,"`@#^_?W[^OK\ -M_@`!`@,"__[^___^_?W[^_OZ^/;V]_G[_0``_O[___[\_?_^_O[^_?S\_/[_ -M`00$`@$"`P(`_O[]_/S\^_KY^?K[_/___O\!`@'____^_OW]_O[__P$"`@,# -M`P0%!@8$`P,"__[^_O[]_?\``0("`0($!04#`P,#`@("`@(#!`<)"0H)!P8% -M!`,#`@,#`@$!`?_]_/W_``(#`@,%!00!__________[^_OX``0,#!`4&!0,` -M_?S]_/O\_?[^_?S\_/S[^_X!`P,!_OS[^OGY^OS^_O\``0$`_O\!`0$!```! -M__W\^OK\_/W_`/_]_/W^___^_O\`__W]_/O[^_W_`0(````!`?_]_@`!`?_^ -M_/OZ^OS_`0("````__[\_/W_`0(#`@$````!`@0%!04$`P#^_?W^_P$"`0#_ -M_O\```$!`0(#`P'^_/S\_?W]_O___O[_______\``0#^_/O\_?W\_/S\_/X` -M``#__OW]_OW\_/S\_?[^_____P`#`P,"`0$"`0#^_?W_`````/_]_/W_```` -M_OW^_OS[^_S^`0("`@(!_P`"`P0%!@8&!0+__?W_`0("`P(`_OX``0(#!`0$ -M!`'__?W_`@0%!@<'!00#`P,$!`0&!@,!__[^``,$!`0$`P("`@,#`P,#`P'_ -M_?S\_?[_``$!```````!```"`@#^_?S\_?[^_O[__OW]_O[^_?S\^_GX]_?X -M^OS^_O[^_O[^_O[^_O[^_?OZ^?GY^OS^_O[]_?W]_O[^_O[^_OOZ^OO]_O\` -M`/__``````$!`0$``/[]_/S^``$!`0#_``$"`@0%!00#`?[]_?[_`@0%!00" -M`0(#`P,#`P,"`?_]_?X``0(#`P,"`0$"`@,#`P0#`?[\^_O\_?\`````__\` -M``#__P#__OW\^_O[_/W^_O________[^_O____W\_/O[_/W_``$#`P0$`P(` -M````___^_O[^_?W]_?W_``$!`0#__O____[^_O[^_P`````!`@,#`P(!`0`` -M`/_^_O\``0$`__\``0("`P,#`@$!`/___O[^``("`0$!`0("`0$!`0$!`/_^ -M_?W^_P```0$````````````!`0#^_?W]_O\````!`0(#`P,"`@$!`0$!```` -M``$``/___P`!`````/____[^_O[^_O[^_O[^_P`!`0#___[^_OW]_?[^__[^ -M_O[]_O\``0$``/_^_O[^_O[_`/_____^_P`!`0$!`@$`________````___^ -M_?X``````0$`__[^_?W^__\``0$``````````0("`0$`___^_P`!`@,"`0`` -M``#_``$!`@(!`/_^_O[_``$!`0$!`0#___\```$!`/_^_?S\_?W]_O[__OW] -M_?W]_?W^_P#_______[^_P`"`@$!`0$`__[^_P````````#__O[^_P```0`` -M`/______``````#___\`_P`!`0$!``````````$!`0$`______\``0$!`0#_ -M_O[__P`!`@(!``#__P````$!`0$``/____\```$!`0```/\```````#_____ -M__\````````!`0$!`0$````````!`0$```#__O[______P``_________P#_ -M_____O[_``````#___[^__\```````#__O[^_P``````___^____``$!```` -M____``$!`0$!``````````$!`0$!`/___P`````!`````/___P`````````` -M````````_____P````````$!```````!````_____________________P`` -M_____O[^_O[^_O[____^_OW]_O[^___^_O[^_O[__O[______O[^_O__``#_ -M________````````_____O___P``__\````````````````````!`0`````` -M```````````````````!``````````$!`0$!````____````````_____P`` -M````````````````````____`````````````````0$!````____`````/__ -M________``````#_____````____________________________________ -M________________````_________P```````/____\`````________```` -M````______\`````_________P``````_____P```````/___P`````````` -M`````````````/__`````````````````````/______________________ -M______________\`__________\```````#_____________________```` -M``#__________P``````````````````____________```````````````` -M`````/____\`````````````````````````____````````````````_P`` -M````````````````````````____________```````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````````0T]-30```!(``0``+Q8`"$`-K$0```````!-05)+ -M`````@``24Y35````!0\``!_`'\``````````````````$%04$P```&H4V0R -M80`"```````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````(````````````````````````` -M````````````````````````````````````````````````````````!`@` -M``````D`(P````````````````!X````!``$````````_`#___^``````0$` -M!E%5;FET````'@```!6__3_\O_P_^[_ -M[/_H_^?_Y__N__@`!P`8`"@`-0`_`$4)1FER92!(;W)N`@```$%)1D939#)A -M````````````````04E&1E-D,F$```````````````````````````````"G -M/:W$```Q(@```<[_G_^L_\P``@!&`(P`R`#R`0D!#P$)`/P`Y0#'`*<`A@!E -M`$0`)``$_^;_S?^[_Z[_J?^H_ZO_K_^R_[3_LO^P_ZS_J/^G_Z3_I/^C_Z3_ -MI?^I_[/_Q/_=__\`)0!.`'``BP"=`*0`I`"<`)``?P!J`%8`0P`Q`"``#P`! -M__3_Z/_=````&@`I``\":@,Q`"H``P)M`ST`*0`/`D$#(@$`````&@`I``\! -M4`'Q`"H``P)M`ST`````````````````&@`L`!8!/@'<`"H``P)M`ST````` -M````````````&@`````````````````````````````````````!`````7@` -M``!X````5@!QN+P8G1_?'IX:50_+!\8$@P&`?OY^?GZ`AM$9G5Q84DW-4%/4T]&-R8G0EM7 -M0R\9_NG:TM':\A@_6&!:3C\Q+30Y-S(R-C@U+B89"?3>S,/,ZQ0S.BL2]][+ -MR]KJ\OG___CLY.#>W=_BX=W7UM_V%"PR(@L"#BA"6&5A5E!)/#$L*RLI)R(9 -M#@H:.E=B7D\[)104(R\O)QP._?L2+S8##@?UX='(S=[N\_'LX]7'RMG@ -MU,:XK*FOOMS^$Q<.^^36WO8.'",@%P\*!@+^]^S=R[>FGJO1_ALG(Q#\Z-3* -MS][O_0D)_>W@V]K;WN'CX-S?[@$.%QX<$`+^$"@P*R08"?[V[>3:T,S+RL?` -MOLKB^`(!]^[HX^+FZ>39SL*UK;+'W./CW -M#0']``@4'R`5!/?^'#E%13PM'Q0*`O[Y\>KGZ.WT_@<*!?SPXM;7ZP<9&P[W -MW[GVL[(U?PI/SPK$_WP[O<% -M#@\'^NO=U][K\_#FV,F^O]#P"1`)_.W>T=+J"!85$0H`^?+JX]O4SLO+SM3C -M]P$"__GQZ^3>V-'(OK2KI:*GON/\__7AQZZCK3?X_(`!0+]]N[E -MW]W;U]+.QKNQM-'^(C4V*1L6$Q`."P+VZ>/DY^GM]/CPW\JXL\7E``P,!?SU -M^Q,D'0KYY]G3TM?=X-_;U,O(U.K]!@/UY^'F[_?\_?CMX-OH##1,444I#?T" -M'#E&0C,B%Q(3&R$?&1`*!P0!_O;IV]/-P[S&Y000"_[MXN'I\?/R\O+T^@$$ -M`/OZ_/[]_`8<+2\A"_/EY_<8-T`V)1#][-K+Q\O.SLS(QM;[(3?X]N[?SL&VJZJT -MQ,[/Q[_&X/P)"/_SZN;GZ.;?ULW%P,#.Z_[^]>C4P\/9^Q$6#P+T[_4`!PT1 -M#P?]\NC>V-?;W-3'NK;+\A$<%P?W[^SL[O#P\/'OZ>#:U-#2VN+H\@<>)!D% -M[MG.SN($&QX9#/_[_?X!!@@%`P$"#!PH*2,6!_OOX]O8U]71S,C#Q-'E\?7P -MYM[A\`<:)B@E(B`?)2LK)B`9$0P*!P'X\>[M[/00/%YI954\)AH9)3(X-"PG -M)B8E(Q\5!?+?SL7)WO4!_>[:R<+-Z0$%`?7CU=#1U]WDZ_/V]/7_#!`-`_+A -MV=SE[O;W].[K[?D1)RH="O+>UMWR#R4O,"TI)B4D(AX;&!,)__;P[O'Y__WU -M\`(G0DE$,QP-!P<-%AL:$PL`\N+4S,K-T=?:W.?]$!0+_.OBZ`(<)!\7#`#Z -M]_C[^_;LXM?,Q]+J_0+[[=O)O;O#S=/5T[BU,K*WP4C*R42^^KCX^CL[.KL\O?X]>_IY^KMZN7B -M[007&Q0%\^3F_AWBUM#=^@\2!>[6R,C3 -MY?D*$Q83#04`_P#\].C:R\//ZP41#?SFVN4%(2PK(`SXZN3EZ>WR]O7OY^'G -M]?[^^//S]?;T[N7SDWM?.R=#@Z^O@SKR[TO(! -M_O3BTLS,T=CWP -M]OT`__SZ^OKW]?@'(#E&1#[W#B@X.3(J -M)R'R"1XG(!@1#`X5&AP<&1,-!@'\]N[GY.+? -MVM'%O<39ZNWEW>3Z"Q`1#/[OXMG6V-C4T-'4U<_#MK?*X>SLZ.'7O]O/G -MU\_;\?KW\>77S\W-SM7H`10;%PT#_/CX^_\!__OY^?K\_OWW\.WW!@T2'!\7 -M$`P)#A?E[@(@.TI,0C0F'QXC -M)R0;$`@%"`P,!OSOX=?:ZOT0)S@W+!X,_/7V_@@/#PD`^/+MZNCGY>+>V=+- -MT^7\"P\-$B,Q,"H@$`,``@<.$0\*!@(`_?CQ[?#[`P/^]_'P]@`(#`G^[^GQ -M``<)"0/Z]?+O[O']%3)(4T]!,28B)S1!1D,Y+2(6"O_X\NWO`ADE+3H],RD? -M%Q05%QL?(!T8$PP#_/3JX-3'O[NYN\;<[_'FV-';Y^CDX-7+QL3%RU=#4Y@4A+BL?$`3^_@`! -M_O?Q[.GFX-K6TLS'RMCI]04;)2$8"OSV^/T%#A49&QT=&1$*!/_Z\^KAW-_P -M#BDV-C(X04$Z-BXD'!80#0L)"`D(!/[W[^;BZP$5'!8'].3/H\PLL1U)-0#4P+S(W.C8M)!L2"0#Y]O?W^@86&Q48(B0?&A(* -M!00%!P<%__CS[./8T,O*S,[/SLW/VNGR\.GDZ_H#"0\0#P\,!P#Z]/'R]/C\ -M____"2`[35%)."@A(RPR,2DA)CM-344Y)Q0(`?[_`PXE.D`Y+!T4$!$2$0X' -M_OGV\NODW][>X>X('!T9'B`<&14."PD)"@H(!PH-#0D#_/;NYMK+O*ZFK<7D -M^/OY_08&`?_\]>SBULW)R,K0UMC6T&!,,!P8) -M$!@=&@\!\N3:V-O?X-W8T,6\O,WH_@<($2(K)R$;$`;_]O#N[N_R]?C]`0#X -M[NKV"A<9$@;^_@(("P@`]O<)&QT6#P3Y\_#N[>ST"!\L*R(4!O__"!0=(2(> -M%0K^]>[GX-WA[OH"#A\F*"LF&Q0/"PH*"@D*"PX0$`T&_O7O[>SJZ_/^!04" -M!QLP.#@T)1#^[N7DZ?#W_?[]^_;Q[O,$'2XT+R06"?SQZN;BX.C_&24C&@GW -M[_#S]OD`$28W/T$_/CPW,BLD'10,!P8'"@T."P8$#!<=(RDG'A<.!P,"`@0' -M!P#W[>/:TL[*QL3`N[.MK;C,VMW9VND`"PH'_O#EWMG:WN/I[?'R\>SAUM/A -M^@T4$PT'!`(`_OGPZNT!&2`9#P+PX=?0S]7F`QXK*A\2"`+__P,'!@'Y[^/5 -MR,'#Q\G+U.'M^PT6%!$-!?_\^OGY]_7U]_CW]._KZ>CGY>/BZ?H1(2(7"`<9 -M+#$P*AT3#@P,#0T,"0/[[^/8T]GM!AD@'!$%_P`'#A$-!@(-)CL],R82__/M -MZ_4+*T1-23PO)R4H+"TJ)!X;&QL9%`O^\.+8V>L)*3Y!-B@9"@$``0("_O?N -MZ.7DY>3BW]G4T,S*T.#S_O_VZ>/O!Q@=&@KUZ>7G[_C]`04("`/_``TF/TM( -M.245#0T3&1T=%A`4)SL^,!\+]NGFZ/('(C(S*R`5#PX0$1`,"`0"`0$#!04` -M]>;7TM[]'C(X+QX,^_#O]P(-%!84$`L$_/'IX][9T\_/V>X""0?_\^[Y#184 -M#`#PX]S9V-?3S<:_N[BXP-7O_P#X[-_6T=#1T<_*QL7/Z`<8%PX`[-S3T=WV -M$R8L*!T1!O_]`@D/$0X)!/[Y]_?X]_/NZ.L!'S0\."H:#0/]_/X$"@T,"@D( -M!P+[\NG@VM?8Y/L1&A,![.#I!R8T-2P8!/7IY>KP]/;V]._I[``=-$%#/#,L -M*2HK*B8?&`\(#!XK)1<*]^+8V>7^&"@J)B`:%A(/#`@#_OGV]?C]`0,"_?/G -MW-SS&#,].2H6!OGS^``#`O_[]O/R\_/Q[>?@V=37Y/H/&14']>GK_A@F)AP( -M\^GI\/?[_O[\^?;V`!0H,2XC%PT)"Q,=(B`7"O[T]08>+#$P(P_]\_<-)C0U -M,"VMC7 -MU,['P+R_S^G[_O7EU/@WMO9UM'+Q\SD -M#"HS+B`)]>KK^`D5&!<5$@X*!O[SZ.+?W=WG_14E*"`2!?GT`R$V."X>!O'F -MYNSU^_SW\>KDZOX5(B,<$PT+#`X/#0D%`/OT[?`!%!H7#O[MZ/(%&28G(1XA -M)S$\0D([,B@=$@D$!0P3%A0)_?H,*SPY+R(0_O/S^@($`?KQZ.#8T]#.S?%@G\\.7@Z@`/#@;\[-O1S,S. -MT,[&O+>_U_$``??JX-S7?[087&Q8)^O'T_PT2 -M#P;\]._Q^0,("`+WZ=G/SMS['3`P*!H(^/+S^/X"`P#[]O#HXM_AY>;G[P(9 -M)209"__X]_C^#B8U,2<>%`L'!08'!?_W]0`8,T1%.RPA&QD;("0E)"$<%@T` -M\>SV!0H'`?C[#!H>&Q,)`0`(3$0T*"`8#_O?PZ^?BW-KA\`0=,SDM'0SX -MZ./DZ>WQ]?C\_P$!`/WX\>GDZ/@.'1\6"?SS[^[P^@P:&Q4-__/MZNCGZ>GG -MZ?0%%B(E(AP6$Q08&Q@1"PH,$!(0#Q8F,"H>$PT5*3D^.S0N+3(Y/T`\-2XG -M(!D3#PT+"07_]>SI[O8"$AD3"O_QY^/?W=[?W=C4T,S+S='4T]'4X_<"`OKO -MX-+(P\+$S^?Z_/7MXMC4T]38W-W=Y?D.%Q(%].;?X>OW`08'!@'Z\^OAV-?F -M^?_]^?D$$!,/!_WT[_'W^?CX^?S]^_CU\_'O[.;>U]7KN`1XT -M/3HM'A(*!P<)"0<$`/OT[N?AX.T'&AX:%QPE)AP/`??T^@@7("`9$0L%__OX -M]_GY]O'JY>GY#2$V0SXO(1,%_OS]``,#__GV]//S\N[GX-WC\?\%`_KOY^7I -M\OC^#2$K*"(6!/;P[_'V^OP%%B@P+R<<%18=)R\P*R0>'!H7$@H`_`05'QX= -M'R4N,2PB%Q`-$1D@(A\9$0@`]_#JYN3FZ.GGY^_\`00-&1H5#PD!^O'HXN'D -MZ.SP\>SEW-70T^+\$!<4"?OPZ.7DX^#+Y`__\``4(!@'[^?P!"Q4:&182#0D'!@4#`/SW -M\NSFY_4&#Q8A*2@A&A`(!0']^//LY-[=X./EY^CGYNWZ!@L(`?CR[NWN[>KM -M_A0=&1$$\^CBX>3H[?@.*T!(1#(RC@ -MX^_V]OD"!P3_^O+JY-[:V=C6TM'3U=/.Q[ZXN\O@[O#GV<_,TMO@X=[B\@0( -M!?[QY=[;VMO?]$Q\?&1$,"PX3%Q81#`<%`P#[].SDY?+[]O#W!`P."@/\ -M^/CZ_P0$__?MY-_>WM[>WM[;UM#/VNOV_0D<*2<=%`H&!P<)#A06%!$0$1(1 -M#0;^_0H;(B$9#P8`_?W[\^KI]P8)!?_TZ.'=W=[>X.K^$R(D'1(*"`T6'!P7 -M$0H%`?WZ^/;Z"2`L*B@M,C8U,2LE(1\?(2$=%Q(/#0L)!?[W\.OFX=O=Z?;[ -M_0@:(R,?%0?]].SFY.+>VMC8V=O=W=S=Y_@($1$*__;P\/3X_`(3*30S*AP- -M!`#]_?W]`1`I04U.1CPS+BLI)R4C(B$?'AL3!_KT_@T0#1`7&QP7#@7^_/T` -M!0@&`?OU\.SIY^3BWM?-P[N\R][L]@83$0;[\./>W^/M]OS____]^O;OYMO: -MZ``0$@H`^OG\_P'^]_/Z!PL(`_?IX-O7U-/5WO(,'R,;#0'[_`(("@D'!@4" -M_/3KX][D]PH,!PH2&1L7$0H&!@@-$A05%102#PL$_//KYN'%0T*"Q`6'!X< -M%Q`)`_[Z]>_HXMW9U]OI_0P8)C`M)1\9%!(0#@T+"`4"__SY]O'JX=S@\`,- -M#@@`^/7S\_#KZ/$"#`T*`/+FWMG:W>'J_1WHX][:UM?B[?7_#A@8%!`) -M!@8%`?_^_/KW\^_KZ.3AX.;W#AXA&Q$(`@$#!00#"QLF)B`6!_GNYN#>WN#K -M!"`Q-2XB%@\+"P\1$0X*!0#Z\NC'BX>+M`!0?(AP2"P@)#0X*`OOV]?3S\N[IZO8# -M!@$!"QTI*2(;%Q<<)"TT,BPB%PP#^_7P[NWMZN;G\@<6&ATC(QH2"?_V]/3U -M]_?U\>WIYN/?VM;2TMWQ`@@!].CDYNOO\?+Z"Q<6$0?XZN3CY.?IZ_4+)#8Z -M,B07#@P2&AX?'QT8$@L$^_#J\@0."0,'$Q\D(1D2#0T/$1(1#PP)!P<&!/_V -M[.+9T]#3X/(`"!$<(!T9%A`,!P(``/_Y\_#R]OCV\>KE[0`2&1@1"/_Y^/GX -M\NSP``T+!/ONY-[;V=C7VN?_%B(A%PH!``4,$`\)`?;LY-_=V]K>Z?H#!0P8 -M(2(>%0P'!PL5'B0E(QX8$0H#_??R[.?BWM[I_`@(!`D2%A(+`//M[O+U^/CT -M[>;@W-O:V-CB]0@0#0+UZ^CJ[_3U\O,!%!H3"O[PZ.?FY^OT!A\T/T`Y+R&Q<4$Q$,!P#X[^;D[/?_"1DB(1X8$0X/$1(0#0@#_??PZ>#9U=/1S\[- -MTN+Y#102$ATF(QL4"?WU\.WN\O7Y_@(!^_/IY.P"%A\=$P@"``$"`/KRZNS[ -M"@X+`_;JXMS8V>+Q`@X3$Q(4%QD<'AX;%`T&`/KT[^KEX>#H^Q(G-#,I'A82 -M%1PA(1X9%!`-"0/^^?/MY^+'M_Q`7%@\&`@(%"`@"^.WEYO@1("(=#_SLX^'M!R`N,"HC'1L;'B$A'AH7 -M%!(0#`;\\>;=U=3A_!4@'0__\_#V``D-#`'=V=75W^_\__OS -MZ.+K`QPG)1H*^>_JZO#W^O?Q[.CG[P$3'!P6#04"`PD-#`?_]>G>VN7V_O[Y -M[=[6U^;]$1<3#0D("Q`4$Q`)`OSY^OT!!`3^]>SG[@8G0$E%-R07$1(7'B$@ -M'AL7$0L%`/OV[^;@W^K["0X*`?7KY./O!A<:%0O\[.#8U-36UM74UN+U"A@; -M%@T&`/SZ^/;S[^OHY.#>Y/4$!P'VZN;N_@T9'QX;&R`F*2VMSD[._M[OL2(B8C&P\&__GZ``8)"0<# -M_/7LY^OY"`\/"0+^_?\!`?OPX]SD^`@,"@/VZ=[7V>7S_0(&"`<%`P0'"08` -M^?/O[N_Q\?#LY^'@[`,9)BD@$`+Z^/P%"@T0$Q89&AH7$@L$^_/R^PL7&A<1 -M"P<#!A0G+2<>$P7Z].[KZ^SJZ.GR``P1$A`,"`4"`/[[]_+MZ>;BW-C=Z_7U -M\O+U^P$$!04&!@@,$!(0#`<"_/;Q[>KHZ.KR_`4)!?SV^PP<(B(<$@@#__W^ -M__SX]O3S]?X*$Q<6$PX(!`,$!@@'!/WV\_L,&!D6$`D*$A@;'!H7%!,4%A@8 -M%A(."P;DX>#B[/T/&1@0!_[W -M\>WN\O;X]>_J[P`/$@P"^/8!#1(3$0T*"@P0%!87%A(-!P#[]>_LZNGM^@4& -M__\*$Q01#07__/S^``#^^O;R\.SGY>O\#Q<4"__SZ^?I\/?Y]_/W!A8:%@W_ -M[^+:V^P#$A84#0%@P"]_#L[?#U]_CW]_CX]_;T\>WIZ_0! -M"0P*`_GP[OP1'B$>%`?^^?;W^?KY^/H"#1<:&10/"00"`P<+"PD%`?ST[.;K -M^`,*$189&180"@3_^_K_`P4&!@<)"@D&__?NY^7L^@8(`_KR]@,.$!`-!@'_ -M_OX``P,!_OKX_0D3%Q4.!__Z^/L`!@@&`?KPZ.?R_@(`^_C[!0H+"@D'!04% -M!PL.#@T+!P+]]_+NZ^GO_`D."@0$#A@:&!0-!P,!````_OOY]_/NZ>SW`P@' -M`_WX]?3V^O[_^O+IYN[[`?[X[N'9W>OX_O[Z]?'N[_/Z``("`/OU\.WKZ^KG -MY>7K\OP+&R(A'181#Q$2$A,1#@H&`?_]_?P`"Q@?'AH3#`3_^_KY]_/Q^0D5 -M%A$*__/JX^+K^P8+#`D%`O_]_/W^_/KX^/CW]?/OZN7BYO4-'R4B&0T"_/K[ -M_P$!__[^_O\```#]^?C\!@T/#0@!^O3P[N[S_PX6%`\'_O;Q[.KK\?L$"@X0 -M$`X+!P0%!PD)"@L+"@@%`OWX]/D*&R0E(!<0#0L*"PP-#0P+"0@'!@/^^/+Q -M]@`+$1`+`OCOZ./H]PL6%Q,+`/?NZ.3CX^;O^P4*"P@%`?WZ^/G\``,"`/WY -M]O+MZNSW!A,='QP7$@X+"08$`@(#!`8&!`']^O;R[NWT_P<(!@'[].[N^`8- -M#`D#_/?S[^WKZ>?FZ_8"#`\."P@$`0`!`P0$`O[X\^[JZ.GO]OK^!`@(!@/_ -M^O;T]/;Y_``#`O_[]O+P\._M[?#V^_W\^?7R]/T&"@P-"P@%`P#^_/KY^OL` -M"1`4%!(/#`H)!P<&!@8&!0,!_?GY_P0$!`D.$Q,/"0+[]?+S^/T!`P0"`?[Z -M]O+O[>OK\?H``P#Z]/3\!`@*"08#`?_]^_GX]_;V]OH"#18;&A82#0D%`P,$ -M!`0#__KW^P0+#0L(!0<+#0T,"08"`/\``P8("0D(!@,`_?GU\?#Q]_X"`?__ -M!@X1$`X*!`#]^OGX]_;T]//T]OP&$!45$@\+"08%!`,"_OKU[^[S_@<)"`/] -M^_X#!08&`P#^_@`#!04$`P(!`?_\^OCV\_+T^?S\^OT&$!,0#`@%!`,!__W\ -M^OCW]_C[_P0)#0X-"P<$`@#__?OY]O/P[O'[!`8#__KV]_T#!P@&`P'__?S\ -M_/OZ^OKZ^OGW\NWGX^'AY>OP\_;]`P4!_?OX]_?W^?S^__[]^_GW]OC]!0T2 -M$Q$,!@+^_?X!`P,`^_C\!@X1#PH$_OP!"`L,"PD&!`,#!0@*"PP+"08"__SZ -M^/;S\?'T^/K]`PL.#0H'!`("`P,"`/SX]/+S]/3T]OG^`0,"`?_^_?SZ]_7T -M\_/S\_7\`P8$`?WY^/O_`@,$`P,$!04&!P8&!@8'!P@'!@4$`P(!`@4("`8% -M"1(7%A01#@T+"08$`P(`_OSZ^?GZ_0(("PL(!`#^_?W]``,$!`+^^O?Y``8& -M`O_[^?K_!0<&`__\^_T"!@D*"`8$`P$`_OSY]O/Q\?7\`@8'!00'#Q04$Q`, -M"04"``#__OW\^OCV]/7Y_@("`@#__O[_``$!`/[\^?;S\>_R^?W[]_3T^0`$ -M!0,`_/CW^/O^``#__?S[^_OZ^??T\?#Q]_\&"0<"^_?Y`PL.#PP&`?WZ^OS] -M_?OX]O7T]?G_`P8&!`'__P$#!`,"`/[\^OCV]?3V^P$!__\!!`<'!@0!```" -M!`8("`<%`P$!`@0$`O_\^?;V^P(&!P4`^O;U_`8+"PD%`/S[^OGY]_7S\?'S -M^0`&"`<#_OKW]_K]_____OW[^OCW]?/S]OL`!`D.$1(1#0@%`@$!`0(#!0<( -M!P<&!@8'!@,!``$%#`\0#@L&`O[]`0L2%!(/"P<#`?_^_/KW]/+S]_\&"@L* -M"`4#`0```````/____[\^??T\?+W_`()#`L(!0+__?W]_O[]_?W^__[^_?S\ -M_/S[^_S_!0L-"P@$`@#]^?H!"`L*"`4`_/KY^?KZ^?GY_`('"@L*"`8$`@$` -M````_______]^_CU\_'R]@`)#@\-"04"`/___OS[^?CW]O;V]O3S\O'Q\O/V -M^P`#`P'__?OZ^OGW]O?]!`H+"08"_OOY^/GZ_/\"!0<'!@4%!04&!P<&!00$ -M`P'__?KX]O7U]?7V^@()#@X,"`4"`/[^_?W]_/OZ^/?V]?7V^/K^`00&"`<& -M`P$`__W]_/S\_/S]``8)"@<$`?[\^_O\_@$$!04%!`,!__[^_P`!`0#__?OY -M^/CX^?GY^OK[_/X``P<*"PL)!@0#`P,"`0#__O[]_?S\_?[_`@0'"PP,"P@& -M!`(!``#___[]_/S[_/T!!08$`O_]_/X``P4$`P'^_?S\_?W^_O[^__\``/__ -M_OW]_?W]_?X``P4%`P$!`P<)"0<&!`,#`P,#`@$!`````0``__\``@0%!00# -M`@#__O\```$!`/[]^_GX]_?Z_@$"`/[\^_P``@(!`/_^_?W^_O[^_O[^_O__ -M``#__OS[^OGX]_?Y_``"`@$`_?OY^OX"`P,"`0#___[]_/S[^_KZ^?GY^_\$ -M!P@(!@4#`@$!`@(#`@(!`0#__O[^_?S[^_X"!`4&"`D)"`8$`P$```````#_ -M___^_OW]_?[^_OW\^_GX^/O_`@,#`?_^_/KY]_C\`00$`P'__?S[^OGY^/GY -M^OP`!`8&!@0"`0`````!`0(#!`0#`@$`_OW\_/S\_/X!!@H,#`H'!`(!```` -M`0$!`@,#`P("`0#__O[^_?W^_P`!`P0#`P(``/_____^_?W\_/\#!P<&!`(` -M_OW\_/S\_@`#!04%!`,"`0#__O[^__\``0$!`0#__OW\^_O[^_K[^_W_`P8' -M!@0"`/[^_O[^_O[^__________[^_O[__P`"`P4%!`0#`@$`______[^_?S\ -M^_O^`0,#`P$`_OW]_/S]_O\`````__[^_?S\_/W]_?W^_O[___[^_OW^_O[^ -M_?W\_/S\_/X``P4%!00#`@$!```!`0$!`0$!`0$``/_^_OW]_@`"!`0$`P(! -M``#__O[]_/S[^_KZ^_S_`0("`0#^_?W\_/S]_@`"`P,"`/_^_O[^_O__```` -M`0$!`0$``/____[^_?W\_/S\_0`#!04%!`,"`0#___[__P```0$!```````` -M``#___[^_OX!`P4%!`,"`0``__________\```$!`0$!`0$``/_^_?W]_@`" -M`@("`0#___[^_O[^_O__``$!``#____^_O[]_?W]_/W]_@`"`P("`0$!`@(! -M`0```````0$!`0$!`0``___^_O[^_P`!`@,#`P("`0$```#___[^_?W]_?[^ -M_______^_O[^_O[^_O__``$!`0````#_____________````````_____O[] -M_?[^_O[__P`!`0```/___O[^_O[^__\``````````````/____________\` -M``$!`0$!`````````````````````````/______________``$"`@$!``#_ -M_______________^___________^_O[^_O[^_O[__P`!`0$!``#_________ -M_O___P`!`@("`0$```````````#_____``$!`0$!````______\````````` -M`/_____________^_O[^_O[__P`!`@(!`0```/_______P````````#___\` -M````````_________P```0$!`0```/_______________P```````````/__ -M____________``````````#___________\```````#_________________ -M______\`````````_________________P```````/________________\` -M``````````````#_______________\``````````````/___P`````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````!#3TU-````$@`!```H%@`(0`VL1``` -M`````$U!4DL````"``!)3E-4````%#P``'\`?P``````````````````05!0 -M3````:A39#)A``(````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````````````````````````Z`````````````` -M```````````````````````````````````````````````````````````` -M```````$"```````"0`C`````````````````'@````$``0```````#\`/__ -M_X`````!`0`&455N:71S```````````````````````````````````````` -M`0(`!B!S86UP````%8` -M``$A!%-!1$6!`0`````.```&`:/4?J:EY/O_```B8`I&`0``D`#&`0#_^/_C -M````````@``````````````:`"D`#P)J`S$`*@`#`FT#/0`I``\"00,B`0`` -M```:`"D`#P%0`?$`*@`#`FT#/0`````````````````:`"P`%@$^`=P`*@`# -M`FT#/0`````````````````:```````````````````````````````````` -M``$````!>````'@```!6`'&XO!RF````'`!6``!7```````#__\````\```````$__\```!:```````````` -M```````````````````````````````````````````````````````````` -` -end diff --git a/sys/share/sounds/lethdrum.uu b/sys/share/sounds/lethdrum.uu deleted file mode 100644 index 2c198692a..000000000 --- a/sys/share/sounds/lethdrum.uu +++ /dev/null @@ -1,433 +0,0 @@ -begin 644 Leather_Drum -M``Q,96%T:&5R($1R=6T````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$``$X`SP```````$B,```! -MZ*<]F@*G/9L$``````````````````````````````"!@6!?``!&3U)-``!( -MA$%)1D934TY$``!&B``````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````````````````````````````/___P``_P`# -M`@$!``#__P@.!/CU]_T!^?;\``#__/S\^?3P\?3U]?7V^?GX^/KSZ^ON\O3U -M^/?R\?'V`@@,#PP)"@\7%0X-!_[Z`1`9&!03%A@;("`4"@8"``4-$Q0/"@D+ -M!O[Z^/?W]OH#!0($!P/[]>WJ_QH@&A0+`?_Z]O#HY-[=Z?3V[>SW\>7AX>?L -MYM?+Q;R[R=CAXMS9W-_>W^'BY>SS^@`!``(%"Q0<)"PT.CDV.#Y!0DA36UY@ -M8V)=54M$0T,_."TC&1`(`__Y\^OCW=K7TQK["R -MM+:VM;2SL[C"R]'7W./L\O;Y^_S^`@<,$147&A\D*"TR-38W-S;BW=G4 -MT,K"NK2NJ::DHZ.CI*6FI::GJJ^TNL#%R,K.TM79W^3I[O/Y``4+$18;'R,F -M*"LN,C0V.#H\/T-(3%%55E965%%-245!/3DV,B\J)2`;%A$-"08#`/WY]?+O -M[.GFY.+@W]WSR^/\$"A`5&1XB)2@L+S,V.3T_04)#1$1$141#0D%`/SX].S@U,B\M*BX.+EZ.OO\O;Y^_X`!`<*#A$4%AD;'2`B)2@L+S0Y/D-(3$]04%%0 -M3TQ)1D(^.3,O*B4B'AH7%!$."@8"_OKV\>WHX]_:U=#,Q\/!O[Z_O[^_O[^_ -MO\#`P,'"P\7'RL[1U=G>X^CL\/3X^_\"!@H-$!,5%Q@:'!X@(B0F*"DK+"PM -M+2TM+BTM+"LK*BHJ*2DH*"DI*"WHX][: -MU]/0S,G&Q,&_O[^_OKZ^O\#!PL/%QL?)R\W/TM78V]_DZ>[T^O\%"@\5&ATA -M)"[L -MZ^GHY^;EY>;GZ.CHY^?FY>3CX=_=V]G7U];5UM;6U]?7V-G:V]S>X./FZ.ON -M\?3W^_X!!`@+#A`2%!<9&QT?(2,E)RDJ+"TO,C4W.3H[.SLZ.#8T,2XJ)R,@ -M'!@4$`P(!`#\^/3OZ^CDX-W9UM32T,_.SWQ -M]?G\_@`!`@(#`P,#`P,#!`0%!P@*"PT/$!$1$A,5%A<8&1H:&QP<'1X>'AX> -M'Q\?'QX='!P;&AD8&!<5$Q(0#PT+"08$`?_\^?;R[NKEX=W9UM/0S7I[/#S^/P!!0D.$Q8:'2$D)BDK+2XO,#`P,"\N -M+"LI)R4C(!T:&!84$Q$0#@T+"0@'!00"`?_^_?OZ^/;T\O#O[N[M[>SL[>WM -M[>WM[>WL[.OKZ^KIZ>CGY^?GYN;EY>7DY./CX^/DY>;HZNSO\?3X^_X!!0@, -M#Q,6&1P>(20F)RDK+B\Q,S0U-34U-#,Q,"XL*28B'QL7$P\+!P/_^_CT\>[K -MZ.;CX>#?WM[>WMW=W=W=W=S3CXN'@W]_?WM[?W]_@X>/DYN?IZ^WO\O3W^OS_`00'"@T0$A48&AT?(20F -M)R@I*BLK+"LK*BDH)R4D(A\=&Q@6$Q$.#`D&!`'^_/GW]?/Q[^[M[.OJZ.?F -MY>7EY.7EY>7EYN;FY^?HZ>KK[.WN[_#R\_3U]O?X^?GZ^_S]_?[_```!`@0% -M!@<("@P-#Q$2$Q05%A<8&1H:&QP<'!P='1P<&QL:&1@7%A03$1`.#`H(!0,` -M_OOY]O3Q[^SJZ.;DXN'@W][=W=S+DY>?IZNSN\/+T]OCZ^_W_ -M`0($!0<("@P.#Q`2$Q,4%!45%145%104%!03$Q(2$1$1$!`0$`\/#P\.#@T- -M#`L)"`<%!`,"`/_^_/OZ^??V]?7T\_+Q\.[M[.OJZ>CGYN7DY./CX^3DY.7F -MY^CJZ^WO\?3V^?O]``(%!PD+#1`2$Q47&!D;&QP<'1X>'AX>'QX>'1T<&QD8 -M%Q44$A$/#@P*"`8%`P'__?SZ^?CW]O7T\_/R\?'P\/#P\/#P\/#P\/#O[^_O -M[^_P\/#P\/'Q\?+S\_3U]?;W^/GZ^_O\_?W^__\``0($!08("0L-#A`2$Q46 -M&!D:&QP<'1T='!P;&AD8%Q44$A$/#0L*"`8$`@#^_?OY]_7S\>_N[.KIY^;E -MY./CXN+BX^/DY>7GZ.GK[>[P\?/T]O?X^?O\_?[__P`!`@,$!08'!P@)"0D* -M"@H+#`P-#0X.#@X/#PX.#@X.#@X.#@X-#0T-#0P,#`P,"PL*"@H)"`<%!`,! -M`/[]^_KX]O3R\>_N[.OJZ>GHZ.CHZ.CHZ.CIZ>GJZ^SM[N_P\O/U]_CZ_/X` -M`P4'"@P.$!(3%!46%Q@8&!@8&!@7%Q85%!,2$1`0#PX-#`L*"0<&!00#`@$` -M__[^_?S\^_OZ^OGY^?GY^?GY^?GY^?GY^/CX]_?W]O;U]?3T\_/R\O+R\O+R -M\O+R\_/T]?;W^/GZ^_W^_P$"`P0&!PD*#`T.$!$2$Q05%A<7&!@9&1D8&!<7 -M%A43$A$/#0P*"`8$`@#^_/KX]_7T\O'P[^[M[.OKZNKJZNKJZ^OL[>WN[_#Q -M\O/T]O?X^OO\_?\``0$"`P,$!`4%!04&!@8%!04%!04%!@8&!P<'!P@("`@) -M"0H*"@L+"PL+#`P,#`P,#`P,#`P+"PH*"0@'!@4$`@'__OW[^?CV]?3R\?#O -M[NWLZ^KJZ>GIZ>GJZNOL[>[O\/+S]/;W^?K\_O\!`P4&"`H+#`X/$!`1$A,3 -M$Q,3$Q,3$A(1$!`/#@T-#`L*"0@'!@4$`P,"`0$`___^_?W\_/S\^_O[^_O[ -M^_O[^OKZ^OKZ^?GY^/CX]_?V]O7U]?3T]/3T\_/S]/3T]/7V]O?X^?GZ^_W^ -M_P`"`P0&!P@*"PP-#@\0$1(2$Q,4%!04%!,3$Q(1$`\.#0L*"`<%!`(!__[\ -M^_KX]_;U]//S\O+Q\?#P\/#P\/'Q\?'R\O/T]/7V]_CY^OO\_?[__P```0$! -M`@("`P,#`P,#`P,#`P,#`P,$!`0%!04&!@8'!P@("`D)"@H*"@H*"@H*"PL+ -M"PL+"@H*"0D(!P8%!`,"`?_^_?OZ^??V]?3S\O'P\._O[^[N[N[O[^_P\?+S -M]/7V]_CY^_S]_@`!`@0%!@<("@L,#`T.#@\/$!`0$!`/#PX-#0P+"@D)"`<& -M!04$`P(!`0``_____O[^_OW]_?W]_/S\_/S\_/S\^_O[^_O[^_OZ^OKZ^OGY -M^?GX^/CW]_?W]O;V]O;V]O?W]_CY^OO[_/W^_P$"`P0%!@<("0H+#`P-#@X/ -M#P\0$!`0$`\/#PX.#0P+"PH(!P8%!`(!__[\^_KX]_;U]/3S\O+R\?'Q\?'R -M\O/S]/7U]O?X^/GZ^OO\_/W^_O__```!`0("`@,#`P,#!`0$!`0$`P,#`P0$ -M!`0$!`0$!`0$!04%!@8&!P<("`@)"0D)"0D)"0D("`@'!@8%!`0#`@(!`/_^ -M_?S[^OGX^/?V]?3T\_/R\O+Q\?'Q\O+R\_3U]O?X^?K\_?[_``(#!`4'"`D) -M"@L+#`P,#0T-#0T-#0P,"PL*"@D("`<&!@4$`P(!`0#__O[]_?S\_/O[^_O[ -M^_O[^_O\_/S]_?W]_?W]_?[]_?W]_?W]_/S\_/S[^_O[^_KZ^OKZ^OKZ^OK[ -M^_O[_/S]_?[__P`!`@,$!08&!P@)"@H+#`P-#0T-#@X-#0T,#`L*"0D(!P8% -M`P(!`/_^_?S[^?CW]_;U]?3T\_/S\O+R\O/S\_3U]?;W^/GZ^OO\_?[_``$" -M`@,$!`4%!@8&!@8'!P<'!P8&!@4%!04$!`0$!`0#`P,#`P("`@("`@("`@(" -M`P,#`P,#`P0$!`0$!`0$`P,#`@(!`0#___[^_?S\^_KY^?CX]_?V]O7U]?7U -M]?7U]O;W^/CY^OO\_?[_``$"`P0%!@<("0H*"PL,#`T-#0T-#0T,#`P+"@H) -M"`<&!00#`P(!`/_^_?S[^OKY^?GX^/CX^/CX^/CX^/GY^?KZ^_O\_/S]_?W^ -M_O[___\```````#__________________O[^_O_______P````$!`@(#`P0$ -M!04&!@<'!P@("`@("`@("`@(!P<&!@4$`P,"`0#__O[]_/OZ^?CW]_;V]?7U -M]/3T]/3T]?7V]O?X^?GZ^_S]_O\``0(#!`4&!@<'"`@)"0D)"0D)"0D)"0@( -M"`<&!@4%!`0#`P(!`0``___^_O[^_?W]_?W]_?W]_?W^_O[^______\````` -M``````````#_______[^_O[]_?W]_?W]_?W]_?W]_?[^_O__`````0("`P,$ -M!`4&!@<'!P@("0D)"0D)"0D("`@'!P8&!00#`@$`___^_?S\^_KZ^?CX]_?V -M]O;V]O;V]O;V]_?W^/GY^OO[_/W^_O\``0$"`P,$!`4%!04%!@8&!04%!04% -M!00$!`,#`P("`@$!`0$!`0````````````````````````````$!`0$!```` -M````_____O[^_?W]_/S[^_OZ^OKY^?GY^?GY^?KZ^OO[^_S\_?W^__\``0$" -M`@,$!`4&!@<'"`@("0D)"0D)"`@("`<'!@8%!`0#`@$``/_^_OW\_/O[^OKZ -M^?GY^?GY^?GY^OKZ^OO[_/S]_?[^__\```$!`@(#`P,$!`0$!`0$!`0$!`0$ -M`P,#`P("`@("`0$!`0$!`0$!`0$!`0$!`0("`@("`@("`@("`@("`@("`@$! -M`0$!````___^_OW]_/S\^_O[^_KZ^OKZ^?GY^OKZ^OO[_/S]_?[^__\``0(" -M`P0$!04&!@8'!P<("`@("`@'!P<'!@8&!04$!`,"`@$``/_^_OW]_/S[^_OZ -M^OKZ^OKZ^OKZ^OK[^_O[_/S\_?W^_O[___\``````0$!`0$!`0$"`@(!`0(! -M`0$!`0$!`0$!`0$!`0$!`0$!`@("`@,#`P,#!`0$!`0$!`0$!`0$`P,#`P(" -M`0$!``#___[^_?S\^_OZ^OKY^?GY^?GX^/CX^/GY^?KZ^_O\_/W]_O__``$" -M`@,$!`4%!@8'!P<("`@("`@("`<'!P8&!@4%!`0#`P("`0``_____O[]_?W\ -M_/S\_/O[^_O[^_O[^_S\_/S]_?W]_?[^_O[^________________________ -M__________\```````$!`0$"`@(#`P,$!`0%!04%!04%!04%!04%!00$`P," -M`@$!``#__O[]_?S[^_KZ^?GX^/CX]_?W]_?W^/CX^/GY^OK[^_S]_?[__P`! -M`0(#`P0%!08&!P<'"`@("`@("`@("`<'!P<&!@4%!00$`P,"`@$!``#____^ -M_O[^_?W]_?W]_?W]_/S\_/S]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] -M_?W^_O[^_O___P```0$"`@,#!`0%!04&!@<'"`@("`@)"0D("`@("`<'!@8& -M!00$`P(!`0#___[]_?S[^_KZ^?GX^/CX]_?W]_CX^/CX^?GY^OK[^_S\_?[^ -M__\``0$"`@,#`P0$!04%!08&!@8&!@8&!@8%!04$!`0$`P,#`@("`@$!`0`` -M````_____________O[^_O[^_?W]_?W]_?S\_/S[^_O[^_O[^_KZ^OKZ^OKZ -M^_O[^_S\_/W]_?[^_P```0$"`P,$!`4&!@<'!P@("`D)"0D)"0D)"`@(!P<& -M!@4$!`,#`@$``/_^_?W\_/OZ^OGY^/CX]_?W]_?W]_?W^/CX^?GY^OK[^_S\ -M_?[^__\```$!`@(#`P,$!`0$!04%!04%!04%!04%!04%!00$!`0$!`0$!`,# -M`P,#`P("`@("`@("`0$!`0``_____O[^_?W]_/S[^_OZ^OKY^?GY^?GX^/CX -M^?GY^?KZ^OO[_/S]_?[^_P```0("`P0$!08&!P<("`@)"0D)"0D)"0D)"`@( -M!P8&!04$`P,"`0$`__[^_?S\^_OZ^OGY^?CX^/CX^/CX^/CY^?GY^OK[^_O\ -M_/W]_O[__P```0$"`@(#`P,$!`0$!04%!04%!04%!04%!04%!04%!04%!00$ -M!`0$!`,#`P,"`@(!`0$!``#____^_O[]_?S\^_O[^OKZ^?GY^?GX^/CX^/CX -M^/GY^?KZ^OO[_/S]_O[_```!`@(#!`0%!08'!P@("0D)"0H*"@H*"@D)"0D( -M"`<'!@4%!`,#`@$!`/_^_OW\_/OZ^OKY^?CX^/CX]_?W^/CX^/CY^?GY^OKZ -M^_O\_/W]_?[^__\````!`0("`@,#`P,$!`0$!`4%!04%!04%!04%!04%!04% -M!04%!04$!`0$`P,"`@(!`0``___^_OW]_/S[^_KZ^?GY^/CX^/?W]_?W]_?W -M]_?X^/CY^?KZ^_O\_?W^_P`!`0(#!`0%!@8'!P@("0D)"@H*"@H*"@H)"0D) -M"`@'!@8%!`0#`@(!`/___OW]_/O[^OKY^?GX^/CX^/CX^/CX^/CX^/GY^?KZ -M^OO[^_S\_/W]_O[___\```$!`@(#`P,$!`0%!08&!@8'!P<'!P@("`@("`@( -M"`@'!P<'!@8&!04$!`,#`@(!``#___[]_?S[^_KZ^?GX^/?W]_;V]O;V]O;V -M]O;V]_?X^/GY^OO[_/W]_O\``0$"`P0%!08'!P@)"0H*"@H+"PL+"@H*"@H) -M"0@(!P<&!04$`P,"`0``__[^_?S\^_OZ^OGY^?CX^/CW]_?W]_?W]_?X^/CX -M^?GY^OKZ^_O\_/S]_?[^__\```$!`@(#`P0$!04%!@8'!P<'"`@("`@("0D) -M"`@("`@'!P<&!@4%!`0#`P(!``#__OW]_/O[^OGY^/?W]O;U]?7T]/3T]/3T -M]/7U]?;V]_?X^?KZ^_S]_O\``0("`P0%!@<'"`D)"@H+"PP,#`P,#`P,"PL+ -M"@H)"`@'!@8%!`,#`@$``/_^_?W\^_OZ^?GX^/CW]_;V]O;V]O;V]O;V]O?W -M]_?X^/GY^OK[^_S\_?W^_O\```$!`@,#!`0%!08&!P<("`D)"0D*"@H*"@H* -M"@H*"@H)"0D("`<&!@4$`P,"`0#__OW]_/OZ^?GX]_;V]?3T\_/S\_+R\O+S -M\_/S]/3U]?;W^/CY^OO\_?[_``$"`P0%!@<'"`D*"@L,#`P-#0T-#0T-#0T, -M#`L+"@H)"`<'!@4$!`,"`0#__O[]_/O[^OGY^/CW]_;V]O7U]?7U]?7U]?7U -M]?;V]O?W^/CY^?KZ^_S\_?[^_P`!`0(#!`0%!@<'"`D)"@H+"PP,#`P-#0T- -M#0T-#`P,"PL*"0D(!P8%!`0#`@$`__[]_/OZ^?CW]O7U]//S\O+R\?'Q\?'Q -M\?'R\O/S]/7U]O?X^?K[_/W^_P`!`@,$!08'"`D*"PL,#0T.#@X.#@X.#@X. -M#0T-#`L+"@D("`<&!00#`@$`__[]_/OZ^OGX]_?V]?7T]/3S\_+R\O+R\O+R -M\O/S\_3T]/7V]O?X^/GZ^_S]_?[_``$"`P0%!@<("0H*"PP,#0T.#@X/#P\/ -M#P\/#@X-#0P,"PH)"`<&!00#`@'__OW\^_GX]_;U]//R\?'P\._O[N[N[N[N -M[N_O[_#Q\O+S]/7V]_CY^_S]_@`!`@0%!@<)"@L,#0T.#Q`0$1$2$A(2$A$1 -M$1`0#P\.#0P+"@D(!P8%!`,!`/_^_?S[^OGX]_;U]//S\O'Q\/#P\._O[^_O -M\/#P\?'R\O/T]/7V]_CY^OO\_?\``0(#!08'"`D*"PP-#@\0$1$2$A(3$Q,3 -M$Q,2$A$1$`\/#@T+"@D(!P4$`@'__OW[^OCW]O7S\O'P[^[N[>SLZ^OKZ^OK -MZ^SL[>WN[_#Q\O/T]??X^?O\_?\``@,%!@@)"@P-#@\0$1(2$Q04%!05%144 -M%!03$A(1$`\.#0P+"@@'!@0#`@#__?S[^?CW]O7S\O'P[^_N[>WL[.OKZ^OK -MZ^OK[.SM[>[O[_#Q\O3U]O?Y^OS]_P`"`P4&"`D*#`T/$!$2$Q05%186%Q<7 -M%Q<7%A85%103$A$/#@T+"@@&!0,!`/[\^OGW]O3S\?#O[NWLZ^KIZ.CHY^?G -MY^CHZ>GJZ^OM[N_P\?/T]O?Y^_S^``$#!`8("0L,#0\0$1(3%!46%A<7%Q<8 -M%Q<7%A85%103$A$/#@T+"@D'!00"`?_]_/KY]_;U\_+Q\.[M[>SKZNKIZ>CH -MZ.CHZ.CIZ>KJZ^SM[N_P\O/T]O?Y^_S^``$#!0<("@P-#Q`2$Q06%Q@8&1H: -M&AL;&QH:&AD8%Q85%!,1#PX,"@@'!0,!__W[^??V]/+Q[^[LZ^KIZ.?FYN7E -MY>3DY>7EYN;GZ.GJZ^WN[_'S]/;X^?O]_P`"!`8'"0L,#A`1$A05%A<8&1D: -M&QL;&QL;&AH9&!@7%A03$A`/#0L*"`8$`P'__?OY^/;T\_'P[^WLZ^KIZ.?F -MYN7EY>7EY>7EYN?GZ.GJZ^SN[_'R]/;W^?O]_P$#!08("@P.$!$3%187&1H; -M'!P='1T>'1T='!P;&AD8%A43$A`.#`H(!@0"`/[[^?CV]/+P[^WLZNGHY^;E -MY>3DY./CX^3DY>7FY^CIZNOL[N_Q\O3V]_G[_?\``@0&"`D+#0X0$A,4%A<8 -M&1D:&QL;&QL;&QL:&AD8%Q84$Q(0#@T+"0<%`P'__?OZ^/;T\_'O[NSKZNGH -MY^;EY.3DX^/CX^/DY.7FYN?IZNOL[O#Q\_7V^/K\_@`"!`8("@P.$!(3%1<8 -M&1H;'!T='AX>'AT='!P;&AD8%A43$1`.#`H(!@0!__W[^??U]/+P[^WLZ^GH -MY^?FY>7DY.3DY.3EY>;FY^CIZNOM[N_Q\_3V]_G[_?X``@0%!PD+#0X0$1,4 -M%A<8&1H;&QP<'!P<'!P;&QH9&!<6%!,1$`X,"@D'!0,!__W[^??U\_+P[^WL -MZ^GHY^?FY>7DY.3DY.3EY>;FY^CIZNSM[_#R\_7W^?O]_@`"!`8("@P.$!$3 -M%!87&1H;&QP='1T='1T<'!L:&1@7%A03$0\-"PH(!@0"`/[\^OCV]/+Q[^[M -MZ^KIZ.?GYN;EY>7EY>7FYN?GZ.GJZ^SM[_#R\_7V^/G[_?\``@0%!PD*#`X/ -M$1(3%187&!D9&AH:&QL;&AH9&1@7%A44$A$0#@P+"0<%`P'__?OY^/;T\_'O -M[NWKZNGHZ.?FYN7EY>7EYN;FY^CIZ>KL[>[P\?+T]O?Y^_S^``(#!0<)"@P. -M#Q$2%!46%Q@9&AH;&QL;&QH:&1D8%Q84$Q(0#@T+"0<%!`(`_OSZ^/?U\_+Q -M[^[M[.OJZ>GHZ.?GY^?GY^?HZ.GJZ^SM[N_P\?/T]??X^OO]_@`"`P4&"`H+ -M#0X0$1(4%186%Q@8&1D9&1D9&!@7%A44$Q(1#PX,"PD'!00"`/[\^_GW]O3S -M\?#O[>SKZNKIZ.CGY^?GY^?GZ.CIZNOL[>[O\/+S]?;X^?O]_@`"`P4'"`H, -M#0X0$1(4%186%Q@8&!D9&1@8%Q<6%103$A$0#@T,"@@'!0,"`/[]^_KX]_7T -M\_'P[^[M[>SKZ^KJZNKJZNKJZNOK[.WN[_#Q\O/T]??X^?O\_O\``@,%!@@) -M"PP.#Q`1$A,4%187%Q<8&!@8%Q<6%A44$Q(1$`\-#`H(!P4#`0#^_/OY]_;T -M\_+P[^[M[.SKZNKIZ>GIZ>GIZNKKZ^SM[N_P\?+T]?;X^?O\_O\!`P0&!PD* -M"PT.#Q$2$Q04%186%Q<7%Q<6%A85%!03$A$/#@T+"@@'!00"`/_]^_KY]_;T -M\_+Q\._N[>WL[.OKZ^KJZNOKZ^OL[.WN[_#Q\O/T]?;W^?K[_?[_`0($!08( -M"0H,#0X/$!$2$Q04%146%A86%A45%!03$A$0#PX-"PH)!P8$`@'__?SZ^/?V -M]//R\._N[>WLZ^OJZNKJZ>KJZNKK[.SM[N_P\?+S]?;W^?K[_?X``0,$!@<( -M"@L,#@\0$1(3$Q05%146%A86%144%!,2$A$0#PT,"PD(!P4#`@#__?SZ^?CV -M]?3S\O'P[^_N[>WM[.SL[.SL[.WM[N[O\/#Q\O/T]?;X^?K[_/[_``(#!`8' -M"`H+#`T.#Q`1$A(3$Q04%145%104%!,3$A$0#PX-#`L)"`8%`P(!__[\^_GX -M]_7T\_+Q\._N[NWM[.SL[.SL[.SM[>[N[_#P\?+S]?;W^/G[_/W^``$"!`4& -M"`D*"PP-#@\0$1(3$Q,4%!04%!04$Q,2$1$0#PX-#`H)"`8%!`(!__[]^_KX -M]_;U]//R\?#O[^[N[>WM[>WM[>WM[N[O[_#Q\?+S]/7V]_GZ^_S]_P`!`P0% -M!@@)"@L,#0X/$!$1$A(3$Q,4%!,3$Q,2$A$0#PX-#`L*"0@&!0,"`?_^_/OZ -M^/?V]?3S\O'P[^_N[NWM[>WL[>WM[>[N[^_P\?+S]/7V]_CY^OS]_O\!`@,$ -M!@<("0H+#`T.#P\0$1$2$A(2$Q,2$A(2$1$0#P\.#0P+"@D'!@4#`@'__OW[ -M^OGX]O7T\_+Q\?#O[^[N[>WM[>WM[>WN[N_O\/'Q\O/T]?;W^/K[_/W^``$" -M`P4&!P@)"@P-#@\/$!$1$A(3$Q,3$Q,3$Q(2$1`0#PX-#`H)"`8%!`(!`/[] -M^_KY]_;U]//R\?#P[^_N[NWM[>WM[>WN[N_O\/#Q\O/T]?;W^/GZ^_W^_P`! -M`@0%!@<("0H+#`T.#P\0$1$1$A(2$A(2$A(1$1`0#PX-#`L*"0@'!@4#`@'_ -M_OW\^_GX]_;U]//S\O'Q\/#O[^_O[N[O[^_O\/#Q\?+S\_3U]O?X^?K[_/W_ -M``$"`P0&!P@)"@L,#0X/#Q`1$1(2$A(2$A(2$A$1$`\/#@T,"PH)"`8%!`(! -M`/[]_/OY^/?V]?3S\O'Q\/#O[^[N[N[N[N[O[_#P\?'R\_3T]?;W^/GZ^_S^ -M_P`!`@,$!08'"`D*"PP-#@X/#Q`0$1$1$1$1$1$0$`\/#@T,#`L*"0<&!00# -M`0#__OW[^OGX]_;U]//R\O'Q\/#O[^_O[^_O[^_P\/'Q\O+S]/3U]O?X^?K[ -M_/W^_P$"`P0%!@<("0H+#`T.#@\0$!$1$1$1$1$1$!`0#PX.#0P+"@D(!P8$ -M`P(!`/[]_/OZ^?CW]O7T\_+R\?'P\/#O[^_O[_#P\/#Q\?+S\_3U]O;W^/GZ -M^_S]_O\``0($!08'"`D*"@L,#0T.#P\0$!`0$1$1$!`0$`\/#@T-#`L*"0@' -M!@4$`P$`__[]^_KY^/?V]?3T\_+Q\?#P\/#O[^_O\/#P\/'Q\O/S]/7V]_?X -M^?K[_?[_``$"`P0%!@<("0H+#`T.#@\/$!`0$1$1$1$0$!`/#PX-#0P+"@D( -M!P8%`P(!`/_]_/OZ^?CW]O7T]//R\O'Q\?#P\/#P\/#Q\?'R\O/S]/7U]O?X -M^?K[_/W^_P`!`@,$!08&!P@)"@L,#`T-#@X/#P\/#P\/#P\/#@X.#0P,"PH) -M"`<&!00#`@$`__[]^_KY^/?W]O7T\_/R\O'Q\?#P\/#P\/'Q\?+R\_/T]?7V -M]_CY^OO[_?[_``$"`P0%!@<("0D*"PP-#0X.#P\/#Q`0$`\/#P\.#@T,#`L* -M"0@'!@4$`P(!`/[]_/OZ^?CW]O7U]//S\O+Q\?'Q\?#P\?'Q\?+R\O/T]/7V -M]O?X^?K[_/W^_P`!`@,$!`4&!P@)"@L+#`P-#0X.#@\/#P\/#PX.#@T-#`P+ -M"@D(!P8%!`,"`0#__OW\^_KY^/?V]?3T\_+R\O'Q\?'P\/'Q\?'Q\O+S]/3U -M]O;W^/GZ^_S]_O\``0(#!`4&!P<("0H+"PP-#0X.#@\/#P\/#P\.#@X-#0P, -M"PH)"`@'!@4$`@$`__[]_/OZ^?CW]O;U]/3S\_+R\O'Q\?'Q\?+R\O/S]/3U -M]?;W]_CY^OO\_?[^_P`!`@,$!08'"`D*"@L,#`T.#@X/#P\/#P\/#P\.#@T- -M#`L+"@D(!P8%!`,"`0#^_?S[^OGX]_?V]?3T\_+R\O'Q\?'Q\?'Q\O+R\_/T -M]?7V]_CX^?K[_/W^_P`!`@,$!`4&!P@)"@H+#`P-#0X.#@X/#P\.#@X.#0T, -M#`L*"@D(!P8%!`,"`0#__OW\^_KY^/?V]O7T]//S\O+R\O+Q\?'R\O+R\_/T -M]/7U]O?W^/GZ^_S\_?[_``$"`P0%!@<'"`D*"@L,#`T-#0X.#@X.#@X-#0T, -M#`L+"@D("`<&!00#`@$`__[]_/OZ^?CW]_;U]?3S\_/R\O+R\O+R\O+S\_/T -M]/7U]O?W^/GZ^_S\_?[_``$"`P0$!08'"`@)"@H+"PP,#`T-#0T-#0T-#`P, -M"PL*"@D(!P<&!00#`@$`__[^_?S[^OGX^/?V]O7U]/3T\_/S\_/S\_/T]/3U -M]?;V]_?X^?GZ^_S\_?[_``$!`@,$!04&!P@("0H*"PL,#`P,#`T-#0T,#`P, -M"PL*"@D("`<&!00#`P(!`/_^_?S[^OKY^/?W]O;U]?3T]/3T\_3T]/3T]/7U -M]O;W]_CY^?K[^_S]_O__``$"`@,$!04&!P<("0D*"@H+"PL+"PP,#`L+"PL* -M"@H)"0@'!P8%!00#`@(!`/_^_?W\^_KZ^?CX]_?V]O7U]?7U]/3U]?7U]?7V -M]O?W^/CY^?K[^_S]_?[_```!`@,#!`4&!@<'"`@)"0H*"@L+"PL+"PL+"@H* -M"0D)"`@'!@8%!`0#`@$!`/_^_?W\^_OZ^?GX^/?W]O;V]?7U]?7U]?7U]O;V -M]_?X^/GY^OK[_/S]_O[_```!`@,#!`4%!@8'!P@("`D)"0D)"@H*"0D)"0D) -M"`@'!P8&!04$!`,"`@$``/_^_OW\_/OZ^OGY^/CW]_?V]O;V]O;V]O;V]O?W -M]_CX^/GY^OK[_/S]_?[__P`!`0(#`P0$!04&!@<'"`@("0D)"0D)"0D)"0D) -M"`@(!P<&!@4%!`,#`@$!`/___OW\_/O[^OKY^?CX]_?W]_;V]O;V]O?W]_?X -M^/CY^?KZ^_O\_/W]_O__``$!`@(#!`0%!08&!P<'"`@("`D)"0D)"0@("`@( -M!P<'!@8%!00$`P,"`@$``/___O[]_/S[^_OZ^OGY^?CX^/CX^/CX^/CX^/CY -M^?GZ^OO[^_S\_?W^_O\```$!`@(#`P0$!04&!@8'!P<'"`@("`@("`@(!P<' -M!P8&!@4%!`0#`P("`0$``/___OW]_/S[^_OZ^OGY^?GX^/CX^/CX^/CX^?GY -M^?KZ^OO[_/S]_?[^__\```$"`@,#!`0%!04&!@8'!P<'!P<("`<'!P<'!P8& -M!@4%!00$`P,"`@$!``#___[]_?S\^_O[^OKZ^?GY^/CX^/CX^/CX^/CY^?GY -M^OKZ^_O\_/W]_O[__P```0$"`@,#!`0%!08&!@<'!P<'!P<'!P<'!P<'!@8& -M!04%!`0#`P("`0$``/_^_OW]_/S[^_OZ^OGY^?GX^/CX^/CX^/CX^/GY^?GZ -M^OO[^_S\_?W^_O__```!`0("`P,$!`4%!@8&!P<'!P<("`@("`@'!P<'!P8& -M!@4%!`0#`P("`0$``/_^_OW]_/S[^_OZ^OGY^?GX^/CX^/CX^/CX^/CY^?GZ -M^OK[^_S\_?W^_O__```!`0(#`P0$!04%!@8'!P<'"`@("`@("`@("`@'!P<& -M!@8%!00$`P,"`@$!``#__O[]_?S\^_O[^OKY^?GX^/CX^/CX^/CX^/CY^?GZ -M^OK[^_S\_?W^_O__```!`0("`P,$!`0%!08&!@<'!P<'!P<(!P<'!P<'!P8& -M!@8%!00$!`,#`@(!`0``___^_OW]_/S[^_OZ^OKY^?GY^/CX^/CX^/CY^?GY -M^?KZ^_O[_/S]_?[^__\```$!`@(#`P0$!04%!@8&!P<'!P<("`@("`<'!P<' -M!@8&!04$!`0#`P(!`0``___^_?W\_/O[^_KZ^?GY^/CX^/CX^/CX^/CX^/GY -M^?KZ^OO[_/S]_?[^__\```$!`@(#`P0$!04%!@8&!@<'!P<'!P<'!P<'!P8& -M!@8%!00$!`,#`@(!`0``___^_OW]_/S[^_OZ^OKY^?GY^/CX^/CX^/CX^?GY -M^?KZ^OO[_/S\_?W^_O__```!`0("`P,$!`4%!08&!@8'!P<'!P<'!P<'!P8& -M!@8%!00$!`,#`@(!`0``___^_OW]_/S\^_OZ^OKZ^?GY^?GY^?GY^?GY^?GZ -M^OK[^_O\_/W]_?[^__\```$!`@(#`P0$!04%!@8&!P<'!P<'!P<'!P<'!P<& -M!@8%!04$!`,#`@(!`0``___^_OW]_/S\^_OZ^OKZ^?GY^?GY^?GY^?GY^?GZ -M^OK[^_O\_/S]_?[^__\```$!`@(#`P0$!04%!@8&!P<'!P<'"`@'!P<'!P<& -M!@8&!04$!`,#`@(!`0``___^_OW]_/S[^_OZ^OKY^?GY^?GX^/CX^?GY^?GZ -M^OKZ^_O[_/S]_?[^__\```$!`@(#`P0$!`4%!@8&!@<'!P<'!P<'!P<'!@8& -M!@4%!00$`P,#`@(!`0#___[^_?W]_/S[^_KZ^OGY^?GY^/CX^/CX^/CY^?GY -M^?KZ^OO[_/S\_?W^_O__```!`0("`P,$!`4%!08&!@<'!P<'!P<'!P<'!P8& -M!@8%!04$!`,#`@(!`0``___^_?W]_/S[^_KZ^OGY^?GY^?CX^/CX^/GY^?GY -M^OKZ^_O\_/S]_?[^__\```$!`@(#`P,$!`4%!08&!@8'!P<'!P<'!P<'!@8& -M!@4%!00$!`,#`@(!`0``___^_OW]_?S\^_O[^OKZ^?GY^?GY^?GY^?GY^?KZ -M^OK[^_O\_/S]_?[^__\```$!`@(#`P0$!`4%!08&!@<'!P<'!P<'!P<'!P8& -M!@8%!00$!`,#`@(!`0``___^_OW]_?S\^_O[^OKZ^OKY^?GY^?GY^?GY^OKZ -M^OO[^_O\_/W]_?[^__\```$!`@(#`P,$!`4%!08&!@8&!P<'!P<'!P<&!@8& -M!04%!00$`P,"`@$!`0``___^_OW]_?S\^_O[^_KZ^OKZ^?GY^?GY^?GZ^OKZ -M^OO[^_S\_/W]_?[^__\```$!`0("`P,$!`0%!04&!@8&!@8'!P<&!@8&!@8& -M!04%!`0$`P,"`@$!``#___[^_?W]_/S[^_OZ^OKZ^?GY^?GY^?GY^?GY^?KZ -M^OK[^_O\_/S]_?[^____```!`0("`P,#!`0$!04%!@8&!@8&!@8&!@8&!@8& -M!04%!`0$`P,#`@(!`0``___^_OW]_?S\^_O[^OKZ^OGY^?GY^?GY^?GY^?GY -M^OKZ^_O[_/S\_?W^_O__```!`0("`@,#!`0$!04%!@8&!@8&!@<'!P8&!@8& -M!@8%!04$!`0#`P("`0$```#___[^_?W\_/S[^_OZ^OKZ^OKY^?GY^?GY^OKZ -M^OK[^_O[_/S]_?W^_O__`````0$"`@,#`P0$!04%!08&!@8&!@8&!@8&!@8& -M!@4%!04$!`0#`P("`0$!``#___[^_OW]_/S\^_O[^_KZ^OKZ^OKZ^OKZ^OKZ -M^OO[^_O\_/S]_?W^_O__`````0$"`@,#`P0$!`4%!04&!@8&!@8&!@8&!@8& -M!04%!00$!`,#`P("`0$!``#___[^_OW]_?S\_/O[^_KZ^OKZ^OKZ^OKZ^OKZ -M^OK[^_O[_/S\_?W]_O[__P````$!`@("`P,$!`0$!04%!04&!@8&!@8&!04% -M!04%!`0$`P,#`@(!`0$``/____[^_?W]_/S\^_O[^_KZ^OKZ^OKZ^OKZ^OKZ -M^OK[^_O\_/S]_?W^_O[__P```0$!`@("`P,$!`0$!04%!04%!08&!@4%!04% -M!04$!`0$`P,#`@(!`0$``/____[^_OW]_?S\_/O[^_O[^OKZ^OKZ^OKZ^OKZ -M^_O[^_O\_/S]_?W^_O[__P````$!`0("`P,#!`0$!`4%!04%!04%!04%!04% -M!04$!`0$`P,#`@("`0$```#____^_O[]_?W\_/S\^_O[^_O[^OKZ^OKZ^_O[ -M^_O[_/S\_/W]_?[^_O___P```0$!`@(#`P,$!`0$!04%!04%!04&!@8%!04% -M!04%!`0$!`,#`P("`@$!````___^_O[]_?W\_/S\^_O[^_OZ^OKZ^OKZ^OO[ -M^_O[^_S\_/S]_?W^_O[___\```$!`0("`@,#`P0$!`0%!04%!04%!04%!04% -M!04%!`0$!`,#`P("`@$!`0``_____O[]_?W]_/S\^_O[^_O[^OKZ^OKZ^OO[ -M^_O[^_O\_/S]_?W]_O[^__\````!`0$"`@(#`P,#!`0$!`0%!04%!04%!04% -M!00$!`0$`P,#`P("`@$!`0``_____O[^_?W]_/S\_/O[^_O[^OKZ^OKZ^OKZ -M^OK[^_O[^_S\_/W]_?[^_O___P```0$!`@(#`P,#!`0$!`4%!04%!04%!04% -M!04%!`0$!`,#`P("`@$!`0``_____O[^_?W]_/S\^_O[^_O[^OKZ^OKZ^OKZ -M^_O[^_O\_/S\_/W]_?[^____`````0$"`@(#`P,#!`0$!`4%!04%!04%!04% -M!04%!04$!`0$`P,#`@("`0$```#____^_OW]_?W\_/S\^_O[^_O[^_KZ^OK[ -M^_O[^_O[_/S\_/W]_?[^_O___P```0$!`@("`P,#!`0$!`4%!04%!04%!04% -M!04%!04$!`0$`P,#`@("`0$!````_____O[]_?W]_/S\_/O[^_O[^_O[^_O[ -M^_O[^_O\_/S\_/W]_?[^_O[___\````!`0("`@(#`P,$!`0$!`0%!04%!04% -M!04%!04$!`0$`P,#`P("`@$!````_____O[^_?W]_/S\^_O[^_O[^OKZ^OKZ -M^OKZ^_O[^_O\_/S\_?W]_O[^__\````!`0$"`@(#`P,$!`0$!04%!04%!04% -M!04%!04$!`0$`P,#`P("`@$!````_____O[]_?W\_/S\^_O[^_KZ^OKZ^OKZ -M^OKZ^OO[^_O[_/S\_?W]_O[^____`````0$!`@("`P,#`P0$!`0%!04%!04% -M!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^_OW]_?S\_/S[^_O[^_O[^OKZ -M^OKZ^_O[^_O[_/S\_/W]_?[^_O___P````$!`@("`P,#`P0$!`0$!04%!04% -M!04%!04%!00$!`0$`P,#`@("`0$!````___^_O[]_?W]_/S\_/O[^_O[^_O[ -M^_O[^_O[^_O\_/S\_?W]_?[^_O___P````$!`0("`@,#`P0$!`0$!04%!04% -M!04%!04%!00$!`0$`P,#`@("`0$!````_____O[^_?W]_/S\_/S[^_O[^_O[ -M^_O[^_O[^_O\_/S\_/W]_?[^_O[__P````$!`0("`@(#`P,$!`0$!`4%!04% -M!04%!04$!`0$!`0#`P,#`@("`0$!````_____O[^_?W]_?S\_/S[^_O[^_O[ -M^_O[^_O[^_O[_/S\_/S]_?W]_O[^____`````0$!`@("`@,#`P,$!`0$!`0$ -M!`4%!`0$!`0$!`0$`P,#`P("`@$!`0``_____O[^_?W]_/S\_/O[^_O[^_OZ -M^OKZ^_O[^_O[^_O\_/S\_?W]_O[^____`````0$!`@("`@,#`P,$!`0$!`4% -M!04%!04%!00$!`0$!`,#`P,"`@(!`0$```#___[^_OW]_?W\_/S\^_O[^_O[ -M^_O[^_O[^_O[^_O\_/S\_?W]_?[^_O___P````$!`0("`@,#`P,$!`0$!`4% -M!04%!04%!04%!`0$!`0$`P,#`P("`@$!`0``_____O[^_?W]_?S\_/S\^_O[ -M^_O[^_O[^_O[^_S\_/S\_?W]_?[^_O___P````$!`0("`@,#`P,$!`0$!`0% -M!04%!04%!04%!`0$!`0#`P,#`@("`0$!````_____O[^_?W]_?S\_/S[^_O[ -M^_O[^_O[^_O[^_S\_/S\_/W]_?W^_O[___\````!`0$"`@(#`P,#!`0$!`0$ -M!04%!04%!04%!00$!`0$!`,#`P("`@$!`0```/___O[^_?W]_/S\_/O[^_O[ -M^_OZ^OKZ^_O[^_O[^_O\_/S\_/W]_?[^_O____\````!`0$"`@(#`P,#!`0$ -M!`0$!04%!04%!04%!`0$!`0$`P,#`@("`0$!````___^_O[]_?W\_/S\^_O[ -M^_O[^OKZ^OKZ^OK[^_O[^_O\_/S\_?W]_O[^____`````0$!`@("`P,#`P0$ -M!`0$!04%!04%!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^_OW]_?S\_/S[ -M^_O[^_O[^_O[^_O[^_O[^_O\_/S\_?W]_?[^_O___P````$!`0("`@,#`P0$ -M!`0$!04%!04%!04%!04%!04%!`0$!`,#`P("`@$!`0``_____O[^_?W]_/S\ -M^_O[^_O[^_KZ^OKZ^OO[^_O[^_S\_/S]_?W^_O[___\````!`0$"`@(#`P,$ -M!`0$!04%!04%!04%!04%!04%!04%!`0$!`,#`P("`0$!``#____^_OW]_?S\ -M_/S[^_O[^_KZ^OKZ^OKZ^OK[^_O[^_S\_/W]_?W^_O[___\```$!`0("`@,# -M`P,$!`0$!`4%!04%!04%!04%!04$!`0$!`,#`P("`@$!````___^_O[]_?W\ -M_/S[^_O[^_OZ^OKZ^OKZ^OKZ^_O[^_O\_/S\_?W]_?[^_O___P```0$!`@(" -M`@,#`P0$!`0$!04%!04%!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^_OW] -M_?S\_/O[^_O[^OKZ^OKZ^OKZ^OO[^_O[^_S\_/S]_?W^_O[___\````!`0$" -M`@(#`P,#!`0$!`4%!04%!04%!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^ -M_OW]_?S\_/S[^_O[^_O[^_O[^_O[^_O[^_O\_/S\_?W]_?[^_O__`````0$! -M`@("`P,#`P0$!`0%!04%!04%!04%!04%!04%!`0$!`,#`P("`@$!`0``____ -M_O[^_?W]_/S\_/O[^_O[^_O[^_O[^_O[^_O[_/S\_/S]_?W^_O[___\````! -M`0$"`@(#`P,#!`0$!`0%!04%!04%!04%!04%!00$!`0#`P,#`@("`0$```#_ -M___^_O[]_?W\_/S\^_O[^_O[^_O[^_O[^_O[^_O[_/S\_/W]_?W^_O[___\` -M```!`0$"`@("`P,#`P0$!`0$!04%!04%!04%!`0$!`0$`P,#`P("`@$!`0`` -M_____O[^_?W]_/S\_/O[^_O[^_O[^OKZ^OO[^_O[^_O\_/S\_?W]_?[^_O__ -M_P````$!`0("`@(#`P,#!`0$!`0$!04%!04%!00$!`0$!`,#`P,"`@(!`0$` -M``#____^_O[]_?W\_/S\^_O[^_O[^_O[^_O[^_O[^_O[_/S\_/S]_?W^_O[_ -M____`````0$!`@("`P,#`P0$!`0$!`4%!04%!04%!00$!`0$!`,#`P,"`@(! -M`0$```#____^_O[]_?W]_/S\_/S[^_O[^_O[^_O[^_O[_/S\_/S]_?W]_O[^ -M_O___P````$!`0$"`@(#`P,#`P0$!`0$!`4%!04%!04$!`0$!`0$`P,#`P(" -M`@$!`0```/____[^_O[]_?W]_/S\_/S\_/O[^_O[^_O\_/S\_/S\_/W]_?W^ -M_O[^____``````$!`0("`@(#`P,#`P0$!`0$!`0$!`0$!`0$!`0$!`0#`P,# -M`@("`0$!````_____O[^_?W]_?S\_/S\_/O[^_O[^_O[^_O[^_S\_/S\_/W] -M_?W^_O[^____``````$!`0$"`@("`P,#`P,$!`0$!`0$!`0$!`0$!`0#`P,# -M`P("`@$!`0$```#____^_O[^_?W]_?S\_/S\_/O[^_O[^_O[^_O[_/S\_/S\ -M_?W]_?W^_O[^____``````$!`0$"`@("`P,#`P,$!`0$!`0$!`0$!`0$!`,# -M`P,#`@("`@$!`0$```#____^_O[^_?W]_?S\_/S\_/S\_/S\_/S\_/S\_/S\ -M_/W]_?W]_O[^_O____\````!`0$!`@("`@(#`P,#`P,#!`0$!`0$!`0$`P,# -M`P,#`P("`@("`0$!`0```/_____^_O[^_OW]_?W]_?W]_/S\_/S\_/S\_/W] -M_?W]_?W]_O[^_O[_____``````$!`0$"`@("`@,#`P,#`P,$!`0$!`0$!`0$ -M`P,#`P,#`P("`@(!`0$`````______[^_O[]_?W]_?W\_/S\_/S\_/S\_/S\ -M_/W]_?W]_?[^_O[^_____P`````!`0$!`0("`@("`P,#`P,#`P,#`P,#`P,# -M`P,#`P,"`@("`@$!`0$!`````/_____^_O[^_OW]_?W]_?W]_?W]_?S\_?W] -M_?W]_?W]_?W]_O[^_O[^_____P```````0$!`0$"`@("`@("`P,#`P,#`P,# -M`P,#`P,"`@("`@(!`0$!`0````#______O[^_O[]_?W]_?W]_?S\_/S\_/S\ -M_/S]_?W]_?W]_?[^_O[^_O______```````!`0$!`0("`@("`@(#`P,#`P,# -M`P,#`P,#`P("`@("`@(!`0$!`0````#_______[^_O[^_OW]_?W]_?W]_?W] -M_?W]_?W]_?W]_?W]_O[^_O[^______\```````$!`0$!`@("`@("`@,#`P,# -M`P,#`P,#`P,#`P,"`@("`@(!`0$!`0``````_______^_O[^_O[^_?W]_?W] -M_?W]_?W]_?W]_?W^_O[^_O[^________`````````0$!`0$!`@("`@("`@(# -M`P,#`P,#`P,#`P,#`@("`@("`@(!`0$!`0``````_______^_O[^_O[^_?W] -M_?W]_?W]_?W]_?W]_?W]_?[^_O[^_O[_______\``````0$!`0$!`@("`@(" -M`@(#`P,#`P,#`P,#`@("`@("`@(!`0$!`0``````_______^_O[^_O[]_?W] -M_?W]_?W]_?W]_?W]_?W]_?W^_O[^_O[^_O_______P```````0$!`0$!`0(" -M`@("`@("`@("`@("`@("`@("`@("`0$!`0$!``````#________^_O[^_O[^ -M_?W]_?W]_?W]_?W]_?W]_?W]_?W]_O[^_O[^_O_______P```````0$!`0$! -M`@("`@("`@("`@("`@("`@("`@("`@("`0$!`0$!````````_________O[^ -M_O[^_O[^_O[^_?W]_?W]_?W]_?[^_O[^_O[^_O[_________`````````0$! -M`0$!`@("`@("`@("`@("`@("`@("`@("`@("`@$!`0$!`0````````#_____ -M_____O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^__________\````````` -M`0$!`0$!`0$"`@("`@("`@("`@("`@("`@("`@$!`0$!`0$!`````````/__ -M_________O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^____________```` -M``````$!`0$!`0$!`@("`@("`@("`@("`@("`0$!`0$!`0$!``````````#_ -M__________[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O________\` -M``````````$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````````` -M``#______________O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O__________ -M_P```````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````` -M````````_________________O[^_O[^_O[^_O[^_O[^_O______________ -M_P`````````````!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M``````````````#____________________^_O[^_O[^________________ -M____``````````````$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0`` -M``````````#______________________O[^_O[^_O[^_O[^_O[_________ -M________```````````````!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0`` -M`````````````/________________[^_O[^_O[^_O[^_O[^_O[^_O[^_O__ -M_____________P```````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$`````````````````______________________[^_O[^_O[^_O[^_O__ -M_________________P````````````````$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$`````````````````________________________________ -M_________________P````````````````$!`0$!`0$!`0$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$!``````````````````#_________________________ -M________________________``````````````````````$!`0$!`0$!`0$! -M`0$!`0$!`0$!`0$``````````````````````/______________________ -M_____________________________P`````````````````````````````` -M``````````````````````````````````#_________________________ -M______________________________\````````````````````````````` -M`````````````````````````````````````````/__________________ -M____________________________```````````````````````````````` -M`````0$!`0$!`0$!`0`!``````````````````````````````````#_____ -M____________________________```````````````````````````````` -M```````````````````````````````````````````````````````````` -M______________________________\````````````````````````````` -M`````````````````````````````````````````````````````````/__ -M__________________________________________\````````````````` -M````````````````````````````````0T]-30```!(``0``1H``"$`-K$0` -M``````!-05)+`````@``24Y35````!0\``!_`'\``````````````````$%0 -M4$P```&H4V0R80`"``````````````%````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````````"P```````````````` -M``````````````````````````````````````````````````````!QV?P` -M````````<````````````````````&```)VX````<=KD`'':4`!QVDC__P!Q -MVA"J5:I5!`@```````D`(P````````````````!X````!``$``````!6_@#_ -M__^``````0$@!E%5;FET@``"1Y0050C```)*DQ74E<````` -M``$"1@8@T]B -M:D1IT]B -M:D1I'1R86QE -M=BYC+F\@M@T@("`@("`@(")[3V)J1&ER?2)F:6QE_["@GY[@0:`>L$&`KO_1L`[0<-`?CQ]@L)\/G][PT4Z/(; -M"?`$%`@!!P0)#?GY%17KY2`AV^,5!.KT`0']`?WQ_Q,"\@<,\@(>`?$.%/_\ -M#@GX``3U_`+W]@#_Z_L:\N0=!]\.&NOV'@GU$`GP#Q[P[A4"Z@(&[_<(\O0, -M]N8#%/OD_A@&\0`7"/D1&0#Y!@T"]OT!]/7]\_7V\OGOZ?0$"NSI$`O[#@P# -M`@`-$`7]]@80]?$'^>W[\_#_ZN`#`_/Z_`0'_0@2#0D`!Q<7!_0%%`'\]>O^ -M]N/U].;M_`;MV`P"'!GNX__YZO3TZN_P -M]0KUT?DC]-@+'0($&AX/"0\*"`H"`PWUZ`;VT.H,^]?C`/?N[_7]]?`&'PWV -M#2@=_OT3"_T0$?'N_/GP[NSO^O;L]O;N]_+W`_'Z&Q($%AT0_P<=!OL8#/+V -M\/'_\NGQ_?G=[0GOX?CXZP,6`08B%0H8$@`('Q'Y#0;=^2#]V_(&_/;TY^;X -M]N#L#03X%!L,%AD+"0H'#!,/^^P%#N[U$O?B`/K?\?/Y0G]Z1(D"/X/%O?]*QC]$@+R(!_O^ACZUNX#YM#=[N#7^`OW -M\@8;(@7M!R(C#_D,&0X4"?L>(>GA_O7I[-O.V^/P!?[J\QTK`.P0'!,5#/\% -M)"#Y$S<&Y`0$XN;HS-;OXMWW"?KV$Q;X`R$1`Q49#A,@$1@^%_(C#\?F$=J_ -MZ=S#]07>\Q;RZ1<:[NXN-//W*RD2'C8H"@$$`?/FX]S4U=SDZ.[Z_NKG#Q#E -M_R\4^1`>)#0E#2U'"]0(*-R][^G"V>O>\_O5WA7_UP@9\PLD!@\_+`7:W_WR\PH!#C4@ -M$$E6)RY,&^T'%OK7R];J\=/.[./-U.GNV^8+_O`C-1]TM7'T_KUT/0J)"HX-%9F/"0O -M.A7R!_+?`N>^V^/0OZO.Y,;.U=SW]PPG)#,]6&PN(%LM*C*\-;T*BU'85Q28'1;."LA -M'0_'@H&'`3X`O/QSK#-Q*VOKJ^WY03C^S,M,#U#34%%23`^ -M-Q(T*/'\[,[)K:BJEYNDKKW2`/X"1$8B-DI-0R,P/`D'+A/Q!O[0U>3(N\C) -MQKMY_$0%0DB.!X9/D`F,40P -M*34E$A'^W-;CSZ:\V:ZRYM+0^>76`B,6"S!%+SE<5T!!,R41]O;.J\BZEZ>^ -MO[70Y>$.#^ -MU<&WX=:IW`/0W1/WYAPU#@],.P,O02$P(@;[\@'VULO7Y.7KW-3[]M;A[/#N -M\A(1`APE&R$;,5(M"1HE$_WK^?S.TNK7U^+%K=+KU>0&^00T.2DP-SI`-!82 -M)`7K[=_AV-+5P=WRU]O?Y?3T$"L:#AP^-@TF/`T"$PP,\>#ZZ^+OV>GNR^3M -MT,K1[OOM_AH9$B$Q)"M8-`<\0A8G(?#P^.'/T(+[^,/$_X;/R8<-S-$1R,?$`@/XM;MUL.YNLR_Q]S+\1WT -M\"<=!2HM$"(L)#"M_6].&\WN/#S][QY-00&@4>&2DZ-E]+%S,K"P?FX?/?S\K'S\W6 -MWM'F]^;T`O8#'P;L+SL(-T@>'R$8"@L8!OT%[_H,[.3:S.KJT]/&Y`7>W@H0 -M%2LS*B,Z)@(2#/?_`^?<]_7HZ];=_O+J`@S_$#(:""\X(R`3!`P`VM'K\-;< -M]>7G!_CH__/N"0+[^_H1"@`6$!(I(`4((!7U`Q<&`PX#``[RW_K>R^;3U?'= -MX0/Z]!0<&Q<0*S`7!@`(%A+Y\0\8\>;N[?7FZ_;@_17R!1?Y#A__!!/U_1[[ -MW.\#$OWM#P+G"03G[??WX.<,]?,:_O$B&P -M\\S-\.OJ_`/T"1_^!C4:_R,8!B,5`QH'\_<(`0`%("8)%CXI$"P>#B$D#_D,\;[P_L_AZ.?;S0\` -MRO_LT",3WQRP#RU``A&Q(D.C,?&QTZ//T!&_WJ_`S=V1/RS@`+Z=/H#>;("R\/ -M_@\M'Q$?$2`I[^L.^L_/#>VP]NK&]^+:^_OKWAH_!B]2%C%)0$@/'#7:!C3" -MTO[.SM'/R=S_RK/Q^MC;`!@%""X?"!XT/1X+(R4D"/0?$N3Q"/KM!_;!W03U -MY=_L`@+_!`07*AL-"A('[MWEQ]K:R`G_Q.L)!!`5%!SN_AM:S2^MF]\/'9__?B^?GX`QG[WT`Y[#$W!SU!$!(;#/\#]^02"\OL -M_]_C[>[3O^[SW`L;#B0>$BLY&?/Z!O[7J-H0V;SQ!O<+(!(&+BWT&C$/+3$/ -M'Q?[$1'CV=_'O]_CM.4MY]\J)0']&0?7\OW9[PL0$`4E-R@P(Q\H_.?Z!0CI -MX?;K[/OR\.S=Y/?LUP`U%@D_.1(H(O/V[-#+M;S>X.;R`!XG(T1,&!P^'`$( -M"10/ZMW[!^_?V][HVLSC``P4#A0F`P$G]MW_[;A$P(.4E%# -M7UDQ*2$*"-.N[-N@TNSD__8"(A3WZQDKZ.GD[?P3(1$%#P+F]_7'U?+4O='PY^+X\_(#&!L1*S8K -M,R/PV-4!_=K[&_;9XNG>VO#QU.D'\`8?``@;%!8*!@_[ -M&#@'$S\P*"$AGW -M\Q-`%Q-;+`I&,`@;%??EY,>GR-:EK_3\UNLC)0T:+A0'(PWB_P;7U^GGZ@`@ -M!ODO)QPZ*S=-)@,)%/?-U]RVOLZ_W//N^AHC`QU(&_T)\^?XX,K7W.KZ[NT5 -M0R\',F,S"$)(_P#ZQM+@O\;HS[OV#^'R,S`,%AL=(P`(`]'S#M3,_/?L!O+I -M'"+`X,)0/M[.T`YM[WX>T,Z=GP#0WR -M`O_^(@SN_/OM^O[F]`D&&1X`!$A<$/PR*?KHX^?Q[M3.]`/Q_@D'"@`'^]\( -M#,K1X-<`^K4W.W: -MPL?-V=SF#Q41,CHL+5)@&`U$*03\!AOU]Q;X^PD&^=0!#\'P!Z"_^,:UO-': -MU>[Y,J^YQ$!`RL])18]0!0<*18"[=_F]M6GO=?9V,WH"O\.)1TM -M-ATB(@@0[=4$Z=`,)0^PTJ+A@: -M*CL@^@?\^B$$V_<*_>/7Y^SYY;38__#_$@,",#H*!B]+(@@D"1DX]?4O#N#F -MY,.QQ\^WL+##\N[I.5TD)%$Z'34Y'0P/!O0`^@@O_N($\N#=T][EV]'-W?'T -M`/;L&A#M#1@?*BY9125032`!^P#/H*>EHKC$T.O]%#T%W.0O+/L,)1+X -MZ-?(WNK1UNP`'A<&(4%`+2`C)186$^C?"`O-M.?>L[[!PN<"^/@D0T-!.C0Y -M.@[H`_C.U>#?W.,!#@'^#A<(ZN/X_>S@ZP<*]/<2(Q']#1<6&Q0+$AL9!P41 -M\-CKW<.VL]?AS?D?$1LF*#XI%2P1_P_LX@(%^_G]`?KV!@/;ZP[DX0[_`!H) -M`PH#!0D%_O/Q"13W^QP:`?<"!_KGX.7EW]CA]@\;``8F*"D-`R@8_1<)]A@3 -M]/\3_>;^_,W,[>;+U.[LZ@L'Z`D>#Q<%_20D%QDA+2`C'P<<&-W9[N/>S]+R -MZ_3[\!@*W/D-^>OS^?P)!`\B%!H="QX5\/@`__7G`/_R#!(#\>?Y^_/]^0(6 -M#Q,7%2<>^./[!,.[\=6[Z/WM\1,B#`P@#`LB`@P\&08D'14A(@+R"/WM\>CF -MZ>WNZ>':ZN_:R=+DY>?Q#B<6'4A%0#X<*CX;`/W]\N;DX>OR]O7U!^[9_0/Z -M\>[OW.X(^0HC$@L,`^CA -M\=?0Y-WK]_,0'!\H#Q`N&`@2_Q8N]NT/&0G>[/[?X^/9V^#Y_?#W$1H)&AGR -M!1#G^/_:`S`'\!4R*10:)18$_.C>_?S3Z`'E\P?P[_?_`<_2_^KD`P\<*1X) -M&2D%]A("Y04(ZA8['04;,@SG[?'LV,K;ZO3T^0T-`O_\].3(PD4$>X'`VN+BT+P%!L.$`P+#@X0`1HW!0M**1@X$`<4Z.WP -MU.3I\@#H`"P9`OS[`-J[T-/&P,;H_@`#!1XU'@P?-C<@($`\)SM&'O\+".#' -MR=')M+K:\?/Z`0`.\M#FZ=S+X%Q@2-4Y"0%!((18P-@WP#ASVXNCDV,K% -MNIVVX,7#[`<9%A@;%B@G"?[T\?SQZ@4?)R0A.#TK)`\1'?OM[^3S`/'8X_W9 -MN]GFR/?X>'Q^>+R"P\B'BQ<3C=68D`P.1GT^NW:Z_OWXNOSVN#KW79 -MU`D4_P@;+2LB'R9`1#8]7F,[,BP-!^C*V,VYN\[6QM;^\N'X\>KYXM;R__3Y -M"0,/-!WX&2L>#P(?(Q%"$T/RXB,349$!T)!AP2`._?X]:ON->ZM,/%Z?_\_0$5%@4)#P\< -M*1P7+SLP+3@Z*Q/^]NK=W-GM[\K?!-C-^.;)U]SD[^OR`1HU(10L&@\M'OK_ -M$A8-!0\A,2P/`O[N[_#8TN_OUM;<[_OBXOCHRNOYRO@BZ_DB&R(B)"\H+"@( -M&282-S3Y"B@7`?;JY/#?LJFVRM?*L,+[[-?_]_\?_O\C'A8A/#@M5DDD-BTA -M*QS_Z?H1[-/_`^7SY+S`SLFUNK6T/07^N\K,`\E-AL"#"L<^`88"PH0"!HG$A`3$@GRZ]SF -M"NB[V?[@R??VV/3]YMCL#@$*)A(-,#$)%#TC^P@2_/49)0,%&`+_#^O:_N7' -MU<_4Y>K?WPD#X`0?^>T.$00<*!\R^;?Z`,4 -M!OL@+Q\<(2PP+2(=*CPQ"0P?!/X$]?#T"`/=Y?37TN36Q,[SL]>G?T-;;R-;7N=3YWMGZ\N;_`/8* -M%0X;-BPC/$-#/3$R(14:%!\3\`4$Y>O+GZ=KAQK[7PL#6W.+&@\,_^;IZMG,U?#GR]GLY.T`\MKN$`?W^!8L$A`:!PD8$0('$Q4%_14I -M(B`G%_X%_-WDZ,K$XM.\ZOK5Z1#VZ0P&\@\;"A$1`Q,F%PT7%`<7*1(4,R86 -M*!@`!/'>XWVX@0P'2,O+40Q%24B'BT@"A4:%!`%!Q8<"/+_ -M[\SGZL?:WKS#Q\/;XN7DX0PG$AXW1E,U(2T>%AH4#_OO`@O[^A`5"@+Y_`#H -MY@+MRMONU$@P5)18%&!\<$P<7'Q\A$@H,#?_M]O??U-;,P,?= -MWM/B]/+[$`S_$"00!A4$!!T(]ADH$P\;+#4F+345$B+[W_3LU]?"M<[&NM+9 -MT]CO`_8%-"X?,"<:+"L@&P<+%04)#@8A.`GW)17=Z?[ET=?6N\KQV=3RW=\( -M_N0#*QH&(S4G&BDU(!01!@L'[?D:!?8;$_'[!OOQ]>C#U?/:T.?PY>3V_/#R -M#@P!$@#_+2\<&1\O-"#_"S(<`!(.\O\,Z.+SX=[7P-/DU-'>Z^#5[03\^`L> -M'@4%,R\#&D8N%"XH%CDW#P\3#@?NU,W=U[ZZM\+9T<_G\.CN^?D)%QDF&A\P -M&Q\Q)!8?*0CX'!@''1<##1+RU^G_Y+JXRM#1V^SD[0;T[O\!$A\."PP$'2@' -M%BD0$Q8+%Q\<$A0M(`@8%PL%Z=C?SK?#TL:\S]3&Z?W1Y"4=]`4U,0P:24$; -M)SHL)BL?$BPG[?(6]][SZ\W*ULZ\PM+=W='-X?H"]OPJ.!01+"$H/1(90!4. -M)!@<&A01^O@`].3=W]O@X\O+\?_FYP#KV0`'X_(/"04!"1P-!A83%!L-`Q]! -M)QH^'P@L%_'P^^W-S;JGY/K+V_;7XPKTWP,8_OH*!`TA'1XD'A49)!P=+BLE -M'10@'0+Y\NS;L*_!L+?+Q,_AZ@$(!!$I/1H)/#(('R\:"1(6`@H;#/\-%_[] -M"O'W$0#IX-O4U>+/Q.SJNM$(_?,;."`5,#(A'28V&>CX#`4-`P0A%_OV_`3_ -M"0C5X`C@S_#UY.?OT+WI^-OC]/H/'QD;.DPM(SP7`S4I^0@?#_P$_.O^".K2 -MVM71W$+#@D#(3`)"18)#Q\4"!$8)R(**T$4'S+S]RSJNO;\Q<';R*_6 -M].'6U>X%\.X,)R<+!1DC&Q$6%!`0^.D<.`\;/RL;(!X8$@P`ZM3`NLC*Q;Z[ -MV.#$UP#^_Q@9#!LO*B0V-R0D&0H2&1@(^QDF^_4@$.\3"\?4]&!``!B``Y._Y#`+P__OOZ=OJ[N#P[M//XNOI -M\?L$#0#S"1X>(QT0&BH9^"%-$_HC'O3T#/'K!>;+W>??X_/JX.7I]/?PZ_8( -M_OP!_A87#1T:$ALB&14Q-QL='!`?$.#K#>FPQ-2WS.#6W>?Q]/P!_ALM$?@' -M)R`("QX@$`D!`A<8$Q@5%Q4/"/X(!>WKW[R]W=K'TMG>\?CX%#(6`BSDUNOLY??U\P/[^@X1$C1.(11'-10H -M)QLF(OSH`0?OYN'AZM2XQN7IU-GU\NG^!?H,%OP!%?7O%`X!&A\&_ATV'1X^ -M*Q$A)@;S`0S^Z^35S.#GUL_3T-#GZ=SS"P@)$`L*%!D9$`X(!AH;&RLN.$`T -M&PD;(?OK[]_)P,_2P,[=P+W?ZN7E^`X<)QD9/CXE-2L"``7U^@K\_!H6_`@: -M%A\8[>4(\\3;`?#7UN7OY^CJ[`0%[OH#`2$M&Q02&!#W`0SW`QS^[R$B"",O -M)!<`!0SNXO/GPKS/V-+/W.?P\>CU_00E)00:22L*+S(>*"<.``T/\/,-_.CV -M]^KJYN_NSM/DVM78ZPD,_@4=(!8@(1XM&_<#%0T2%@H-#?GP[.W[]N38W>K\ -M#?CK%Q[N[!$'Y_\3_O0`#P0+*Q3W`@;Z[O4`_OT#$A$)#R$F#@8'\.__Z^#\ -M]][K\O/SV_T4X.0%__3\(2$.*"(,(BH/_10B"_GM_!T2``3T\??;TN#5V-/! -MW.S;Z`L@%A0C(R(;*$$I"A8#'!H>$Q8S)Q0H'P((`OC^]PP1[P8;^_#[!P?BVOGOW.8`!M[K$.#&Z?#G -M\?/J\?\.(2HP-B89+"X6&Q,,*A[_!!`8$@3RYN;1QL2\Q\R_P]WEW?@(]O\: -M%0$()#X])39.,RDS+!P9&?;I]_/T[O3\X.#TZ]S,SN?1N.7NT_@&^R,P$`L; -M'!P;"@TE#?D9$0HC%`X8"/T%%0'Y$P+R]_SRY0?XO]'AS,+&Y?#E_0/D#4(A -M$1H@*@L)(!,>(2$Q$Q$V*0D+%O??\=_+X>79R75U][.VN\!!_,0(/,3.1,7*!D='10,!A$3!O__\.0, -M&NST(`GC^_W8XOKLR+_6T-;UZ.\/_P8E)B@G)S(H(RT3"BH5`A3WY?[\Z>G] -M`.;C].#;!_G&U/#JT-'N^O/K`A4*&S`J+"TG,#(=&AP.$@L!`M_N&NK0`?[, -MSO#JTMGM\^K?Y?H'^_80"/`/'P@3)"4F*2X6"BD'$//Y"_SGYN;8 -MR-#DVWC_B,-^1`3!Q`6&A,-)2L<%1TO(1,C&_OV$0SZ"`OYW^;PR<36 -MP+C+QL3?Z_8>'/X5-STH"1].)_<@+@@('R4:"0#\!!,`\`+[X-_HV<34T;?3 -MV[+*_?KP`AH;'3HZ)#Q`&R0U!NH1%_7X`_KM\P\0`P@#`@G\W-#K\M71V,K1 -MZ.SM\._V"B(6_RI$&R4_)!`7*"?^\1<-Y?T1`0T-_@K[W=S?W-'(T,S(VN7J -M]OL'"0(4)RLH,$`V,"XM."4?*`#A\O7DZO3CXNK?ZM_1\>+)[??CVNT<%^P# -M)A45&PL=,A+]*#L-^ATS'OWX`OKW^NWQ\.;V\-33Z?GEV^WLY?0-"?0"#P(/ -M%@83)1D(%RL+_B8G$R(/[A,L!^\##>O=[M>YR]7%SM;.W.WU^P(3%A89%R0P -M*R8T+`T4(AX/`A44\>3X"_KM\N[YY\;-T=#.R-;/ROD)^`XA%A\W,R`;.TL/ -M"CL1_!L$^`L$\.3@[__[Y.`)#-O4Z>GAXN+:Y>;E!P?W#!HB(0P:.BP8'B4H -M%009%PT9_^3[$/[L\OKY]>[BV=?=W=W;SMKKZO;V\A,7"Q(/+$6OMN#+PM[8S>;X\P@5"1XJ'"`H+S$F*#;ZS\3@T+?(Z?+BU_`-_OD6(A<6'Q``'R\4"Q\N%_8.*Q`$&!;X -MZ@H?_-_V#?'-S=O5O<;=S=KKW/L3!@P.%AT-%1\5'"\T)B`E&B="'_T)"P?Z -MW>/T\>C2R=*[N-K%N=W8SO05$A$G,3,N("PX)R0O(A04$Q`@(07]^_#H[??C -MVO#JTM/?V=7JZ]?F\>7^&@4!)R(&$RPQ'!8K*!4,`0DG)0+X"@7Z`?WV]_?U -MWM+7T]79V=G9Y.CK`@WY!B8)^B4J'BHX0S48'"4?+QOI_`3@[??=[0/GV=W: -MU\G0Y-O5W^CZ"@D6*Q@$$2`D'ADI."4/(286)B#Z]_O@VNODX.WLX-ODY-WH -MZN3FXNGX_@\.!!H=!@P:&2`E'!T>$Q,?*1\+&1#@[@KLW^WJV]WDUV^?P -M_A0?'AX<"PXF)!HM.2`6)!L1&14,!>W9ZOKNZN[K\??JT,_=W^+BW>/H^108 -M$Q47$Q$1#A,B)!<0+"\""RT8"POKZP;RY?3V]^OJY\G.YN#8WMS&V@\._1(> -M#0D5'B4H+#0Y)PP4*2(;'/SC]O[EW?7PW.'2QM;-Q-SJXN+EY04C'A8.&R01 -M&"4P/R`50S/X`208]>KMX>#W\.#Q_?7RZ]/0[-G)]NO)]!8,"!PF"0XF!_D? -M+2$@'B0C#!$='!'MZO;EZP']]P+_W=?JX-/8U,[.T>/X!107%QX<("$F1#X= -M+T,D"ADH'Q/]Y^+C\N_GHU>D+#ALE%0X>,S,?*4L\(S,I -M"/T'$@/FVN7FV^KT[.3G_NK#V_CMX_CTUN\=&@,-)0SV#A(!"B,U+AXH(PL= -M+POZ#>[7]_KH\OOT[-O4W]W,R^#=P=@'"@(1(AH-$AD/#2PS&"M`)1DC)S(B -M]^[X[-O6Y^S0T-_*PN#:O=+S[-CL%AP<-#LE&20D&R,K)QT;$?X$#PP(!?'? -M[NSA[_+GU]C@S=ORT]\+\,WQ)R46(!L8&!04%1\:$2(A$`L'"Q$&_?GX`/_[ -M!P/Q\?'@T=36P[W:W]'?]@H)$204$B09$!8L030N.S(=$QDJ&.G>^?70T_GT -MV-K6R]7+P-+';UMKG -MZ][=Z>CR`NG1\102#Q,2%1D6#`H8)B@5"2$K#@D;'A4%_?WP[P@!V<_EZ,O` -MT-C=X-OE]/3T!Q@2!`T:"@@B,3(L+STU)Q\=)!@&_N?G__#;W=C6T+>XQ[S! -MVN;@W`,J)"8P*"0J(P\:*R`B)1\L(P(-*@WD[?/=WO#OX>7QY]O;UMG?YNOB -MWNX,&A4<+"<;&`@('1P."!,<#@D6(!T-!@?^]_O^^O7PZ./>VM3-U>3#1TC#/+BZ>WH\/GPY>WUYL[1[.O7V.#B\P(#$1H5%`L* -M&"`H'18U-"$O+R@Q*!#W]@/APN3HO?QYM/3VL[`T^7I^O_W!1`7)R`-%1X0_0DE(B(H -M%1PF"@,/#`;Z[NSN]0@*[/`#X#;X._HWN+?W./=R,?>Z-W:WNG^"`\5%RPO&2,R+#`M)S`E&1`! -M&"#Y[.[AW.+GY=S.W//2N>#UY^O^_NSV%`P`$A4*!@XH)Q8L-R(C+2(*`A@= -M__'PYNP`]=K;W];5R;[5Y.#L]?/_$Q<.$!43$`H4&QPN+R,M+BTB`A`M!=_J -M].[E[.[6WNW0P,G-U^'FX>H+!P0K)`XJ*`L2)"04'289)"D4!PDA'?;KZ.W] -M[]SE[>C@SLS6TM;5V/'LZP81$ALK*A,5-3X@%C;L!.S@\>7B -MZ-K9VL[&U>?8UO#[\NS_%146'AL7*SHG)C@V+"8=!`48"O;N]/;AX./I^M_) -MW]W)R]7>[_;L[?X(!Q4>`_H8+2@7(#\^+3DN$2$?`@7\[NS9V?'UX=#=[].] -MT]G1W_'VZO$1&18>%AD@#Q0C'RHO)"HV+1(/)B0&\_?HT>7RV<[:WM?0PL/@ -MYM[H\_G^"1P;&#`H"24]&QDO'1HP)@X.$A0>">?V!.34YN;-U>*^LMG>R>0# -MZND+#0H7*"D,"RXV(AHK+Q\G+PSX#1L6!.[W_N/H_>O@X-;4PKC4V$0H-&Q/GT.7QV]3>T,7AY+2XZ>[F\_3S!1<<&!HG -M*RDG&"$O&QLJ&!8:`OX3&0_^Z^SXZ-[GVM+DW[BUW>SAY/'R`18!`B@F%1D: -M%!LN+2(B)RPG$P84(!8&[N[YY.'MW]/2SL"WPLG3Y^;A]@0')"P8(C0G'2LU -M*",L*S`O!_PA'@7_Y]?EX=7?W\;0\-BXR-GAZ^CJ\P(2"Q4S)Q#FX<[G\=+$QM/GY>/S\N;V"@X2&R$7$"(O(QXS/2SGVM+8WM7&U=S&Q,K&W//J[P/[`B`A(RL<&B`1&246(#0B&"<>!Q8H -M#/'S\N'9Y^O=U=O?TL70X]S9\?GL\0L7"0LE(PT''C$=%C(Q'R,I'Q?@]PH1&AD7)288&B?= -MY>S=RM7EVL2ZP]OV]M[C`!,;'!D;)R81%BD>$R$N(A4>&`P4$`7\Y.#W\=G? -MZ//WV\_@V=/D\O'BYO\*#!$6&A\5!A4C$Q@J(!DC'@T1)1\$^??P[N_JYM[= -M\.C&RMS>Y^;G\>GW&!,$'#`4""0L'R(O*Q\E*A8'$A(`^?CKV=KHW-+=V=;9 -MT-'A\/W]\?80(!H8)2(3&"0=$QLG)!L6%14*`PX'\>??X.WKU]OSZ-C@V=3L -M\^GU`??Y&B83%!L7%Q(/%!<>(AH?)18/&QH.!/+HZ^?:TMGDXM30V=;/V>7M -M\?#U!QH4%2\O%QDK*!PD*1PC,B,-#AH6"/?HXM[1SMG3Q=7@S,#6Z>;J]OC] -M#1<6&BHR)!PD)R8>&2@G%A84"A$6!/3SZ^?KV]+EX\K4W\G2[-C4_PKT_!89 -M%28H#0\D)!H9(B,E*AX<)QP2$`#S[_'SY-7@Y=;7V_QY]?@[=;+[.K+U.;GY>?N[/4(!`86%Q<8$!8G -M(Q06*C,E#0CF[0+]^PT5&1P0"QPE&1PA -M'S(W&!$B(@[[_/7H\N/0[/;:V^O@V-[=W][F`OOP#A@:*!<.'QH8'PX('B8< -M%!0A'@L$`OOR\^G7Z_CBVN;OX]KIYMCL_NWP`00.%A@?%Q$<(AP1$"(H#PD@ -M'`D2%?_P]OGIZ?'BUMWCW=C7W.?HY/(!`@($#2(C$10A*BL:&2CGULC:ZMK<[?`!"OX+'QT5%B$?%QH?'Q@<*R`-"PD)!?;J -MX^S]\-G@\O/EW^3?X>C%0'X^/[LT-[S -MX,3/YM_:W]GA[_#S^/X'!084'AD4'B,B(AH;*"DC&@P/&Q'_^/GX[.GQZ=71 -MX.73S=C&ATK)A(4'A(`_P#V\?CTZN+[V]?T&_``= -M&0<6*!\1$!P9"`L6"P0*#0CZ]?\"^>SQ]N;:W>?IX=O_N^O3AW>KGX>S>SNKSV^/N\O[^!10.%"4A&Q\A -M(AL6$@X:'PH`"`X,]NG\`_'M]>_@YO+GYO+DVNCJX>X$^O`-(140'"$E)!81 -M&2`:"@L>%@0-"_G]!?GJ[?/EX>3=XNK@U=CEY>7T]?<3%049*"`J,"$6%R(? -M#1,3"A,+_`0!]OCVZN;M[N;>X>;CW]K@ZN#E^_4#'@@$*"X>%ATK)`\1&A(0 -M$`<*#@'U]/S^\.KU\>#F\.KEWM_JX-3I^_'Q_PH3%!(:(R<@%!,;'A<3$A(. -M#Q#]^@7]^/;JZ_/IWN;IYN?=UN3LY^KU_04."PD:(AH?)!4/'2$5#!(9$PD' -M!@'Y]O3LZ^WGY>+E[>7CZ>;I\/+Z__\.&0X*'"D:"Q47#A81"!$2$!,+__X( -M`_+V]^KO[-OF]^[=W>KNZ>WW^P`0$0(+'1P=&PL%%A\(`1(/#1<,`@3_"`7L -M]`3PWN3O\.KFVMKIZ^/H^04(#@T.'"`?)1,%&1D$`P\5"P<0!OH("?7S^O7S -M[N3J\.WIX-WAX./I[OL`_Q`;%!HJ*1P4&AL,!P@)$`H`!@7X^/[Y\?/S[>KI -M[OGOWN;PZN;G[_?\"0C[#R$!0?%/\'%@L""`/X^/;Y_/#N\N?L]_+Q -M\.CK[N?J]/?Y`0<$!1,8&QX7%Q88'!$0'!<2$0D$_?;Y]NWM[.+A[?;RX=WL -M[-_D\?+Z"`0"%!L5&"(?%Q45%A<6$1,9&10&^?O]]^WCX>CGWN?OYNOIXNGF -MZOW^^P4.%!,3'2(A'1(.$`D)#PP2&PP""0,!!OKL[.WIZ.CGZNSCV^#KY^;X -M^_L&!P4.'"0;$Q@<'10%#1T2"`T3#````@,!\_+PY.CLY][9YN?3VNKN_`/Z -M`Q00$20H&QDA(1<-$1L6$@\$!`+V]?W]\>3H\O#M[.KNY]WAY.;J]`,'``87 -M%A0A(!D>%P<.&A(+$1@5"`'_``7_\.SQ\>OK[^_N[>OGX.'CZOK[]OH`$!P1 -M%28:&!X2%14-%A8/$`\$_@D%]?#P[.3EZ^?AZ>WBW>CJY_@!]?H-"@,5)1H5 -M(B(5$A48&A@.`P<.`O/Y`?KPY^;N].S?XNWFW-[F[/7_`0,%!Q0<%!09&14+ -M#!02$1$-#Q`*__G[_OGO[.SJ\O7HY._RY=K>ZO/V^/P!!@P7'A<:)!@'#A(( -M#14-"`X3"OS^"@?Y[>KP\NGGZNGGYN/AX>?X^_'Z!`01&1DB(!L:%188$`L5 -M%00%#/_[!03]]._U\NSMZ.3HZ>7;W.[S\0`!^0L1#1L@&1<4&1H.#1,4%@\" -M`@@#^O?Y_?CM[O?SZ^[T[.+AX>/J\_CU^@8(#AD8%!0<&PP*%!<4%!`*#0\& -M_?H``>[F\._I\>_E[>_@Y>OE\?_U\`,/!@L7%QP=%`\2$PX4&@X'#0\*__C^ -M!??FZ.WKZNCGZ>OJX>;T\O$"!OL`$!,1%QT9#@\6$Q`/$A0)!Q`+__?_"/;J -M\>_K[_/KX.SOX>3K\?3X!0/Z"A4/$A@9%0T-$A`0#A$9$0<+"P3_`?[V]N_H -M\_'CZ?3JW.;IW_'_\_P*`P07(!<2&Q\4#0\2$Q40#0T*"0/[_0#W[NWKZO#L -MZN_IY.3G[NSO_/[[`0H3%A4;'1<4$1,2#A06"P8+#`'^!/OO]_3G[//HZO'K -MZN[FY>_T]O?Y`@4&$1(2&QH4%!03#@X7%0<%#PGY_/_Z^//N[>SN[NWKZ>7B -MZ/#N\/O[^P,!!Q80$1@1$Q80$Q86%141#`L$_@,!^/#O[.?O]>SBXNKHX>3G -M\/S\^/P($!,:%0X=(`X*%A40%Q,%"1$-_?@#_O3PZNSQ\/#MZ.OPZ.'L]/3Z -M^_@!#Q`-$QD9&A4'"AT4!A$/!@\,_?X+!??V\N_V]N[GZ_+HX>KIZ>_M]/[] -M_P4/%A0:'103&AD1#Q04#`0)!_T!!/CR]?'P\.WQ\>KIZ>CLZNGV_?;]!OX) -M(14)&AX3%!,.%1D1!@8)!/\!^?/[]>;M]O#R].[O[^_R[>;S!/KN^`<-#@P) -M#QH6#@P-$1D6!@02$`0$`?C^`>_E\/GT[.WP\/#IY._[]N[X`/L"#PH)&!D0 -M#@\3&1<."@\0#PT`_@7]]_7JZ_7PY>GQ[^GEZ_+Q]OS[_04("Q05$A<6$1`2 -M$`T0#04�G^_P(`_/3P\O3R\/'L[?3KY?#S\/G^^_X#"1$1#10:#`84$P@, -M$`H)"08'!`(&__7X]^_T]>_P[NGKZ^CGZ_#W_OOZ!!$5$1(6$Q07#@P6$0H1 -M#`,*"_[Y_O_SZO/W\.SM[>[NZN;GZO'Y^?3\"0T0$A45$!<<$`@.%1<*_042 -M"O?X`_[T\^_L]??MZ>_V[>+M\^KQ`/KT``T."@X5$Q(5#@P4$PT)!PT,`P,` -M_P'\]/#S]_/L[>_L[.GEZ?+Q\?\`\@(7#`H2$A(4%!$4%`\1$PH)"P4!`/[Z -M]_?S[_/S\.OI\>WBZO#L]?WZ_0<+#0\1%!02$`X0$`T.$0H&#`D$`?W_^O3X -M]/+Z]>GL]?7LX^OU\_3W^``*!P@4$@T3$1`2"0L5#`4*"@D(```$__OU\_GU -M[_'R[NWNZ.OT[>W[^?;^!`H/"@D1%1(,#A,.#0L&"`8'!OS^`?KW^OGT\_+P -M\.[N[^GL\O7X^?L!!@8'#PX+$!(/#!`2#0T-"`8%!/_\__WY]O3W^?;Q\/3R -M[O#M[?;Y^OK]!PD)#@P+$1`-"PL0#`D,"0@)!04!_?_^^/7X^?/R]O3Q\O#O -M\O3W]_?^`0('"0D.$0\+#0T-#0L+!PD*`P<'_0$%^_3Z_/#Q]>_N\>_N\/+U -M^OGZ``,("0D0#0T3#@L.#PX+"`@'`P,#_O\!^_?X^??R\/3Q[?#P[?#U]?D` -M_@`)"0D-"PL0"P8,#@D'"0D$`00#`?SZ_OOZ^O3V^/7U\O#Q[NSQ]_;T_`#^ -M!0H'"@T,#0P*!P@/#P4!!@@&`OS]!/_U]?KZ]._U].[P\.[P]?;V^_[[`PX( -M"!`/#A`/"@T2#`<)!P8%`0#^_P'Z]?K[]O+T]O'T]NSP^_?X__[]`@D*!PD. -M#0P,!PL0#0@'!P8%`O\!`P#\^?O]^/;X]_/S]?+O\_;W^?K[``0&!P<)#`H+ -M"@P-"@L*"0H'!00#``$"_/G\^/3T]/3S\N_M\_CR]/[]_@,#!0D-#@H+#0L+ -M"@H+"`("!00#`?[^_OKX^??W]_/R]/+Q]/;V]_K\_@`!`PD+!P@,#`L*"0D* -M!@(#!0$`!0#Z`0+Y^?KX^??T\?/T\O3U]?K\^?L``@,("04(#0H'"0H+"08$ -M!`8%`?__`@#Y]_GZ^/7W]/+W]?+U]??^_?K^`@4&!@D+"0D+"@D,"`4)"`,# -M!0'_`O_Y^_WW]?OW\_CW]/;Y^/G^_?P``0(%"0D("`D+"@<)"@8%!04%`P,# -M__P`_OCY^_KX]O?U]_GW]OK]^_L``O\""`@&!@@,!@,+"04'!`,'!P(``@$! -M_OCY_/GU]O;U]?7U]_;X_/S]_@$#!`8'"0@&"`D'"`@%`P8&`0$$`?W_`/OZ -M^_CX^/7W]_7U]?CZ^OO]_P`!`@4'"`<'!P<("`4&!@($!`("__\`_/O\^_KX -M^?KZ]_;W]OCY^/K[_@#^`0,$!P<'!P8("04$!P0"!@,!`O_]_?W\^OGZ^?KX -M]_GY^/CX^/K]_OS]`@0$!08("0@&!@@(!00$!`0$`/X!__O^_?GY^OKY^?KW -M^?SY^?O\_P'^_@0%`P4'!@8)!P4'!@4&!`,#!`']``'\_/SZ^_KX^_OW^?CY -M^OK\_OW_`0`#!P,#"`<$!0<&!08%!`0#!`,`_____/W^^?C[_/KY^?GY^OOZ -M^P#__@$!`P8%!`8&!04%!`0%!`$"!`(!`/_^_O[\^OKZ^OSY]_O\^?KZ^?X` -M__[_!`4$!`,&"08$`P4&`P("`0(#_OT``?W\_/O\_/OZ^?O[^OKY^_[^____ -M`0("!`0$!04%!`,$!`,!`0(!__[]`/[Z_/[]^_O\^_O\^_G[_/S]_O__``$! -M!`0$!0,#!00#`P0#`0("``#^_@#^^OS]_/S\_/S[_/S[_?S\___^_P`!`P(# -M`P,%!0("!00"`@(!`0'______?W]^_W_^_O]_/W^_/S]`0#]_P$"`@(#`P(# -M`P(#`P,#`0`!`@'^_P#__O[]_?[]_/W]^_W^_/W^_O__`/\``P$``P,"`@,# -M`@("`@$!`@'__@$`_O[^_?W^_OW\_?[\_/S]_O[___\``0$"`@(#`@("`@$! -M`@'_`0'__P#__O[__OW^_O[]_?[^_?W^_O[_____``$!`@(!`@$!`@$!`0'_ -M``$`__\``/____[^_O[^_O[^_O[]_O_^_____P$!`0$!`0$!`0$!`0`````` -M`/\`_____O___O[^_O___O[^______\``````0$``0$```$``0$`````__\` -M`/_______________________P#_````````````````````````````____ -M_____________________P#___\````````````````````````````````` -M``````!#3TU-````$@`!``!#%@`(0`VL1````````$U!4DL````"``!)3E-4 -M````%#P``'\`?P``````````````````05!03````:A39#)A``(````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````N`````````````````````````````````````` -M```````````````````````````````````````````$"```````"0`C```` -M`````````````'@````$``0```````'\`/___X`````!`0$&455N:71S`/\` -M`/___OX!`?[^`/____\``/__`/_^____`````0+_!B!S86UP````%8P*P`$D&VK3#\`J(`?!T)G2&T- -MZB\.+P9.N@`\4@=P`0M-86=I8R!&;'5T90(```!!249&4V0R80`````````` -M``!!249&4V0R80```````````````````````````````*<]K5D``$4B```! -MSA`N`!9(@$'MJ;@2,```2('203HS$``0+@`62(!![:FX$C```$B!TD$\,Q`$ -M/@5"!!U\``'_^;Q'7,`2!`H!``'``6=*ND=6P+Q'5L&"+@`4P`$"0``!9Q0_ -M!Q\N__E![@`,(!AG`B\`(%!.D+Q';@1X`6#"0F````'@```!6`'&X -MO!RF````'`!6``!7```````# -M__\````\```````$__\```!:```````````````````````````````````` -;```````````````````````````````````` -` -end diff --git a/sys/share/sounds/mgcharp.uu b/sys/share/sounds/mgcharp.uu deleted file mode 100644 index 05a9e5324..000000000 --- a/sys/share/sounds/mgcharp.uu +++ /dev/null @@ -1,407 +0,0 @@ -begin 644 Magic_Harp -M``I-86=I8R!(87)P```````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$``&@``````````$0B```! -MSJ<]K4JG/:U2``````````````````````````````"!@8QW``!&3U)-``!$ -M&D%)1D934TY$``!"'@`````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M___________________________________________________^_O[^_OW] -M_?S\_/S\^_CW]_?X]_7T]/;Z_?[_``$"`@(!`/[[^?CX^P`"`@("`@("`@(" -M`@,!^.*]H)V@GZ.GK+*VNKJWN+:MFX:`B(R.CXJ#BIFGL[BZOL/(SM/:WN'@ -MU='9X>ST]?7V^?X%"0L-$!(2$A$0#PT*"`@)#1$1$1`0$!`0$!`0#P\/"?KC -MTL_.SM#3UMK>X-_>W]W5P["IJJNLK*:CK+C#S-#2U=K>X^?K[O#LXN+K]/X# -M`@(#!@P2%1<9&QT='1P;&1<5%!,5&1L;&QL;&QH:&AH:&AD8$P+LW]S:VMS? -MX^;IZ^KIZNC>R[NWN+BXM[&QN\;1V-K=X>7I[?'U]_CRZN[W_P@+"@L,#Q4: -M'!XA(R0D)",B(!X<&QL>(B(B(B(A(2$A(2`@("`@&@?RY^7CX^3GZ^[Q\O+Q -M\O#DT,/!P,#`OKBZQ=#:X.+EZ.SP]/C[_?SU\??_"`\0$!`2%1H?(2,E)RDI -M*"@F)"(A("`C)B8F)B8F)24E)24D)"0D'@SW[>KHZ.KL\//V]_;V]_;IU?J[?'T^/S_`/[W]?P$#1,3$Q,5&1XB)"8H*BPL*RLI)R4D -M(R0G*2DI*2DH*"@H*"ON -M\O7Y_/\!`P'Y^0$($1<6%A<8&R`D)B@J+"XO+RXM*RDG)BSO\O;Y_/\" -M`P#Y^0$)$1<7%Q<8&R`D)B@J+"XP+R\M*RDH)R@K+2TM+"PL+"PK*RLK*BHI -M*2`,_?CS\/#Q\_?Z_/W]_?[UX]?4T,[-R\7$S=;@Z.ON\O7X_/X``?_X^``) -M$1<7%Q<8&A\C)B_P\O7Y^_S\_/WWYMG4T,W,RL7"R=/KL\//V^OS^`/[W]?X'#Q87%A87 -M&1TB)"8H*BPN+R\M+"HH)RCJ[O'U^/K\_OWW\_D$#146%A86%QH?(R4G -M*2LM+RXM+"HH)R[Q]/?X^?KY\N7WP\_;X^OKX\/'Z!`X5%!04%!89'B$C)2WN\/3V]_?X].G>V=/.RL?$OKW& -MS]CBY^KN\?3V^/CW\.WT_@@2%!,3$Q06&Q\A(R4G*2LL+"HH)B4E)RHJ*BHI -M*2DI*"@H*"SBW-;0R\?%P+N^R-#;X^;J -M[?#S]?;U\>KM]P`+$A(2$A(3%AL>("(D)B@J*RHH)B4D)2@I*2DH*"@H)RWKZNSO\?/S]/#EW]O4SLK&P[RYP,G2W>/FZ>WP\O3T -M\NSH\/D##A$1$1$1$Q8;'A\A(R4G*2HH)B4D(R4H*"@H)RV-#+QL*[M;G"R];>XN;I[._Q\?#JY>KT_0@.#P\. -M#Q`3%QH<'B`B)"8G)R8D(R(C)BKH -MZ>OM[N_P[.'=WMC0RL2_MK.[Q,W8WN'EZ.SN[_#NY^/K]?X)#0T-#0T/$Q<9 -M&QT?(2,E)ROHZ.CJ[.WN -M[^K?W=[8T,G"N;&TOL;0V=S@Y.CK[>_O[.3C[/7_"0P+"PL,#Q,6&!H<'A\A -M(R4E)"(A(2,E)20D)"0C(R,C(B(B(B$A'Q<)`P/^].[IY^?HZNOL[N_IW]W? -MVM#'OK*ON,'*T]?;X.3HZ^WO[NOCX^WV``D*"@H*#!`3%1<8&AP>("(D)",B -M(2$B)"0D)",C(R,B(B(B(2$A'QH-`P,!^?+LZ.?GZ.GJ[>_PZ=_>X-K/Q;>N -ML[S$SM/6V^#DZ.OM[^[JX^/N]P`("0@("@T1$Q06&!D;'1\A(R0C(2`A(R0D -M(R,C(R(B(B(A(2$A'QP1!`(#_O7NZN?GZ.GIZ^[P\.C?W^#:SK^RL;G`RL_2 -MUMO@Y.CL[N_NZ>+E\/@""`<'"`H.$1(4%1<9&QT?(2(C(B$@(2,D(R,C(R(B -M(B(A(2$A(!T3!@$#`/GQ[.CGY^CHZNWP\O'GW]_?V,FXL[B^Q\W/TM?;X.7I -M[.[O[>?BZ/+Z`P<&!@D,#Q`1$Q46&!H<'B`B(R(A("$C(R,C(B(B(B$A(2$@ -M(!T5"`("`?SU[>GGY^?GZ>SO\O3PY=[>W-+`M[J^Q'=W-7'O;W`QSI -MY^?FY^KM\?7V].C>V];+Q<3$R,S,S,[1U=K@Y>KN\/#OZ./J\_H!!`4)"@L- -M#@\1$A06&!H<'A\@(2`@(2(B(B(B(2$A(2`@'QT5!P$"`@#[\^WJZ.?FY^KM -M\?7X]_#BV]7+R7F[_?]`P8("@L,#0X0$1,4 -M%A@:'!X?("$@("(B(B(B(2$A(2`@'QP2!@$"`@'\]._KZ.?FY^KM\?7X^?7G -MV]/+S-+2TM+/SL[.T=;;X>;K[_'R\.GE[/3[`@8("0H+#`T.$!$3%1<8&AP> -M'R`@("$B(B(B(2$A(2`@'QL/`P("`@']]>_KZ>?FY^KN\O;Y^O?KV]#*SM;8 -MV-71S\[.T-39W^7J[O'S\NWFZ?+X``<("`D*"PP-#Q`2$Q47&1L='A\@("`B -M(B(A(2$A("`@'A@,`@("`@']]O#KZ>?FY^KN\O;Y^OCNW,[,TMC=WMC3T<_. -MT-/8W>/H[?'S\^_GY_#W_P8'!P@)"@L,#@\1$A06&!H;'1X?'R`B(B$A(2$A -M("`?'14(`@,"`0']]O#LZ>?FZ.OO\_?Y^OGPW'R`A(B$A(2$@("`>&Q$% -M`@,"`@+]]O#LZ>?GZ>SP]/CZ^_GPW,S1V=WDYN#:UM/1T=/7W.'G[?'T]?/K -MZ._W_@8(!P@)"@H+#0X/$1(4%A@:&QP>'R`A(B(A(2$A("`>&`L#!`0"`@+\ -M]O#LZ>?HZNWQ]?G[^_CNVL_5W.'FYN/>V-73T=/7W.'H[?'U]O3MZ?#X_P8( -M!P@)"0H+#`X/$!(4%1<9&QP='B`A(B(A(2$A(!\<$@8#!`0#`P'\]/#LZ.?I -MZ^_S]_K\^_;KV=/9W^7GY^7@VM?4TM37W.'H[?'U]O3MZO'Y``8'!P@("0H+ -M#`T.$!$3%1<8&AL<'B`A(B$A(2$@'QT7"P0$!`,#`P'Z\^_KZ.CJ[?'U^/K[ -M^?/FVMC=Y.?GZ.CCW=G6U-37W.+G[?+U]O3NZ_/Z``8'!P@("0H*"PT.#Q$2 -M%!88&1L<'1\A(2$A(2$@'AL0!00%!`,#`__X\NWJZ.GL[_/W^OO[]^WEX-WA -MZ.CHZ>GFX-O7U=;8W>/H[O/V]_7N[?7\`08'!P@("0D*"PT.#Q$2%!87&1H; -M'1\A(2$A(2$?'!0(!`4%!`,#`OWV\>SIZ>ON\O;Y^_OY\NKHX^#GZNCHZ>KG -MXMW9U]?:W^3I[_7W^/7O\/C]`@<("`@("0H+"PT.#Q$2%!87&1H;'1\B(B$A -M(2`=%PL%!@8$!`0$`?KT[NOJZ^WQ]?G[^_KU[>WMYN;JZ>GIZNOIX]_;V-G< -MX.7K\?7W^/7P\OK_!`@("`@("0H+#`T.#Q$2%!87&1H;'2`B(B$A(!X8#04& -M!@4%!`4#_?;Q[.KK[?#T^/K\^_;O[O/OZ>GJZNKJZ^SJY>##=V]S?Y.KO]/?Y^?3R^?\# -M!P@("`@)"0H+#`T.#Q$2%!87&!H;'B`A(2`>&@\&!P<&!04%!0/\]>_L[.WO -M\_;Y^_OW\/'W^O?OZNOKZ^OL[>_LYN#=W=[AY^SQ]?CZ^//U_0`%"`@("`@) -M"0H+#`T.#Q$2%!87&1H<'R$A(!X:#P<'"`8&!04&!/[W\>[L[>_R]OGZ^O?P -M\OG\_/;LZ^SL[.SM[_#LYN'?W^'EZN[S]_K[]?+Y``0("`@("`D)"@H+#`T/ -M$!$3%188&1L='R(A'AD.!P@(!P8&!@8%`/CS[^WN\//V^?KZ]_'S^_[__/#K -M[>WL[>WN\/'LYN+@X>/G[?+V^OSY\_?^`@<)"`@("0D)"@L,#0X/$1(4%1<8 -M&AP>("`>&`T'"0D'!P8&!P8"^O3P[N[P\_;X^OKV\?3\_P(`]>SL[>WM[>[P -M\O#JY>+BX^;K\/7Y_/OU]?P"!@D)"`@)"0D*"@L,#0X0$1,4%A@9&AT?(!X8 -M#0<)"0@'!P8'!P3\]?'O[O#R]?CZ^?;R]?T!`P+Y[NSN[>WM[N_Q\N[HY.+C -MY>GN\_?[^_?T^@$%"0H)"`@)"0D*"PP-#@\0$A,5%A@9&QX?'A@."`D)"`<' -M!P<'!?_W\_#O\/+U^/GY]O+T_0$#`_SQ[.[N[N[N[_'S\>SGY./EZ.SQ]OK[ -M^/3Y``0("@D("`@)"0H*"PP-#A`1$Q06%Q@:'1X=&A`("0H)"`<'!P<'`OKU -M\>_P\?3W^?GW\O3]`0,$_O+L[N[N[N[O\/+S[^GEY.3GZ_#T^/KY]/@`!`@* -M"0D)"0D)"@H+#`T.#Q$2%!47&!H<'1T:$0D)"@D("`<'!P@%_O?S\?#Q\_;X -M^??S\_L!!`7_].WN[^[N[N_P\O3QZ^?EY.;J[O/W^?GU]P`%"`L*"0D)"0D* -M"@L,#0X/$!(3%1<8&AP>'1P4"PD+"@D(!P<("`<#^_;R\?'S]??X^/3R^0$$ -M!0'W[N[O[^[N[_#Q\_/NZ.;EYNCL\?3W^/7V_P4("PL*"0D)"0H*"PP-#@\0 -M$1,4%A<9&QT='!@."0L+"@D("`@("`8`^?7R\?+T]OCX]?+W``,$`_GO[N_O -M[N[N[_'R]/#JY^7EY^KN\O7V]/;^!0@,"PH*"0D)"0H*"PP-#@\1$A05%A@: -M'!T=&A()"@L*"0@("`@("`3^^/3R\O/U]O?V\O/\`@,#_/'M[^_N[N[O\/'S -M\NWHY>3FZ.SP\_7T]/L#!PL,"PH)"0D)"@H+#`P.#Q`1$Q06%QD;'1T;%@P) -M"PL*"0@("`@("`/[]_3R\O3V]_?T\O@!`P0`]>[O[^[N[N[O\/+S\>OGY>7G -MZNWQ\_/R^`('"@T,"@H*"0D*"@L+#`T.#Q$2%!46&!H<'1P:$@H*#`L*"0@( -M"`@(!P'[]_/R\_3U]O7R\_P#`P/Z\._P[^[N[N_P\?/S[^GFY>7HZ^[Q\O'S -M_@8)#0T,"PH*"@H*"@L,#0X/$!(3%!87&1L='1P8#@H,#`H*"0@("0D)!P'[ -M]_3S\_3U]O3Q]@`#`__T[_#P[N[N[N_P\?/R[>GFY>;H[._Q\/#W`P@,#@T, -M"PH*"@H*"PL,#0X/$1(3%188&AP='!L5#`H,#`L*"0D)"0D)!P'[]_3S\_3U -M]?+Q^0$#`OOQ\/'O[N[M[N_P\?+Q[.?EY>;HZ^[O[O#\!@H.#@T,"PH*"@H+ -M"PP,#0X0$1(4%1<9&QT='!H2"@L-#`L*"0D)"0D)!P+[]_3S\_3T\_#R_`(" -M`/?O\?'O[NWM[N_P\?+PZ^?EY>;HZ^WM[?,`"`P.#@T,"PH*"@H+"PP-#@\0 -M$1,4%A<9&QT=&Q@0"@P-#`L*"0D)"0D)!P+[]_3S\_3T\N_T_@("_O/O\?#O -M[NWM[N_P\/+P[.?EY>;HZNSK[/8""0T/#@T,"PH*"@H+"PP-#@\0$1,4%A@9 -M&QT<&A<."@T-#`L*"0D)"0D)"`/\^/7T\_/S\>_U_P(!_/+P\O#O[NWM[N_P -M\/+Q[.CFY>;HZNOJ[/D$"@\/#@T,"PL+"PL+#`P-#@\0$1,5%A@:'!T<&A4- -M"PX-#`L*"0D)"0D)"03^^?;T]//S\>_W``$!^O'Q\O#O[NWM[N_O\/+Q[.CF -MY>7GZ>GH[?H%"@\0#PX-#`L+"PL+#`P-#@\0$A,5%A@:'!T<&A4-"PX.#`L* -M"@D)"@D)"08`^O?U]//R\._W_P$`^?'Q\O#O[NWM[N[O\/'R[NGFY>7FZ.CG -M[/D$"Q`0#PX-#`L+"PL+#`P-#@\0$A,4%A@:&QT;&14."PX.#`L*"@H*"@H) -M"0<"_/CU]//R[^[V_P$`^/#Q\O#O[>WM[>[O[_#R[^KGY>7FY^?FZ_D#"@\0 -M#PX-#`L+"PL+"PP-#@\0$1(4%A<9&QT;&14-"PX.#0P*"@H*"@H)"0D%_OKW -M]?/R[^WT_0#_^/'R\_'O[>WM[>[N[_#R\.OHYN7EYN;EZO@""0\0#P\-#0P+ -M"PL+"PP-#0X0$1(4%1<9&AP<&A8/"PX.#0P+"@H*"@H)"0H(`OSX]O3R[^WR -M_/__^/'R\_'O[NWM[>WN[_#Q\>WHYN7EY>7CZ/8!!PT0$`\.#0P+"PL+"PP, -M#0X/$!(3%188&AP<&A<0"PT/#@P+"@H*"@H*"0H*!?_[]_7S\.WP^?[^^?+R -M]/+P[NWM[>WN[^_P\O#KZ.;EY>3BYO/^!@P0$`\/#@T,"PL+#`P,#0X/$!$3 -M%!87&1L<&A@2#`P/#@T,"PH*"@H*"@H*"`/^^O;T\>[N]OS]^?/R]//Q[^[M -M[>WN[N_P\?'MZ>?EY./BY._\`PH.$!`/#@T,"PL+"PP,#0T.#Q$2$Q47&!H< -M&A@4#0L.#@T,"PH*"@H*"@H*"@WM[N[O -M\/+PZ^CFY./AX>KX``<,#@\/#@T,#`L+"PL,#`T.#Q`1$A05%QD;&A@6$`L- -M#@T,"PH*"0H*"0D)"@H&`/SX]/'M[O;[^O7Q\_3R\>_M[>WM[>[N[_'R[NKG -MY>/AX.7S_0,)#`X/#PX-#`L+"PL+#`P-#@\0$1,4%A@:&QD7$PP+#@X-#`L* -M"@H*"@D)"@L*!?_[]_/O[?#X^O;Q\O3S\O#N[>WM[>[N[_#R\>WIYN3BW^'L -M^``&"PT/#PX-#0P+"PL+#`P-#0X/$!(3%188&AH8%@\*#`\.#0P+"@H*"@H* -M"@H+"@7_^O;R[NWS^?CS\?3U\_'P[NWM[>[N[N_Q\_'LZ.;CX-_E\OP""`L- -M#P\.#0P,"PL+"PP,#0T.$!$2%!47&1H9%Q0-"@X/#@T+"@H*"@H*"@H*"PH% -M__KV\>WN]?GU\?+U]/+Q[^[N[N[N[N_P\O/P[.CEXM[@Z_;]!`D+#0\/#@T, -M"PL+"PL,#`T.#Q`1$A05%QD:&!81"PL/#PT,"PH*"@H*"0D*"@P*!?_Z]?#M -M[_;W\O#S]?3R\>_N[N[M[N[O\/+S\.OGY.#=XN_Y_P4("PT/#PX-#`L+"PL+ -M#`P-#@\0$1(4%1<9&!84#@D,#PX-#`L*"@H)"0D)"@H,"@3^^?3O[?+W]?#Q -M]/3S\O#O[N[N[N[N[_#R\_#KY^/?WN;R^@`&"`L-#PX-#0P+"PL+"PL,#0T. -M$!$2%!47&!84$0H(#0\.#0L*"@H*"@D)"0H+#`H$_OCR[N_U^/3P\O7T\_+P -M[N[N[>[N[N_Q\_3Q[.?CW]_I]/L!!@D+#0\.#0P,"PL+"PL+#`P-#@\0$A,5 -M%Q84$@P'"0X.#0P+"@H*"@D)"0H*"PP(`OSV\._T^?GT\/+U]//R\._N[N[N -M[N_P\?/U\NWHY.#AZ_;\`@<)#`X/#@T-#`L+"PL+"PP,#0X/$!(3%184$@X' -M!@L.#@T,"PH*"@H*"@H*"PT,!P#Z\^_S^OOZ]/#S]?3S\?#O[N[N[N[O\/'T -M]O3NZ>7@XN[W_0,'"@P/#PX.#0P+"PL+"PL,#`T.#Q`1$Q04$0X(`P<+#`T, -M"PH*"@H*"@H*"PP-"P3^]_'R^OW]_/3P]/7T\_'O[N[N[N[N[_#R]/;U\.OE -MX>3O^/X$"`H-#P\.#@T,"PL*"@L+"PP-#0X0$1,2$`X(`@0)"@L,"PL*"@H* -M"@H*"@L,#0D!^O/P^/____ST\?3U]/+P[^[N[>[N[N_P\O3W]O'LYN+G\OK_ -M!0@+#@\/#@T,#`L*"@H*"@L+#`T.#Q$1#@P(`0$&"`D*"PL*"@H*"@H*"@L, -M#0L$_?;Q]_\"`0#Z\O+U]?3R\._N[N[N[N_P\?/U]_CS[>?DZO7\`08)#`X/ -M#PX-#0P+"@H*"@H+"PP-#A`0#@L'`/\#!@<("0H+"@H*"@H*"@L,#@T'`/CS -M]OX#!`+_^/'S]?7S\?#N[N[N[N_O\/+T]OCX\^WGYN_X_@,'"PT.#PX.#0P, -M"PH*"@H*"PL,#0X/#0H'`/T"!08'!PD*"PL+"@H*"@L,#0X+`_KT]_X#!@4! -M_?;Q]/;T\_'O[N[N[N_O\/'S]??Z^?3MY^KT^P`%"0P.#@\.#@T,"PL*"@H* -M"@L+#`T-"PD%_OL``P0%!@<("@L+"PH*"@L,#0X+!/OU^/\#!@<#`/KS\O7U -M\_'P[N[N[N[O\/#R]/;Y^_GS[.GO^?X#"`L-#@X.#@T-#`L*"@H*"@H*"PP- -M"@<#_/K_`@(#!`4'"0H+"PL*"PL,#0X,!?SV^0`#!@@%`O[V\?3U]/+P[^[N -M[N[O[_#Q\_7X^OSY\NSM]OT"!@D,#0T.#@X-#`L*"@D)"0H*"@L+"`4!^OG^ -M``$!`@,%!PD+"PL*"PL,#0X,!OWX_`($!PD'`P#Z\_+U]//Q[^[N[N[O[_#Q -M\_7W^?S\]_#M]/P`!0@+#0T-#@X-#0P+"@H)"0D*"@L*!@/^^/G]_P```0($ -M!@@*"PL+"PP,#0X,!OWY_P0%!P@(!0+]]?'T]?/R\.[N[N[O\/#Q\O3W^?O] -M_/7O\_L`!`@*"PP-#0X-#0P+"PH)"0D)"@H(!`'[]OG]_O__``$#!0<)"PL+ -M"PP-#0X-!?W\`04&"`@)!P/_]_+S]?3R\._N[N[O\/#Q\_3V^?O]_OKS\_L` -M`P@*"PP,#0T-#0P+"PH)"0D)"0D&`__X]?G\_?[^_P`"!`8("@L+"PP-#0T, -M!?[_!`8'"`@)!P,`^O+R]?3R\>_N[N_O\/'R\_3V^?O]__WV]/L!!`<*"@L, -M#`T-#0P+"PH)"0D)"0@$`?SU]OK\_/S]_O\!`P4'"0H+"PP-#0T+`_\"!P<( -M"`@)"`0!^_/R]?3R\?#O[N_O\/'R\_3V^/O]___Y]OL"!`<)"0H+#`P,#`P+ -M"PH)"0@("`4!_OCS]OO[^_O\_?X``@0&"`H+"PP,#0T)`P$&"`<(!P<)"`0! -M^_3R]/3S\?#O[^_O\/'R\_3V^/O]_P#\^/T#!0@)"0D*"PP,#`P+"PH)"0@( -M!P/_^_3T^/KZ^OO[_/[_`0,%!PD+"PP-#`P(`P4)"`@(!P@)"`0!^_3R]/3S -M\?#O[^_P\/'R\_7W^?O]_P'^^OX$!@@)"0D*"@L+#`L+"@H)"`@(!`#]]O+U -M^?GZ^OK[_/W_`0,%!PD+#`P,#`H&!0D*"0@'!P@)"`0!^_3R]?3S\O#P\/#P -M\?+S]/7W^?S^``'__0$&"`D*"0D)"@L+"PL+"@H)"`@&`?[Y\_/W^?GY^?GZ -M^_W_`0,$!@D+#`P,#`D&"0L*"0@'!P@)"`0!^_3R]?3S\O'P\/#Q\?+S]/;X -M^OS^``$`_P,("0H)"`@)"0H+"PL+"@H("`<#_OOT\O;X^/CX^/GZ^_W_``($ -M!@@+#`P+"@D*#`L)"`<'!P@)"`,`^O/R]?3S\O'P\/'Q\O/T]??Y^_W_`0$" -M`@8*"@H)"`@("0H*"PL*"@D)"`3_^_7Q]/?X]_?W^/CZ^_W_``($!@@+#`L* -M"0L.#0L)"`<'!P@)!P+_^/+S]?3S\O'P\?'R\_3U]O?Y^_X``0("!`D,#`L) -M"`@("0D*"@H*"0D(!0#\]_'S]_?W]_;W]_CZ^_W^``($!@@*"PH*#`\.#`H( -M!P<'"`D)!@'^]_+T]?3S\O'Q\?+S]/3V]_CZ_/\!`@($"`T.#`H(!P<("`D) -M"@H*"0D&`?WX\O/V]_?V]O;V]_GZ_/W^``($!@@*"@D,$!`-"P@'!P<'"`D( -M!`#[]/+U]?3S\O+R\O+S]/7V^/G[_@`!`@,&#`\.#`H(!P<'"`D)"0D)"08! -M_?CR\O;W]_;V]?;W^/G[_/W_``,%!PD)"0T2$0X,"0<'!P<("`D&`O[X\_/U -M]?3S\O+R\_/T]?;W^?O]_P$"`P0*$!$.#`D'!P<'"`@)"0D)!@']^//S]O?V -M]O7U]?;W^/K[_/W_`0,%!P@)#1,3#PP)"`<&!P<("`@$`/OU\O3U]?3S\O+S -M\_3U]O?X^OS^``(#`P8.$Q$."PD'!P<'"`@("0D&`?WX\_/V]_;V]?7U]?;W -M^?K[_/[_`0,%!@@.%!,0#0H'!@8&!P<("`4!_OCS\_;U]?3S\_/S]/7V]_CZ -M^_W_`0,#!`L3$P\-"@@&!@8'!P@("`4`_?CS]/?W]O;U]/3U]O?X^?K[_?X` -M`@,$!@X5%!`-"@@&!@8&!P<(!P+^^_7S]?;U]?3S\_3T]?;W^/G[_?\``@,$ -M"!$5$@X+"0<&!@8&!P<(!0#]^/3U^/?W]O7U]?7V]_CY^?K\_?\!`@,%#!45 -M$0X*"`8&!@8&!P<'!/_\]O/U]O;U]?3T]/3U]O?X^?O\_@`!`P,%#144$`T) -M!P8&!@8&!P<%`/WX]/7X^/?V]?7U]?;W^/CY^OO]_@`!`@0+%!82#PL(!P8% -M!@8'!P<%`?WX]/3W]_;U]/3T]/7V]_CY^OS]_P$"`P0+%!42#PL(!P8%!@8& -M!P4!_OGU]?CX^/?V]?7U]?;W^/GZ^_S^_P$"`PD2%A00#`D'!@4%!@8&!P4! -M_OKT]/?W]O;U]/3U]?;W^/GZ^_W^``$"`P@2%A,0#`D'!@4%!08&!0'^^_;U -M^/GX]_;U]?7V]O?X^?GZ_/W_``$"!P\6%1$-"0<&!04%!08&!0'^^O7T]_?W -M]O7U]/7U]O?X^/GZ_/[_``$"!P\5%!$-"0<&!04%!08%`O[[]_7X^?CW]_;U -M]?7V]_CX^?K[_/[_``$%#!06$P\+"`8%!04%!08%`?[[]O7W^/?V]?7U]?7V -M]_CX^?K[_?X``0(%#105$@X*"`8%!04%!08#__WY]??Y^?CW]O;V]O;W^/GY -M^OO\_?\``0,)$145$0T)!P8%!`0%!04"__SW]??X^/?V]?7U]?;W]_CY^?O\ -M_?\``0,*$A43#PL)!P4$!`4%!00`_?KW]_GZ^?CW]O;V]O?X^?GY^OO]_O\` -M`@8.$Q43#PL(!@4$!`0%!0/__?GU]_GX^/?V]?7U]O?W^/CY^OO]_O\``@@/ -M%!01#0H(!@4$!`4%!0+^_/CV^?KZ^?CW]_;V]_CY^?GZ^_S]_P`!!`H1%101 -M#0H(!@4$!`0%!`#^^O?W^?GX]_;V]?7V]O?X^/GY^OS]_O\`!`L1%!,/#`D' -M!00$!`4%!`#]^O?W^OKZ^?CW]_;W]_CY^?K[^_W^_P`!!0T2%!00#`D'!00$ -M!`0$`?[\^/;X^?GX]_;V]?;V]_?X^/GZ^_S]_O\""`X2%!(."@@&!00$!`0% -M`O[\^?;X^_KY^/CW]_?W^/GY^OK[_/W^_P`""`X2%!,/"PD&!00$!`0"__WZ -M]_?Z^OGX]_;V]O;V]_?X^/GZ^_S]_O\$"Q`2$Q`,"0<%!`0$!`0#`/W[^/?Z -M^_KY^?CW]_?X^/GY^OK[_/W^_P`#"A`2%!(/"P@&!00$!`,`_OSX]_GZ^OGX -M]_;V]O;W]_CX^/GZ^_S]_@`&#`\1$@\+"08%!`,$!`0#__WZ]_C[^_KY^?CW -M]_?X^?GZ^OO[_/W^_P$$"Q`2$Q(."P@&!00#`P+__?OW^/KZ^OGX]_;V]O?W -M^/CX^?GZ^_S]_@()#0\1$0X+"`8%!`,#!`0!_OSY]_G[^_OZ^?CX^/CX^?KZ -M^OO\_?[_``$`2$Q(."@@&!00#`P'^_/GW^?O[^OGX]_?V]O?X^/CX^?GZ -M^_S]_P,*#0\1$0X*"`8$!`,#!`0!_OSY^/K\^_OZ^?CX^/CY^?KZ^OO\_?[^ -M_P$'#1`1$A$."@@&!`,#`P#]^_CW^?O[^OGX]_?W]_?X^/CX^?GZ^_S]_P0* -M#0\0$`X+"`8$`P,#`P,`_?SY^/K\^_OZ^?CX^/CY^?KZ^OO\_/W^_P((#0\1 -M$A$."P@&!`,#`O_]^_CW^OO[^OGX]_?W]_?X^/CX^?GZ^_S]_P4+#0X0$`X* -M"`8$`P,#`P+__?OY^/K\^_OZ^?CX^/CY^?KZ^OO[_/W^_P('#0\0$1$/"P@& -M!00#`O[\^_CX^OO[^OGX]_?W]_CX^/CX^?GZ^_S]``4*#`X/#PX+"`8$`P,# -M`P+__?OY^/O\^_OZ^?CX^/CY^?KZ^OO[_/W^_P$&#`X0$1$/#`D'!00#`O[\ -M^OCX^_S[^OGX^/?W]_CX^/CX^?GZ^_S]``4*#`T.#PX,"08%!`,#`P+__?OY -M^/O\_/OZ^?GX^/CY^OKZ^OO[_/W^_P$&"PX/$!$0#0H(!@0#`O[\^OCX^_S[ -M^_KY^/?W]_CX^/CX^?GZ^_O\_P0)#`T.#PX,"0<%!`,#`P,`_?SZ^/K\_/OZ -M^OGY^/CY^OKZ^OO[_/W^_@`%"@T/$!`0#@L(!@0#`O[\^OCX^_S\^_KY^/CW -M]_CX^/CX^?GZ^OO\_P0)"PP-#@X,"@@&!`,#`P,`_?SZ^/K\_/S[^OGY^/CY -M^OKZ^OK[_/S]_@`$"0P.#Q`0#PT*!P4$`O[\^OCX^OS\^_KY^/CW]_CX^/CX -M^/GY^OO[_@,("@L,#0X-"P@&!`,#`@(!_OS[^?G[_/S[^OGY^/CY^?KZ^OK[ -M^_S]_O\"!PL-#@\0$`X+"`8$`__\^_CW^OS\^_KZ^?CX^/CX^/CX^/GY^OK[ -M_0('"0L+#`X.#`D'!00#`P,"__S[^?G[_/S[^_KY^?GY^?KZ^OK[^_S\_?X` -M!0H,#@\/#P\-"@<%!`#]^_GW^?S\^_OZ^?CX^/CX^/CX^/CY^?K[_``%"`H+ -M#`P-#`H(!@0#`P("`/W\^OGZ_/S\^_KZ^?GY^?KZ^OKZ^_S\_?[_`@@+#0X/ -M#P\.#`D'!0+^_/KW^/O\_/OZ^OGX^/CX^/CX^/CY^?KZ^_X#!PD*"PP-#0L) -M!P4$`P("`?[\^_GY^_W\_/OZ^?GY^?KZ^OKZ^_O\_?W^``4*#`T.#P\/#@L( -M!@3__/OX^/K\_/O[^OGY^/CX^/CX^/CX^?GZ^_P!!@@)"@L,#0P*"`8%!`," -M`@#]_/KY^OS]_/O[^OGY^?GZ^OKZ^OO[_/W^_P('"PP-#@\/#PT*"`8!_?OY -M]_G[_/S[^OKY^?CX^?CX^/CX^?GY^OO^`P<("0H+"PP+"0@&!`,#`@'__/OZ -M^?O\_/S[^OKY^?GY^OKZ^OK[^_S]_O\#"`L,#0X/#PX-"@@$`/W[^/CZ_/S[ -M^_KZ^?GX^?GX^/CX^/GY^?K\`04'"`D*"PL,"PD'!00#`@(!_OS[^?K\_?W\ -M^_KZ^?GY^OKZ^OK[^_S\_?X`!0D+#`T.#@X.#0H'`__\^OCY^_S\^_OZ^OGY -M^?GY^/CX^/GY^?K[_0(&!P@)"@H+#`H(!P4$`P("`/W\^OGZ_?W]_/OZ^OGY -M^OKZ^OKZ^_O\_?W_`@8*"PP-#@X.#@P*!@+^_/GX^OS\_/O[^OKY^?GY^?GX -M^/CY^?GZ^_\#!@<("0H*"PL*"`<%!`,"`?[\^_KY^_W]_/S[^OKY^?KZ^OKZ -M^OO[_/W^_P,("@L,#0X.#@X,"04!_?OX^/K\_/S[^_KZ^?GY^?GY^/CY^?GY -M^OP`!`8'"`D*"@L+"@D'!00#`@#]_/OY^OS]_?S[^_KZ^?KZ^OKZ^OK[^_S] -M_@$%"0H+#`P-#@X-"P@$`/W[^/G[_/S\^_OZ^OGY^?GY^?GY^?GY^OO]`04& -M!P@)"0H+"PH)!P4$`P'^_/OY^?O]_?W\^_KZ^OGZ^OKZ^OKZ^_O\_?\#!PD* -M"@L,#0T-#`H'`__\^OCY^_S\_/O[^OKY^?GY^?GY^?GY^?K[_0(%!@<("0H* -M"PP+"0<%!`+__/OZ^?K]_?W\_/OZ^OKZ^OKZ^OKZ^OO[_/X`!0@)"0H+#`P- -M#0L)!@+^_/KX^?O\_/S[^OKZ^?GZ^OGY^?GY^?KZ^_X"!0<("`D*"@L,#`H' -M!00!_?SZ^?K\_?W]_/O[^OKZ^OKZ^OKZ^OK[^_S_`P8("`D*"PL,#0P*"`4! -M_OSZ^/K\_/S\^_OZ^OKZ^OKY^?GY^?KZ^_S_`P8'"`@)"@L+#`P*!P8#__S[ -M^?G[_?W]_/S[^_KZ^OKZ^OKZ^OKZ^_S^`@4'"`@)"@H+#`P+"`8$`/W[^?CZ -M_?W]_/O[^OKZ^OKZ^OGY^?KZ^_O]``0&!P@)"0H+"PP,"0<$`/W[^?G[_?W] -M_/S[^_KZ^OKZ^OKZ^?KZ^_O]``0&!P<("0D*"PL+"0<%`__\^_GY^_W]_?S[ -M^_KZ^OKZ^OKY^?KZ^OO\_0$%!P<("0D*"PP,"PD&`O[\^OGZ_/W]_/S[^_OZ -M^_OZ^OKZ^?KZ^OO]``0%!@<'"`@)"@H+"@@&!`']_/KY^OS]_?S\^_OZ^OKZ -M^OKZ^?KZ^OO[_/\#!@<("`D*"@L,#`L(`__]^_K[_/W\_/S[^_O[^_OZ^OKZ -M^OGZ^OO\_P,%!08&!P@("0H*"0@&!`+__/OZ^?O]_?W\_/OZ^OKZ^OKZ^OKZ -M^OO[_/X!!0<'"`D)"@L,#`L*!0'^^_K[_/S\_/S[^_O[^_O[^OKZ^OGZ^OO\ -M_P,$!04&!@<'"`D)"0@&!0,`_?S[^?K\_?W]_/O[^OKZ^OOZ^OKZ^OO[_/W_ -M`P8'"`@)"@H+"PL*!@+__/O\_?W\_/S[^_O[^_O[^_KZ^OKZ^OO\``,$!`4% -M!@8'"`@)"0<&!0,!_OS[^OK[_?W]_/S[^_KZ^_OZ^OK[^_O[_/W^`@4'"`@) -M"0H+"PL*!@,`_?S]_?W\_/S[^_O[^_O[^_KZ^OKZ^OO]``,#!`0%!08&!P<( -M"`<%!`,"`/W\^_K[_?W]_?S[^_OZ^_O[^_O[^_O[_/S^`00&!P@)"0H*"PL) -M!@0!_OW^_OW\_/O[^_O[_/S[^_KZ^OKZ^OO]`0,#!`0$!04&!@<'!P8%!`," -M`/W\^_KZ_/W]_?S\^_O[^_O[^_O[^_O[_/S]_P,&!P@("0D*"@H(!00"__[_ -M_OW\_/O[^_O[_/S[^_OZ^OKZ^OS^`0(#`P0$!`4%!@8'!P8$`P,"`?[\^_KZ -M_/W]_?S\^_O[^_O[^_O[^_O\_/W]_P(%!P<("0D*"@D&!00"````__[]_/O[ -M^_O\_/S[^_OZ^OKZ^_S_`@(#`P,$!`0%!08&!@4$`P("`?[\_/KZ_/W]_?W\ -M_/O[^_O[^_O[^_S\_/W]_P(%!P<("`D*"@@%!`,"`0$!__[]_/O[^_S\_/S\ -M^_O[^_K[^_T``@("`P,#!`0%!04&!@0#`@("`?_]_/OZ_/[^_?W\_/O[^_O[ -M^_S[_/S\_/W^_P(%!@<("`D)"0<%!`,"`P(!__[]_/S[^_S\_/S\^_O[^_O[ -M_/\!`@("`@,#`P0$!04%!00#`@(!`?_]_/O[_/[^_?W\_/O[^_O\_/S\_/S\ -M_?W^_P(%!@<("`D)!P4$`P(#!`,!`/[\_/S[_/S\_/S\^_O[^_O\_@`!`@(" -M`@,#`P,$!`4%!`,"`0$!`?_]_/O[_/[^_?W\_/S[^_O\_/S\_/S\_?W^_P(% -M!P<'"`@(!@0#`@($!0,!`/[]_/S[_/S\_/S\^_O[^_S]_P$!`0("`@(#`P,$ -M!`0$`P(!`0$!`/[]_/O[_/[^_?W\_/S[^_S\_/S\_/S]_?W^``(%!@<'"`@& -M!`0#`@,%!0,"`/[]_/S\_/S\_/S\^_O[_/W_``$!`0("`@("`P,#!`0#`@$! -M`````/[]_/O[_?[^_?W\_/O[^_S\_/S\_/W]_?[^``,%!@<'"`8%!`,"`P0% -M!0,!`/[]_/S\_/S\_/S\_/S\_/X``0$!`0$"`@("`P,#`P,"`0$``````/[] -M_/O[_?[^_?W]_/S\_/S]_?W]_?W]_O[_`00&!P<'!P4$`P("!`4%!`,!`/[] -M_?W\_/S\_/S\_/S]_@`!`0$!`0$!`@("`@,#`P,!`0``````__[]_/O\_?[^ -M_?W\_/S\_/W]_?W]_?W]_O[_`00&!@<&!`,#`@($!04$!`,!__[]_?W\_/S\ -M_/S\_/W^``$!`0$!`0$!`@("`@,#`P$!`/___P``__W]_/S\_O[^_?W\_/S\ -M_/W]_?W]_?W^_O\``@4&!@8$`P,"`@,$!`0$`P(`__[^_?W\_/S\_/S\_?X` -M`0$!`0$!`0$!`0("`@("`0``_____P#__OW]_/S]_O[^_?S\_/S\_?W]_?W] -M_?[^__\!`P4&!00#`P("`P0$!`0#`P(`__[^_?W\_/S\_/S]_@`!`0$!`0$! -M`0$!`0("`@(!``#______P#__OW\_/W^_O[]_?W\_/W]_?W]_?W^_O[^_P`" -M!`4%!`,"`@(#!`0$!`,#`@$`__[^_?S\_/S\_/W^``$!`0$!`0$!`0$!`0$" -M`@$``/_________^_?W\_/W^_O[]_?W]_?W]_?[^_O[^_O[_``$#!04#`P(" -M`@,$!`0$`P,#`@$`__[]_?S\_/S]_?\``0$!`0```0$!`0$!`0$"`0``____ -M______[]_?S\_?[^_OW]_?W]_?W^_O[^_O[^_O__`0,$!`,"`@("`P0$!`,# -M`P,"`@$`__[]_?S\_/W]_P`!`0$!`````0$!`0$!`0$!``#___[^______W] -M_?S]_O[^_OW]_?W]_?[^_O[^_O[^__\``@0$`P("`@(#!`0$`P,#`@("`0#_ -M_OW]_/S\_?W_``$!`0$```````$!`0$!`0$!`/___O[^_____OW]_/S^_O[^ -M_?W]_?W]_O[^_O[^_O[__P`!`P,"`@(!`@,$!`,#`P,"`@("`0#__OW]_/W] -M_?X``0$!`0````````$!`0$!`0$`___^_O[____^_?W]_?W^_O[^_?W]_?W^ -M_O[^_O[^_O__``$#`P("`@$!`P0$`P,#`P("`@(!`/_^_?W]_?W]_@`!`0$! -M``````````$!`0$!`0``___^_O____[]_?W]_?[^_O[^_?W]_?[^_O[^_O[^ -M_O__`0(#`@("`0$"`P,#`P,#`@("`@(`__[^_?W]_?W^_P`!`0$````````` -M``$!`0$!`0#____^_____OW]_?W]_O_^_O[^_?W]_O[^_O[^_O[^__\``@," -M`0$!`0(#`P,#`P,"`@("`@$`__[]_?W]_?[_``$!`0````````````$!`0$! -M``#________^_?W]_?W^__[^_O[^_?W^_O[^_O[^_O[__P`!`P,"`0$!`0(# -M`P,#`P("`@("`0#__O[]_?W]_O\````````````````````!`0$!``#_____ -M__[]_?W]_?[__O[^_O[^_O[^_O[^_O[^_O[__P$"`P(!`0$!`@,#`P,"`@(" -M`@("`0#__O[]_?W]_O\````````````````````!`0$!`/_______OW]_?W] -M_O___O[^_O[^_O[^_O[^_O[^_O__``$"`@$!`0$!`@,#`P,"`@("`@(!``#_ -M_O[]_?W^_P`````````````````````!`0$!`/_______OW]_?W]_O___O[^ -M_O[^_O[^_O[^_O[^_O\``0("`0$!`0$!`@,#`P("`@("`@(!`/___O[]_?[^ -M_P`````````````````````!`0$``/_____^_?W]_?W^_____O[^_O[^_O[^ -M_O[^_O[^__\``0("`0$!`0$"`@,#`@("`@("`@(!`/_^_O[^_O[__P`````` -M```````````````!`0$``/_____^_?W]_?[^___^_O[^_O[^_O[^_O[^_O[^ -M__\``@(!`0````$"`@("`@("`@("`@$!`/_^_O[^_O[_```````````````` -M`````````0$``/____[]_?W]_?[____^_O[^_O[^_O[^_O[^_O[__P`!`@(! -M``````$"`@("`@("`0$!`@$!`/_^_O[^_O[_```````````````````````` -M`0$``/____[]_?W]_?[____^_O[^_O[^_O[^_O[^_O[__P`!`@$!``````$" -M`@("`@("`0$!`0$``/___O[^_O[_``````````````````````````$```#_ -M__[]_?W]_O_____^_O[^_O[^_O[^_O[^_O[__P`!`0$```````$"`@("`@(! -M`0$!`0$``/___O[^_O__``````````````````````````$```#___[]_?W] -M_O_____^_O[^_O[^_O[^_O[^_O___P`!`0$```````$"`@("`@$!`0$!`0$` -M`/___O[^_O__``````````````````````````````#___[]_?W]_O_____^ -M_O[^_O[^_O[^_O[^_O___P`!`0$```````$"`@("`@$!`0$!`0$!`/___O[^ -M_O__``````````````````````````````#___[]_?W]_O_______O[^_O[_ -M__[^_O[^_O___P`!`0$```````$"`@("`0$!`0$!`0$!`/____[^_O__```` -M``````````````````````````#___[]_?W]_O_______O[^_O[___[^_O[^ -M_O___P`!`0$```````$!`@(!`0$!`0$!`0$!``#___[^_O__```````````` -M````````````````````__[^_?W]_O_______O[^_O_____^_O[^_O___P`! -M`0$````````!`0$!`0$!`0$!`0$!``#____^_O__```````````````````` -M````````````__[^_OW^_O________[^_O_______O[^_____P```0$````` -M```!`0$!`0$!`0$!`0$!``#_________```````````````````````````` -M`````/_^_O[^_O____________________[^_____P```0$``````````0$! -M`0$!`0$!`0$!`0``_________P```````````````````````````````/_^ -M_O[^_O[___________________________\``````````````0$!`0$!`0$! -M`0$!`0``_________P```````````````````````````````/___O[^_O[_ -M__________________________\```````#__P````$!`0$!`0$!`0$!`0$` -M`/________\```````````````````````````````#___[^_O[_________ -M__________________\```````#___\````!`0$!`0$!`0$!`0$```#_____ -M__\`````````````````````````````````__[^_O[_________________ -M____________````````____`````0$!`0$!`````0$`````________```` -M````````````````````````````_____O[^________________________ -M____````````_____P````$!`0$!````````````_________P`````````` -M`````````````````````/____[^_____________________________P`` -M`````/____\````!`0$!`````````````/_______P`````````````````` -M``````````````#____^______________________________\``````/__ -M__\```````````````````````#_______\````````````````````````` -M``````#_____________________________________``````#_____```` -M````````````````````______\````````````````````````````````` -M____________________________________``````#_____```````````` -M`````````````/______`````````````````````````````````/______ -M_____________________________P``````_____P`````````````````` -M````````____``````````````````````````````````#_____________ -M______________________\`````_____P`````````````````````````` -M``````````````````````````````````````#_____________________ -M________________````______\````````````````````````````````` -M````__\`````````````````````````____________________________ -M_________P``______\``````````````````````````````````````/__ -M````````````````````````____________________________________ -M_P``______\```````````````````````````````````````#_```````` -M`````````````````/__________________________________________ -M__\```````````````````````````````````````#__P`````````````` -M`````````/____________________________________________\````` -M````````````````````````````````````__\````````````````````` -M`/____________________________________________\````````````` -M````````````````````````````____``````````````````````#_____ -M______________________________________\````````````````````` -M````````````````````_____P````````````````````#_____________ -M______________________________\````````````````````````````` -M`````````````/___P````````````````````#_____________________ -M______________________\````````````````````````````````````` -M`````/___P````````````````````#_____________________________ -M_____________P````````````````````````````````````````````#_ -M_P````````````````````#_____________________________________ -M____```````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````$-/34T````2``$``$(6``A`#:Q$```````` -M34%22P````(``$E.4U0````4/```?P!_``````````````````!!4%!,```! -MJ%-D,F$``@`````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````"D``````````````````` -M```````````````````````````````````````````````````````````` -M``0(```````)`",`````````````````>`````0`!````````/P`____@``` -M``$!``9156YI=',````````````````````````````````````````!`@`& -M('-A;7!S```````````````````````````````````````````````````` -M````````````)P`O``__]O_Y``$````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````!`````7@```!X````5M8Z*`_> -MOCO;Q0T.*`5//"BD#RQP.]W&*#P!`?\@1-@4"DUA9VEC($AARQP,4`0\-!QP%7W?^,7D/ -M#080```!H`*0`/`FH#,0`J``,";0,]`"D`#P)!`R(!`````!H` -M*0`/`5`!\0`J``,";0,]`````````````````!H`+``6`3X!W``J``,";0,] -M`````````````````!H``````````````````````````````````````0`` -M``%X````>````%8`<;B\'*8````<`%8``%=S=&$``P`*``'__P`````````` -M``+__P```!X```````/__P```#P```````3__P```%H````````````````` -I```````````````````````````````````````````````````````` -` -end diff --git a/sys/share/sounds/toolhorn.uu b/sys/share/sounds/toolhorn.uu deleted file mode 100644 index 3f7f63f30..000000000 --- a/sys/share/sounds/toolhorn.uu +++ /dev/null @@ -1,345 +0,0 @@ -begin 644 Tooled_Horn -M``M4;V]L960@2&]R;@`````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$``((`10```````#DB```! -MSJ<]K0&G/:TS``````````````````````````````"!@1/]``!&3U)-```Y -M&D%)1D934TY$```W'@````````````````````````````#_____________ -M__________________________\```````````````````````````#_____ -M________```!`@,#!`4%!@8&!@8%!00$`P("`0$``/____________\````` -M`0$!`@("`P,#`P,#`@("`@("`0$``/___OW]^_KY]_;T\_'P[^_N[^_P\O/V -M^/O]``0&"`L-#Q`0$!`/#0P+"0@&!`,!`/_^_OW]_?W]_?W]_?[^__\``0$" -M`P0$!04%!04%!04%!`,#`@$`__[]^_GW]?+P[>OIY^7EY>7GZ>SP]/G]`@8* -M#A(5%Q@9&!<6%!$/#`H(!@0"`/_]_/S[^_O[^_O[_/S]_?[_``$#`P0$!04& -M!@<("`D)"`<&!`,!__W[^?;R[NKEX=W;V=?7V=O>X^CN]?L""`X4&1P?(2(A -M(!X<&183#PP*!P4#`?_^_/OZ^OKZ^OKZ^OO[_/W^``$"`P0%!@<("`D*"PL+ -M"@D(!@4#`?[[^/3OZN7?VM;2S\[/T-/7V^'F[?3[!`P3&B`D*"HJ*B@E(AX; -M%Q,/#`D&`P'__?S[^OKZ^?GY^OK[_/W^``$"`P,$!`4&!P@)"0H*"@D(!P8% -M`P#]^O;Q[.?AV]71SKCW=?1R\?#P<#"Q,C-U-SE[_H&$1PF+C0X.CHX-3`K)B$;%A(-"04"__W[ -M^OGX]_?W]_?X^/G[_/X``0("`P0%!P@)"@L,#`P+"@D(!P8#`/WX\^WFW]?0 -MR,.^NKBZO,'(T=KE[_L'$AXG,#8Z/#PZ-S,M*"(=&!,/"P<$`/[\^OGX^/?W -M]_?W^/GZ_/[_``$"!`4&"`D+#0X/$`\.#0L*"`0`_/CS[>;?UL['P+JULK&S -MMKW%T-SI]P85(BXX/T-%1$(^.#(K)1\9%`\+!P0!_OSZ^?CW]_?W]_CY^?O] -M_O\``0$"`P0%!P@*"PP-#0T,#`L*"`4!_??RZ^3;T\S$OKBSL*^QM+K"SMOK -M^PL;*C8_14E*2$0_.#$J(QT7$0T)!0(`_OS[^OGY^?CX^?GZ^_S]_O[__P`` -M`0(#!08'"0H+#`P+"PL*"`4"_OGS[.7+3E! -M1TI*2$,]-BXG(!H4#PL(!0(`__[]_/S\^_O[^_S\_?W^_O[^_O[^_O\``0,% -M!PD*"PP-#0T,"@<$`/SU[N;>U<['P+JTL;"PLK:^R-;G^0L=+3I$2DU-2D4^ -M-R\F'QD3#@H&!`(`__[]_?S\_/S\_/S\_?W^_O[]_?W]_O[_`0($!@@)"0H* -M"@H)"`8$`?WX\>KCVM/,Q+ZZM[:VN+O"RM7D]`46)3(\1$A)1T,^-R\H(!H4 -M#PL(!0(`__[^_?W]_?S\_/S]_?[^_O[^_O[^_O\``@,%!@<("0H+"PL)"`8# -M__KT[.7'S!1K^$2,S0$A.4$]+1#PT*R(;%`\+!P0"`0#___[^_O[^ -M_O[^____``#___[^_?W]_?X``@,%!P@*"PP,"PH(!0+]^/'JX]K3S,2^N+.P -MK["RM\#-W?`%&2LZ1DY14D]*0SHP)Q\7$0P(!0,!``#___________\```$! -M`0#___[]_/S\_/[_`0,%!@@)"@L,#`H(!0']^/'JXMO3S,6_N;2QL+"RM\#, -MW?$&&RT\2$]34U!)0CDO)AT6$`L'!`,!````______[^_O___P```/___O[] -M_?W]_?X``0,%!@<("0D*"0@'!0/_^O/LY-W5SL;`N[>TL[2VN\/.W>\#%B@W -M0TM/44Y)0CDP)Q\7$0P(!0,"`0``_____O[^_O[__P````#__O[]_?W]_O\` -M`@,%!@<'"`D*"@H)!P0`^_3LY=S3S,.\MK*OKJ^RN<32Y/@-(#(_24]244U' -M/C8L(QL4#@H&!`(!`/_^_O[^_O[^_O__``$!`0#___[^_?W]_O\!`P4'"0H* -M"PL+"0@&!`#[]>[GWM;-Q;ZWL:VKK*^TOLO;[P4:+#Q'3U-34$I#.C`G'A<1 -M#`@%`P$`___^_O[^_O[^____```!`0#___[]_?W]_@`!`P4'"`@)"@L*"@@& -M!`#Z].SDW=3,P[RVL*RKK;"UO\S>\PD=+SY*45144$E"."\F'180"P<%`P(! -M`/___O[^_O[^_O__```!`0#___[]_?W]_@`"!`8'"0H+"PL+"@@'!`#[].WD -MW-/,P[RVL:ZMK:^TOLO<\0<<+S]*4E5544I"."\E'!40"P<%`P(!`/___O[^ -M_O[^_O[^_P```/___OW]_?W]_@`!`P4&"`D*"@L+"PH)!@/]]^_GWM;-Q;VW -MLJZLK*ZSO,G:[@09+#Q(4%1544M#.C`G'Q<1#0D&!`(!`/___O[^_O[^_O[^ -M____`/___OW]_?W^_@`!`P4'"`D*"@H+"PH(!0+^^/'HX-?/Q[^XLJ^MKK"V -MOLO<[P08*CE%35!13DE".3`H'Q@2#@H'!0,!`/_^_O[]_?W]_O[^_O__``#_ -M__[^_?[^_O\!`P4'"0L,#`T,"PH(!0']]N_FW=3+P[NTKJNJJZ^VP,_A]@L? -M,#Y)3U)13DA`-R\F'A@2#0H'!`(`__[]_?W]_?W]_?W^_O_______OW]_?W^ -M_P`"!`8("@H+"PP+"PD'!0'\]>[EW=3+PKFRK*FHJ:RTP-#C^0\C-4-,4E13 -M3D<_-BTD'181#0D'!0,!`/_^_?W]_?W]_?W^_O_______OW]_/W]_@`"`P4' -M"0H+#`T-#0P*!P/^]^_FW=3+PKFRK*BFIJFQO,SA^`XC-4--4U543T@_-BTD -M'!81#0D'!0,!`/_^_?W]_?W]_?W^_O[____^_?S\_/S]_O\``@0&"`H+#`T- -M#0L)!@/_^O/JXMG0R+^XLJZJJ:JON,;8[@4:+3U(4%-34$E".3`G(!D3#PL) -M!P0"`?_^_?W]_/S\_/S]_?[^_O_^_OW]_?W]_@`!`@0&"`H+"PP,#`P*"`0` -M^_7MYMW4R\.\MK&NK:ZQN<33YOL/(C-`24]03TM$.S0L(QT7$@X+"`8$`@#^ -M_?W\_/S\_/S\_/S\_?W]_?W\_/S]_P`"!`8("0L,#`P+"PL*!P0!_/;OY][6 -MSL6^MK&MJZROML'0Y/D.(C-`2E!14$Q%/#4L)!X8$P\,"`8$`?_^_?S\^_O[ -M^_O[_/S\_?W]_?W\_/W]_@`"!`8'"`H+#`P,#`L*!P0!_/?PZ-_6S<2[M:^K -MJJJMM<#0Y?H/(S1!2U!244Q%/C4M)1\9%!`,"08#`?_^_?S[^_O[^_O[^_S\ -M_/W]_/S\_/S]_@`!`P4'"0H,#`T-#0P+"08#_OCQZN'7SL6\M:^JJ*>JL;S, -MX?<-(3-!2U%34DU&/S8N)B`:%!`-"@<$`?_^_/S[^_O[^_O\_/S\_?W]_/S[ -M^_O\_?X``@0&"0L,#0X-#0P+"`4"__KSZ^+9T,B_N+&MJJFKL+K)W/$'&RT\ -M2$Y144Y(03@O*"$;%A(."P@&`P'__OW\_/S\^_O[^_O[^_S\_/O[^_O[_?X` -M`0,%!PD*#`T.#@X-#`D&`O[W\.C?ULW$N[2OJZFHJ[*^T.7[$24V0TQ24U%, -M13PU+"4>&141#0H'!`'__?S[^_KZ^OKZ^OK[^_S\_/S\^_O[_/[_`0($!@@* -M#`X.#0T-#`D&`_[Y\NKAV=#(P;NVL:ZMKK*\RMSQ!QLM.T9-4%!-1T`W,"@B -M'!<3#PL(!0(`_OW\^_KZ^OGY^?GY^OK[^_O[^_S\_?\``@0&"`D+#`T-#0T- -M"PD'`__Z\^OCVM#'OK>QK*BGJK"[RM[T"AXP/DA/4E%.2$$Y,"DB'!<3#PL' -M!0'__?S[^OKZ^OKZ^OGY^?GY^?KY^?K[_/X!`P4'"0H+#`P,"PL*"0@%`O_Z -M].WFW=7,Q+RWL:VKJZZVQ-;K`18I.45-45)/2D,\,RLE'QD5$0T*!@0!_OW[ -M^OGY^?GY^?GY^?GZ^OKZ^OK[_/W_`0,%!PD+#0X.#0T,"PD'!`']]N[GWM7, -MP[NUKZNHIZJRP-/I`!8J.TA05%113$4]-"PE'AD5$0T)!@,`_OW[^OKZ^OKZ -M^OKZ^OKZ^OKZ^?GZ^_S^``($!0<("0L,#0X-#0T+"`4!_/7LY-O2R+^XL:NG -MI:>LM\?<]`LA,T),4E533TA!."\H(AP7$P\+"`0"`/[\^_KY^?GY^?GY^?KZ -M^_OZ^OKZ^OO]_P$#!`8("@P-#@X.#0P+"`4"_??PY][5S<2\M:^JIJ:JL\'5 -M[`,9+#Q(4%1444M$/#,L)1\9%!`,"`4"__W\^_KZ^?GY^?CX^/CY^?KY^?GY -M^OO\_@$#!0<("@P-#@X.#@T,"08#_OGRZN'8SL6\M*ZHI*.FK[W1Z0`7*SM( -M4%154DQ%/30L)1X9%!`,"04"__W[^OGY^?GY^?GY^?KZ^_O[^_KZ^OO\_?\! -M`P4("@P-#@X/#@T,"@8"_OCQZN'8S\>_N+*LJ*>HK[O,XOD0)#9$3E-44TY' -M/CKAV=#'OK>PJJ6CI:Z]T>H#&BX_2E)655)+1#LS*R0>&!00#0D% -M`O_]^_KY^?GY^?GY^?GZ^OO[^_KZ^OK\_?\``@0%!PD*"PP-#@X.#0H'!/_Y -M\NOAV,_%O+2MJ*2CIJZ\T.@`%RL\25%555),13TT+"4?&100#`D%`O_]_/KZ -M^?GY^OKY^?GY^OKZ^OGY^?K[_/X``@0%!PD+#`T-#@X.#0H'!0#Z\^SBV=#' -MOK>OJJ:DIZZ[SN3\$RWDV]+)P+BQJZ:C -MI*JUQ]SS#"(T0TY3551/2$`W+R?FYN@K<':]`XE.4A26%E644I!."\G(1L5$0T)!0+_ -M_?OY^/CX^?GZ^OO[^_O[^_OZ^?CX^?K\_@`"!`8)"PT.#@X-#0P+"08"_?CQ -MZ.#7SL6^MJ^GHJ&CK+S2[`4=,4%-5%=644I#.C$I(AP7$P\+"`0!__W[^OKZ -M^OKZ^OKZ^OO[^_OZ^?CX^?K[_?\!`P4'"0L,#0X/#P\.#`D%`/OT[./:TLG` -MN+"GH9^@I[;+Y/\8+C],5%A75$U%/#,J(QP7$P\+"`4!__W[^OGY^OKZ^OKZ -M^OO[^_OZ^?GY^?K[_?\!`P4("@L-#@\0$!`/#0H&`?SU[>3;TLB_MZZEGIN; -MHK''X?T6+4!-55E954]'/C4L)!X8$P\,"`0"__W[^OGY^?GZ^OK[^_O[^_O[ -M^OGX^/GZ_/X``@4'"@P-#Q`1$1`/#0D%`?OT[>3;TLG`MZ^HHIZ=I+''X?L6 -M+#Y,5%E954Y'/C4L)!X8%!`,"`4"__W[^OGY^?GZ^OK[^_O\_/S[^OGY^?GZ -M_/X``@0'"@P-#@\/#P\-#`D&`OWV[N;NI9Z9F)^O -MR.0!'#)$45E<6U9.13PR*2(;%A(."@8$`/[\^OGY^?KZ^_O\_/S\_?W\^_KZ -M^?GY^OO]``($!PH,#@\0$!`/#@P*!P+]]NWEW-/*P;FQIYZ7E)FIP=[\&#!# -M4EI=7%=01STT*R,<%Q,/"P@$`?[\^OGX^/GY^OO[_/S\_?W]_/OZ^?GY^OS^ -M``($!@@*#`T.#P\/#PT+"`3_^/#GW=3+PKFPIYZ7E9JHO]OY%2U`3UA<7%A1 -M2#XT*R,=%Q,/#`@%`O_]^_KY^?GZ^OO[^_S\_/S\_/OZ^?GY^OS^``($!PH, -M#@\/#P\/#PX,"04`^?'HWM7+PKFOI9R4D9:DO-GW%"U!4%I>7EI32D`V+24> -M&!,/"P@$`?[\^OGX^/GY^OO[_/S\_/S\_/OZ^?CX^?O]``($!PH,#@\0$1(2 -M$0\-"04`^?#HWM7,P[JPIIR4D).@M]3S$2M`3UE>7EI32D`V+24>&!,/#`@% -M`O_\^OGX^/GZ^_O\_/S\_/S\_/OY^/CX^?O]_@`#!@D,#Q$2$Q,2$A`-"@8` -M^?'GW=/)P+:LHI>0C9.CO-KY%B]#4EI>75E22#XT*R,<%Q(."P<%`?_]^_GY -M^?GZ^_S\_?W]_?W]_?SZ^?CX^/K[_0`"!`<+#0\0$1$2$0\-"@8`^?'HW];, -MP[JPIIR4CY*?MM/S$2H_4%I?7UM42D`W+B4>&!,/#`D%`O_]^_KY^?GZ^OO[ -M_/S\_/S\_/OZ^/CX^?K\_0`"!0@+#0\0$1(3$Q$/#`@"_/7LX]K0Q[ZUK**9 -MD9"9J\;E!"`W255<7EQ63D0Z,2DA&Q82#@H'`P#]^_KY^?GY^OO\_/S]_?W] -M_/SZ^?CW^/G[_0`#!0@,#@\0$1(2$A$."P<#_/7LX]K2R<&XKZ67U1D9NNRND'(SE*5EQ= -M6U5-1#HQ*"(<%Q,/"P<$`?[\^OGX^/GY^OO[^_O[^_S[^_KY^/CY^OS^``,& -M"`L.$!$1$A(2$0\,"03]]N_FW-/)P+>LH)6-BY2IQ>0#'S9)5EQ>7%9/1CPS -M*B,=%Q,/"P@$`/[[^?CX^/GZ^_O\_/S\_/S\^_KX]_?X^?K\_@`#!@H.$!$2 -M$Q,3$0\-"@8`^?#HW]7,P[FOI)B/BY"AN]KZ%S%$4UM>75A11SXU+"0>&!00 -M#`@%`?_\^OGX^/GY^OO[_/S\_/S\_/KY^/CX^OO]_P$#!@@*#0\0$1$1$0\- -M"@8"^_3LX]K1R+^UJY^5CY";LL_N#"8[3%9;7%E22D$X+R<@&A82#@H&`O_\ -M^OGX]_CY^OO[^_O[^_O\^_KY^/CX^/G[_@`#!@@+#0\1$A,3$Q$."P<"_/7M -MY-O2R<"VK**8D9":KLGH!R(X251;7%I43$,Z,2@B'!82#@L'`P#]^_GX^/CY -M^OO[^_O[^_O[^_KY^/CX^?O]_P$#!@@+#A`1$A,3$A$/#`@$_?;MY-O1R+ZT -MJ9V2BXN6K,GI"20[3%A>7UQ53D0[,BHB'!82#@H&`__]^_GW]_CX^?K[_/S\ -M_/S\_/OY^/?W^/K\_@`"!0<)#`\1$A04$A$/"P@#_O?OYMW3R;^UJIZ3BXN5 -MJL?G!R(Y2U==7EM6340Z,2DB'!<2#@H'`P'^^_GX^/CY^OO\_/S\_/S\^_KY -M^/?W]_G[_?\!`P8("PX0$A04%!02#PL&`?KQZ-[4R\&VJIV1AX6/I,+D!"$Y -M2U=>7UQ63T4[,BHB'!<2#@L'!`'^^_GX^/CY^OO\_?W]_?S\^_OY^/?W]_CZ -M_/X``P8)#0\1$Q04%!,1#@H%`/GRZ>#7S<2ZL*.7C(>-G[G:^A@R151<7UY8 -M44<^-"LC'1<3#PL(!0+__/KY^/CX^?K[_/S\_/S\_/OZ^??W]_CY^_W_`@4( -M#`\1$Q04%!01#@H&`?KRZN'8S\:]LZF=DHR.F[/1\1`J/T]975U:4TI`-RXF -M'QD5$0T)!@/__?OY^/CY^?K[^_S\_/S[^_OZ^??W]_?Y^_W_`@4(#`X0$A05 -M%102#PL'`OWV[>3;T\K"N;"DF9&/EJG$Y`0?-DE56UU;5$U$.C$H(1L6$@X* -M!P0!_OOY^/CX^?KZ^_S\_/S\_/O[^OGX^/GZ_/X``@0&"@T/$1,4%103$0T) -M!/[W[^?>USCVM'(OK6JGI.,C)>LR>D((SI+ -M5EQ=6E1,0SDP*"(<%A(."P<$`?W[^?CX^/GZ^_O\_/S\_/O[^OCW]_?X^?O^ -M`0,&"0P/$1(3%!03$0\,"03_^/#HW];-Q+FMH)2*B)&DP>(#(#=*5EU?7%5. -M13LR*2(<%Q(."P<$`?W[^??W]_CY^OO\_/W\_/S\^_GX^/CX^?O]``($!PD, -M#Q$3%!44$Q$."03_^._GWM3+PKFNHI6,B9&DP.`!'C9)55Q?7%9/13PS*B,= -M%Q,/"P@%`O[\^OCX^/CY^OO\_/S\_/S[^OCW]O;W^/K\_@$%"`L/$1(4%144 -M$Q$."@4`^O/JX=C/QKRQI9F.B(R=M];W%B]#45M>75A12#XU+"4=&!00#`D% -M`P#]^OCX^/CY^OO\_/S\_/S\^_KX]_?X^?K\_@`"!`<*#1`2$Q04%!(/#`@# -M_/7LXMG0QKRRIYN1C(Z;L]'Q$"H_3EA=75E224`W+B8?&100#`D%`__]^_GX -M^/CY^OO\_/S\_/S\^_KY^/?W]_G[_?\"!0@,$!,6%Q<6%1,0#`7EI32T$X+R<@&A41#0D&`O_\^OGX]_CY^OO\ -M_?W]_?S\^_KY]_?W^/GZ_/X!!`<+#Q(3%186%1,0#0D#_?;MY-O1R+^UJY^4 -MC8V7K,CH!R,Y2E9;7%I32T,Y,"DA&Q82#@H'!`'^_/KY^/CY^OO\_?W]_?S\ -M^_KY^/?W^/G[_/\"!0@,#A`1$A,3$A$/#0H%__CQZ-_6S,.YK:&4BXB1IDHJ*E:S+[`PH/4Y875Y:5$M"."\H(!H5$0T)!@(` -M_?KX]_?X^?K[_/S\_/S\_/OZ^?CW]_CZ^_T``@4("PX1$Q05%102$`P(`_WV -M[N77C?U65!'/3,J(QP7$P\,"04"__SZ^/?W^/GZ^_S]_?[^_?W[^OGW]_?X -M^OO]_P(%"0L-#Q$2$Q03$A`,"`/\\^OBV,W$NK"DF(V(C)RVUO@7,$547%]> -M65%(/C4L)!X8$P\+"`0!_OSZ^/?W^/GZ_/W^_O[^_?W[^OCW]_?X^OO]``(% -M"0P/$1,5%144$Q`,!P+[\^K@U\W$NK"CE8J%B9JVU_D9,T=67F%?65)(/S4L -M)1X8$P\+"`0!_OSZ^/?X^/G[_/W^_O[^_OW\^OCW]_?X^?O]``,%"`P.$!$3 -M%!03$@\,"`/\\^OAV,[$N:Z@D86`AIJXW/\?.4Q98&)?65%'/30K(QT7$@X* -M!@0!_?OY^/?X^/K[_?[______OW\^OCW]?7V^/K]``,&"0P/$1(3$Q,3$0X+ -M!@'[\^KAV,_&O;*FF8V'BIBRT_45,$5476!?6E)(/C0K)!P7$P\+"`4"`/W[ -M^?CX^?K[_/W^_O___OW\^OGW]_?W^?K\_@$$!PH-#Q$2$Q,3$@\,"03]]NWD -MW-/*P;>KG8^%A9"HR.P.*D%276)A7%1+03,%(SM.6F!@759. -M0SDP*"`:%1$-"@<$`?[\^OCW]_CZ^_S^______[]_/KX]_?W^/GZ_0`"!0D, -M$!(3%!04$Q(/"P8`^?#FW=3+PKFNHI2*AHV@O-X`'SE,66!A7EA/13LQ*"$; -M%A(."P@$`?[\^?CW]_CY^_W^_O____[]^_KX]_?W^/K\_@`#!@@+#A`1$Q04 -M$Q$."@8`^?+HW]?.Q;VSIIJ/BHV=M]?Y&#)&5%Q?75A01STT*R,=%Q,/"P@% -M`O_\^OGX^/CY^OS]_O[^_O[\^_KY^/?W^/K\_@`#!0@+#0\1$A(3$Q(/#`@" -M_/3LX]K1R+^TJ)J.AXF7L='S%"]$4UQ@7UI324`V+24?&100#`D%`O_\^OCW -M]_CY^OS]_?[^_OW\^_GX]_;V^/G[_@$$!PH-$!(3$Q03$A`-"@8!^O/KXMG0 -MQ[VSIYR1BXV;L]/U%"Y#4EM>75E123\V+24>&!,/#`D%`@#\^OGW]_CY^OS] -M_O[^_O[]_/KY^/?W^?K\_@`#!@D-#Q$3%!03$Q$."@8`^?+IX-?/QKVSIYJ/ -MB8R:LM+T$RY#4UU@7UM32D`W+B4?&100#`@&`__]^_GX^/CY^OS]_O[__O[\ -M^_GX]_;W^/G\_@`#!0@+#A`2$A,3$A$."P@"_/7MY-O2R<"WK*"5C8R6JL?H -M""4\35A>7EM53$(Y," -M7UQ6340Z,2DA&Q81#0H'!`'^_/KY^/CY^OO\_?[^_O[]_/OY^/?W]_CZ_/\" -M!`<*#0\1$Q04%!,1#@H%_O?OYMS2R+ZSIYJ-@X*-I<7J#"E!4EUB8EY73D4Z -M,2@A&Q41#0D%`O_\^?CW]_?X^OS]_O_____^_/OY]_;V]_CZ_/X!!`<+#A$3 -M%!44$Q(/#`@#_?7MY-K1R+^UJYZ2BHJ4J:CXF- -MG;C9^A@Q15)97%I4340Z,2DA&Q82#@L(!0+__/KY^/CY^OO\_?[____^_?OY -M^/CX^/CY^_W_`00(#`\0$1,4$Q,1#PL'`OOT[.+9T,B_M:B:CXN0H;S<_1LS -M1E)96UE42T(Y,"@@&A00#`D&`P#^_/KY^/GY^OS]_O_____^_?OZ^/?W]_CY -M^_W_`@0'"PX0$A,3$Q(0#@L&`?SU[>3,D!)34U*13XW+B[HX=K4S<2[LJJGK+G. -MYP`6*#8_1$9$0#DS+"4?&100#0H(!0,!__W[^OGZ^OO\_?[______OW\^OKY -M^?GZ^_S^``($!@D+#`T-#0T-#`H(!0'\]_'KY-[8T&141#0H(!@,!__W[^OKZ^OO\_?[^_____OW\^_KZ^?KZ^_S] -M_P$#!0@+#0X/#PX-#`H'!`'\]_+KY-[7T/=U]#'O[>TMK_/X_@,'2HS.#HY-S(M)R`;%A(.#`D'!0," -M`/[]_/O[^_S\_?[^_____OW]_/OZ^OK[_/W^``(#!0<)"@H+"PL+"@D'!`'^ -M^O7OZN7@V]7.Q;ZZN;_,W_,'&"4O-3@X-3$L)B$;%Q,/#`H(!@0"`/_]_/O[ -M^_O\_?[^_____O[]_/O[^OKZ^_S]_P$"!`8'"0H+#`P,"PD'!0+_^_;Q[.?A -MW-;/Q[^ZNL#.X/0'%R0M,S4U,R\J)!\:%A(."PD'!0,!__[\^_O[^_O\_?[^ -M_____O[]_/OZ^OKZ^_S]_P`"`P4("@L,#`P+"PD'!0+_^_?R[>GDW]K3S,7` -MOL/.W_$#$A\H+C$R,"TH(QX9%1$-"PD'!00"`/_^_?S[^_S\_?[^_O[^_O[] -M_/S[^_K[^_S]_@`!`P4'"`D+"PL+"PH(!@,`_?GT[^KEX-S7T,K%P\?0W>W^ -M#1HD*BXO+BLH(QX:%A(/#`D'!0,"`/_^_?S\_/S]_?[^_____O[]_?S[^_O[ -M_/W^_P`!`@,%!P@)"@H*"0@'!@0!_OKV\N[IY>'7@V];2S\_4W>GV!`\8'R,F)B0B'QL7%!`-"PD' -M!@0#`0#__OW\_/S]_?[^_O[___[^_OW\_/S\_/W]_O\``0($!08&!P<("`<& -M!00"`/WZ]_/P[.CDX-O7U-/6W>?S``L4&Q\B(R(@'1H6$Q`-"PD'!@0#`@'_ -M_OW]_/S]_?W^_O[^_O[^_OW]_/S\_/W]_O\``0(#!08'!P@("`<&!0,"`/[[ -M^/7R[NOHY.#7P_`<0%AL?("`>'!D6$P\-"PD'!@0#`@$`__[]_?W] -M_?W^_O[^_O[^_OW]_?W\_?W]_O\```$"!`4&!P<'!P<&!00"`?_\^?;S\.SJ -MY^/?W-K:WN;P^@0-$Q@<'1T<&A@5$@\-"PD'!@0#`@$`__[^_?W]_?[^_O[^ -M_O[^_O[]_?W]_?W]_O__``$"`P0%!@8&!@8&!0,"`?_]^_CU\_#MZN?DX=_? -MX>;M]O\(#A08&1H:&!84$0\,"@@'!@0#`@$``/_^_OW]_?[^_O[^_O[^_OW] -M_?W]_?W^_O__``$"`P0%!08&!@8%!00#`0#^_/KW]/+O[.GFXN#@X>;N]O\' -M#1(6%Q@8%A02$`X,"@@'!00#`@$`___^_OW]_?[^_O[____^_O[^_?W]_?W] -M_O[_``$"`@,$!04%!04$!`,"`?_^_/KX]O3Q[^WIY^7DY>GO]OX$"@\2%!45 -M%!(1#PP+"0<&!00#`@$``/_^_O[^_O[^_O[______O[^_OW]_?[^_O[_```! -M`@,#!`0$!`0$!`,"`0#__OSZ^/;S\>_LZ>?FY^KO]OT#"0T0$A,3$A$/#0L* -M"`<%!`,"`0$`___^_O[^_O[^__________[^_O[^_O[^_O[__P`!`0(#`P,$ -M!`0$`P,"`0'__OW[^??V]/+O[>OIZ>SP]OP"!PL.#Q`0$`X-"PH(!P8$!`," -M`0$``/___O[^_O[____________^_O[^_O[^_O___P```0("`P,#`P,#`P(" -M`0#__OW\^OGW]O3S\>_M[>_R]OL`!`@+#`T.#0P+"@@'!@4$`P("`0$``/__ -M__[^_O[______________O[^_O[^_O___P```0$"`@("`@("`@(!`0#___[\ -M^_KY^/?U]/+Q\?+T]_O_`P8("@L+"PH)"`<&!00#`@(!`0$``/__________ -M_________________________P````$!`0$!`@("`0$!`0``__[]_?S[^OGX -M]_;U]/7V^/O_`00&!P@("`@'!@4%!`,"`@$!`0````#_________________ -M__________________\````!`0$!`0$!`0$!````___^_OW\_/OZ^OGX^/CY -M^OS^``($!04%!04%!`0#`@("`0$!``````#_________________________ -M__________\``````````0$`````````_____O[^_?W]_/S[^_O[_/W_``$" -M`@,#`P,"`@(!`0$!``````````#_________________________________ -M__\`````````````````````______________[^_O[^____```````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````````````````!#3TU-```` -M$@`!```W%@`(0`VL1````````$U!4DL````"``!)3E-4````%#P``'\`?P`` -M````````````````05!03````:A39#)A``(```````````!%]```!``*`*`` -M`'E%]````@`*J8$``'D(Q2LCU@`````@5@`BW@!$]`````%$!P`%]"(`__\% -M]"4``_]F]!,`#`!(`0`&`(0``(Q(7@!G]```#``%]"<``_\*J:,``+,*J80` -M`)$*J"0,`*4-`2(*J80``+-A]```!`!']```#@`-`+4BK@`@`'0.D)X-`3X* -MJ80``+,-`2(*J80``+-A]```!`!']```#@`-`+4BK@`@`'0.$*P-`3X*J:0` -M`)<*J`0```0*`*```.9"@0!(@@!$]"`___]$@T9(`49$]````"!$]$```_\A -MT@!6@0`&WR!'!B-$]$8`#`!%@T`$"```````"0`C`````````````````'@` -M```$``0```````#\`/___X`````!`0`&455N:71S```````````````````` -M`````````````````````0(`!B!S86UP````%9N(&EN=&4@9&5L87,@9IIR````'@```!6`'&XO!RF````'`!6``!7 -M```````#__\````\```````$ -M__\```!:```````````````````````````````````````````````````` -/```````````````````` -` -end diff --git a/sys/share/sounds/wdnflute.uu b/sys/share/sounds/wdnflute.uu deleted file mode 100644 index d60f76f4a..000000000 --- a/sys/share/sounds/wdnflute.uu +++ /dev/null @@ -1,328 +0,0 @@ -begin 644 Wooden_Flute -M``Q7;V]D96X@1FQU=&4````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$````!%````````#8B```! -MSJ<]K;"G/:VZ``````````````````````````````"!@1V.``!&3U)-```V -M&D%)1D934TY$```T'@```````````````````````/____________\````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````$!``$!``$!`0$```$!`0`!`0$! -M`0$!`0$!`0$!`0$!`?_^_P#__P$!`/_]^OG^`0,*#0@)#0@#`?\!`P0%!08% -M`/SZ^OCT]/CZ!`P"]_W_]_3V_PH-"0+\_?[^`P(`__L&&A,&!P4`_@(-%142 -M"/SQ[/#[^^SF[.WGZ.KEX^CFXNWY^_\*!?G_!/X*&AL4#P\1#P<`!@P%^.KH -M\_3FWN7EUY];5XN3E\?GS^`D-"Q4G,2\Q-3(L*RXF*#H_,QX4&Q3ZZ^SIX.#= -MS,?1SK^YOL_C[?D-&1L:&"$O-3M"0D5,0SI(6E`^."T?&Q0#[^'5R,3$O;V_ -MKZ*HNY -ML;*\QM3A]`L,#"<^3%I0.3=#1DQE;E];5S\E$__KY./6O[:VKJ:ML:*5FZJY -MSN;U`0L1$Q,:*#I/6%%,3E5>75-%,B,@'@X`_>W2P[6GL;VUL;2RM+C#V.7L -M^/\%$R4X0$5.2T%$2#X[361;/#`O'Q02^]"ZP,2ZN,#"N*^FG):BR>WR[P$7 -M%A0M/S8O-#],6&EY=V=)(`D1'A<*"?O7PKZYKZ2>I*BDKLO1S.#PXM7>]0\M -M3EY22$4W*"TU-T-*0"L?(QH&[DYVQP]#7V^@"&"`C*"@@ -M'"4O/4U35U,[)2$>"O7S\^#1U-3%NK:NHYR9F**ZSM7AZ^/644T*!T%Y,_,T]C=Y=W`JZ>DH:*NQM_P_/X#'"P>$AD?*$1@9%E34TDW -M,#,N)1X3`_'HZ.'.OKFWL;6ZM+7$S]?F\O7W_@P<*3`W/4-,2T9`,BXW/#0L -M+S(F%/G4O\;.S/=Z?'ET+^UM+BPI:K`UN+N]O/U!108$0D3*#M!.S8X-"@B(2$K+R@B$_OP -MZMW3QKJWM[F^Q,.YL;.]U.SZ!Q`6(24A'1TG,S(O,T%/3D`U*QT1"0#QX-7; -MX=6^M+>XMK*NM<+*V/`!"!0;%A`,$"$T/D)!/#Q#0SPR&P<#!`D/`^C1P[>O -MKJ^PM<#%O[O(Y?;X^_KY#B\],2HS.#(L+S4X0U)--2XO\K.P[BTL;?) -MW.KS^/H"'3Q%-B8D)!P6*$A64U1+,QP2#@/SZ^;?V];/R<:\JZ.IM;[,Z0<1 -M!O\#"!$A-#\_/3T_1%%93CTW+!H7'AP0^M[)N;*YP\"VL[.SM\#0W^+I\_,` -M'2\W/SXL'"$S04E/3D4^-BLD&PX%\]K,S<_/S,6WJZ>LM,#6ZNSP_PH(#",V -M,RHG+C8X0E%00S@O(!PC(!``\=O&PL?*Q;RSJJ*HNL3*W.;=W/41'"0M-S4H -M*#8\/4%$/"\J*RHJ(Q+XW\_$OL++SL2WL:JGK\#+SMGO_P0-("LF(1T:)CE" -M2DY%/38K)RHF&A(%Y\[.U-#%N*ZKIZ>PM;?"S='8Y?@+%QT?'!XK.CX_14,Z -M-S0J*38]+`SSY]W1Q\;+Q+FXM;"UO<3*R\W9[PL>(A\>("`@*C0]148_-C0[ -M03LI&`CSYN7AULS%P;ZTJZVRM+S$P\KA^PP3%QH9'2HO+CM/4$$^/38X04,Z -M)1$$_/#;R+^YM[>TLK6ZNKBYN\'3[@88)"@H*"[J -MW\J[N+:OJ[&YNK2RNL35[?P!"A@B*C`R-3]#/3TL:ZKI*2O -MNL?7W^K_!@$.*#8_0CL]1$%!2U!023PS+R06"?GFS[ZZO+RWLJ^HI*2FK\'. -MV>S[_P84(RTT.CT\0$=/55%(2$0V*24?$O_FS\&YM+2ULJVHJ*NLL+W,V.'H -M^1$@*#8^-S(]2$='4%A734`Y-BXA#_GJVL>_P;VVM+.MIZ:MO,7*U.'O_@\B -M,38Z04,_04]=75504$U$.S$C$_[FU,K!NKN_MJ>AIZVML;[,UN'M_1,D*"X[ -M0D!'5%A555E63$5`.SDN%/WMUL&^O;2NKJZLJ*:MM;K`S=OJ_A$A+S4U.4%% -M2$]87EI134U(0#4E$?WLW,W`N;>RK:FFI:FPM;B\Q=/H_A$?*#`W/D)"2%1= -M6E-,24I(/B\@#?KJV\_&N[*MJ:*>HZRQL;:_QM#B]0<;+#4W.T%'4%-03U!2 -M4TU&0C8A#O_IS\;)PK.JIZBGHZ2LM+:[Q=3F^@\A)R@P/D=)3%):751+2TY+ -M13DB!_?QZ-;!MK2RJJ.AIJVRM+6XO\[F^@40(C<^.CY*45164E%345)42#$= -M%`;MV<[*Q[JII*6FJ*BLL;:]Q]+<[`@A+"TQ/4I355)-35)45%122T(M"N[F -MYMO*OKFVKJ2@HZ2GK[B\P,WE_0@*$B,S/T=.55I844E'2U%643PG&0SVWL_( -MP+:OK*JHJ*JIJ*FQOM'F]P,1'2(J-D)-65Q33E)64U%12CHI&PS^[=W,O;&G -MI*JNJZBHJJRON,S@\P42&B4O.TA/3DY25%-56EI52SHG%PT"\^+0O["LK:FI -MK*NIJJZTOLS=[?X.'"4P/DA04TU+3E%67V)92CLK'0[_\^;5P[2LJZRMK*:D -MIZJPP-'>[O\'#QXN/4I14E%.35-;7UI01SDI(1L/_>;*M[.MIJ:NL*BCI:FN -MN,;6YO+_%"HX/4%%1T9"151@965803(L(1(%^>[;PK.OJZJJIJ*BHJ:RP,G1 -MW^[Y!!DS0TM.2D)$3UE>8&!:3D`P(Q@/_N;.OK:OK*RIHIZ>H*:MNLK6W>;T -M"1XP/4)(44Y&2U5:7%U82#@U,B$,^>/+N[.OL+*OI9Z=GJ&LOH*BRN\/+T]WP"24Z03]! -M1TI)35EB85I23$4Z+B02]=K)PKRVL;"KGY>6GJBPN,?4V.'T"B`R.T1,24E6 -M7EU=6E-12T%!/"969E -M74]$149!.BP8`.3/Q+JQK:FBGI^BI:JQM;:]S-[X`.SI`0DA58FAD8F%9 -M3TI$-!X*].#5S,.[L:6:E9>:H*NTN+J]R=[V"AXR0$5#1U1>8%Y;6596659+ -M.B0-]-_0QL"\M*B=FIF9GJ2JK[;"TN'T#"(O,C8_35]I:&1A6$]/5%1,/RX4 -M]=_7S+ROJ*2@G9VAHZ6FIZNUQ>($'2@M,3="2D]<:VQD86%=6U=&+1@)_?#D -MU<.VJYV3D9:=I:NJJ;"XQ-KU"ADK/$1)5F%B7EM97&%C8UY/.2(+]>7Z -MK*"9FIJ8G:2CI:^_S-WT!A0C,3Q+66-H9EY85EA<7UM202<0_NS8RL*WJ:*? -MG9ZAH9N9GZFWS>?["18B*S5!45UB9F=D8U]=8%A%,2`1"`#OVL:RHYR:F9R? -MHZ6CHJFVP]3I_!`@+T)25UA<7%=35F!L;F!,-R,1`/'GW,FWK*2=FYZ>F9>; -MHZV[S-CD^@P6)CQ.769B5E-87&!E95]20"P8!_KLV<2TK:JEGY^?F9*4GZJU -MR>'O]?X,(SM)4%MC86%C96=D7%A0/2TI(0GLUL.SIZ"@I**?GIJ9G*.PP,[@ -M]0L?+SQ*4E945%MF;7)P:%Q+.2TD$P/XX\FXK*2CH)N9EY27HZRRO3D$T)`[QWM7,P;:KGY60D9*6GJFRN;[$S^D*(#!`3E9;7E]?86-E -M8EI:6U-"*@SRX='"N;*LIJ"7D(^4FZ6KKKG*W/`%&2P[1$M25V!M<&5=7%Y? -M6TX\*1D$ZM3&N[*JHIJ4E9F;G)VAJK?#U>T"%BLW/49066!D9VEF9&-=54Y# -M+18"[MS,O[6JG9:7EY.5G*6IJ[+`T^C\#B4[1DI586-?865C7%QG:EI#+QD" -MZM?,P[:KIJ2?F).3EYN@J[G&U>G_$1LE-D=37VIM:&)?8F1@651+."`(].32 -MP+2KHYN7F9N8E9FBJ;&]S^;\#APJ.4=5865E9F5I:V5?7%E-.B,+]N75P[2I -MHIV9F9F9F)F=IJZYR^3["18H/DI/5EQ?8V=H:6AG8E1",2$._N[6Q+BKHY^: -MEI>7E9B?IK&^R=GO!1@H-T9/56!J:&5H:V=A6U5+.RH7`.K9R+6FGYRHJJVQ]KM!!DJ-T966U=99G!N;6UF7E5(."H:!>[:R;BKI)^\@VOL/4\@P?,3]* -M6V9F96IQ<&QI8UI22CXE"O;DT\&OI:&;E9*0D).9H*:JL2S,@$@#HT<&VK*&9E(^-D)69G*.LM<+2Y@$:+3U+56%L;FQN -M;6=I;FI>3STG$/CDU<6XK)^6DY&/CHZ2FJ.LM\31Y/P/(CA+661K:VIN<&MI -M96%?5T,L%/WHU<&RJJ.'%H96=E5T,Q(`_Y -MW\BWJJ*=EY&.CI.7EY:?KKW-W.T$'C1#351B5D@R'P_XWLF[ -MKJ2;E)&3DH^,D)JEK[K'U>P(&B,V4&-I:6MU>'!L:V-=5THY)`[YYM.[J)^< -MF9:2CXZ0E)>4T8S)!8!ZM&YK:B=DY*2 -MD(^0D)>AI['!T.;]$BE`3%5A:FYN;W)V=&QD5D0X*!'^[=6_M:F;E9*/CH^/ -MD9:?J[?!R=GV$R8W35]H:FIMA -MIZV[TN;V""(Z2U5<96YP='Q[<&AD74\[*!P/]=C#M:NBFY:1C8Z1DY.:J+>^ -MQ-7Q#B,W2%)<9VYS=7-Q=G1C44E%.2`$\-_*MZFAG)6-CI*0CYBAIJNVQMCN -M!ATV2UE?9&AJ;W=Y<6EE8UQ%+AT*\-G)NJ^GGYB2BXB-DI:;HJV[QM3I`1HP -M/TQ98VQS=7)P;FEF85-%.B4+]-[*N["HH)>0CHR-CY.;I*RUP-'H`!79R;6AE7U9-0"D.^N3,O;.HGI:2D8^.D)28G:>SP=/F_!S4PK>MH)22E)&0DI.6G:6POLW@_!0C+T!48FMQ=7=W;VAH -M95U00C(:_^O9QK2HH)N5CXZ1E)24EY^JN -MT<&QIYZ5D(^0D)"2F*&KN,G9ZO\4)3=-86YSWEP;&I>2C@K&@3OVL2SI9V;F92/ -MC(V0DYBDLK[-X/(%'C=(56!I<7)O6D8Z, -MCI>DK[G'WO4)'3-&4UQC9FQV?'MXG_&31*5U]D:FYR='5W=6M>4D[LJB>EI.0C8N-DIFCK;7" -MU>?\&#)#4F!I;&QQ=W5R;FID64LZ)Q+YW\NZKJ:AGYJ1C(R,C9*=J;?$TN@# -M&2D[35998W)^?WMY_KZ:I*ZZR^7_&#)" -M25=C8F1N=7EY=&MC6DHW)Q?]X=+'N*NCG)2.BXR.D9>>IK"\R-OX$B=I*RVP]7L`QPU2%):9W-V<&UN;FUI -M9%M+-B`([]G(P+BLGY:1CXZ,BY"7H*RYQ-7O!A4E-DQ@;71U[8Q+6FG)B3CY"1DI26FZ2PO<_D^Q8K.4I;86-KS: -MRKNMHIJ6DH^/CX^4G*:QO=#H^@D=,D)6:&YO<6]N<&QF8%I00B\9!?/=QK6L -MHYN9F9:0CY*3EI^MOM'D]PPA,T%,5V5N,D116F!E:FYU>G9M95Q-.RH<"_GHUL.RIIZ:EI", -MCY*5G*6NN<33Z``3*D=97&%I;6YK9VIN:%Y52#@C#?OFSK^VK:6@FY>3CXN/ -MF**MN,35ZO\3*3U+5F-H:6QP3CXV0EZ"K -MN,//X_L1)SU.6%M@:W%R1C8R.E9^KML#+WO@0 -M(2\^46%H:W!U=FYD6U--3$DZ'@#KW,NYKJFDGYJ4CY"4F9VBJ[K/Y/<,'S)$ -M35%=;GAY=FYE75I73#\T)Q+WV\:ZM:^CF965EI64E)FBK+G'V?85*#4\0DY@ -M:W%V=6]L:5U334,R(`OTY=?&N*ZCFY61D9*4F)ZBJ;7&V_,'%R@Z2UAA;75W -M=&QC75Q<54DY(PW[ZM7$N:VCFY:4EIB7EIB=I;+$V>X%&BHW1U5>:&]Q<6QF -M9FA@440V)Q+ZY]O/O:RCGYN5DY25DY6=J+/`UO,)%2`P0%!>:'!U<6MJ:V18 -M3T:&UM:VAD96AE6$0R -M)1D'\MW-P;:HFY:7F9J8DY*8I+/!S^/[$2(P/4M>:VUH9VYO:F5@5D@U(1,( -M^NK9QK&BG9^?F).3E9B=I;"_T>/S`1$J0U9?8&)J;69E:&1=5T@T)!<-`NK/ -MOK:LHYV:F9B5E9::I+/!S=GI`1PP0%!=9FEE865J;6YE44([+QX+^>C8R+BM -MI:&=FYB1C).?J;&]RMGL_@XC/E)<8&-E:&UN:61;4DD]+!T2!O+4EYB_>J;.ZQ-'C^1`F/4]87%M=:'-T;6=A54<]-"H:!?+@S+VUKZFBF9.3E)>? -MJ+&YPL_?\PLE/$A-5V-G:6]P:F!53TU$.3`A"O+;HJRV -MP,W?]0HA-T%&359E<7-O;&1634E"/#,?#/K@RL*\LJFCG)>6EI:;I*RRNLG= -M\08>,SU&4%ME:VUP;6)74$I(0C`?$?G@T\F]LZVFG9>3E)J?HJBSO<;6[P<9 -M*#9$3UIE;'%P9EM644Q)13HF#_KGULB_N*^DG9J8FIRMM<7;\P@8)3,_ -M2%5C;71R:&%:4D]+/S,F%`#PX,_!N*RBG9N:FY^@H*2JM,/4ZP09)3`\2%5B -M:6UM9V%=6%%+0S4C$/[RZ]K&N:^CG)J:G)^AHJ2HL<#2Z@$0'S`[1E5A96IL -M9V%<55=81"XB$P3Z[-K,OJ^DGIJ9G:&BHJ&EL\32X?,)("TU1EID:6AC8&!@ -M7UQ1034H%@;XZ^#1OZZEH9V?H9V:G:2JLKW-Y/H)$R(W2UA=8VAE9&5A6UA4 -M2SPF$@D"]^;/O;.LI:">G9^AGZ"HLL'3W^P`$R0X2U1;8V9E9&)@85]51#,G -M'Q,#\N+0P[>IH*"BHI^;G**IL;[-V^S_$2(T1E9A95];7V=I9%M01CTN&0L% -M^NG7Q+2MJ:6AG9R3U!QPU2%5=75MD9U]:7EU523DI)!D%].31 -MPK>OJZBCH)Z;FIZGL\',UN3R!1XP/4]965UF96!@7E9.13HN(Q@*^^C0P+FR -MJZ>EHI^ -MGJ.JL+O*U-KG`!PP.D-.5EU@8&5H74]+1SPT,281^^C:S<*XLJ^LI9^>H*.J -ML[K!RMOU"A0A,T%)45A>9FIE7%)'0D$],B(2!?3>S<.\MJ^II**BI*>JK;6^ -MRMON`18J-CU"2E5?9FEG7%%+13XY+R(4!._?U,G`MZVHI:*AI:JLL+6[QM;I -M`!6%%+2DI#,1\3!O3EVL_&N[&KI:&FJZNJJK*^R=7I_@X=*S9` -M2U-<8V-;5%143D8[,",4!/?NXM7*NZRFIJBIJZRKL+6XPM3H_`H9*3=#3UA; -M5U596U=034Y&,A\/`??PYM?)O+2NJ*2DJ*NMKK7`R='?\@02(#5)45-:7U=. -M3E!36%%"-RD3`OCLX=?,PK>NK:RII:*DJ[6_R]OG\?T*&"L\3%MD7U135E!* -M24<]-BX>#@'RW]#%N[.PL;&PJZ:FJ:ZVP];G]0(-&BT]1$U75U9865A43TE` -M,"(:$P?WZMC&O+:RKJZOK*>GJ["ZR-/=[/P,'3$_1TU14%!76EA75$IKK6^QL_;ZO8%&B\^2E)245185U943D=!.2XB%PS^ -MZ=/&P;ZYM+.PJZBGJ;*]QLW:[?L('C(\049+4%576U]=4D,V+RPF&P[]Z]S. -MP+JXM;&MJ:JNL+2]P\C3X/,-(R\Z1$=$2%)965A744<_-RLA&@[YYMK3R\.Z -MLZ^KJJJKL+>]P\G3X.\&'BXU/$9,35%765A324`[/#DL'`[ZX];0R\.]NK2L -MIZFNL;2YP,G6Y/4(&B8O.D%$35EA7U5*1D([-S8O(A']Z]_4R<"\M[*RL:^P -MLK>ZN\'.X?@.'2DS.#M!2E!66EM73$`_0#@I&`G\\.3;UL`%B@Q-C]-5%974DI'1DE-1CDP(0KWZ=_;ULO"O+*LL+"LK[>[OL// -MXOD(#AK9S\K!NK6PK[2WM[2QM,'0W_0* -M%!LG,#=!3%%35%)/24=(0C0H'1#_\N_IVLJ_M:VML;.UMK2VO,/+V.T`#![DV\_"NK6UM+.RL;"SN\73Y?+[!0\9*#E) -M5E=22TA(1T5$0SPQ)!<+_N_BUYM[6SLK.YP,3,V>;O^@D9*SU*3$=#0D-+44U) -M0SLR)Q@/"/WKV[O;_$S]OE^`\@*"DO-SD]25!23T<^.C8Q*R@@$0'QY-S6SL7` -MNK2WO+N[P,3'S-7C]@<7)S$P,SU$1DI+2$4_.C@V-"P=#`#RX]S:T';T<>_N[NYN<#" -MP+_"Q]+E^@D7("8M,#4_1TQ.24)`/3@T+24<$`7\\N?=U,BYL;6_P\/!P<+! -MQ-#?[P(6)2PM+SI%1$!!0D-$0S\[,B48"_SS\_+FU[@T_?T?U!!`;(RDV04%"2$8Z,2LG+#(M(AH0`?/MZN38S3>TL.ZN\#&R\S+R\G+ -MU^?U`0X;(BG?U,?#QL;&R,;!PL?2X>OR_P<%#B`N -M.TE)03LV,C,T+RDD'1D2!P($`>_9RLC*QL7)R<3!PL?2WNCU```"#R$S041" -M/SLU,30U+RPI&PP-$P\$]NG>U&QH4$P\#^.S:T<_*RL[+P;V_PT]#-R\O%P<+`Q-/9UMSEZO0%%"0X.C0T-3@^04`\+R(:%A<9 -M&1,,_NOAW=?3S<*]P,#`R]C:UMCSHY-O5TL>\N+K!RM#6V]S:XO(!$"0R,R\P.$%%0CTU*1X9&2$B&A(+^>CC -MY.3S;RK^ZNL') -MS<_.SM+9Y?,"$1<8'S`_1DE)034I(B,F*2DF'`X!^/7V\>37S<2]O\?,S,G% -MQG6Q+V^P,7-T76QL#`P\C+R,;%PL;6[?G^ -M!`8-'"X[2$]'.3$J)RDM+BD@$0@+"?[Y].?5QL+%RL[*Q+VZO\S=[??^!`4* -M%R@Z1TM(/SO9S)RDA%`?]]_'K -MY=[0O[>YNK[)TM+,Q\G7ZOL,'"4K,#,Y0D4_.#$G)2@L+2@?%P?V\/#Q[.'2 -MQ;VYNL#%Q\?)SM;=Z/P0%Q<<*3=!1DE)03`B(B0B)BPJ'`K^_/?LX-?/R+^[ -MP\O*Q\2_O\K<]`@-$AXB(RTZ0TM)/34N(R8P*Q\;%P\'`?SW[MO&N[R^P,K3 -MSL/!Q#-P;_!P\3%PL'$ -MR='=[OP"!0X=*C1"3DH\,R\I)2DM+2H>$@X,!?GOYMC)Q,7'R[Y -M!A0A+SQ"0#DQ*BPS.#@Q*20;#`0'"@7[[^'0QZ.WN\P4> -M,3]+2STT,"LG*2XR,2L@%1(0!OOPX]G6U]#(Q\.[M[B]Q]?EZ^_U^P,2)39! -M0T`^.C,O,C$J(1P;'A\:#P'SY=;/SLS,R\?"O+J\Q=/#6RLC)Q<&^OL#%S=/7W./K]00<,3U`.3,W.30S -M,RTH*"8D(1L5$0/NXMS:W=C*P\.]M[C`R=#8X^GK]@P<(RLS-SU`/3L].2TA -M&APA)28A$P#S[.'6S\[/RL*_N[S%R\K-U>'Q!`\4'RXU-#4Y/3]`.B\E'QX? -M'QX<&`KV[.?=TLS(P+W`P\7'QLG0U]GA]PX=*3(V-S0S.C\X,#$Q)B$D)R09 -M!_SZ\>7BXMC'O+N[N;[(R\S0T]OJ]P$0(RLO-CH\0$$Y,2PD(2HL)"`<$@;[ -M\.GCV=#+P[NZP<7%Q,7*T=GF]@85'R4N.#HX/#XX,R\L+"%Q$&^O7PW\S$Q,;%P[^\ -MP,7$Q]3C\OX(#18C,T!#.S@[.#`M*RHM+"8B&0T(!_OHVM/,R,._P<7`N[W# -MS-7A\/H`"ALH+SA`1$,Y+BPM+S$P+"+#<_0SXX-C4R,3`I(B$A'QH0!O_RW,W)RLC#P[W"1LC -M*#$\/S@Q-#DV-#$K)R0B(AT2!?SSYM;-S,W)P+JXN+S#Q\W8XN_^!@P:*C0X -M.#8X.ST\-"#_[QY-G1R<7$P\"^O\"]O3R!A@D*R\R-#8X -M-S8W.#4O)B`A)!X6#P+TZ^+5S,7`P;^YN;_'S,O,UN/O`18C*C(U-34S-3HZ -M-C$L*BPK(A@2"P/YZ^#;US\.^N[N^P<#"QL7(T=WK_@X:)"PQ-CDW-CDV-#0Q+RPI)B$8 -M"@'_^>O=TLW&NK2XO<##Q<;+T=WN^@,1'RHS.3L]/#DT,"PH+C@W*R(<$@3U -M[.WGV=#)P+R[N[R\N\',V>3N^P8-%1\I,S]&1#DS-3,L)B8N-"T?$PK_]>SB -MULW%P<7#NKG`P<#&S]ON_0()%R,J,CL_/#@V-3$N+C`R+2`8%@\$^^_CV\_$ -MP;ZYO'AL1`?;QW\K&R,;%P[VYNK[%SM;< -MYO8$#A4>+#H]-2\R/#\W,"XH)R8A&QD5#/_KUWT`!4E*2PO -M,#,Y/3PW+BOW``L8("$D+#4W-C;U`0D0%!DF,3$M+2\M)2`E*RXI'A41 -M"?_\_//DV]7,QLC.TM'-RL_9X>CT_@$%$!LB*2\V-RP?'2(E*"HF(!H1"03] -M^//IW=+,S-+2T,_-S,_7X.OU_0$$"A0@*S,T+R@C(R,A)"@F'QD5#@)RTM*2&101$@\&_?7KX-G6V=O9 -MU=+0T]C>XN?O]?K_!A(@)R(!\>'R$>%A$4%Q@7%0\'_O?Q[>GHY^3@W=S>X>/CY.;K\/;^!PT1 -M%A84%QXA(1\;%Q43$A,5%`X&`/GT\O#JYN+>WN'CX^7FYN?I[//_"`T/$1,6 -M&1L;'!P9%105%185$0H#_?KY]_+LY^/AX>'BY>CGYNCL\/?^`@<,#@\3&1P< -M&QH6$A`2%!84$`P&`?SX]?/NZ.7DY.7HZ.;GY^CJ\/D`!`8)#0X1%1@;&Q@4 -M$A,3$A,2#0@%`P#]^?3MZ>;EY>?JZ^KIZ.GM\O?[`04("PX3%A86%A01#Q(5 -M%1,0#`@$`/[]^_CR[.GHZ.GK[.KIZ^WO\OC]_P`#"`T3%185%!$/#A`1$1(1 -M#0@#`0'^^O;R[NWL[.WN[.KJZ^WR]OK]_@`#!@H.$104$A`/$`\/#PT+"0@' -M!0+^_/GR[>SM[_#P[^_N[>[R]??Z_@($!PL/$`\-#0X.#@\1$`T*!P4#`P(! -M_?CU\_#O[_#P\._O\?/T]_KY^OX"!@H-#@\.#`L+#0T,#0T*!P<&`P'__?GV -M]//S\_/Q\?'Q\O3V^/K[_?\``P<*"PL,#`L+#`L*"0@'!P<&!0(`_?GW]?7U -M]?7V]//S]/7V^/K[_?\!!`8("`@("0D+"PL)"`<&!00$`P,!_OOY^/?V]O;U -M]O;V]_?Y^OK[_/T`!`8'!P@'!P<'!P@'!P8%!00$`P'__?S[^_KY^?CX]_?W -M^/K[^_O\_?\``0,$!04&!@8&!@4%!`,$!`0#`@$`_OW\_/S[^_OZ^OKZ^OK[ -M_/W]_O\``0("`@,#`P0$!`,#`P("`@("`0$`__[^_?W]_/S\_/W]_?W]_?W^ -M_O\```$!`0$!`0$!`0$!`0$!`0$```#___________________________\` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````````````!#3TU-````$@`! -M```T%@`(0`VL1````````$U!4DL````"``!)3E-4````%#P``'\`?P`````` -M````````````05!03````:A39#)A``(````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`H`````````````````````````````````````````````````````````` -M```````````````````````$"```````"0`C`````````````````'@````$ -M``0```````#\`/___X`````!`0`&455N:71S```````````````````````` -M`````````````````0(`!B!S86UP````%;_^?_[__S_^__\__S__/_]__W__?____X````"``$``P5& -M;'5T90(```!!249&4V0R80`````````````2J0````!!249&4V0R80`````` -M`````````````````````````*<]K;```#8B```!S@"*`(``@0!T`&$`5P!' -M`#X`-P`U`"X`'P`A`!``#``5`!<`'0`8`"(`*0`P`#,`-`!"`$@`/P!#`$4` -M0``R`"X`-@`F`"``)@`<`"``)0`B`"(`(@`@`"D`,``D`!X`&0`-``;__O_V -M__W_^O_S__;_^@`&``T`#P`8`"(`*0`O`#H````:`"D`#P)J`S$`*@`#`FT# -M/0`I``\"00,B`0`````:`"D`#P%0`?$`*@`#`FT#/0`````````````````: -M`"P`%@$^`=P`*@`#`FT#/0`````````````````:```````````````````` -M``````````````````$````!>````'@```!6`'&XO!RF````'`!6``!7```````#__\````\```````$__\` -M``!:```````````````````````````````````````````````````````` -,```````````````` -` -end diff --git a/sys/share/sounds/wdnharp.uu b/sys/share/sounds/wdnharp.uu deleted file mode 100644 index 2f01e106e..000000000 --- a/sys/share/sounds/wdnharp.uu +++ /dev/null @@ -1,282 +0,0 @@ -begin 644 Wooden_Harp -M``M7;V]D96X@2&%R<``````````````````````````````````````````` -M``````````````````````````!!249&4V0R80$``$X`10```````"XB```! -MSJ<]K8^G/:V7``````````````````````````````"!@<\@``!&3U)-```N -M&D%)1D934TY$```L'@`````````````````````````````````````````` -M````````````````````````````````````````____________________ -M________________________________________````````````_____P`` -M`````````````````````/_________________^_O[^_?KX^/T!`O_[\-[, -MP;R\OL"\L:>OQ=37S\6]M[2VN\''S=/8WN/GZ^_Q]/D`"A8B+SM$2U%776%E -M:6UOX./H[?7_"10>)RXS.#Q`1$A+3E%25%9865I; -M7%Q=75Q;6E9/.Q+Q[/+[!`P3&A\A(!T8$@G^Z\.:BX^6GZBOM[N]O+JWM;2U -MN+O`Q,C+SM'4U]G;W=_BY^SU_P@2&R$G+#`T.#P_0D1'24I,3D]045)34U-1 -M3TL_)@/NZ^WQ^/\&#A08&AD6$0G^ZLBEE)*4F)ZEK+*WNKN[N[N\O\+%R,O. -MT-+5U]G;W-W@X^CO]P`)$1D?(RWM[_+W -M_0,)#A$2$`L!\=K!K:6BH*"AHZBML[B]P<7(S-#2U=?9VMKFIJ>KL+6[P<;,T-38V]W>W]_@X>'BXN/DY>?J[_3[`PD0 -M%AH>(20G*2PN,#(T-C;FY^GK[_3Y_P8,$A<;'R$D -M)B@K+2\Q,C0V-SDZ.CDV,"<;#0'X]//S\_3U]OG]`@<+#`L'_O'BTL6]M[6S -ML;"PL+.XO<3,TMC>XN7GZ.CHZ.CHZ>GIZ>OL[_/X_0,)#Q49'!\A)"8H*BPN -M,#(T-3KM[_#P\/#P[^_O[_#P\O3X_`$&#!$6&AT@(B0F*"HL+C`R,S4U-3,P*B,: -M$0D"_?OZ^OO\_?[_`00'"@L*!@#W[>+8T,K&P\+!P+^_P<3*T-??Y>OO\?/S -M\_/S\O+R\O+R]/7X_``%"A`4&!P?(2,E)RHL+C`R,S0T-#(N*2(;$@L%`/W\ -M_/W_``$"`P4'"0L+"`/\\^G@U]',R,;%Q<3$Q("(E)RDK+2\Q,C,S,S$M*"(;$PT'`O_^_O\``0(# -M!`4'"0H*"07_]^[FW=;1S?L\?3V]_CX^/CW]_?W]_CY^_X!!0H/ -M$Q<;'R$C)B@J+"XO,3(Q,2\K)B(;%0\*!@,!``$"!`8'"`@)"@L+"@@$__CP -MZ>+;K\/3V^/GY^?GY^?GY^?GZ_/X!!0D-$A8:'B$C -M)2@J+"XO,3$Q,"XK)R(<%A`,"`0#`@($!0<)"@H+"PP,"PH'`OSU[N?AV]?4 -MTM'1TM/5U]G=X>;J[_/V^/GZ^OKZ^OKZ^OK[_/X!!`@,$!49'2`C)B@J+"XO -M,#$Q,"XK)B$<%Q$-"08$`P,$!@@*"PP,#`T-#`L(!/_Y\NSFX-O7U=/3U-77 -MV=O>X>7I[?'U]_GZ^OO[^_KZ^OO[_/X``P8*#Q,7&Q\B)2VMC7U]?9V][AX^;I[._R]/;X -M^?KZ^OKZ^OO[_/W^`00'"@X3%QL?(B4G*2LL+"TL*RDF(Q\:%A(."@<%!`0$ -M!@@*#`X/#P\.#0P*!P/_^O7PZN;BWMO9V=G;W=_BY>?J[.[P\O3V]_?X^?GY -M^?KZ^_S]``,%"0T1%1D=(20F*"DJ*RLJ*2_Q\O/T]?;W^/CX^?GZ^_S] -M_P(%"`P0%!@<(",F*"DI*BDH)R4B'QP8%1$."PD'!@4&!P@+#0\1$A(1$`X, -M"08#__KV\>WIY>+@WMW>W^'DY^KL[O#Q\O/T]/7V]_?X^/GY^OO]_P$$!PL/ -M$Q<;'R(D)B&Q@5$0\,"0<&!00$!08("@T/$!$1$1`.#`D&`__\^/3P[.GFY.+AX>+D -MYNGL[O#R\_/S\_/T]/3U]O?W^/K[_/X!!`8)#1$5&!P>(2,C(R,B(1\=&A<4 -M$0X+"0<%!`0$!`4'"0P.$!$2$1`/#0H(!`'^^O;S[^OIYN3CX^/DYNGL[O#R -M\_3T]/3T]/3U]O?W^/G[_/X``@4)#`\3%AD='R$B(B(A(!X<&1<4$0X+"0<% -M!`,#!`4&"`L-#Q`1$1$/#@L)!@,`_/CU\>WKZ.;EY.3DYNCK[?#R\_3T]/3T -M]/3U]?;W^/GZ_/W_`@0'"@X1%!<:'1\@(2$@'QT;&!83$`T*"`8$`P("`@,% -M!PD+#@\0$1`0#@P*!P0!_?KV\^_LZNCFY>3EYN?I[._Q\O/T]/3T]/3T]?7V -M]_CY^_S^``(%"`L/$A48&AP>'Q\>'1L9%Q01#PP)!P4#`@$!`0(#!0<)#`X/ -M$!`/#@P*!P0"_OOX]/'MZ^GGYN7EY>?IZ^WO\?/S]/3S\_/S]/3U]O?X^OO] -M_P$#!@D,#Q(5&!H<'1T='!H8%A,0#@L(!@0"`0`````"`P4("@P.#P\/#@P* -M"`8#`/WY]O+O[.KHY^;EY>;HZNSN\/+S]/3T\_/S]/3U]O?X^?O\_@`"!0@* -M#1`3%A@:&QL;&AD7%1(/#0H'!0,!`/___P`!`@0'"0L-#@\.#@T+"0<$`?[[ -M^/7Q[NSJZ.?FYN?HZNSN\/+S]/3T]/3T]/3U]O?X^?K\_@`"!`<*#`\2%!88 -M&AH:&A@7%1(0#0H(!0,!`/_^_O\``0,%"`H,#0X.#@T,"@@%`P#]^?;S\.WK -MZ>CGY^?HZ>OM[_'S]/3T]/3T]/3U]O?X^?K[_?\!`P4("PX0$Q46&!D9&1@6 -M%!(/#`D'!`(`__[]_?[_``($!@D+#`T.#@T,"@@&!`'^^_CU\N_MZ^GHZ.?H -MZ>KL[O#R\_3T]/3T]/3T]?;W^/G[_/X``@0&"0P.$1,4%A<7%Q85$Q$."P@& -M`P'__OW\_/S]_@`"!0<)"PP-#0P+"@D&!`+_^_GV\O#MZ^KIZ.CHZ.KK[>_Q -M\O/T]/3T\_3T]/7V]_CZ^_W_`0,%!PH,#A`2%!45%144$@\-"P@%`P'__?S[ -M^_O\_?\!`P4'"0L,#`P+"@D'!0,`_?KW]/'O[>OIZ.CHZ.GK[.[P\?/S]/3T -M]/3T]/7V]_CY^_S^``($!@@+#0\1$A,4%!03$0\-"@<%`@#^_?S[^_O[_/X` -M`@0&"`H+#`P+"@D(!@0!__SY]O/P[NSKZNGIZ>KK[.[O\?+S]/3T]/3T]?7V -M]_CY^_S^``($!@@*#`X0$1,3$Q,2$0\-"@@%`P#^_?S[^OK[_/W_`0,&"`D+ -M#`P,"PH)!P4"`/[[^/7R\.[LZ^KJZNKK[.WO\?+S]/3U]?7U]?;V]_CY^_S^ -M_P$#!0<)"PT/$!$2$A(2$`\-"@<%`@#^_?OZ^OKZ^_S^``(%!PD*"PP+"PH) -M"`8$`?_\^??T\>_M[.OJZNKK[.WN\/'S]/3U]?7U]?;V]_CY^OS]_P`"!`8( -M"@P-#Q`1$1$0#PX,"@<$`@#^_/OZ^?GY^OO]_P$#!0<)"@H+"PH)"`8$`@#] -M^O?U\_#N[>OJZNKKZ^SN[_#R\_3T]?7U]?7V]O?X^OO\_O\!`P4'"0H,#0X/ -M$!`/#@T+"08$`O_]^_KY^/CX^?K\_?\"!`8'"0H*"@H)"`8%`P#^_/GV]/'O -M[NSKZ^OKZ^SM[_#Q\O/T]/7U]?7V]O?X^?O\_?\!`@0&"`D+#`T.#P\.#0P+ -M"08$`O_]^_KY^/CX^?G[_?X!`P4'"`D*"@H)"`<%!`+__?OX]?/Q[^WL[.OK -M[.SM[_#Q\O/T]?7U]O;V]_CX^OO\_O\!`@0&!PD*#`T-#@X.#0P+"0<$`@#^ -M_/KY^/CX^?G[_/X``@0&"`D*"@H*"0@'!0,!__SZ^/7S\>_N[>WM[>WN[_#Q -M\O/T]?;V]O?W^/CY^OO\_O\!`@0%!P@*"PP-#0T-#0P*"0<$`@#^_/OY^/CX -M^/GZ_/W_`0,%!P@)"@H*"0@'!@0"`/[[^??T\O'O[N[M[>WN[_#Q\O/T]?;V -M]_?W^/CY^OO\_O\``@,%!@@)"@L,#`T,#`L*"`8$`@#^_/KY^/CX^/GZ^_S^ -M``($!@<("0D)"0@'!@4#`?_]^OCV]/+P[^[N[>[N[^_P\?/T]?7V]_?W^/CY -M^OO\_?X``0,$!0<("0H+"PL+"PH)!P8$`@#^_/KY^/?W]_CY^OO]_P$#!08' -M"`D)"0@'!@4#`@#]^_GW]?/Q\._N[N[N[^_P\?+S]/7V]O?W^/CY^OO\_?[_ -M`0(#!08'"`D*"@L+"@D(!P4$`@#^_/KY^/?W]_CX^OO]_@`"!`4'"`@)"0@( -M!P8$`P'__?OX]O3S\?#O[^_O[_#P\?+S]/7V]_?X^/GY^OO\_?[_`0($!08' -M"`D*"@H*"@D(!P4$`@#^_/OY^/CW]_CY^OO\_@`"!`4'"`@)"0D("`<%!`(` -M_OSZ^/;U\_+Q\/#P\/#Q\O/T]?;V]_CY^?KZ^_S\_?\``0($!08'"`D*"@H* -M"@D(!P8$`@'__?OZ^?CX^/CY^OO\_@`!`P4&!P@)"0D)"`<&!0,"`/[\^OCV -M]//R\?'Q\?'Q\O/T]?;V]_CY^?K[^_S]_O\``0($!08'"`D)"@H*"0D(!P4$ -M`@'__?SZ^?CX^/CX^?K\_?\!`@0%!P@("0D)"`<'!@0"`?_]^_GW]O3S\O'Q -M\?'Q\O/S]/7V]_CY^?KZ^_S\_?[_`0(#!`4&!P@("0D)"`@'!@4#`@#^_?OZ -M^?CW]_?X^?K[_/X``0,$!@<'"`@("`<'!@0#`0#^_/KX]O7T\_+Q\?'R\O/S -M]/7V]_CX^?KZ^_S\_?[_``$#!`4&!P<("`@("`<&!@0#`@#^_?OZ^?CX]_?X -M^/GZ_/W_`0($!08'"`@("`@'!@4$`@'__?OY^/;U]//R\O+R\O/S]/7V]_CX -M^?K[^_S]_O[_``$#!`4&!@<("`@("`<&!00#`@#__?S[^OGX^/CX^?GZ_/W_ -M``(#!08'!P@("`@(!P8%!`(`__W[^OCW]?3T\_/S\_3T]?;V]_CY^OO\_/W^ -M_O\``0(#!`4&!P<("`@("`<'!@4#`@'__OS[^OGY^/CX^?K[_/W_``(#!08' -M!P@("`@("`<&!0,"`/[]^_KX]_;U]/3T]/3U]?;W^/CY^OO\_?W^__\``0(# -M!`4&!P<("`@("`<'!@4#`@'__OW[^_KY^/CY^?KZ_/W^``$#!`4&!P@("`@( -M"`<&!00#`?_^_/OY^/?V]?7T]/7U]?;W]_CY^OO\_/W^__\``0(#!`4%!@<' -M"`@(!P<&!00#`@#__OS[^OGY^/CX^?GZ^_S]_P`"`P0%!@<'"`@(!P<&!00# -M`@#^_?OZ^/?V]O7U]?7U]?;V]_CY^?K[_/W^_O\``0$"`P0%!@8'!P<'!P8& -M!00#`0#__?S[^OGY^/CX^/GZ^_S]_@`!`@0%!08'!P<'!P<&!@4$`@'__OS[ -M^OCW]_;U]?7U]O;W]_CY^OK[_/W^__\``0("`P0%!@8'!P<'!P8&!00#`0#_ -M_OW[^_KY^?CX^?GZ^_S]_O\!`@,$!08'!P<'!P<'!@4$`P(!__[\^_KY^/?W -M]O;V]O?W^/CY^OO\_?[^_P`!`0(#!`0%!@8'!P<'!P<&!00#`@$`_OW\^_KZ -M^?GY^?KZ^_S]_O\!`@,$!08'!P@("`@'!P8%!`,"`?_^_/OZ^?CX]_?W]_?X -M^/GZ^OO\_?[__P`!`@(#!`4%!@<'!P<'!P<&!00#`@$`__[\_/OZ^OGY^?KZ -M^_S]_O\``@,$!08&!P<("`@(!P<&!00#`0#__?S[^OGX^/CX^/CX^/GZ^OO\ -M_?[__P`!`@(#!`0%!@8'!P<'!P8&!00#`@$`__W\^_OZ^OGY^?KZ^_O\_?X` -M`0(#!`4%!@<'!P<'!P8&!00#`@#__OW[^OKY^/CX^/CX^/GY^OO[_/W^_P`! -M`0(#`P0%!08&!@<&!@8%!00#`@#__OW\^_OZ^?GY^?GZ^OO\_?[_``$"`P0% -M!08&!P<'!P8&!00#`@$`__W\^_KY^?CX^/CX^/GY^OO[_/W^_P`!`0(#`P0% -M!08&!@8&!@8%!00#`@$`_OW\_/OZ^OGY^?GZ^OO\_?[_``$"`P0$!08&!P<' -M!P<&!@4$`P(!`/[]_/OZ^OGY^?GY^?GZ^OO\_/W^_P`!`@(#!`0%!@8&!P<' -M!P8&!00#`@$`__[]_/O[^OKZ^OKZ^_O\_?[_``$"`P0$!08&!P<'!P<'!@8% -M!`,"`0#__OS\^_KZ^OGY^OKZ^_O\_?[__P`!`@,#!`4%!@8'!P<'!P8&!00$ -M`P(`__[^_?S[^_OZ^OO[^_S\_?[_``$"`P,$!08&!@<'!P<'!@8%!00#`@#_ -M_OW\_/O[^OKZ^OK[^_O\_?[^_P`!`@,#!`4%!@8&!P<'!P8&!00#`P(`___^ -M_?S[^_OZ^OK[^_O\_?[^_P`!`@,$!`4%!@8&!P<&!@8%!`0#`@$`__[]_/O[ -M^OKZ^OKZ^_O\_/W^_P```0(#`P0%!08&!@8&!@8%!00#`@$`__[]_/S[^_KZ -M^OKZ^_O\_/W^__\``0(#`P0%!04&!@8&!@8%!00#`@$`__[]_/S[^_KZ^OKZ -M^_O[_/W^_O\``0("`P0$!04&!@8&!@8%!00#`@$`__[^_?S[^_OZ^OKZ^_O\ -M_/W^_O\``0("`P0$!04&!@8&!@8%!00#`P(!`/_^_?S\^_O[^_O[^_O\_/W^ -M__\``0(#`P0$!04&!@8&!@8%!00#`P(!`/_^_?W\_/O[^_O[^_S\_?W^__\` -M`0("`P0$!04&!@8&!@8&!04$`P,"`0#__OW]_/S\^_O\_/S\_?W^_P```0(# -M!`0%!08&!@8&!@8&!04$`P(!`/___OW\_/S[^_O[_/S\_?W^__\``0("`P0$ -M!04&!@8&!@8&!@4%!`,"`0$`__[^_?S\_/S\_/S]_?[^_P```0(#`P0%!08& -M!@8&!@8&!04$`P(!``#__OW]_/S\^_O\_/S\_?W^__\``0$"`@,$!`4%!08& -M!@8&!@4%!`,#`@$`__[^_?W\_/S\_/S\_?W^_O\``0$"`P,$!04%!@8&!@4% -M!00#`P(!`/_^_OW\_/S[^_O[^_S\_/W]_O__```!`@(#`P0$!04%!04%!04$ -M!`,"`@$`___^_?W\_/S\_/S\_/W]_O__``$"`@,$!`4%!04%!04%!`0#`P(! -M`/_^_OW\_/S[^_O[^_S\_/W]_O[_```!`0("`P,$!`4%!04%!04%!`,#`@$! -M`/_^_OW]_/S\_/S\_?W^_O__``$!`@,#!`0%!04%!04%!`0#`P(!``#__OW] -M_/S\_/S\_/S\_?W^_O__```!`0(#`P0$!`4%!04&!04%!00$`P(!`0#___[^ -M_?W]_?W]_?[^__\```$"`@,$!`4%!08&!@4%!00$`P("`0#___[]_?W\_/S\ -M_/S]_?W^_O__```!`0("`P,$!`4%!04&!@4%!00$`P,"`0$`___^_O[]_?W] -M_O[^__\```$"`@,$!`4%!08&!@4%!00$`P,"`0``__[^_?W]_/S\_/W]_?W^ -M_O__```!`0("`P,#!`0%!04%!04%!04$!`,"`@$``/_^_O[]_?W]_?[^_O__ -M``$!`@,#!`0$!04%!04%!`0#`P(!`0#___[]_?S\_/S\_/S\_?W]_O[__P`` -M``$!`@(#`P,$!`0$!04%!`0$`P,"`0$``/_^_O[]_?W]_?W^_O[__P`!`0(" -M`P0$!`0%!00$!`0#`P(!`0#__O[]_?S\_/S\_/S\_/W]_?[^__\```$!`0(" -M`P,#!`0$!`0$!`0$`P,"`@$!`/___O[^_?W]_?W^_O[__P```0("`P,$!`0$ -M!00$!`0#`P(!`0#___[^_?W\_/S\_/S\_?W]_O[^__\````!`0("`P,#!`0$ -M!`4%!`0$!`,#`@(!`0``___^_O[^_O[^_O__```!`0(#`P0$!`4%!04%!`0$ -M`P,"`0$`___^_OW]_?W]_?W]_?W^_O[___\```$!`@("`P,#!`0$!04%!04$ -M!`0#`P("`0$``/____[^_O[_____```!`0(#`P0$!`4%!04%!`0$`P,"`0$` -M`/_^_O[]_?W]_?W]_?W^_O[___\```$!`0("`@,#`P0$!`0%!04$!`0#`P," -M`0$```#______O[^____```!`0("`P,$!`0$!`0$!`0#`P("`0$`___^_OW] -M_?W]_/W]_?W]_?[^_O___P```0$!`@("`P,#!`0$!`0$!`,#`P("`0$``/__ -M__[^_O[^_O[__P````$!`@(#`P0$!`0$!`,#`P(!`0``__[^_OW]_?S\_/S\ -M_?W]_?W^_O[__P`````!`0("`@,#`P,#!`0$`P,#`P("`0$``/_____^_O[^ -M_O___P````$!`@(#`P,$!`0$`P,#`@(!`0``___^_OW]_?W\_/S]_?W]_?[^ -M_O[___\````!`0$"`@(#`P,#!`0$!`,#`P("`@$!````_____________P`` -M`0$"`@(#`P0$!`0$!`0#`P("`0$``/___O[^_?W]_?W]_?W]_O[^_____P`` -M``$!`0("`@,#`P,$!`0$!`0$`P,#`@(!`0$```#_________`````0$"`@,# -M`P0$!`0$!`0#`P,"`@$!``#___[^_OW]_?W]_?[^_O[^_____P````$!`0$" -M`@(#`P,#!`0$!`0$`P,#`@("`0$`````________`````0$!`@(#`P,$!`0$ -M!`0#`P,"`@$!``#___[^_OW]_?W]_?W^_O[^_O[___\``````0$!`0("`@(# -M`P,#`P,#`P,"`@(!`0$```#___________\````!`0("`@,#`P,#`P,#`@(" -M`0$``/___O[^_?W]_?W]_?W]_?W^_O[^_____P`````!`0$!`@("`@,#`P,# -M`P("`@(!`0```/______________`````0$"`@(#`P,#`P,#`@("`0$``/__ -M_O[^_?W]_?W]_?W]_?W^_O[^______\``````0$!`0("`@(#`P,#`P,"`@(! -M`0$`````__________\````!`0$"`@(#`P,#`P,#`P("`0$!``#____^_O[^ -M_?W]_?[^_O[^_O[_____```````!`0$!`@("`@,#`P,#`P,#`P("`@$!`0`` -M````_P````````$!`0("`@,#`P,#`P,#`P,"`@$!````_____O[^_O[^_O[^ -M_O[^_O______```````!`0$!`@("`@,#`P,#`P,#`P("`@(!`0$````````` -M```````!`0("`@(#`P,#`P,#`P("`@$!````_____O[^_O[^_O[^_O[^_O[_ -M_____P````````$!`0("`@("`@,#`P,"`@("`@$!`0````#_______\````` -M`0$!`0("`@(#`@("`@("`0$```#____^_O[^_?W]_?W]_?[^_O[^_O[_____ -M_P```````0$!`0$"`@("`@("`@("`0$!`````/___________P````$!`0$" -M`@("`@("`@(!`0$```#___[^_O[^_?W]_?W]_O[^_O[^_O[_______\````` -M``$!`0$"`@("`@("`@("`0$!`0````#__________P`````!`0$"`@("`@(" -M`@("`0$!``#______O[^_O[^_O[^_O[^_O[_________```````!`0$!`0(" -M`@("`@("`@("`@(!`0$!`````````````````0$!`0("`@("`@,"`@("`@$! -M`0```/_____^_O[^_O[^_O[^_________P`````````!`0$!`0("`@("`@(" -M`@("`@("`0$!`0$``````````````0$!`0("`@("`@("`@("`@$!`0```/__ -M___^_O[^_O[^_O[^_O________\``````````0$!`0$"`@("`@("`@("`@(! -M`0$!`0`````````````````!`0$!`0("`@("`@(!`0$!``#______O[^_O[^ -M_O[^_O[^_O[^_O___________P````````$!`0$!`0("`@("`0$!`0$````` -M`/________\```````$!`0$!`0$!`0$!`0$```#____^_O[^_O[^_O[^_O[^ -M_O[^_O[^__________\```````$!`0$!`0$!`@(!`0$!`0$```````#_____ -M__\```````$!`0$!`0$!`0$!`0$`````_____O[^_O[^_O[^_O[^_O[^_O[_ -M_________P````````$!`0$!`@("`@("`@("`0$!`0$````````````````! -M`0$!`0$"`@("`@(!`0$!`````/_______O[^_O[^_O[^____________```` -M`````````0$!`0$"`@("`@("`@("`@(!`0$!`0````````````$!`0$!`0(" -M`@("`@("`0$!`0````#________^_O[^_O[______________P`````````` -M``$!`0$!`@("`@("`@("`@$!`0$!`0```````````````0$!`0$!`0$!`0$! -M`0$!`````/_____^_O[^_O[^_O[^_O[^_O[^____________``````````$! -M`0$!`0$!`0$!`0$!`0$```````````````````````$!`0$!`0$!``````#_ -M______[^_O[^_O[^_O[^_O[^_O[^_O[___________\``````````0$!`0$! -M`0$!`0$!`0````````````````````````$!`0$!`0$!`0````#_______[^ -M_O[^_O[^_O[^_O[^_O[^_O____________\````````!`0$!`0$!`0$!`0$! -M`0$!`0````````````````$!`0$!`0$!`0$!`0$!``````#________^__[^ -M_O[^_________________P````````````$!`0$!`0$"`@("`@(!`0$!`0$! -M`0`````````!`0$!`0$!`0$!`0$!`0$!`0``````____________________ -M_____________P````````````$!`0$!`0$!`@("`0(!`0$!`0$!`0`````` -M`````0$!`0$!`0$!`0$!`0$!``````#__________O[^_O[^_O[^________ -M_____________P`````````!`0$!`0$!`0$!`0$!`0`````````````````` -M`````0$!`0$`````````_______^_O[^_O[^_O[^_O[^_O[^_O[^_O______ -M_________P`````````!`0$!`0$!`0$````````````````````````````` -M`0``````````_________O[^_O[^_O[^_O[^_O[^_O[^________________ -M_P`````````!`0$!`0$!`0$!`0$````````````````````!`0$!`0$!`0$` -M````````________________________________________```````````` -M`0$!`0$!`0$!`0$!`0$!`0$!`0```````0$!`0$!`0$!`0$!`0$!`0`````` -M`/___________________________________P```````````````0$!`0$! -M`0$!`0$!`0$!`0$!`0```````0$!`0$!`0$!`0$!`0$!`````````/______ -M__________________________________\```````````````$!`0$!`0$! -M`0```````````````````````````````````````/____________[^_O[^ -M_O[^_O[^_O[^_O___________________P`````````````````````````` -M````````````````````````````````______________[^_O[^_O[^_O[^ -M_O[______________________P`````````````````````````````````` -M``````````````````````````#_________________________________ -M_____________P`````````````!`0$!`0$!`0$!`0$!``````````````$! -M`0$!`0$!`0$!````````````__________________________________\` -M`````````````````0$!`0$!`0$!`0$!`0$!`0$!`````````0$!`0$!`0$! -M`0$`````````````______________________________________\````` -M``````````````$!`0$!`0$!```````````````````````````````````` -M`/_______________________________________________________P`` -M``````````````````````````````````````````````````#_________ -M______________[___________________________________\````````` -M````````````````````````````````````````````________________ -M____________________________________`````````````````0`!`0$! -M`0``````````````````````````````````````````________________ -M________________``````````````````````````$!`0$!`0$!`0$!`0$! -M`0$``````````````````````````````````/______________________ -M__________\```````````````````````````$!`0$!`0$````````````` -M``````````````````````#_____________________________________ -M__________________\````````````````````````````````````````` -M`````````/__________________________________________________ -M______________\````````````````````````````````````````````` -M`/__________________________________________________________ -M_P`````````````````````````````````````````````````````````` -M`````/________________________________\````````````````````` -M```````!`0$!`0$!`0$!`0$!`0`````````````````````````````````` -M``#______________________P`````````````````````````````````` -M``$!`0$!`0$!`0$```````````````````````````````#_____________ -M________________________________________```````````````````` -M``````````````````````````````#_____________________________ -M______________________________________\````````````````````` -M`````````````````````/______________________________________ -M____________________________```````````````````````````````` -M``````````````````````````#_________________________________ -M````````````````0T]-30```!(``0``+!8`"$`-K$0```````!-05)+```` -M`@``24Y35````!0\``!_`'\``````````````````$%04$P```&H4V0R80`" -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````/@```````````````````````````` -M````````````````````````````````````````````````````!`@````` -M``D`(P````````````````!X````!``$``````"[_`#___^``````0&H!E%5 -M;FET````'@```!6`&X`9P!:`$L`.P`H -M``W_Y_^W_W7_)/Z^_D+]M/TI_,8$2&%R<($"````04E&1E-D,F$````````` -M````$J<`````04E&1E-D,F$```````````````````````````````"G/:V/ -M```N(@``` lst) + if ((nxt = strchr(p, '|')) == 0 || nxt > lst) nxt = lst; if ((long) (nxt - p) == (long) n && strncmp(p, nam, n) == 0) return lst; @@ -220,8 +212,7 @@ char *ent; /* look up a numeric entry */ int -tgetnum(which) -const char *which; +tgetnum(const char *which) { const char *q, *p = tc_field(which, &q); char numbuf[32]; @@ -239,8 +230,7 @@ const char *which; /* look up a boolean entry */ int -tgetflag(which) -const char *which; +tgetflag(const char *which) { const char *p = tc_field(which, (const char **) 0); @@ -249,9 +239,7 @@ const char *which; /* look up a string entry; update `*outptr' */ char * -tgetstr(which, outptr) -const char *which; -char **outptr; +tgetstr(const char *which, char **outptr) { int n; char c, *r, *result; @@ -260,7 +248,7 @@ char **outptr; if (!p || p[2] != '=') return (char *) 0; p += 3; - if ((q = index(p, ':')) == 0) + if ((q = strchr(p, ':')) == 0) q = p + strlen(p); r = result = *outptr; while (p < q) { @@ -326,15 +314,13 @@ char **outptr; /* look for a particular field name */ static const char * -tc_field(field, tc_end) -const char *field; -const char **tc_end; +tc_field(const char *field, const char **tc_end) { const char *end, *q, *p = tc_entry; end = p + strlen(p); while (p < end) { - if ((p = index(p, ':')) == 0) + if ((p = strchr(p, ':')) == 0) break; ++p; if (p[0] == field[0] && p[1] == field[1] @@ -343,7 +329,7 @@ const char **tc_end; } if (tc_end) { if (p) { - if ((q = index(p + 2, ':')) == 0) + if ((q = strchr(p + 2, ':')) == 0) q = end; } else q = 0; @@ -356,20 +342,17 @@ static char cmbuf[64]; /* produce a string which will position the cursor at if output */ char * -tgoto(cm, col, row) -const char *cm; -int col, row; +tgoto(const char *cm, int col, int row) { return tparam(cm, cmbuf, (int) (sizeof cmbuf), row, col, 0, 0); } /* format a parameterized string, ala sprintf */ char * -tparam(ctl, buf, buflen, row, col, row2, col2) -const char *ctl; /* parameter control string */ -char *buf; /* output buffer */ -int buflen; /* ought to have been `size_t'... */ -int row, col, row2, col2; +tparam(const char *ctl, /* parameter control string */ + char *buf, /* output buffer */ + int buflen, /* ought to have been `size_t'... */ + int row, int col, int row2, int col2) { int atmp, ac, av[5]; char c, *r, *z, *bufend, numbuf[32]; @@ -412,7 +395,7 @@ int row, col, row2, col2; LF from becoming CR+LF, for instance; only makes sense if this is a cursor positioning sequence, but we have no way to check that */ - while (index("\004\t\n\013\f\r", *r)) { + while (strchr("\004\t\n\013\f\r", *r)) { if (ac & 1) { /* row */ if (!UP || !*UP) break; /* can't fix */ @@ -501,14 +484,13 @@ int row, col, row2, col2; /* send a string to the terminal, possibly padded with trailing NULs */ void -tputs(string, range, output_func) -const char *string; /* characters to output */ -int range; /* number of lines affected, used for `*' delays */ -int FDECL((*output_func),(int)); /* actual output routine; +tputs(const char *string, /* characters to output */ + int range, /* number of lines affected, used for `*' delays */ + int (*output_func)(int)) /* actual output routine; * return value ignored */ { - register int c, num = 0; - register const char *p = string; + int c, num = 0; + const char *p = string; if (!p || !*p) return; diff --git a/sys/share/unixtty.c b/sys/share/unixtty.c index 3196f3b3d..aa62a477d 100644 --- a/sys/share/unixtty.c +++ b/sys/share/unixtty.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 unixtty.c $NHDT-Date: 1570652308 2019/10/09 20:18:28 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.26 $ */ +/* NetHack 5.0 unixtty.c $NHDT-Date: 1596498288 2020/08/03 23:44:48 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.27 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -11,6 +11,9 @@ #define NEED_VARARGS #include "hack.h" +#if defined(TTY_GRAPHICS) && !defined(NOTTYGRAPHICS) +#include "wintty.h" +#endif /* * The distinctions here are not BSD - rest but rather USG - rest, as @@ -38,7 +41,6 @@ #endif /* POSIX_TYPES */ #ifdef LINUX #include -#undef delay_output /* curses redefines this */ #include #endif #define kill_sym c_cc[VKILL] @@ -131,14 +133,12 @@ struct tchars inittyb2, curttyb2; * used unconditionally because it conflicts with the 'bool' one. */ #ifdef NEED_HAS_COLORS_DECL -int has_colors(); +int has_colors(void); #endif #if defined(TTY_GRAPHICS) && ((!defined(SYSV) && !defined(HPUX)) \ || defined(UNIXPC) || defined(SVR4)) -#ifndef LINT extern /* it is defined in libtermlib (libtermcap) */ -#endif short ospeed; /* terminal baudrate; set by gettty */ #else short ospeed = 0; /* gets around "not defined" error message */ @@ -154,8 +154,7 @@ struct termstruct inittyb, curttyb; #ifdef POSIX_TYPES static int -speednum(speed) -speed_t speed; +speednum(speed_t speed) { switch (speed) { case B0: @@ -197,7 +196,7 @@ speed_t speed; #endif static void -setctty() +setctty(void) { if (STTY(&curttyb) < 0 || STTY2(&curttyb2) < 0) perror("NetHack (setctty)"); @@ -209,7 +208,7 @@ setctty() * Called by startup() in termcap.c and after returning from ! or ^Z */ void -gettty() +gettty(void) { if (GTTY(&inittyb) < 0 || GTTY2(&inittyb2) < 0) perror("NetHack (gettty)"); @@ -231,10 +230,12 @@ gettty() /* reset terminal to original state */ void -settty(s) -const char *s; +settty(const char *s) { - end_screen(); +#ifdef TTY_GRAPHICS + if (WINDOWPORT(tty)) + term_end_screen(); +#endif if (s) raw_print(s); if (STTY(&inittyb) < 0 || STTY2(&inittyb2) < 0) @@ -247,7 +248,7 @@ const char *s; } void -setftty() +setftty(void) { unsigned ef, cf; int change = 0; @@ -259,7 +260,7 @@ setftty() /* Should use (ECHO|CRMOD) here instead of ECHO */ if ((unsigned) (curttyb.echoflgs & ECHO) != ef) { curttyb.echoflgs &= ~ECHO; - /* curttyb.echoflgs |= ef; */ + /* curttyb.echoflgs |= ef; */ change++; } if ((unsigned) (curttyb.cbrkflgs & CBRKMASK) != cf) { @@ -311,14 +312,18 @@ setftty() if (change) setctty(); - start_screen(); + +#ifdef TTY_GRAPHICS + if (WINDOWPORT(tty)) + term_start_screen(); +#endif } -void intron() /* enable kbd interupts if enabled when game started */ +void intron(void) /* enable kbd interrupts if enabled when game started */ { #ifdef TTY_GRAPHICS /* Ugly hack to keep from changing tty modes for non-tty games -dlc */ - if (WINDOWPORT("tty") && intr_char != nonesuch + if (WINDOWPORT(tty) && intr_char != nonesuch && curttyb2.intr_sym != '\003') { curttyb2.intr_sym = '\003'; setctty(); @@ -326,11 +331,11 @@ void intron() /* enable kbd interupts if enabled when game started */ #endif } -void introff() /* disable kbd interrupts if required*/ +void introff(void) /* disable kbd interrupts if required*/ { #ifdef TTY_GRAPHICS /* Ugly hack to keep from changing tty modes for non-tty games -dlc */ - if (WINDOWPORT("tty") && curttyb2.intr_sym != nonesuch) { + if (WINDOWPORT(tty) && curttyb2.intr_sym != nonesuch) { curttyb2.intr_sym = nonesuch; setctty(); } @@ -349,16 +354,16 @@ int sco_flag_console = 0; int sco_map_valid = -1; unsigned char sco_chanmap_buf[BSIZE]; -void NDECL(sco_mapon); -void NDECL(sco_mapoff); -void NDECL(check_sco_console); -void NDECL(init_sco_cons); +void sco_mapon(void); +void sco_mapoff(void); +void check_sco_console(void); +void init_sco_cons(void); void -sco_mapon() +sco_mapon(void) { #ifdef TTY_GRAPHICS - if (WINDOWPORT("tty") && sco_flag_console) { + if (WINDOWPORT(tty) && sco_flag_console) { if (sco_map_valid != -1) { ioctl(0, LDSMAP, sco_chanmap_buf); } @@ -368,10 +373,10 @@ sco_mapon() } void -sco_mapoff() +sco_mapoff(void) { #ifdef TTY_GRAPHICS - if (WINDOWPORT("tty") && sco_flag_console) { + if (WINDOWPORT(tty) && sco_flag_console) { sco_map_valid = ioctl(0, LDGMAP, sco_chanmap_buf); if (sco_map_valid != -1) { ioctl(0, LDNMAP, (char *) 0); @@ -381,7 +386,7 @@ sco_mapoff() } void -check_sco_console() +check_sco_console(void) { if (isatty(0) && ioctl(0, CONS_GET, 0) != -1) { sco_flag_console = 1; @@ -389,19 +394,17 @@ check_sco_console() } void -init_sco_cons() +init_sco_cons(void) { #ifdef TTY_GRAPHICS - if (WINDOWPORT("tty") && sco_flag_console) { + if (WINDOWPORT(tty) && sco_flag_console) { atexit(sco_mapon); sco_mapoff(); - load_symset("IBMGraphics", PRIMARY); + load_symset("IBMGraphics", PRIMARYSET); load_symset("RogueIBM", ROGUESET); switch_symbols(TRUE); -#ifdef TEXTCOLOR if (has_colors()) iflags.use_color = TRUE; -#endif } #endif } @@ -413,33 +416,33 @@ init_sco_cons() int linux_flag_console = 0; -void NDECL(linux_mapon); -void NDECL(linux_mapoff); -void NDECL(check_linux_console); -void NDECL(init_linux_cons); +void linux_mapon(void); +void linux_mapoff(void); +void check_linux_console(void); +void init_linux_cons(void); void -linux_mapon() +linux_mapon(void) { #ifdef TTY_GRAPHICS - if (WINDOWPORT("tty") && linux_flag_console) { + if (WINDOWPORT(tty) && linux_flag_console) { write(1, "\033(B", 3); } #endif } void -linux_mapoff() +linux_mapoff(void) { #ifdef TTY_GRAPHICS - if (WINDOWPORT("tty") && linux_flag_console) { + if (WINDOWPORT(tty) && linux_flag_console) { write(1, "\033(U", 3); } #endif } void -check_linux_console() +check_linux_console(void) { struct vt_mode vtm; @@ -449,37 +452,51 @@ check_linux_console() } void -init_linux_cons() +init_linux_cons(void) { #ifdef TTY_GRAPHICS - if (WINDOWPORT("tty") && linux_flag_console) { + if (WINDOWPORT(tty) && linux_flag_console) { atexit(linux_mapon); linux_mapoff(); -#ifdef TEXTCOLOR if (has_colors()) iflags.use_color = TRUE; -#endif } #endif } #endif /* __linux__ */ +DISABLE_WARNING_FORMAT_NONLITERAL + #ifndef __begui__ /* the Be GUI will define its own error proc */ /* fatal error */ -/*VARARGS1*/ -void error -VA_DECL(const char *, s) +void +error(const char *s, ...) { - VA_START(s); - VA_INIT(s, const char *); + va_list the_args; + va_start(the_args, s); if (iflags.window_inited) exit_nhwindows((char *) 0); /* for tty, will call settty() */ if (settty_needed) settty((char *) 0); - Vprintf(s, VA_ARGS); + Vprintf(s, the_args); (void) putchar('\n'); - VA_END(); + va_end(the_args); exit(EXIT_FAILURE); } #endif /* !__begui__ */ + +RESTORE_WARNING_FORMAT_NONLITERAL + +#ifdef ENHANCED_SYMBOLS +/* + * set in term_start_screen() and allows + * OS-specific changes that may be + * required for support of utf8. + */ +void +tty_utf8graphics_fixup(void) +{ +} +#endif + diff --git a/sys/share/uudecode.c b/sys/share/uudecode.c index b998e4698..a59856925 100644 --- a/sys/share/uudecode.c +++ b/sys/share/uudecode.c @@ -12,20 +12,20 @@ * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Modified 12 April 1990 by Mark Adler for use on MSDOS systems with * Microsoft C and Turbo C. * - * Modifed 13 February 1991 by Greg Roelofs for use on VMS systems. As + * Modified 13 February 1991 by Greg Roelofs for use on VMS systems. As * with the MS-DOS version, the setting of the file mode has been disabled. * Compile and link normally (but note that the shared-image link option * produces a binary only 6 blocks long, as opposed to the 137-block one * produced by an ordinary link). To set up the VMS symbol to run the * program ("run uudecode filename" won't work), do: - * uudecode :== "$disk:[directory]uudecode.exe" + * uudecode :== "$disk:[directory]uudecode.exe" * and don't forget the leading "$" or it still won't work. The binaries * produced by this program are in VMS "stream-LF" format; this makes no * difference to VMS when running decoded executables, nor to VMS unzip, @@ -41,11 +41,16 @@ * Modified 08 July 2006 to cast strlen() result to int to suppress a * warning on platforms where size_t > sizeof(int). * - * $NHDT-Date: 1432512787 2015/05/25 00:13:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ + * Modified 05 Jan 2024 to avoid K&R function declarations, marked KR_PROTO. + * + * Modified 09 Apr 2026 to change mode variable from (int) to (unsigned int) + * to match prototype of sscanf %o. + * + * $NHDT-Date: 1775744389 2026/04/09 14:19:49 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.21 $ */ #ifndef lint -static char sccsid[] = "@(#)uudecode.c 5.5 (Berkeley) 7/6/88"; +/* static char sccsid[] = "@(#)uudecode.c 5.5 (Berkeley) 7/6/88"; */ #endif /* not lint */ #ifdef __MSDOS__ /* For Turbo C */ @@ -81,19 +86,23 @@ static char sccsid[] = "@(#)uudecode.c 5.5 (Berkeley) 7/6/88"; #include #endif +/* #include "warnings.h" */ +#define DISABLE_WARNING_UNREACHABLE_CODE +#define RESTORE_WARNINGS + static void decode(FILE *, FILE *); static void outdec(char *, FILE *, int); /* single-character decode */ #define DEC(c) (((c) - ' ') & 077) +DISABLE_WARNING_UNREACHABLE_CODE + int -main(argc, argv) -int argc; -char **argv; +main(int argc, char **argv) { FILE *in, *out; - int mode; + unsigned int mode; char dest[128]; char buf[80]; @@ -124,15 +133,18 @@ char **argv; } (void) sscanf(buf, "begin %o %s", &mode, dest); -#if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) +#if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) && !defined(__APPLE__) /* handle ~user/file format */ if (dest[0] == '~') { char *sl; - struct passwd *getpwnam(); struct passwd *user; - char dnbuf[100], *index(), *strcat(), *strcpy(); + char dnbuf[100]; +#ifdef KR_PROTO + struct passwd *getpwnam(); + char *strchr(), *strcat(), *strcpy(); +#endif - sl = index(dest, '/'); + sl = strchr(dest, '/'); if (sl == NULL) { fprintf(stderr, "Illegal ~user\n"); exit(3); @@ -148,7 +160,8 @@ char **argv; strcat(dnbuf, sl); strcpy(dest, dnbuf); } -#endif /* !defined(MSDOS) && !defined(VMS) */ +#endif /* !MSDOS && !VMS && !WIN32 && !__APPLE__ */ + dest[sizeof dest - 1] = '\0'; /* create output file */ #if defined(MSDOS) || defined(WIN32) @@ -175,13 +188,13 @@ char **argv; return 0; } +RESTORE_WARNINGS + /* * copy from in to out, decoding as you go along. */ void -decode(in, out) -FILE *in; -FILE *out; +decode(FILE *in, FILE *out) { char buf[80]; char *bp; @@ -218,10 +231,7 @@ FILE *out; * output all of them at the end of the file. */ void -outdec(p, f, n) -char *p; -FILE *f; -int n; +outdec(char *p, FILE *f, int n) { int c1, c2, c3; @@ -236,7 +246,7 @@ int n; putc(c3, f); } -#if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) +#if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) && !defined(__APPLE__) && !defined(__linux__) /* * Return the ptr in sp at which the character c appears; * NULL if not found @@ -248,7 +258,7 @@ int n; char * index(sp, c) -register char *sp, c; +char *sp, c; { do { if (*sp == c) diff --git a/sys/unix/Install.unx b/sys/unix/Install.unx index 455e8bab5..b257ff164 100644 --- a/sys/unix/Install.unx +++ b/sys/unix/Install.unx @@ -1,4 +1,4 @@ - Instructions for installing NetHack 3.6 + Instructions for installing NetHack 5.0 on a UNIX system ======================================= NB: We are gradually replacing this process with the process documented in @@ -50,8 +50,8 @@ the file NewInstall.unx. 6. Edit the top sections of the src and util Makefiles. (If you are doing a full recompile, or if you got your files from someplace besides the official distribution, type 'touch makedefs.c' to make sure certain files - (onames.h, pm.h) get remade instead of relying on the potentially - troublesome timestamps.) Then type 'make' in src and go get a cup of + get remade instead of relying on the potentially troublesome timestamps.) + Then type 'make' in src and go get a cup of coffee or take a nap, depending on the speed of your system. You should now have created the game executable. @@ -109,7 +109,7 @@ the file NewInstall.unx. Notes: 1. Save files and bones files from previous versions will not work with - NetHack 3.6. Don't bother trying to keep them. + NetHack 5.0. Don't bother trying to keep them. 2. To install an update of this version of NetHack after changing something, type 'make update' from the main directory. If you created the new @@ -210,25 +210,7 @@ Notes: and -xenix. The cc problems are old enough that a new, working version may have been released by this time. -10. Xenix/286's lex generates a faulty lexical analyser from lev_comp.l. - The beta-release of flex 2.3 (available from uunet, osu-cis, - prep.ai.mit.edu, etc.) can be used to generate the lexer. - The only change to flex is to change "#define yyleng (yy_cp - yy_bp)" - to "#define yyleng (int)(yy_cp - yy_bp)" in flex.skel. - Flex is not needed with Xenix/386, as its lex generates a proper lexical - analyser. [Xenix instructions by J.T. Conklin] - -11. If your system does not have a lex/yacc or flex/bison combination - capable of producing the dungeon and level compilers, lex and yacc - output from one of our development systems can be found in sys/share. - Unfortunately, this output is less portable than the rest of the code, - as it contains skeleton parsing code provided by the specific vendor - who has no particular incentive to make such skeletons portable, but - the output works on most systems. To try it on yours, copy dgn_comp.h - and lev_comp.h to include and dgn_lex.c, dgn_yacc.c, lev_lex.c, and - lev_yacc.c to util. - -12. Yes, Virginia, you compile NetHack for a NeXT as if it ran UNIX instead +10. Yes, Virginia, you compile NetHack for a NeXT as if it ran UNIX instead of Mach. Just tell NetHack you're a BSD system (Mach is extremely close to BSD UNIX for traditional system calls, so this is also a likely thing to try for any other programs you want to compile). @@ -237,7 +219,7 @@ Notes: not allowed", you might want to re-install using the setgid option instead (see Note 7 above, and the setgid comment in the toplevel Makefile). -13. If you are using Solaris 2.x (aka SunOS 5.x) you shouldn't have to +11. If you are using Solaris 2.x (aka SunOS 5.x) you shouldn't have to do any system configuration -- this is the default. In case it is messed up, follow these instructions. @@ -247,10 +229,11 @@ Notes: config.h: UNIX, TTY_GRAPHICS unixconf.h: SYSV, SVR4, TERMINFO, POSIX_JOB_CONTROL, POSIX_TYPES - X11_GRAPHICS does work. Do not define OPENWINBUG. You may safely define - NETWORK, TEXTCOLOR if desired. Other #defines in these files may be - defined too, as needed. Just make sure that the set mentioned here are - not misdefined, or your compile will fail (do _not_ define BSD or SUNOS4). + X11_GRAPHICS does work. You may safely define NETWORK if desired. + Other #defines in these files may be defined too, as needed. Just make + sure that the set mentioned here are not misdefined, or your compile + will fail (do _not_ define BSD or SUNOS4). + Unless you are using gzip you will probably want to define COMPRESS to be "/usr/bin/compress". @@ -258,46 +241,16 @@ Notes: compiler, /usr/bin/cc, or gcc, but _not_ ucbcc. The lattermost will not work. After this, you should get a clean compile. - Also, it is recommended that you use FLEX instead of the standard - lex bundled with Solaris 2.x (even if that last one should work ;-). - -14. If your machine is a 286, 386, or 486 running an appropriate OS, you - may wish to use the console speaker driver included in - sys/unix/snd86unx.shr. This will allow audible music to be played - on your console speaker in certain appropriate game situations. The only - modification to the main-line code needed to enable use of the driver - is defining UNIX386MUSIC or VPIX_MUSIC in unixconf.h. - -15. If you are trying to cross-compile for another system, there is some - support in the src and util Makefiles, but there are still other - complications. It may well be best to make another copy of util, - util2, to compile target copies of makedefs, lev_comp, and recover - (duplicating the cross-compilation settings from the src Makefile) - without disturbing the main build. - - You can use the host makedefs for everything but "makedefs -v", which - creates include/date.h, which provides various sanity-checking values - for making sure files read by NetHack at run-time are compatible. - These values depend on the endianness of your processor, its type - sizes, and its compiler's idea of struct packing. Your host and target - computers may disagree on these things, so you'll need to build a target - version of makedefs, run "makedefs -v" on your target, and bring the - resulting date.h back for the builds on the host. (Making sure the host - makedefs doesn't decide it needs to overwrite it for you. :-) - - You also need a target version of lev_comp, and to provide it with all - the dat/*.des files, and copy all the resulting *.lev files back for - packaging on the host. - - For recover, you just want the target binary to install on the target. - -16. If you get a compiler warning about 'get_colors()' being implicitly +12. If you are trying to cross-compile for another system, see the file + Cross-compiling. + +13. If you get a compiler warning about 'get_colors()' being implicitly declared, try uncommenting NEED_GET_COLORS_DECL in unixconf.h. If you get a compiler complaint about tparmdecl() having conflicting declarations, add '#define NOTPARMDECL' to unixconf.h or '-DNOTPARMDECL' to CFLAGS in src/Makefile. (The hints files for Mac OSX already do the latter.) -# NetHack 3.6 Install.unx $NHDT-Date: 1548372344 2019/01/24 23:25:44 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.12 $ +# NetHack 5.0 Install.unx $NHDT-Date: 1577568915 2019/12/28 21:35:15 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.14 $ # Copyright (c) 2012 by Kenneth Lorber, Kensington, Maryland # NetHack may be freely redistributed. See license for details. diff --git a/sys/unix/Makefile.check b/sys/unix/Makefile.check new file mode 100755 index 000000000..f22458ee7 --- /dev/null +++ b/sys/unix/Makefile.check @@ -0,0 +1,37 @@ +# NetHack 5.0 Makefile.check $NHDT-Date: 1599687610 2020/09/09 21:40:10 $ $NHDT-Branch: NetHack-5.0 + +SUPATH := sys/unix/ +MKHINTSPATH := $(SUPATH)hints/ +MKINCLPATH := $(SUPATH)hints/include/ + +# +# Expectations: +# +# HINTSFILE and HINTSINCLFILES are passed from the calling Makefile +# which is the case with the hints/*.500 and hints/include/*.500 +# set. +# +ifneq ("$(HINTSFILE)","") +MKHINTSFILE := $(addprefix $(MKHINTSPATH), $(notdir $(HINTSFILE))) +endif +ifneq ("$(HINTSINCLFILES)","") +MKINCLFILES := $(addprefix $(MKINCLPATH), $(HINTSINCLFILES)) +endif + +checkmakefiles: dat/Makefile src/Makefile util/Makefile doc/Makefile Makefile + +dat/Makefile: $(SUPATH)Makefile.dat $(MKHINTSFILE) $(MKINCLFILES) + @echo Attention: $@ is older than: $? + +src/Makefile: $(SUPATH)Makefile.src $(MKHINTSFILE) $(MKINCLFILES) + @echo Attention: $@ is older than: $? + +util/Makefile: $(SUPATH)Makefile.utl $(MKHINTSFILE) $(MKINCLFILES) + @echo Attention: $@ is older than: $? + +doc/Makefile: $(SUPATH)Makefile.doc $(MKHINTSFILE) $(MKINCLFILES) + @echo Attention: $@ is older than: $? + +Makefile: $(SUPATH)Makefile.top $(MKHINTSFILE) $(MKINCLFILES) + @echo Attention: $@ is older than: $? + diff --git a/sys/unix/Makefile.dat b/sys/unix/Makefile.dat index 00f604396..85d40ef53 100644 --- a/sys/unix/Makefile.dat +++ b/sys/unix/Makefile.dat @@ -1,4 +1,4 @@ -# NetHack Datafiles Makefile.dat $NHDT-Date: 1447844574 2018/04/25 19:25:54 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.22 $ +# NetHack Datafiles Makefile.dat $NHDT-Date: 1596486993 2020/08/03 20:36:33 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.32 $ # Copyright (c) 2018 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. @@ -9,19 +9,13 @@ NHSROOT=.. # SHELL=E:/GEMINI2/MUPFEL.TTP # UUDECODE=uudecode -VARDAT = bogusmon data engrave epitaph rumors quest.dat oracles options +VARDAT = bogusmon data engrave epitaph rumors oracles -all: $(VARDAT) spec_levs quest_levs dungeon +all: $(VARDAT) spec_levs quest_levs ../util/makedefs: (cd ../util ; $(MAKE) makedefs) -../util/dgn_comp: - (cd ../util ; $(MAKE) dgn_comp) - -../util/lev_comp: - (cd ../util ; $(MAKE) lev_comp) - ../util/tile2x11: (cd ../util ; $(MAKE) tile2x11) @@ -71,11 +65,11 @@ rip.xpm: ../win/X11/rip.xpm mapbg.xpm: ../win/gnome/mapbg.xpm cp ../win/gnome/mapbg.xpm mapbg.xpm -nhsplash.xpm: ../win/Qt/nhsplash.xpm - cp ../win/Qt/nhsplash.xpm nhsplash.xpm +nhsplash.xpm: ../win/share/nhsplash.xpm + cp ../win/share/nhsplash.xpm nhsplash.xpm -nethack.icns: ../win/Qt/nhicns.uu - $(UUDECODE) ../win/Qt/nhicns.uu +nethack.icns: ../win/share/nhicns.uu + $(UUDECODE) ../win/share/nhicns.uu Info.plist: ../win/Qt/Info.pli cp ../win/Qt/Info.pli Info.plist @@ -106,71 +100,36 @@ data: data.base ../util/makedefs rumors: rumors.tru rumors.fal ../util/makedefs ../util/makedefs -r -quest.dat: quest.txt ../util/makedefs - ../util/makedefs -q - oracles: oracles.txt ../util/makedefs ../util/makedefs -h engrave: engrave.txt ../util/makedefs - ../util/makedefs -s + ../util/makedefs -2 epitaph: epitaph.txt ../util/makedefs - ../util/makedefs -s + ../util/makedefs -1 bogusmon: bogusmon.txt ../util/makedefs - ../util/makedefs -s + ../util/makedefs -3 -# note: 'options' should have already been made when include/date.h was created options: ../util/makedefs ../util/makedefs -v - -spec_levs: ../util/lev_comp \ - bigroom.des castle.des endgame.des gehennom.des knox.des medusa.des \ - mines.des oracle.des sokoban.des tower.des yendor.des - ../util/lev_comp bigroom.des - ../util/lev_comp castle.des - ../util/lev_comp endgame.des - ../util/lev_comp gehennom.des - ../util/lev_comp knox.des - ../util/lev_comp medusa.des - ../util/lev_comp mines.des - ../util/lev_comp oracle.des - ../util/lev_comp sokoban.des - ../util/lev_comp tower.des - ../util/lev_comp yendor.des +# these don't actually do anything useful now that levcomp and dngcomp are gone +spec_levs: touch spec_levs - -quest_levs: ../util/lev_comp \ - Arch.des Barb.des Caveman.des Healer.des Knight.des Monk.des \ - Priest.des Ranger.des Rogue.des Samurai.des Tourist.des Valkyrie.des \ - Wizard.des - ../util/lev_comp Arch.des - ../util/lev_comp Barb.des - ../util/lev_comp Caveman.des - ../util/lev_comp Healer.des - ../util/lev_comp Knight.des - ../util/lev_comp Monk.des - ../util/lev_comp Priest.des - ../util/lev_comp Ranger.des - ../util/lev_comp Rogue.des - ../util/lev_comp Samurai.des - ../util/lev_comp Tourist.des - ../util/lev_comp Valkyrie.des - ../util/lev_comp Wizard.des +quest_levs: touch quest_levs -dungeon: dungeon.def ../util/makedefs ../util/dgn_comp - ../util/makedefs -e - ../util/dgn_comp dungeon.pdf - # gitinfo.txt is optionally made by src/Makefile when creating date.h +# spec_levs and quest_levs are empty marker files to control 'make' actions clean: - -rm -f gitinfo.txt + -rm -f spec_levs quest_levs gitinfo.txt spotless: clean - -rm -f spec_levs quest_levs *.lev $(VARDAT) dungeon dungeon.pdf - -rm -f nhdat x11tiles beostiles pet_mark.xbm pilemark.xbm rip.xpm mapbg.xpm - -rm -f rip.img GEM_RSC.RSC title.img nh16.img NetHack.ad - -rm -f nhsplash.xpm nhtiles.bmp + -rm -f nhdat $(VARDAT) \ + x11tiles pet_mark.xbm pilemark.xbm rip.xpm mapbg.xpm \ + rip.img GEM_RSC.RSC title.img nh16.img NetHack.ad \ + nhsplash.xpm nhtiles.bmp beostiles + +#eof# diff --git a/sys/unix/Makefile.doc b/sys/unix/Makefile.doc index 6fccfd079..f2f42502a 100644 --- a/sys/unix/Makefile.doc +++ b/sys/unix/Makefile.doc @@ -1,5 +1,5 @@ # NetHack Documentation Makefile. -# NetHack 3.6 Makefile.doc $NHDT-Date: 1581732920 2020/02/15 02:15:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.20 $ +# NetHack 5.0 Makefile.doc $NHDT-Date: 1700788000 2023/11/24 01:06:40 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.28 $ # Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland # NetHack may be freely redistributed. See license for details. @@ -11,6 +11,8 @@ NHSROOT=.. MAKEDEFS = ../util/makedefs +#STRIPBS ?= ../util/stripbs + # Which version do we want to build? (XXX These are not used anywhere.) GUIDEBOOK = Guidebook # regular ASCII file #GUIDEBOOK = Guidebook.ps # PostScript file @@ -19,8 +21,11 @@ GUIDEBOOK = Guidebook # regular ASCII file # Some versions of col need -x to keep them from converting spaces to tabs; # some versions of col don't do the conversion by default and don't # recognize the option. Sigh. -COLCMD = col -bx -#COLCMD = col -b +# +# col is unnecessary, but harmless, with groff. See grotty(1). +COLCMD ?= col -bx +#COLCMD ?= col -b +#COLCMD ?= $(STRIPBS) # The command to use to generate a PostScript file # PSCMD = ditroff | psdit @@ -33,85 +38,102 @@ PSCMD = groff # Single page. Might need adjustment to .pl value # GUIDECMD= $(GUIDE_PREFORMAT) | perl -pe 's/^(.mt)$$/.pl 4720v\n.in 0\n.po 8\n.ll 64m\n$$1/' | nroff -c -Tascii | $(COLCMD) # -GUIDECMD = $(GUIDE_PREFORMAT) | nroff -c -Tascii | $(COLCMD) -ONEPAGECMD = $(ONEPAGE_PREFORMAT) | nroff -c -Tascii | $(COLCMD) \ - | sed -e '/EOF--EOF/,12345D' +GUIDECMD = $(GUIDE_PREFORMAT) | nroff -c -Tascii $(NROFF_FLAGS) | $(COLCMD) +ONEPAGECMD = $(ONEPAGE_PREFORMAT) | nroff -c -Tascii $(NROFF_FLAGS) | $(COLCMD) # Only generate output for the current configuration: NHGREP = $(MAKEDEFS) --grep --input - --output - +NEEDMAKEDEFS = $(MAKEDEFS) # Generate output for all configurations: #NHGREP = $(MAKEDEFS) --grep --input - --output - --grep-define ALLDOCS +#NEEDMAKEDEFS = $(MAKEDEFS) # Fallback: #NHGREP = cat +#NEEDMAKEDEFS = + +GUIDEBOOK_MN_SRC = Guidebook.mn +GUIDEBOOK_MN = $(GUIDEBOOK_MN_SRC) +GUIDEBOOK_TEX_SRC = Guidebook.tex +GUIDEBOOK_TEX = $(GUIDEBOOK_TEX_SRC) -GUIDE_PREFORMAT = cat Guidebook.mn | $(NHGREP) | tbl tmac.n - +GUIDE_PREFORMAT = cat $(GUIDEBOOK_MN) | $(NHGREP) | tbl tmac.n - # for Guidebook.dat, unpaginated version of Guidebook.txt -ONEPAGE_PREFORMAT = cat Gbk-1pg-pfx.mn Guidebook.mn Gbk-1pg-sfx.mn \ +ONEPAGE_PREFORMAT = cat Gbk-1pg-pfx.mn $(GUIDEBOOK_MN) Gbk-1pg-sfx.mn \ | $(NHGREP) | tbl tmac.n - # the basic guidebook -Guidebook: Guidebook.mn tmac.n tmac.nh - $(GUIDECMD) > Guidebook +Guidebook : $(GUIDEBOOK_MN) tmac.n tmac.nh $(NEEDMAKEDEFS) $(STRIPBS) + -$(GUIDECMD) > Guidebook # Fancier output for those with ditroff, psdit and a PostScript printer. -Guidebook.ps: Guidebook.mn tmac.n tmac.nh +# Could be converted to Guidebook.pdf if tool(s) for that are available. +Guidebook.ps : $(GUIDEBOOK_MN) tmac.n tmac.nh $(NEEDMAKEDEFS) $(GUIDE_PREFORMAT) | $(PSCMD) > Guidebook.ps # Guidebook.tex is the same as Guidebook.mn but formatted with LaTeX. # - The invocation command for LaTeX may vary in different installations. # - To print Guidebook.dvi you need to use a suitable dvi-driver. # - LaTeX needs to be run twice; second pass uses Guidebook.aux made by first. -Guidebook.dvi: Guidebook.tex - latex Guidebook.tex - latex Guidebook.tex +Guidebook.dvi : $(GUIDEBOOK_TEX) + latex $(GUIDEBOOK_TEX) + latex $(GUIDEBOOK_TEX) +# makedefs has more dependencies than these; this is mainly to cope with the +# case where it hasn't been built yet since it is usually needed for $(NHGREP) +# (note: 'make makedefs', not 'make $(MAKEDEFS)') +$(MAKEDEFS) : ../util/makedefs.c ../include/config.h ../src/mdlib.c \ + ../util/mdgrep.h + ( cd .. ; make makedefs ) + +../util/stripbs: ../util/stripbs.c + ( cd .. ; $(MAKE) stripbs ) GAME = nethack -MANDIR = /usr/man/man6 +MANDIR ?= /usr/man/man6 MANEXT = 6 +NROFF ?= nroff # manual installation for most BSD-style systems GAMEMANCREATE = cat nethack.6 | $(NHGREP) > -LEVMANCREATE = cat lev_comp.6 | $(NHGREP) > -DGNMANCREATE = cat dgn_comp.6 | $(NHGREP) > RCVRMANCREATE = cat recover.6 | $(NHGREP) > DLBMANCREATE = cat dlb.6 | $(NHGREP) > MDMANCREATE = cat makedefs.6 | $(NHGREP) > # manual installation for most SYSV-style systems # GAMEMANCREATE = cat nethack.6 | $(NHGREP) | nroff -man - > -# LEVMANCREATE = cat lev_comp.6 | $(NHGREP) | nroff -man - > -# DGNMANCREATE = cat dgn_comp.6 | $(NHGREP) | nroff -man - > # RCVRMANCREATE = cat recover.6 | $(NHGREP) | nroff -man - > # DLBMANCREATE = cat dlb.6 | $(NHGREP) | nroff -man - > # MDMANCREATE = cat makedefs.6 | $(NHGREP) | nroff -man - > -manpages: +manpages: $(PREMANPAGES) -$(GAMEMANCREATE) $(MANDIR)/$(GAME).$(MANEXT) - -$(LEVMANCREATE) $(MANDIR)/lev_comp.$(MANEXT) - -$(DGNMANCREATE) $(MANDIR)/dgn_comp.$(MANEXT) -$(RCVRMANCREATE) $(MANDIR)/recover.$(MANEXT) -$(DLBMANCREATE) $(MANDIR)/dlb.$(MANEXT) -$(MDMANCREATE) $(MANDIR)/makedefs.$(MANEXT) # manual creation for distribution -DISTRIB = Guidebook.txt nethack.txt lev_comp.txt dgn_comp.txt recover.txt \ +DISTRIB = Guidebook.txt nethack.txt recover.txt \ dlb.txt makedefs.txt distrib: $(DISTRIB) @echo "Plain text documentation is up to date." -Guidebook.txt : Guidebook.mn tmac.n tmac.nh - $(GUIDECMD) > Guidebook.txt -Guidebook.dat : Gbk-1pg-pfx.mn Gbk-1pg-sfx.mn Guidebook.mn tmac.n tmac.nh - $(ONEPAGECMD) > Guidebook.dat +Guidebook.txt : $(GUIDEBOOK_MN) tmac.n tmac.nh $(NEEDMAKEDEFS) + $(GUIDECMD) > $@ +Guidebook.dat : Gbk-1pg-pfx.mn Gbk-1pg-sfx.mn $(GUIDEBOOK_MN) tmac.n tmac.nh \ + $(NEEDMAKEDEFS) + $(ONEPAGECMD) > $@ -MAN2TXT = $(NHGREP) | nroff -man - | $(COLCMD) +# plain text output +# +# MAN2TXTPRE and MAN2TXTPOST are included so that a hints file can alter +# both of them as required +MAN2TXTPOST ?= | col -b +MAN2TXT = $(NHGREP) | $(NROFF) -man $(MAN2TXTPRE) $(MAN2TXTPOST) +# If you aren't using a hints file, you can uncomment the following +# line if you have groff 1.23 or greater. +#MAN2TXT = $(NHGREP) | groff -man -Tascii -P -cbou nethack.txt : nethack.6 cat nethack.6 | $(MAN2TXT) > nethack.txt -lev_comp.txt : lev_comp.6 - cat lev_comp.6 | $(MAN2TXT) > lev_comp.txt -dgn_comp.txt : dgn_comp.6 - cat dgn_comp.6 | $(MAN2TXT) > dgn_comp.txt recover.txt : recover.6 cat recover.6 | $(MAN2TXT) > recover.txt dlb.txt : dlb.6 @@ -120,10 +142,11 @@ makedefs.txt : makedefs.6 cat makedefs.6 | $(MAN2TXT) > makedefs.txt clean: - -rm -f Guidebook.aux Guidebook.log + -rm -f Guidebook.aux Guidebook.log $(DOC_EXTRAS) spotless: clean - -rm -f Guidebook Guidebook.dat Guidebook.ps Guidebook.dvi + -rm -f Guidebook Guidebook.dat Guidebook.ps \ + Guidebook.dvi $(DOC_SPOTLESS_EXTRAS) maintainer-clean: spotless -rm -f $(DISTRIB) diff --git a/sys/unix/Makefile.src b/sys/unix/Makefile.src index eeb30b9a0..863fa096c 100644 --- a/sys/unix/Makefile.src +++ b/sys/unix/Makefile.src @@ -1,5 +1,5 @@ # NetHack Makefile. -# NetHack 3.6 Makefile.src $NHDT-Date: 1550876124 2019/02/22 22:55:24 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.70 $ +# NetHack 5.0 Makefile.src $NHDT-Date: 1697316523 2023/10/14 20:48:43 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.164 $ # Copyright (c) 2018 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. @@ -43,23 +43,35 @@ SHELL=/bin/sh # Usually, the C compiler driver is used for linking: #LINK=$(CC) +# If we're cross-compiling, a hints file will override this +# to a unique target directory, but otherwise it just goes in +# ../src +TARGETPFX= + # Pick the SYSSRC and SYSOBJ lines corresponding to your desired operating # system. # # for UNIX systems SYSSRC = ../sys/share/ioctl.c ../sys/share/unixtty.c ../sys/unix/unixmain.c \ ../sys/unix/unixunix.c ../sys/unix/unixres.c -SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o unixres.o +SYSOBJ = $(TARGETPFX)ioctl.o $(TARGETPFX)unixmain.o $(TARGETPFX)unixtty.o \ + $(TARGETPFX)unixunix.o $(TARGETPFX)unixres.o # # for Systos # SYSSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ # ../sys/share/pctty.c ../sys/share/pcunix.c -# SYSOBJ = tos.o pcmain.o pcsys.o pctty.o pcunix.o +# SYSOBJ = $(TARGETPFX)tos.o $(TARGETPFX)pcmain.o $(TARGETPFX)pcsys.o \ +# $(TARGETPFX)pctty.o $(TARGETPFX)pcunix.o # # for BeOS #SYSSRC = ../sys/be/bemain.c ../sys/share/unixtty.c ../sys/share/ioctl.c -#SYSOBJ = bemain.o unixtty.o ioctl.o +#SYSOBJ = $(TARGETPFX)bemain.o $(TARGETPFX)unixtty.o $(TARGETPFX)ioctl.o + +# NetHack 5.0 began introducing C99 code. +# +# If your compiler needs an appropriate switch to accept C99 code. +# CSTD = -std=c99 # if you are using gcc as your compiler: # uncomment the CC definition below if it's not in your environment @@ -83,8 +95,13 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o unixres.o # CC = arm-linux-gcc # # +# The gcc compiler switch for accepting C99 code. Because gcc had extensions in +# earlier versions, a number of C99 features were already compiling cleanly, but +# not all (e.g., 'for' loop initial declarations). +# CSTD = -std=c99 + # if you're debugging and want gcc to check as much as possible, use: -# CC = gcc -W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN +# CC = gcc -W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings # flags may have to be changed as required # flags for 286 Xenix: @@ -102,6 +119,11 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o unixres.o # CFLAGS = -mshort -O2 -fomit-frame-pointer -I../include # LFLAGS = -mshort -s +# Curses, use one of the following: +# -D_XOPEN_SOURCE_EXTENDED=1 allows any map character to appear in the message window +# during far look with the '/' command. +# -DCURSES_GENL_PUTMIXED to disable that and fall back to displaying only the historical tty character. +# # flags for AIX 3.1 cc on IBM RS/6000 to define # a suitable subset of standard libraries # (note that there is more info regarding the "-qchars=signed" @@ -153,36 +175,50 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o unixres.o #CFLAGS = -O -DXCURSES -I../include -I/usr/local/include/pdcurses # Compile against system curses library, such as ncurses #CFLAGS = -O -I../include - +# # files in ../win/X11 (relative to src) are passed $(CFLAGS) $(X11CFLAGS) # and by default will find in /usr/include/X11/foo.h; # can be overridden via hints; post-10.7 OSX with XQuartz uses # X11CFLAGS=-I/opt/X11/include to find in /opt/X11/include/X11/foo.h #X11CFLAGS= -# 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. -# The paths are for glibconfig.h and gnomesupport.h respectively. -# -GNOMEINC=-I/usr/lib/glib/include -I/usr/lib/gnome-libs/include -I../win/gnome - # flags for debugging: # CFLAGS = -g -I../include #CFLAGS = -O -I../include -#LFLAGS = +#LFLAGS = + +#fallback values, only if these are not already set +CFLAGS ?= -I../include +LINK ?= $(CC) + +AR = ar +ARFLAGS = rcs # The Qt and Be window systems are written in C++, while the rest of # NetHack is standard C. If using Qt, uncomment the LINK line here to get # the C++ libraries linked in. -CXXFLAGS = $(CFLAGS) -I. -I$(QTDIR)/include +CXXFLAGS ?= $(CCXXFLAGS) -I. -I$(QTDIR)/include $(QTCXXFLAGS) CXX ?= g++ MOC ?= moc +MOCPATH ?= $(QTDIR)/bin/$(MOC) #LINK=g++ -# For cross-compiling, eg. with gcc on Linux (see also CC further up): -#CXX=arm-linux-g++ -#LINK=arm-linux-gcc +# included for documentation purposes if not using the relevant hints files; +# when not using those to manage the value, it should remain empty +#QTn_H = + +# The default is for the TARGET_* variables to match the defaults. +# If we're cross-compiling these will get overridden elsewhere, likely via +# a hints file. TARGETPFX was set above earlier. +TARGET_CC = $(CC) +TARGET_CFLAGS = $(CFLAGS) $(CSTD) +TARGET_LINK = $(LINK) +TARGET_LFLAGS = $(LFLAGS) +TARGET_CXX = $(CXX) +TARGET_CXXFLAGS = $(CXXFLAGS) +TARGET_LIBS = $(LIBS) +TARGET_AR = $(AR) +TARGET_ARFLAGS = $(ARFLAGS) # we specify C preprocessor flags via CFLAGS; files built with default rules # might include $(CPPFLAGS) which could get a value from user's environment; @@ -190,27 +226,33 @@ MOC ?= moc CPPFLAGS = # file for regular expression matching -REGEXOBJ = posixregex.o -#REGEXOBJ = pmatchregex.o -#REGEXOBJ = cppregex.o +REGEXOBJ ?= $(TARGETPFX)posixregex.o +#REGEXOBJ = $(TARGETPFX)pmatchregex.o +#REGEXOBJ = $(TARGETPFX)cppregex.o # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired -# combination of windowing systems. Also set windowing systems in config.h. -# Note that if you are including multiple tiled window systems, you don't -# want two copies of tile.o, so comment out all but the first. +# combination of windowing systems. Also set matching USE_x_GRAPHICS in +# config.h. Note that if you are building for any window system which +# uses tiles, uncomment '#$(TARGETPFX)tile.o' (by removing the '#') in that +# system's WINxOBJ (WINX11OBJ or WINQTOBJ or WINQT3OBJ). If you are building +# nethack with support for multiple window systems, only uncomment that for +# one of them to avoid duplicate tile.o. # # files for a straight tty port using no native windowing system 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 +WINTTYOBJ = $(TARGETPFX)getline.o $(TARGETPFX)termcap.o $(TARGETPFX)topl.o \ + $(TARGETPFX)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 +WINCURSESOBJ = $(TARGETPFX)cursmain.o $(TARGETPFX)curswins.o \ + $(TARGETPFX)cursmisc.o $(TARGETPFX)cursdial.o \ + $(TARGETPFX)cursstat.o $(TARGETPFX)cursinit.o \ + $(TARGETPFX)cursmesg.o $(TARGETPFX)cursinvt.o # # files for an X11 port # (tile.c is a generated source file) @@ -218,53 +260,62 @@ WINX11SRC = ../win/X11/Window.c ../win/X11/dialogs.c ../win/X11/winX.c \ ../win/X11/winmap.c ../win/X11/winmenu.c ../win/X11/winmesg.c \ ../win/X11/winmisc.c ../win/X11/winstat.c ../win/X11/wintext.c \ ../win/X11/winval.c tile.c -WINX11OBJ = Window.o dialogs.o winX.o winmap.o winmenu.o winmesg.o \ - winmisc.o winstat.o wintext.o winval.o tile.o -# -# Files for a Qt port +WINX11OBJ = $(TARGETPFX)Window.o $(TARGETPFX)dialogs.o $(TARGETPFX)winX.o \ + $(TARGETPFX)winmap.o $(TARGETPFX)winmenu.o $(TARGETPFX)winmesg.o \ + $(TARGETPFX)winmisc.o $(TARGETPFX)winstat.o $(TARGETPFX)wintext.o \ + $(TARGETPFX)winval.o #$(TARGETPFX)tile.o # -WINQTSRC = ../win/Qt/qt_win.cpp ../win/Qt/qt_clust.cpp ../win/Qt/qttableview.cpp -WINQTOBJ = qt_win.o qt_clust.o qttableview.o tile.o +# Files for a Qt 3 interface (renamed since nethack 3.6.x) # -# Files for a Qt 4 or 5 port -# -WINQT4SRC = ../win/Qt4/qt4bind.cpp ../win/Qt4/qt4click.cpp \ - ../win/Qt4/qt4clust.cpp ../win/Qt4/qt4delay.cpp \ - ../win/Qt4/qt4glyph.cpp ../win/Qt4/qt4icon.cpp ../win/Qt4/qt4inv.cpp \ - ../win/Qt4/qt4key.cpp ../win/Qt4/qt4line.cpp ../win/Qt4/qt4main.cpp \ - ../win/Qt4/qt4map.cpp ../win/Qt4/qt4menu.cpp ../win/Qt4/qt4msg.cpp \ - ../win/Qt4/qt4plsel.cpp ../win/Qt4/qt4rip.cpp ../win/Qt4/qt4set.cpp \ - ../win/Qt4/qt4stat.cpp ../win/Qt4/qt4str.cpp ../win/Qt4/qt4streq.cpp \ - ../win/Qt4/qt4svsel.cpp ../win/Qt4/qt4win.cpp ../win/Qt4/qt4xcmd.cpp \ - ../win/Qt4/qt4yndlg.cpp -WINQT4OBJ = qt4bind.o qt4click.o qt4clust.o qt4delay.o qt4glyph.o qt4icon.o \ - qt4inv.o qt4key.o qt4line.o qt4main.o qt4map.o qt4menu.o qt4msg.o \ - qt4plsel.o qt4rip.o qt4set.o qt4stat.o qt4str.o qt4streq.o qt4svsel.o \ - qt4win.o qt4xcmd.o qt4yndlg.o tile.o +#WINQT3SRC = ../win/Qt3/qt3_win.cpp ../win/Qt3/qt3_clust.cpp \ +# ../win/Qt3/qt3tableview.cpp +#WINQT3OBJ = $(TARGETPFX)qt3_win.o $(TARGETPFX)qt3_clust.o \ +# $(TARGETPFX)qt3tableview.o #$(TARGETPFX)tile.o +# empty values for 'make depend' +WINQT3SRC = +WINQT3OBJ = + # -# Files for a Gnome port +# Files for a Qt 4, Qt 5, or Qt 6 interface # -WINGNOMESRC = ../win/gnome/gnaskstr.c ../win/gnome/gnbind.c \ - ../win/gnome/gnglyph.c ../win/gnome/gnmain.c ../win/gnome/gnmap.c \ - ../win/gnome/gnmenu.c ../win/gnome/gnmesg.c ../win/gnome/gnopts.c \ - ../win/gnome/gnplayer.c ../win/gnome/gnsignal.c \ - ../win/gnome/gnstatus.c ../win/gnome/gntext.c ../win/gnome/gnyesno.c \ - ../win/gnome/gnworn.c -WINGNOMEOBJ = gnaskstr.o gnbind.o gnglyph.o gnmain.o gnmap.o gnmenu.o \ - gnmesg.o gnopts.o gnplayer.o gnsignal.o gnstatus.o gntext.o \ - gnyesno.o gnworn.o tile.o +# generated source files made by Qt's 'moc' program from ../win/Qt/qt_*.h; +# appended to WINQTSRC for use by 'make depend' +WINQTMOC = qt_kde0.moc qt_main.moc qt_map.moc qt_menu.moc qt_msg.moc \ + qt_plsel.moc qt_set.moc qt_stat.moc qt_xcmd.moc qt_yndlg.moc +WINQTSRC = ../win/Qt/qt_bind.cpp ../win/Qt/qt_click.cpp \ + ../win/Qt/qt_clust.cpp ../win/Qt/qt_delay.cpp \ + ../win/Qt/qt_glyph.cpp ../win/Qt/qt_icon.cpp ../win/Qt/qt_inv.cpp \ + ../win/Qt/qt_key.cpp ../win/Qt/qt_line.cpp ../win/Qt/qt_main.cpp \ + ../win/Qt/qt_map.cpp ../win/Qt/qt_menu.cpp ../win/Qt/qt_msg.cpp \ + ../win/Qt/qt_plsel.cpp ../win/Qt/qt_rip.cpp ../win/Qt/qt_set.cpp \ + ../win/Qt/qt_stat.cpp ../win/Qt/qt_str.cpp ../win/Qt/qt_streq.cpp \ + ../win/Qt/qt_svsel.cpp ../win/Qt/qt_win.cpp ../win/Qt/qt_xcmd.cpp \ + ../win/Qt/qt_yndlg.cpp $(WINQTMOC) tile.c +WINQTOBJ = $(TARGETPFX)qt_bind.o $(TARGETPFX)qt_click.o \ + $(TARGETPFX)qt_clust.o $(TARGETPFX)qt_delay.o \ + $(TARGETPFX)qt_glyph.o $(TARGETPFX)qt_icon.o \ + $(TARGETPFX)qt_inv.o $(TARGETPFX)qt_key.o $(TARGETPFX)qt_line.o \ + $(TARGETPFX)qt_main.o $(TARGETPFX)qt_map.o $(TARGETPFX)qt_menu.o \ + $(TARGETPFX)qt_msg.o $(TARGETPFX)qt_plsel.o $(TARGETPFX)qt_rip.o \ + $(TARGETPFX)qt_set.o $(TARGETPFX)qt_stat.o $(TARGETPFX)qt_str.o \ + $(TARGETPFX)qt_streq.o $(TARGETPFX)qt_svsel.o $(TARGETPFX)qt_win.o \ + $(TARGETPFX)qt_xcmd.o $(TARGETPFX)qt_yndlg.o #$(TARGETPFX)tile.o + +# Files for Shim windowing interface for libnh -- doesn't do anything, +# just passes along the API calls to the library # -# Files for a Gem port -WINGEMSRC = ../win/gem/wingem.c ../win/gem/wingem1.c ../win/gem/load_img.c \ - ../win/gem/gr_rect.c tile.c -WINGEMOBJ = wingem.o wingem1.o load_img.o gr_rect.o tile.o +WINSHIMSRC = ../win/shim/winshim.c +WINSHIMOBJ = winshim.o + # # Files for a BeOS InterfaceKit port -- not ready for prime time WINBESRC = 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 +#WINBEOBJ = $(TARGETPFX)winbe.o $(TARGETPFX)NHWindow.o \ +# $(TARGETPFX)NHMenuWindow.o $(TARGETPFX)NHMapWindow.o \ +# $(TARGETPFX)tile.o # # #WINSRC = $(WINTTYSRC) @@ -299,24 +350,18 @@ WINBEOBJ = # # # libraries for Qt 3 -WINQTLIB = -L$(QTDIR)/lib -lqt +WINQT3LIB = -L$(QTDIR)/lib -lqt # # libraries for Qt 4 WINQT4LIB = `pkg-config QtGui --libs` # -# libraries for Qt 5 (use with WINQT4SRC and WINQT4OBJ) +# libraries for Qt 5 (use with WINQTSRC and WINQTOBJ) WINQT5LIB = `pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --libs` # # libraries for KDE (with Qt) WINKDELIB = -lkdecore -lkdeui -lXext # -# libraries for Gnome -WINGNOMELIB = -lgnomeui -lgnome -lart_lgpl -lgtk -lgdk -lpopt -# -# libraries for Gem port -WINGEMLIB = -le_gem -lgem -# -# libraries for BeOS +# libraries for BeOS WINBELIB = -lbe # # libraries for curses port @@ -332,6 +377,9 @@ WINCURSESLIB = -lncurses # For Curses #WINLIB = $(WINCURSESLIB) # +# some platforms need to build the support libraries +# BUILDMORE = $(TARGETPFX)pdcurses.a + # any other strange libraries your system needs (for Sysunix only -- the more # specialized targets should already be right) # @@ -360,20 +408,25 @@ WINCURSESLIB = -lncurses # If ZLIB_COMP is defined in config.h this is necessary to link with zlib. # LIBS = -lz # -LIBS = +# LIBS = + +#fallback values, only if these are not already set +WINOBJ ?= $(WINTTYOBJ) +WINLIB ?= $(WINTTYLIB) -lncurses # make NetHack GAME = nethack # GAME = nethack.prg +GAMEBIN = $(GAME) -# if you defined RANDOM in unixconf.h/tosconf.h since your system did not come +# if you defined RANDOM in unixconf.h since your system did not come # with a reasonable random number generator -# RANDOBJ = random.o +# RANDOBJ = $(TARGETPFX)random.o RANDOBJ = - # used by `make depend' to reconstruct this Makefile; you shouldn't need this -AWK = nawk +# at all but can override with 'make AWK=nawk' or 'make AWK=gawk' if necessary +AWK = awk # when using 'makedefs -v', also force dat/gitinfo.txt to be up to date; # changing this to 0 will change the behavior to only make that file if @@ -397,7 +450,14 @@ QUIETCC=0 # Nothing below this line should have to be changed. # # Other things that have to be reconfigured are in config.h, -# {unixconf.h, pcconf.h, tosconf.h}, and possibly system.h +# {unixconf.h, pcconf.h}, and possibly cstd.h + + +# NB: This is not used for all .c files (see explicit rules in +# dependencies). +# A normal or cross compile. +$(TARGETPFX)%.o : %.c + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ $< # Verbosity definitions, begin # Set QUIETCC=1 above to output less feedback while building. @@ -429,131 +489,211 @@ AT_V1 := @ AT = $(AT_V$(QUIETCC)) # Verbosity, end +# verbosity-adjacent; these will already have 'real' values if hints have +# set up cross-compiling, in which case these assignments will be no-ops +PREGAME=@true +PACKAGE=@true + +HACKLIBSRC = hacklib.c +HACKLIBOBJS = hacklib.o +HACKLIB = hacklib.a +TARGET_HACKLIB = $(TARGETPFX)hacklib.a + MAKEDEFS = ../util/makedefs +# -lm required by lua +LUA_VERSION ?=5.4.8 +LUABASE = liblua-$(LUA_VERSION).a +LUALIB = ../lib/lua/$(LUABASE) +LUALIBS = $(LUALIB) -lm $(DLLIB) +LUAHEADERS = lib/lua-$(LUA_VERSION)/src + # timestamp files to reduce `make' overhead and shorten .o dependency lists CONFIG_H = ../src/config.h-t HACK_H = ../src/hack.h-t # all .c that are part of the main NetHack program and are not operating- or -# windowing-system specific +# windowing-system specific. Do not include date.c in this list. HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ - botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ - do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ - dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \ - files.c fountain.c hack.c hacklib.c invent.c isaac64.c light.c \ - lock.c mail.c makemon.c mapglyph.c mcastu.c mhitm.c mhitu.c \ - minion.c mklev.c mkmap.c \ - mkmaze.c mkobj.c mkroom.c mon.c mondata.c monmove.c monst.c \ - mplayer.c mthrowu.c muse.c music.c o_init.c objects.c objnam.c \ + botl.c calendar.c cmd.c coloratt.c dbridge.c decl.c detect.c dig.c display.c \ + dlb.c do.c do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c \ + drawing.c dungeon.c earlyarg.c eat.c end.c engrave.c exper.c explode.c \ + extralev.c files.c fountain.c hack.c hacklib.c \ + getpos.c glyphs.c iactions.c insight.c invent.c isaac64.c light.c \ + lock.c mail.c makemon.c mcastu.c mdlib.c mhitm.c \ + mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c \ + mondata.c monmove.c monst.c mplayer.c mthrowu.c muse.c music.c \ + nhlua.c nhlsel.c nhlobj.c nhmd4.c o_init.c objects.c objnam.c \ options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \ - priest.c quest.c questpgr.c read.c rect.c region.c restore.c \ - rip.c rnd.c role.c rumors.c save.c shk.c shknam.c sit.c sounds.c \ - sp_lev.c spell.c steal.c steed.c sys.c teleport.c timeout.c \ - topten.c track.c trap.c u_init.c \ + priest.c quest.c questpgr.c read.c rect.c region.c report.c restore.c \ + rip.c rnd.c role.c rumors.c save.c selvar.c sfbase.c sfstruct.c \ + shk.c shknam.c sit.c sounds.c sp_lev.c spell.c stairs.c steal.c steed.c \ + strutil.c symbols.c sys.c teleport.c \ + timeout.c topten.c track.c trap.c u_init.c utf8map.c \ uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \ - windows.c wizard.c worm.c worn.c write.c zap.c + windows.c wizard.c wizcmds.c worm.c worn.c write.c zap.c # all operating-system-dependent .c (for dependencies and such) -SYSCSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ +SYSCSRC = ../sys/share/pcmain.c ../sys/share/pcsys.c \ ../sys/share/pctty.c ../sys/share/pcunix.c \ ../sys/share/pmatchregex.c ../sys/share/posixregex.c \ ../sys/share/random.c \ ../sys/share/ioctl.c ../sys/share/unixtty.c ../sys/unix/unixmain.c \ - ../sys/unix/unixunix.c ../sys/unix/unixres.c ../sys/be/bemain.c + ../sys/unix/unixunix.c ../sys/unix/unixres.c SYSCXXSRC = ../sys/share/cppregex.cpp # generated source files (tile.c is handled separately via WINxxxSRC) -GENCSRC = vis_tab.c #tile.c +GENCSRC = #tile.c # all windowing-system-dependent .c (for dependencies and such) -WINCSRC = $(WINTTYSRC) $(WINCURSESSRC) $(WINX11SRC) $(WINGNOMESRC) $(WINGEMSRC) +WINCSRC = $(WINTTYSRC) $(WINCURSESSRC) $(WINX11SRC) $(WINSHIMSRC) # all windowing-system-dependent .cpp (for dependencies and such) -WINCXXSRC = $(WINQTSRC) $(WINQT4SRC) $(WINBESRC) +WINCXXSRC = $(WINQTSRC) $(WINQT3SRC) $(WINBESRC) # Files for window system chaining. Requires SYSCF; include via HINTSRC/HINTOBJ CHAINSRC = ../win/chain/wc_chainin.c ../win/chain/wc_chainout.c \ ../win/chain/wc_trace.c -CHAINOBJ = wc_chainin.o wc_chainout.o wc_trace.o +CHAINOBJ = $(TARGETPFX)wc_chainin.o $(TARGETPFX)wc_chainout.o \ + $(TARGETPFX)wc_trace.o # .c files for this version (for date.h) -VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(CHAINSRC) $(GENCSRC) +VERSOURCES = $(HACKCSRC) $(HACKLIBSRC) $(SYSSRC) $(WINSRC) $(CHAINSRC) $(GENCSRC) # .c files for all versions using this Makefile (for lint and tags) -CSOURCES = $(HACKCSRC) $(SYSCSRC) $(WINCSRC) $(CHAINSRC) $(GENCSRC) +CSOURCES = $(HACKCSRC) $(HACKLIBSRC) $(SYSCSRC) $(WINCSRC) $(CHAINSRC) $(GENCSRC) -# all .h files except date.h, onames.h, pm.h, and vis_tab.h which would +# all .h files except date.h, which would # cause dependency loops if run through "make depend" -# and dgn_comp.h, dgn_file.h, lev_comp.h, special level & dungeon files. +# and dgn_file.h, special level & dungeon files. # -HACKINCL = align.h amiconf.h artifact.h artilist.h attrib.h beconf.h botl.h \ - color.h config.h config1.h context.h coord.h decl.h def_os2.h \ - display.h dlb.h dungeon.h engrave.h extern.h flag.h func_tab.h \ - global.h hack.h lev.h lint.h macconf.h mextra.h mfndpos.h micro.h \ - mkroom.h \ - monattk.h mondata.h monflag.h monst.h monsym.h obj.h objclass.h \ - os2conf.h patchlevel.h pcconf.h permonst.h prop.h rect.h region.h \ - rm.h sp_lev.h spell.h sys.h system.h tcap.h timeout.h tosconf.h \ - tradstdc.h trampoli.h trap.h unixconf.h vision.h vmsconf.h wintty.h \ - wincurs.h winX.h winprocs.h wintype.h you.h youprop.h - -HSOURCES = $(HACKINCL) date.h onames.h pm.h vis_tab.h \ - lev_comp.h dgn_comp.h dgn_file.h +HACKINCL = align.h artifact.h artilist.h attrib.h botl.h \ + color.h config.h config1.h context.h coord.h cstd.h decl.h \ + defsym.h display.h dlb.h dungeon.h engrave.h extern.h flag.h \ + fnamesiz.h func_tab.h global.h warnings.h hack.h lint.h mextra.h \ + mcastu.h \ + micro.h mfndpos.h mkroom.h monattk.h mondata.h monflag.h monst.h \ + monsters.h nhmd4.h obj.h objects.h objclass.h optlist.h patchlevel.h \ + pcconf.h permonst.h prop.h rect.h region.h savefile.h selvar.h sym.h \ + rm.h sp_lev.h spell.h sndprocs.h seffects.h stairs.h sys.h \ + tcap.h timeout.h tradstdc.h trap.h unixconf.h vision.h vmsconf.h \ + wintty.h wincurs.h winX.h winprocs.h wintype.h you.h youprop.h \ + weight.h + +HSOURCES = $(HACKINCL) dgn_file.h # the following .o's _must_ be made before any others (for makedefs) FIRSTOBJ = monst.o objects.o +HOSTOBJ = $(FIRSTOBJ) alloc.o drawing.o + +# +# $(TARGETPFX)date.o is not included in this list +# +HOBJ = $(TARGETPFX)allmain.o $(TARGETPFX)alloc.o \ + $(TARGETPFX)apply.o $(TARGETPFX)artifact.o $(TARGETPFX)attrib.o \ + $(TARGETPFX)ball.o $(TARGETPFX)bones.o $(TARGETPFX)botl.o \ + $(TARGETPFX)calendar.o $(TARGETPFX)cfgfiles.o $(TARGETPFX)cmd.o \ + $(TARGETPFX)coloratt.o $(TARGETPFX)dbridge.o $(TARGETPFX)decl.o \ + $(TARGETPFX)detect.o $(TARGETPFX)dig.o $(TARGETPFX)display.o \ + $(TARGETPFX)dlb.o $(TARGETPFX)do.o $(TARGETPFX)do_name.o \ + $(TARGETPFX)do_wear.o $(TARGETPFX)dog.o $(TARGETPFX)dogmove.o \ + $(TARGETPFX)dokick.o $(TARGETPFX)dothrow.o $(TARGETPFX)drawing.o \ + $(TARGETPFX)dungeon.o $(TARGETPFX)earlyarg.o $(TARGETPFX)eat.o \ + $(TARGETPFX)end.o $(TARGETPFX)engrave.o $(TARGETPFX)exper.o \ + $(TARGETPFX)explode.o $(TARGETPFX)extralev.o $(TARGETPFX)files.o \ + $(TARGETPFX)fountain.o $(TARGETPFX)getpos.o $(TARGETPFX)glyphs.o \ + $(TARGETPFX)hack.o $(TARGETPFX)iactions.o $(TARGETPFX)insight.o \ + $(TARGETPFX)invent.o $(TARGETPFX)isaac64.o $(TARGETPFX)light.o \ + $(TARGETPFX)lock.o $(TARGETPFX)mail.o $(TARGETPFX)makemon.o \ + $(TARGETPFX)mcastu.o $(TARGETPFX)mdlib.o $(TARGETPFX)mhitm.o \ + $(TARGETPFX)mhitu.o $(TARGETPFX)minion.o $(TARGETPFX)mklev.o \ + $(TARGETPFX)mkmap.o $(TARGETPFX)mkmaze.o $(TARGETPFX)mkobj.o \ + $(TARGETPFX)mkroom.o $(TARGETPFX)mon.o $(TARGETPFX)mondata.o \ + $(TARGETPFX)monmove.o $(TARGETPFX)monst.o $(TARGETPFX)mplayer.o \ + $(TARGETPFX)mthrowu.o $(TARGETPFX)muse.o $(TARGETPFX)music.o \ + $(TARGETPFX)nhlua.o $(TARGETPFX)nhlsel.o $(TARGETPFX)nhlobj.o \ + $(TARGETPFX)nhmd4.o $(TARGETPFX)objects.o $(TARGETPFX)o_init.o \ + $(TARGETPFX)objnam.o $(TARGETPFX)options.o $(TARGETPFX)pager.o \ + $(TARGETPFX)pickup.o $(TARGETPFX)pline.o $(TARGETPFX)polyself.o \ + $(TARGETPFX)potion.o $(TARGETPFX)pray.o $(TARGETPFX)priest.o \ + $(TARGETPFX)quest.o $(TARGETPFX)questpgr.o $(TARGETPFX)read.o \ + $(TARGETPFX)rect.o $(TARGETPFX)region.o $(TARGETPFX)report.o \ + $(TARGETPFX)restore.o $(TARGETPFX)rip.o $(TARGETPFX)rnd.o \ + $(TARGETPFX)role.o $(TARGETPFX)rumors.o $(TARGETPFX)save.o \ + $(TARGETPFX)selvar.o $(TARGETPFX)sfbase.o $(TARGETPFX)sfstruct.o \ + $(TARGETPFX)shk.o $(TARGETPFX)shknam.o $(TARGETPFX)sit.o \ + $(TARGETPFX)sounds.o $(TARGETPFX)sp_lev.o $(TARGETPFX)spell.o \ + $(TARGETPFX)stairs.o $(TARGETPFX)symbols.o $(TARGETPFX)sys.o \ + $(TARGETPFX)steal.o $(TARGETPFX)steed.o $(TARGETPFX)strutil.o \ + $(TARGETPFX)teleport.o $(TARGETPFX)timeout.o $(TARGETPFX)topten.o \ + $(TARGETPFX)track.o $(TARGETPFX)trap.o $(TARGETPFX)u_init.o \ + $(TARGETPFX)uhitm.o $(TARGETPFX)utf8map.o $(TARGETPFX)vault.o \ + $(TARGETPFX)vision.o $(TARGETPFX)weapon.o $(TARGETPFX)were.o \ + $(TARGETPFX)wield.o $(TARGETPFX)windows.o $(TARGETPFX)wizard.o \ + $(TARGETPFX)wizcmds.o $(TARGETPFX)worm.o $(TARGETPFX)worn.o \ + $(TARGETPFX)write.o $(TARGETPFX)zap.o \ + $(REGEXOBJ) $(RANDOBJ) $(SYSOBJ) $(WINOBJ) \ + $(HINTOBJ) $(SNDLIBOBJ) $(UUIDOBJ) \ + $(TARGETPFX)version.o + +DATE_O = $(TARGETPFX)date.o -HOBJ = $(FIRSTOBJ) allmain.o alloc.o apply.o artifact.o attrib.o ball.o \ - bones.o botl.o cmd.o dbridge.o decl.o detect.o dig.o display.o dlb.o \ - do.o do_name.o do_wear.o dog.o dogmove.o dokick.o dothrow.o \ - drawing.o dungeon.o eat.o end.o engrave.o exper.o explode.o \ - extralev.o files.o fountain.o hack.o hacklib.o invent.o isaac64.o \ - light.o lock.o mail.o makemon.o mapglyph.o mcastu.o mhitm.o mhitu.o \ - minion.o mklev.o mkmap.o \ - mkmaze.o mkobj.o mkroom.o mon.o mondata.o monmove.o \ - mplayer.o mthrowu.o muse.o music.o o_init.o objnam.o options.o \ - pager.o pickup.o pline.o polyself.o potion.o pray.o priest.o \ - quest.o questpgr.o read.o rect.o region.o restore.o rip.o rnd.o \ - role.o rumors.o save.o shk.o shknam.o sit.o sounds.o sp_lev.o spell.o \ - sys.o \ - steal.o steed.o teleport.o timeout.o topten.o track.o trap.o u_init.o \ - uhitm.o vault.o vision.o vis_tab.o weapon.o were.o wield.o windows.o \ - wizard.o worm.o worn.o write.o zap.o \ - $(REGEXOBJ) $(RANDOBJ) $(SYSOBJ) $(WINOBJ) $(HINTOBJ) version.o # the .o files from the HACKCSRC, SYSSRC, and WINSRC lists -$(GAME): $(SYSTEM) +# first target is also the default target for 'make' without any arguments +all: $(GAME) + @echo "" + +create_responsefiles: + echo $(CC_COMPILER_SWITCHES) >$(CC_RESPONSEFILE) + echo $(CXX_COMPILER_SWITCHES) >$(CXX_RESPONSEFILE) + +pregame: $(RESPONSEFILES) + $(PREGAME) + +$(GAME): pregame $(MAKEDEFS) $(LUALIB) $(WAVS) $(SYSTEM) @echo "$(GAME) is up to date." -Sysunix: $(HOBJ) Makefile +Sysunix: $(HOSTOBJ) $(HOBJ) $(TARGET_HACKLIB) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." - $(AT)$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) $(LIBS) + $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ + $(HOBJ) $(DATE_O) $(TARGET_HACKLIB) $(WINLIB) \ + $(TARGET_LIBS) $(LUALIBS) $(AUTOLIBS) @touch Sysunix -Sys3B2: $(HOBJ) Makefile +Sys3B2: $(HOSTOBJ) $(HOBJ) $(TARGET_HACKLIB) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." - $(AT)$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) -lmalloc + $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ + $(HOBJ) $(DATE_O) $(TARGET_HACKLIB) $(WINLIB) \ + $(LUALIBS) -lmalloc @touch Sys3B2 -Sysatt: $(HOBJ) Makefile +Sysatt: $(HOSTOBJ) $(HOBJ) $(TARGET_HACKLIB) $(DATE_O) $(BUILDMORE) Makefile @echo "Loading $(GAME)." - $(AT)$(LD) $(LFLAGS) /lib/crt0s.o /lib/shlib.ifile -o $(GAME) $(HOBJ) + $(AT)$(LD) $(TARGET_LFLAGS) /lib/crt0s.o /lib/shlib.ifile \ + -o $(GAMEBIN) $(HOSTOBJ) $(HOBJ) $(DATE_O) $(TARGET_HACKLIB) \ + $(LUALIBS) @touch Sysatt -Systos: $(HOBJ) Makefile +Systos: $(HOSTOBJ) $(HOBJ) $(TARGET_HACKLIB) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." - $(AT)$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) + $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ + $(HOBJ) $(DATE_O) $(TARGET_HACKLIB) \ + $(WINLIB) $(LUALIBS) @touch Systos -SysV-AT: DUMB.Setup $(HOBJ) Makefile +SysV-AT: DUMB.Setup $(HOSTOBJ) $(HOBJ) $(TARGET_HACKLIB) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." - $(AT)$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) + $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ + $(HOBJ) $(DATE_O) $(TARGET_HACKLIB) \ + $(WINLIB) $(LUALIBS) @touch SysV-AT -SysBe: $(HOBJ) Makefile +SysBe: $(HOSTOBJ) $(HOBJ) $(TARGET_HACKLIB) $(DATE_O) $(BUILDMORE) Makefile @echo "Linking $(GAME)." - $(AT)$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) $(LIBS) + $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAME) \ + $(HOBJ) $(DATE_O) $(TARGET_HACKLIB) \ + $(WINLIB) $(TARGET_LIBS) $(LUALIBS) @xres -o $(GAME) ../win/BeOS/nethack.rsrc @mimeset -f $(GAME) @touch SysBe @@ -578,8 +718,8 @@ DUMB.Setup: ../include/extern.h cp ../include/extern.DUMB ../include/extern.h @touch DUMB.Setup -all: $(GAME) - +$(LUALIB) ../include/nhlua.h: + @( cd .. ; $(MAKE) lua_support ) # dependencies for makedefs and its outputs, which the util # Makefile is responsible for keeping up to date @@ -588,76 +728,61 @@ all: $(GAME) # special rules, to force update of makedefs, real dependencies should be # below in the 'make depend' output. monst.o: - $(CC) $(CFLAGS) -c monst.c + $(CC) $(CFLAGS) $(CSTD) -c -o $@ monst.c @rm -f $(MAKEDEFS) objects.o: - $(CC) $(CFLAGS) -c objects.c + $(CC) $(CFLAGS) $(CSTD) -c -o $@ objects.c @rm -f $(MAKEDEFS) -# Qt 3 windowport meta-object-compiler output -qt_kde0.moc: ../include/qt_kde0.h - $(QTDIR)/bin/moc -o qt_kde0.moc ../include/qt_kde0.h - -qt_win.moc: ../include/qt_win.h - $(QTDIR)/bin/moc -o qt_win.moc ../include/qt_win.h - -qttableview.moc: ../include/qttableview.h - $(QTDIR)/bin/moc -o qttableview.moc ../include/qttableview.h - -# Qt 4 windowport meta-object-compiler output -qt4kde0.moc : ../win/Qt4/qt4kde0.h - $(QTDIR)/bin/$(MOC) -o qt4kde0.moc ../win/Qt4/qt4kde0.h -qt4main.moc : ../win/Qt4/qt4main.h - $(QTDIR)/bin/$(MOC) -o qt4main.moc ../win/Qt4/qt4main.h -qt4map.moc : ../win/Qt4/qt4map.h - $(QTDIR)/bin/$(MOC) -o qt4map.moc ../win/Qt4/qt4map.h -qt4menu.moc : ../win/Qt4/qt4menu.h - $(QTDIR)/bin/$(MOC) -o qt4menu.moc ../win/Qt4/qt4menu.h -qt4msg.moc : ../win/Qt4/qt4msg.h - $(QTDIR)/bin/$(MOC) -o qt4msg.moc ../win/Qt4/qt4msg.h -qt4plsel.moc : ../win/Qt4/qt4plsel.h - $(QTDIR)/bin/$(MOC) -o qt4plsel.moc ../win/Qt4/qt4plsel.h -qt4set.moc : ../win/Qt4/qt4set.h - $(QTDIR)/bin/$(MOC) -o qt4set.moc ../win/Qt4/qt4set.h -qt4stat.moc : ../win/Qt4/qt4stat.h - $(QTDIR)/bin/$(MOC) -o qt4stat.moc ../win/Qt4/qt4stat.h -qt4xcmd.moc : ../win/Qt4/qt4xcmd.h - $(QTDIR)/bin/$(MOC) -o qt4xcmd.moc ../win/Qt4/qt4xcmd.h -qt4yndlg.moc : ../win/Qt4/qt4yndlg.h - $(QTDIR)/bin/$(MOC) -o qt4yndlg.moc ../win/Qt4/qt4yndlg.h +# outdated Qt 3 windowport meta-object-compiler output +qt3_kde0.moc: ../win/Qt3/qt3_kde0.h + $(QTDIR)/bin/moc -o qt3kde0.moc ../win/Qt3/qt3_kde0.h +qt3_win.moc: ../win/Qt3/qt3_win.h + $(QTDIR)/bin/moc -o qt3win.moc ../win/Qt3/qt3_win.h +qt3tableview.moc: ../win/Qt3/qt3tableview.h + $(QTDIR)/bin/moc -o qt3tableview.moc ../win/Qt3/qt3tableview.h # build monst.o and objects.o before executing '$(MAKE) makedefs' $(MAKEDEFS): $(FIRSTOBJ) \ - ../util/makedefs.c $(CONFIG_H) ../include/permonst.h \ - ../include/objclass.h ../include/monsym.h \ - ../include/artilist.h ../include/dungeon.h ../include/obj.h \ - ../include/monst.h ../include/you.h ../include/flag.h \ - ../include/dlb.h ../include/patchlevel.h ../include/qtext.h + ../util/makedefs.c ../src/mdlib.c $(CONFIG_H) \ + ../include/permonst.h ../include/monsters.h \ + ../include/objclass.h ../include/objects.h ../include/sym.h \ + ../include/defsym.h ../include/artilist.h \ + ../include/dungeon.h ../include/obj.h ../include/monst.h \ + ../include/you.h ../include/flag.h ../include/dlb.h \ + ../include/patchlevel.h @( cd ../util ; $(MAKE) makedefs ) -# Source files created by 'makedefs' at build time. -# Each is given an artificial dependency upon the one before -# so that parallel makes will have to build them sequentially. -# (More for documentation than effect; 'make' should know not -# to try to build $(MAKEDEFS) for bar.h while it is in the -# process of building it for foo.h.) +# Source files formerly created by 'makedefs' at build time +# but no longer used. ../include/onames.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/onames.h ) -../include/pm.h: $(MAKEDEFS) ../include/onames.h +../include/pm.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/pm.h ) -../include/vis_tab.h: $(MAKEDEFS) ../include/pm.h - @( cd ../util ; $(MAKE) ../include/vis_tab.h ) -# makedefs -z makes both vis_tab.h and vis_tab.c, but writes the .h first -vis_tab.c: ../include/vis_tab.h # Created at build time for configurations which support tiles, # but not by makedefs so not connected to the others. tile.c: ../win/share/tilemap.c $(HACK_H) @( cd ../util ; $(MAKE) ../src/tile.c ) +# +# hacklib (a library of utility routines) +# + +hacklib.a: hacklib.o + $(AR) $(ARFLAGS) $@ hacklib.o + ../win/gnome/gn_rip.h: ../win/X11/rip.xpm cp ../win/X11/rip.xpm ../win/gnome/gn_rip.h +$(TARGETPFX)sfbase.o: sfbase.c $(HACK_H) ../include/sfprocs.h ../include/sfmacros.h + +# date.c should be recompiled any time any of the source or include code +# is modified. +DATECFLAGS = $(TARGET_CFLAGS) $(GITHASH) $(GITBRANCH) $(GITPREFIX) +$(TARGETPFX)date.o: date.c $(HACK_H) $(HACKCSRC) $(HOBJ) $(TARGET_HACKLIB) + $(TARGET_CC) $(DATECFLAGS) -c -o $@ date.c + # date.h should be remade any time any of the source or include code # is modified. Unfortunately, this would make the contents of this # file far more complex. Since "hack.h" depends on most of the include @@ -666,13 +791,10 @@ tile.c: ../win/share/tilemap.c $(HACK_H) # Do NOT include ../dat/gitinfo.txt as either a prerequisite or target. # 'makedefs -v' processes it when present and ignores it if not. # -# hack.h depends on makedefs' output, so we know makedefs will be -# up to date before being executed -../include/date.h: $(VERSOURCES) $(HACK_H) +../include/date.h: ../util/makedefs $(VERSOURCES) $(HACK_H) -$(SHELL) ../sys/unix/gitinfo.sh $(GITINFO) #before 'makedefs -v' ../util/makedefs -v - lint: # lint cannot have -p here because (i) capitals are meaningful: # [Ww]izard, (ii) identifiers may coincide in the first six places: @@ -690,407 +812,504 @@ tags: $(CSOURCES) clean: -rm -f *.o $(HACK_H) $(CONFIG_H) + -rm -f monstr.c vis_tab.c ../include/vis_tab.h #obsolete generated files + -true; $(CLEANMORE) + true; $(CLEAN_CC_RESPONSEFILE) $(CLEAN_CXX_RESPONSEFILE) spotless: clean - -rm -f a.out core $(GAME) Sys* - -rm -f ../include/date.h ../include/onames.h ../include/pm.h - -rm -f ../include/vis_tab.h vis_tab.c tile.c *.moc + -rm -f a.out core $(HACKLIB) $(GAMEBIN) Sys* + -rm -f ../include/nhlua.h + -rm -f ../include/date.h #created but no longer used, at least by core + -rm -f ../include/onames.h ../include/pm.h #obsolete generated files + -rm -f tile.c *.moc Qt*.h-t -rm -f ../win/gnome/gn_rip.h - -depend: ../sys/unix/depend.awk \ - $(SYSCSRC) $(WINCSRC) $(SYSCXXSRC) $(WINCXXSRC) \ - $(CHAINSRC) $(GENCSRC) $(HACKCSRC) - $(AWK) -f ../sys/unix/depend.awk ../include/*.h \ +package: + $(PACKAGE) + @echo packaging complete. + +# A more automated "make depend" target +# cd sys/unix ; make -f Makefile.src updatedepend +updatedepend: updatedepend-setup + cp Makefile.src ../../src && \ + make -C ../../src MAKEFILE_NAME=Makefile.src -f Makefile.src depend2 && \ + mv ../../src/Makefile.src . + @rm -f ../$(HACK_H) ../../include/nhlua.h + +# check pwd, create bogus derived files +updatedepend-setup: + @ # make sure we're in sys/unix before we start writing + @p=`pwd`; \ + if [ $$p = $${p%/sys/unix} ]; then \ + echo "updatedepend must be run in sys/unix"; exit 1; \ + fi + touch ../$(HACK_H) + @ # generate bogus files + echo "Generating bogus include/nhlua.h" + (HFILE=../../include/nhlua.h && \ + echo '/* bogus nhlua.h for updatedepend ONLY */' > $$HFILE && \ + echo '#error bogus include/nhlua.h' >> $$HFILE && \ + echo '#include "../$(LUAHEADERS)/lua.h"' >> $$HFILE && \ + echo '#include "../$(LUAHEADERS)/lualib.h"' >> $$HFILE && \ + echo '#include "../$(LUAHEADERS)/lauxlib.h"' >> $$HFILE && \ + echo '/*nhlua.h*/' >> $$HFILE ) + @echo "Generating bogus src/tile.c" + @echo '#error bogus include/nhlua.h' > ../../src/tile.c + @echo "#include \"hack.h\"" >> ../../src/tile.c + +MAKEFILE_NAME=Makefile +depend: ../sys/unix/depend.awk \ + $(SYSCSRC) $(WINCSRC) $(SYSCXXSRC) $(WINCXXSRC) \ + $(CHAINSRC) $(GENCSRC) $(HACKCSRC) + $(MAKE) depend2 + +depend2: $(WINQTMOC) + $(AWK) -f ../sys/unix/depend.awk ../include/*.h ../win/*/*.h \ $(SYSCSRC) $(WINCSRC) $(SYSCXXSRC) $(WINCXXSRC) \ $(CHAINSRC) $(GENCSRC) $(HACKCSRC) >makedep @echo '/^# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT/+2,$$d' >eddep @echo '$$r makedep' >>eddep @echo 'w' >>eddep - @cp Makefile Makefile.bak - ed - Makefile < eddep + @cp $(MAKEFILE_NAME) Makefile.bak + @ed - $(MAKEFILE_NAME) < eddep @rm -f eddep makedep - @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile - @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile - @echo '# see make depend above' >> Makefile - - diff Makefile.bak Makefile + @echo '# DEPENDENCIES MUST END AT END OF FILE' >> $(MAKEFILE_NAME) + @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> $(MAKEFILE_NAME) + @echo '# see make depend above' >> $(MAKEFILE_NAME) + - diff Makefile.bak $(MAKEFILE_NAME) @rm -f Makefile.bak + @rm -f ../include/nhlua.h tile.c + # DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT # config.h timestamp -$(CONFIG_H): ../include/config.h ../include/config1.h ../include/tradstdc.h \ - ../include/global.h ../include/coord.h ../include/vmsconf.h \ - ../include/system.h ../include/unixconf.h ../include/os2conf.h \ - ../include/micro.h ../include/pcconf.h ../include/tosconf.h \ - ../include/amiconf.h ../include/macconf.h ../include/beconf.h \ - ../include/wceconf.h ../include/ntconf.h +$(CONFIG_H): ../include/color.h ../include/config.h ../include/config1.h \ + ../include/coord.h ../include/cstd.h ../include/fnamesiz.h \ + ../include/global.h ../include/integer.h ../include/micro.h \ + ../include/patchlevel.h ../include/pcconf.h \ + ../include/tradstdc.h ../include/unixconf.h \ + ../include/vmsconf.h ../include/warnings.h \ + ../include/windconf.h touch $(CONFIG_H) # hack.h timestamp -$(HACK_H): ../include/hack.h $(CONFIG_H) ../include/lint.h ../include/align.h \ - ../include/dungeon.h ../include/monsym.h ../include/mkroom.h \ - ../include/objclass.h ../include/youprop.h ../include/prop.h \ - ../include/permonst.h ../include/monattk.h \ - ../include/monflag.h ../include/mondata.h ../include/pm.h \ - ../include/wintype.h ../include/context.h ../include/decl.h \ - ../include/quest.h ../include/spell.h ../include/color.h \ - ../include/obj.h ../include/you.h ../include/attrib.h \ - ../include/monst.h ../include/mextra.h ../include/skills.h \ - ../include/onames.h ../include/timeout.h ../include/trap.h \ - ../include/flag.h ../include/rm.h ../include/vision.h \ - ../include/display.h ../include/engrave.h ../include/rect.h \ - ../include/region.h ../include/winprocs.h ../include/botl.h \ - ../include/sys.h ../include/wintty.h ../include/trampoli.h +$(HACK_H): $(CONFIG_H) ../include/align.h ../include/artilist.h \ + ../include/attrib.h ../include/botl.h ../include/context.h \ + ../include/decl.h ../include/defsym.h ../include/display.h \ + ../include/dungeon.h ../include/engrave.h ../include/flag.h \ + ../include/hack.h ../include/lint.h ../include/mextra.h \ + ../include/mcastu.h \ + ../include/mkroom.h ../include/monattk.h ../include/mondata.h \ + ../include/monflag.h ../include/monst.h ../include/monsters.h \ + ../include/nhlua.h ../include/obj.h ../include/objclass.h \ + ../include/objects.h ../include/permonst.h ../include/prop.h \ + ../include/quest.h ../include/rect.h ../include/region.h \ + ../include/rm.h ../include/savefile.h ../include/sfprocs.h \ + ../include/seffects.h ../include/selvar.h \ + ../include/skills.h ../include/sndprocs.h ../include/spell.h \ + ../include/stairs.h ../include/sym.h ../include/sys.h \ + ../include/timeout.h ../include/trap.h ../include/vision.h \ + ../include/weight.h ../include/winprocs.h \ + ../include/wintype.h ../include/you.h ../include/youprop.h touch $(HACK_H) # -tos.o: ../sys/atari/tos.c $(HACK_H) ../include/tcap.h - $(CC) $(CFLAGS) -c -o $@ ../sys/atari/tos.c -pcmain.o: ../sys/share/pcmain.c $(HACK_H) ../include/dlb.h - $(CC) $(CFLAGS) -c -o $@ ../sys/share/pcmain.c -pcsys.o: ../sys/share/pcsys.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/pcsys.c -pctty.o: ../sys/share/pctty.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/pctty.c -pcunix.o: ../sys/share/pcunix.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/pcunix.c -pmatchregex.o: ../sys/share/pmatchregex.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/pmatchregex.c -posixregex.o: ../sys/share/posixregex.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/posixregex.c -random.o: ../sys/share/random.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/random.c -ioctl.o: ../sys/share/ioctl.c $(HACK_H) ../include/tcap.h - $(CC) $(CFLAGS) -c -o $@ ../sys/share/ioctl.c -unixtty.o: ../sys/share/unixtty.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/share/unixtty.c -unixmain.o: ../sys/unix/unixmain.c $(HACK_H) ../include/dlb.h - $(CC) $(CFLAGS) -c -o $@ ../sys/unix/unixmain.c -unixunix.o: ../sys/unix/unixunix.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/unix/unixunix.c -unixres.o: ../sys/unix/unixres.c $(CONFIG_H) - $(CC) $(CFLAGS) -c -o $@ ../sys/unix/unixres.c -bemain.o: ../sys/be/bemain.c $(HACK_H) ../include/dlb.h - $(CC) $(CFLAGS) -c -o $@ ../sys/be/bemain.c -getline.o: ../win/tty/getline.c $(HACK_H) ../include/func_tab.h - $(CC) $(CFLAGS) -c -o $@ ../win/tty/getline.c -termcap.o: ../win/tty/termcap.c $(HACK_H) ../include/tcap.h - $(CC) $(CFLAGS) -c -o $@ ../win/tty/termcap.c -topl.o: ../win/tty/topl.c $(HACK_H) ../include/tcap.h - $(CC) $(CFLAGS) -c -o $@ ../win/tty/topl.c -wintty.o: ../win/tty/wintty.c $(HACK_H) ../include/dlb.h ../include/tcap.h - $(CC) $(CFLAGS) -c -o $@ ../win/tty/wintty.c -cursmain.o: ../win/curses/cursmain.c $(HACK_H) ../include/patchlevel.h \ - ../include/wincurs.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursmain.c -curswins.o: ../win/curses/curswins.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/curswins.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/curswins.c -cursmisc.o: ../win/curses/cursmisc.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/cursmisc.h ../include/func_tab.h ../include/dlb.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursmisc.c -cursdial.o: ../win/curses/cursdial.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/cursdial.h ../include/func_tab.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursdial.c -cursstat.o: ../win/curses/cursstat.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/cursstat.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursstat.c -cursinit.o: ../win/curses/cursinit.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/cursinit.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursinit.c -cursmesg.o: ../win/curses/cursmesg.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/cursmesg.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursmesg.c -cursinvt.o: ../win/curses/cursinvt.c $(HACK_H) ../include/wincurs.h \ - ../win/curses/cursinvt.h - $(CC) $(CFLAGS) -c -o $@ ../win/curses/cursinvt.c -Window.o: ../win/X11/Window.c ../include/xwindowp.h ../include/xwindow.h \ - $(CONFIG_H) ../include/lint.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/Window.c -dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) ../include/lint.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/dialogs.c -winX.o: ../win/X11/winX.c $(HACK_H) ../include/winX.h ../include/dlb.h \ - ../include/xwindow.h ../win/X11/nh72icon ../win/X11/nh56icon \ - ../win/X11/nh32icon - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winX.c -winmap.o: ../win/X11/winmap.c ../include/xwindow.h $(HACK_H) ../include/dlb.h \ - ../include/winX.h ../include/tile2x11.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmap.c -winmenu.o: ../win/X11/winmenu.c $(HACK_H) ../include/winX.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmenu.c -winmesg.o: ../win/X11/winmesg.c ../include/xwindow.h $(HACK_H) ../include/winX.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmesg.c -winmisc.o: ../win/X11/winmisc.c $(HACK_H) ../include/func_tab.h \ +$(TARGETPFX)cppregex.o: ../sys/share/cppregex.cpp $(CONFIG_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../sys/share/cppregex.cpp +$(TARGETPFX)ioctl.o: ../sys/share/ioctl.c $(HACK_H) ../include/tcap.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/ioctl.c +$(TARGETPFX)pcmain.o: ../sys/share/pcmain.c $(HACK_H) ../include/dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pcmain.c +$(TARGETPFX)pcsys.o: ../sys/share/pcsys.c $(HACK_H) ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pcsys.c +$(TARGETPFX)pctty.o: ../sys/share/pctty.c $(HACK_H) ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pctty.c +$(TARGETPFX)pcunix.o: ../sys/share/pcunix.c $(HACK_H) ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pcunix.c +$(TARGETPFX)pmatchregex.o: ../sys/share/pmatchregex.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/pmatchregex.c +$(TARGETPFX)posixregex.o: ../sys/share/posixregex.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/posixregex.c +$(TARGETPFX)random.o: ../sys/share/random.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/random.c +$(TARGETPFX)unixtty.o: ../sys/share/unixtty.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/share/unixtty.c +$(TARGETPFX)unixmain.o: ../sys/unix/unixmain.c $(HACK_H) ../include/dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/unix/unixmain.c +$(TARGETPFX)unixres.o: ../sys/unix/unixres.c $(CONFIG_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/unix/unixres.c +$(TARGETPFX)unixunix.o: ../sys/unix/unixunix.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../sys/unix/unixunix.c +$(TARGETPFX)qt_bind.o: ../win/Qt/qt_bind.cpp $(HACK_H) $(QTn_H) \ + ../include/dlb.h ../win/Qt/qt_bind.h ../win/Qt/qt_click.h \ + ../win/Qt/qt_clust.h ../win/Qt/qt_delay.h ../win/Qt/qt_icon.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_key.h ../win/Qt/qt_line.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_map.h ../win/Qt/qt_menu.h \ + ../win/Qt/qt_msg.h ../win/Qt/qt_plsel.h ../win/Qt/qt_post.h \ + ../win/Qt/qt_pre.h ../win/Qt/qt_rip.h ../win/Qt/qt_set.h \ + ../win/Qt/qt_stat.h ../win/Qt/qt_str.h ../win/Qt/qt_streq.h \ + ../win/Qt/qt_svsel.h ../win/Qt/qt_win.h ../win/Qt/qt_xcmd.h \ + ../win/Qt/qt_yndlg.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_bind.cpp +$(TARGETPFX)qt_click.o: ../win/Qt/qt_click.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_click.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_click.cpp +$(TARGETPFX)qt_clust.o: ../win/Qt/qt_clust.cpp $(QTn_H) ../win/Qt/qt_clust.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_clust.cpp +$(TARGETPFX)qt_delay.o: ../win/Qt/qt_delay.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_delay.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_delay.cpp +$(TARGETPFX)qt_glyph.o: ../win/Qt/qt_glyph.cpp $(HACK_H) $(QTn_H) \ + ../include/tile2x11.h ../win/Qt/qt_bind.h \ + ../win/Qt/qt_clust.h ../win/Qt/qt_glyph.h ../win/Qt/qt_inv.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_main.h ../win/Qt/qt_map.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_pre.h ../win/Qt/qt_set.h \ + ../win/Qt/qt_str.h ../win/Qt/qt_win.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_glyph.cpp +$(TARGETPFX)qt_icon.o: ../win/Qt/qt_icon.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_icon.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_icon.cpp +$(TARGETPFX)qt_inv.o: ../win/Qt/qt_inv.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_glyph.h ../win/Qt/qt_inv.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_main.h ../win/Qt/qt_post.h \ + ../win/Qt/qt_pre.h ../win/Qt/qt_set.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_inv.cpp +$(TARGETPFX)qt_key.o: ../win/Qt/qt_key.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_key.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_key.cpp +$(TARGETPFX)qt_line.o: ../win/Qt/qt_line.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_line.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_line.cpp +$(TARGETPFX)qt_main.o: ../win/Qt/qt_main.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_clust.h ../win/Qt/qt_glyph.h \ + ../win/Qt/qt_icon.h ../win/Qt/qt_inv.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_key.h ../win/Qt/qt_main.h ../win/Qt/qt_map.h \ + ../win/Qt/qt_msg.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_stat.h ../win/Qt/qt_str.h \ + ../win/Qt/qt_win.h qt_kde0.moc qt_main.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_main.cpp +$(TARGETPFX)qt_map.o: ../win/Qt/qt_map.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_click.h ../win/Qt/qt_clust.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_kde0.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_map.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_str.h ../win/Qt/qt_win.h \ + qt_map.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_map.cpp +$(TARGETPFX)qt_menu.o: ../win/Qt/qt_menu.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_glyph.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_key.h ../win/Qt/qt_line.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_menu.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_rip.h ../win/Qt/qt_set.h ../win/Qt/qt_str.h \ + ../win/Qt/qt_streq.h ../win/Qt/qt_win.h qt_menu.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_menu.cpp +$(TARGETPFX)qt_msg.o: ../win/Qt/qt_msg.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_clust.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_map.h ../win/Qt/qt_msg.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_pre.h ../win/Qt/qt_set.h \ + ../win/Qt/qt_str.h ../win/Qt/qt_win.h qt_msg.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_msg.cpp +$(TARGETPFX)qt_plsel.o: ../win/Qt/qt_plsel.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_glyph.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_plsel.h ../win/Qt/qt_post.h \ + ../win/Qt/qt_pre.h ../win/Qt/qt_set.h ../win/Qt/qt_str.h \ + qt_plsel.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_plsel.cpp +$(TARGETPFX)qt_rip.o: ../win/Qt/qt_rip.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_kde0.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_pre.h ../win/Qt/qt_rip.h \ + ../win/Qt/qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_rip.cpp +$(TARGETPFX)qt_set.o: ../win/Qt/qt_set.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_glyph.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_str.h ../win/Qt/qt_xcmd.h \ + qt_set.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_set.cpp +$(TARGETPFX)qt_stat.o: ../win/Qt/qt_stat.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_icon.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_stat.h ../win/Qt/qt_str.h \ + ../win/Qt/qt_win.h ../win/Qt/qt_xpms.h qt_stat.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_stat.cpp +$(TARGETPFX)qt_str.o: ../win/Qt/qt_str.cpp $(QTn_H) ../win/Qt/qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_str.cpp +$(TARGETPFX)qt_streq.o: ../win/Qt/qt_streq.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_kde0.h ../win/Qt/qt_line.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_str.h ../win/Qt/qt_streq.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_streq.cpp +$(TARGETPFX)qt_svsel.o: ../win/Qt/qt_svsel.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_kde0.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_pre.h ../win/Qt/qt_str.h \ + ../win/Qt/qt_svsel.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_svsel.cpp +$(TARGETPFX)qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_bind.h ../win/Qt/qt_click.h ../win/Qt/qt_clust.h \ + ../win/Qt/qt_glyph.h ../win/Qt/qt_icon.h ../win/Qt/qt_inv.h \ + ../win/Qt/qt_kde0.h ../win/Qt/qt_key.h ../win/Qt/qt_main.h \ + ../win/Qt/qt_map.h ../win/Qt/qt_menu.h ../win/Qt/qt_msg.h \ + ../win/Qt/qt_post.h ../win/Qt/qt_pre.h ../win/Qt/qt_rip.h \ + ../win/Qt/qt_set.h ../win/Qt/qt_win.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_win.cpp +$(TARGETPFX)qt_xcmd.o: ../win/Qt/qt_xcmd.cpp $(HACK_H) $(QTn_H) \ + ../include/func_tab.h ../win/Qt/qt_bind.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_key.h ../win/Qt/qt_main.h ../win/Qt/qt_post.h \ + ../win/Qt/qt_pre.h ../win/Qt/qt_set.h ../win/Qt/qt_str.h \ + ../win/Qt/qt_xcmd.h qt_xcmd.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_xcmd.cpp +$(TARGETPFX)qt_yndlg.o: ../win/Qt/qt_yndlg.cpp $(HACK_H) $(QTn_H) \ + ../win/Qt/qt_key.h ../win/Qt/qt_post.h ../win/Qt/qt_pre.h \ + ../win/Qt/qt_str.h ../win/Qt/qt_yndlg.h qt_yndlg.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ ../win/Qt/qt_yndlg.cpp +$(TARGETPFX)Window.o: ../win/X11/Window.c $(CONFIG_H) ../include/lint.h \ + ../include/winX.h ../include/wintype.h ../include/xwindow.h \ + ../include/xwindowp.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/Window.c +$(TARGETPFX)dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) ../include/lint.h \ + ../include/winX.h ../include/wintype.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/dialogs.c +$(TARGETPFX)winX.o: ../win/X11/winX.c $(HACK_H) ../include/dlb.h \ + ../include/winX.h ../include/xwindow.h ../win/X11/nh32icon \ + ../win/X11/nh56icon ../win/X11/nh72icon + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winX.c +$(TARGETPFX)winmap.o: ../win/X11/winmap.c $(HACK_H) ../include/dlb.h \ + ../include/tile2x11.h ../include/winX.h ../include/xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmap.c +$(TARGETPFX)winmenu.o: ../win/X11/winmenu.c $(HACK_H) ../include/winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmenu.c +$(TARGETPFX)winmesg.o: ../win/X11/winmesg.c $(HACK_H) ../include/winX.h \ + ../include/xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmesg.c +$(TARGETPFX)winmisc.o: ../win/X11/winmisc.c $(HACK_H) ../include/func_tab.h \ ../include/winX.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmisc.c -winstat.o: ../win/X11/winstat.c $(HACK_H) ../include/winX.h ../include/xwindow.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winstat.c -wintext.o: ../win/X11/wintext.c $(HACK_H) ../include/winX.h ../include/xwindow.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/wintext.c -winval.o: ../win/X11/winval.c $(HACK_H) ../include/winX.h - $(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winval.c -tile.o: tile.c $(HACK_H) -gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ - ../win/gnome/gnmain.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnaskstr.c -gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ - ../win/gnome/gnmenu.h ../win/gnome/gnaskstr.h \ - ../win/gnome/gnyesno.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnbind.c -gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h ../include/tile2x11.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnglyph.c -gnmain.o: ../win/gnome/gnmain.c ../win/gnome/gnmain.h ../win/gnome/gnsignal.h \ - ../win/gnome/gnbind.h ../win/gnome/gnopts.h $(HACK_H) \ - ../include/date.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnmain.c -gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h $(HACK_H) - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnmap.c -gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ - ../win/gnome/gnbind.h ../include/func_tab.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnmenu.c -gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnmesg.c -gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnopts.c -gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ - ../win/gnome/gnmain.h $(HACK_H) - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnplayer.c -gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ - ../win/gnome/gnmain.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnsignal.c -gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ - ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ - ../win/gnome/gnomeprv.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnstatus.c -gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ - ../win/gnome/gn_rip.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gntext.c -gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnyesno.c -gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h - $(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ ../win/gnome/gnworn.c -wingem.o: ../win/gem/wingem.c $(HACK_H) ../include/func_tab.h ../include/dlb.h \ - ../include/patchlevel.h ../include/wingem.h - $(CC) $(CFLAGS) -c -o $@ ../win/gem/wingem.c -wingem1.o: ../win/gem/wingem1.c ../include/gem_rsc.h ../include/load_img.h \ - ../include/gr_rect.h ../include/wintype.h ../include/wingem.h - $(CC) $(CFLAGS) -c -o $@ ../win/gem/wingem1.c -load_img.o: ../win/gem/load_img.c ../include/load_img.h - $(CC) $(CFLAGS) -c -o $@ ../win/gem/load_img.c -gr_rect.o: ../win/gem/gr_rect.c ../include/gr_rect.h - $(CC) $(CFLAGS) -c -o $@ ../win/gem/gr_rect.c -tile.o: tile.c $(HACK_H) -cppregex.o: ../sys/share/cppregex.cpp - $(CXX) $(CXXFLAGS) -c -o $@ ../sys/share/cppregex.cpp -qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) ../include/func_tab.h \ - ../include/dlb.h ../include/patchlevel.h ../include/tile2x11.h \ - ../include/qt_win.h ../include/qt_clust.h ../include/qt_kde0.h \ - ../include/qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt/qt_win.cpp -qt_clust.o: ../win/Qt/qt_clust.cpp ../include/qt_clust.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt/qt_clust.cpp -qttableview.o: ../win/Qt/qttableview.cpp ../include/qttableview.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt/qttableview.cpp -qt4bind.o: ../win/Qt4/qt4bind.cpp $(HACK_H) ../win/Qt4/qt4bind.h \ - ../win/Qt4/qt4click.h ../win/Qt4/qt4delay.h \ - ../win/Qt4/qt4xcmd.h ../win/Qt4/qt4key.h ../win/Qt4/qt4map.h \ - ../win/Qt4/qt4menu.h ../win/Qt4/qt4msg.h ../win/Qt4/qt4plsel.h \ - ../win/Qt4/qt4svsel.h ../win/Qt4/qt4set.h ../win/Qt4/qt4stat.h \ - ../win/Qt4/qt4streq.h ../win/Qt4/qt4yndlg.h \ - ../win/Qt4/qt4str.h ../include/dlb.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4bind.cpp -qt4click.o: ../win/Qt4/qt4click.cpp $(HACK_H) ../win/Qt4/qt4click.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4click.cpp -qt4clust.o: ../win/Qt4/qt4clust.cpp ../win/Qt4/qt4clust.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4clust.cpp -qt4delay.o: ../win/Qt4/qt4delay.cpp $(HACK_H) ../win/Qt4/qt4delay.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4delay.cpp -qt4glyph.o: ../win/Qt4/qt4glyph.cpp $(HACK_H) ../include/tile2x11.h \ - ../win/Qt4/qt4glyph.h ../win/Qt4/qt4set.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4glyph.cpp -qt4icon.o: ../win/Qt4/qt4icon.cpp $(HACK_H) ../win/Qt4/qt4icon.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4icon.cpp -qt4inv.o: ../win/Qt4/qt4inv.cpp $(HACK_H) ../win/Qt4/qt4inv.h \ - ../win/Qt4/qt4glyph.h ../win/Qt4/qt4set.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4inv.cpp -qt4key.o: ../win/Qt4/qt4key.cpp $(HACK_H) ../win/Qt4/qt4key.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4key.cpp -qt4line.o: ../win/Qt4/qt4line.cpp $(HACK_H) ../win/Qt4/qt4line.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4line.cpp -qt4main.o: ../win/Qt4/qt4main.cpp $(HACK_H) ../include/patchlevel.h \ - ../win/Qt4/qt4main.h qt4main.moc ../win/Qt4/qt4bind.h \ - ../win/Qt4/qt4glyph.h ../win/Qt4/qt4inv.h ../win/Qt4/qt4key.h \ - ../win/Qt4/qt4map.h ../win/Qt4/qt4msg.h ../win/Qt4/qt4set.h \ - ../win/Qt4/qt4stat.h ../win/Qt4/qt4str.h qt4kde0.moc - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4main.cpp -qt4map.o: ../win/Qt4/qt4map.cpp $(HACK_H) ../win/Qt4/qt4map.h qt4map.moc \ - ../win/Qt4/qt4click.h ../win/Qt4/qt4glyph.h \ - ../include/qt_xpms.h ../win/Qt4/qt4set.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4map.cpp -qt4menu.o: ../win/Qt4/qt4menu.cpp $(HACK_H) ../win/Qt4/qt4menu.h qt4menu.moc \ - ../win/Qt4/qt4glyph.h ../win/Qt4/qt4set.h \ - ../win/Qt4/qt4streq.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4menu.cpp -qt4msg.o: ../win/Qt4/qt4msg.cpp $(HACK_H) ../win/Qt4/qt4msg.h qt4msg.moc \ - ../win/Qt4/qt4map.h ../win/Qt4/qt4set.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4msg.cpp -qt4plsel.o: ../win/Qt4/qt4plsel.cpp $(HACK_H) ../win/Qt4/qt4plsel.h \ - qt4plsel.moc ../win/Qt4/qt4bind.h ../win/Qt4/qt4glyph.h \ - ../win/Qt4/qt4set.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4plsel.cpp -qt4rip.o: ../win/Qt4/qt4rip.cpp $(HACK_H) ../win/Qt4/qt4rip.h \ - ../win/Qt4/qt4bind.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4rip.cpp -qt4set.o: ../win/Qt4/qt4set.cpp $(HACK_H) ../win/Qt4/qt4set.h qt4set.moc \ - ../win/Qt4/qt4glyph.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4set.cpp -qt4stat.o: ../win/Qt4/qt4stat.cpp $(HACK_H) ../win/Qt4/qt4stat.h qt4stat.moc \ - ../win/Qt4/qt4set.h ../win/Qt4/qt4str.h ../include/qt_xpms.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4stat.cpp -qt4str.o: ../win/Qt4/qt4str.cpp ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4str.cpp -qt4streq.o: ../win/Qt4/qt4streq.cpp $(HACK_H) ../win/Qt4/qt4streq.h \ - ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4streq.cpp -qt4svsel.o: ../win/Qt4/qt4svsel.cpp $(HACK_H) ../win/Qt4/qt4svsel.h \ - ../win/Qt4/qt4bind.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4svsel.cpp -qt4win.o: ../win/Qt4/qt4win.cpp $(HACK_H) ../win/Qt4/qt4win.h \ - ../win/Qt4/qt4bind.h ../win/Qt4/qt4click.h \ - ../win/Qt4/qt4glyph.h ../win/Qt4/qt4inv.h ../win/Qt4/qt4key.h \ - ../win/Qt4/qt4icon.h ../win/Qt4/qt4map.h ../win/Qt4/qt4menu.h \ - ../win/Qt4/qt4msg.h ../win/Qt4/qt4set.h ../win/Qt4/qt4clust.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4win.cpp -qt4xcmd.o: ../win/Qt4/qt4xcmd.cpp $(HACK_H) ../include/func_tab.h \ - ../win/Qt4/qt4xcmd.h qt4xcmd.moc ../win/Qt4/qt4bind.h \ - ../win/Qt4/qt4set.h ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4xcmd.cpp -qt4yndlg.o: ../win/Qt4/qt4yndlg.cpp $(HACK_H) ../win/Qt4/qt4yndlg.h \ - qt4yndlg.moc ../win/Qt4/qt4str.h - $(CXX) $(CXXFLAGS) -c -o $@ ../win/Qt4/qt4yndlg.cpp -wc_chainin.o: ../win/chain/wc_chainin.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../win/chain/wc_chainin.c -wc_chainout.o: ../win/chain/wc_chainout.c $(HACK_H) - $(CC) $(CFLAGS) -c -o $@ ../win/chain/wc_chainout.c -wc_trace.o: ../win/chain/wc_trace.c $(HACK_H) ../include/func_tab.h - $(CC) $(CFLAGS) -c -o $@ ../win/chain/wc_trace.c -vis_tab.o: vis_tab.c $(CONFIG_H) ../include/vis_tab.h -allmain.o: allmain.c $(HACK_H) -alloc.o: alloc.c $(CONFIG_H) -apply.o: apply.c $(HACK_H) -artifact.o: artifact.c $(HACK_H) ../include/artifact.h ../include/artilist.h -attrib.o: attrib.c $(HACK_H) -ball.o: ball.c $(HACK_H) -bones.o: bones.c $(HACK_H) ../include/lev.h -botl.o: botl.c $(HACK_H) -cmd.o: cmd.c $(HACK_H) ../include/lev.h ../include/func_tab.h -dbridge.o: dbridge.c $(HACK_H) -decl.o: decl.c $(HACK_H) -detect.o: detect.c $(HACK_H) ../include/artifact.h -dig.o: dig.c $(HACK_H) -display.o: display.c $(HACK_H) -dlb.o: dlb.c $(CONFIG_H) ../include/dlb.h ../include/patchlevel.h -do.o: do.c $(HACK_H) ../include/lev.h -do_name.o: do_name.c $(HACK_H) -do_wear.o: do_wear.c $(HACK_H) -dog.o: dog.c $(HACK_H) -dogmove.o: dogmove.c $(HACK_H) ../include/mfndpos.h -dokick.o: dokick.c $(HACK_H) -dothrow.o: dothrow.c $(HACK_H) -drawing.o: drawing.c $(HACK_H) ../include/tcap.h -dungeon.o: dungeon.c $(HACK_H) ../include/dgn_file.h ../include/dlb.h \ - ../include/lev.h -eat.o: eat.c $(HACK_H) -end.o: end.c $(HACK_H) ../include/lev.h ../include/dlb.h -engrave.o: engrave.c $(HACK_H) ../include/lev.h -exper.o: exper.c $(HACK_H) -explode.o: explode.c $(HACK_H) -extralev.o: extralev.c $(HACK_H) -files.o: files.c $(HACK_H) ../include/dlb.h #zlib.h -fountain.o: fountain.c $(HACK_H) -hack.o: hack.c $(HACK_H) -hacklib.o: hacklib.c $(HACK_H) -invent.o: invent.c $(HACK_H) -isaac64.o: isaac64.c $(CONFIG_H) ../include/isaac64.h ../include/integer.h -light.o: light.c $(HACK_H) ../include/lev.h -lock.o: lock.c $(HACK_H) -mail.o: mail.c $(HACK_H) ../include/mail.h -makemon.o: makemon.c $(HACK_H) -mapglyph.o: mapglyph.c $(HACK_H) -mcastu.o: mcastu.c $(HACK_H) -mhitm.o: mhitm.c $(HACK_H) ../include/artifact.h -mhitu.o: mhitu.c $(HACK_H) ../include/artifact.h -minion.o: minion.c $(HACK_H) -mklev.o: mklev.c $(HACK_H) -mkmap.o: mkmap.c $(HACK_H) ../include/sp_lev.h -mkmaze.o: mkmaze.c $(HACK_H) ../include/sp_lev.h ../include/lev.h -mkobj.o: mkobj.c $(HACK_H) -mkroom.o: mkroom.c $(HACK_H) -mon.o: mon.c $(HACK_H) ../include/mfndpos.h -mondata.o: mondata.c $(HACK_H) -monmove.o: monmove.c $(HACK_H) ../include/mfndpos.h ../include/artifact.h -monst.o: monst.c $(CONFIG_H) ../include/permonst.h ../include/align.h \ - ../include/monattk.h ../include/monflag.h ../include/monsym.h \ - ../include/color.h -mplayer.o: mplayer.c $(HACK_H) -mthrowu.o: mthrowu.c $(HACK_H) -muse.o: muse.c $(HACK_H) -music.o: music.c $(HACK_H) #interp.c -o_init.o: o_init.c $(HACK_H) ../include/lev.h -objects.o: objects.c $(CONFIG_H) ../include/obj.h ../include/objclass.h \ - ../include/prop.h ../include/skills.h ../include/color.h -objnam.o: objnam.c $(HACK_H) -options.o: options.c $(CONFIG_H) ../include/objclass.h ../include/flag.h \ - $(HACK_H) ../include/tcap.h -pager.o: pager.c $(HACK_H) ../include/dlb.h -pickup.o: pickup.c $(HACK_H) -pline.o: pline.c $(HACK_H) -polyself.o: polyself.c $(HACK_H) -potion.o: potion.c $(HACK_H) -pray.o: pray.c $(HACK_H) -priest.o: priest.c $(HACK_H) ../include/mfndpos.h -quest.o: quest.c $(HACK_H) ../include/qtext.h -questpgr.o: questpgr.c $(HACK_H) ../include/dlb.h ../include/qtext.h -read.o: read.c $(HACK_H) -rect.o: rect.c $(HACK_H) -region.o: region.c $(HACK_H) ../include/lev.h -restore.o: restore.c $(HACK_H) ../include/lev.h ../include/tcap.h -rip.o: rip.c $(HACK_H) -rnd.o: rnd.c $(HACK_H) ../include/isaac64.h ../include/integer.h -role.o: role.c $(HACK_H) -rumors.o: rumors.c $(HACK_H) ../include/lev.h ../include/dlb.h -save.o: save.c $(HACK_H) ../include/lev.h -shk.o: shk.c $(HACK_H) -shknam.o: shknam.c $(HACK_H) -sit.o: sit.c $(HACK_H) ../include/artifact.h -sounds.o: sounds.c $(HACK_H) -sp_lev.o: sp_lev.c $(HACK_H) ../include/dlb.h ../include/sp_lev.h -spell.o: spell.c $(HACK_H) -steal.o: steal.c $(HACK_H) -steed.o: steed.c $(HACK_H) -sys.o: sys.c $(HACK_H) -teleport.o: teleport.c $(HACK_H) -timeout.o: timeout.c $(HACK_H) ../include/lev.h -topten.o: topten.c $(HACK_H) ../include/dlb.h ../include/patchlevel.h -track.o: track.c $(HACK_H) -trap.o: trap.c $(HACK_H) -u_init.o: u_init.c $(HACK_H) -uhitm.o: uhitm.c $(HACK_H) -vault.o: vault.c $(HACK_H) -version.o: version.c $(HACK_H) ../include/dlb.h ../include/date.h \ - ../include/patchlevel.h -vision.o: vision.c $(HACK_H) ../include/vis_tab.h -weapon.o: weapon.c $(HACK_H) -were.o: were.c $(HACK_H) -wield.o: wield.c $(HACK_H) -windows.o: windows.c $(HACK_H) ../include/wingem.h ../include/winGnome.h -wizard.o: wizard.c $(HACK_H) ../include/qtext.h -worm.o: worm.c $(HACK_H) ../include/lev.h -worn.o: worn.c $(HACK_H) -write.o: write.c $(HACK_H) -zap.o: zap.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winmisc.c +$(TARGETPFX)winstat.o: ../win/X11/winstat.c $(HACK_H) ../include/winX.h \ + ../include/xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winstat.c +$(TARGETPFX)wintext.o: ../win/X11/wintext.c $(HACK_H) ../include/winX.h \ + ../include/xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/wintext.c +$(TARGETPFX)winval.o: ../win/X11/winval.c $(HACK_H) ../include/winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ ../win/X11/winval.c +$(TARGETPFX)wc_chainin.o: ../win/chain/wc_chainin.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/chain/wc_chainin.c +$(TARGETPFX)wc_chainout.o: ../win/chain/wc_chainout.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/chain/wc_chainout.c +$(TARGETPFX)wc_trace.o: ../win/chain/wc_trace.c $(HACK_H) \ + ../include/func_tab.h ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/chain/wc_trace.c +$(TARGETPFX)cursdial.o: ../win/curses/cursdial.c $(HACK_H) \ + ../include/func_tab.h ../include/wincurs.h \ + ../win/curses/cursdial.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursdial.c +$(TARGETPFX)cursinit.o: ../win/curses/cursinit.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursinit.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursinit.c +$(TARGETPFX)cursinvt.o: ../win/curses/cursinvt.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursinvt.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursinvt.c +$(TARGETPFX)cursmain.o: ../win/curses/cursmain.c $(HACK_H) ../include/wincurs.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursmain.c +$(TARGETPFX)cursmesg.o: ../win/curses/cursmesg.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursmesg.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursmesg.c +$(TARGETPFX)cursmisc.o: ../win/curses/cursmisc.c $(HACK_H) ../include/dlb.h \ + ../include/func_tab.h ../include/wincurs.h \ + ../win/curses/cursmisc.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursmisc.c +$(TARGETPFX)cursstat.o: ../win/curses/cursstat.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/cursstat.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/cursstat.c +$(TARGETPFX)curswins.o: ../win/curses/curswins.c $(HACK_H) \ + ../include/wincurs.h ../win/curses/curswins.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/curses/curswins.c +$(TARGETPFX)winshim.o: ../win/shim/winshim.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/shim/winshim.c +$(TARGETPFX)getline.o: ../win/tty/getline.c $(HACK_H) ../include/func_tab.h \ + ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/getline.c +$(TARGETPFX)termcap.o: ../win/tty/termcap.c $(HACK_H) ../include/tcap.h \ + ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/termcap.c +$(TARGETPFX)topl.o: ../win/tty/topl.c $(HACK_H) ../include/tcap.h \ + ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/topl.c +$(TARGETPFX)wintty.o: ../win/tty/wintty.c $(HACK_H) ../include/dlb.h \ + ../include/tcap.h ../include/wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ ../win/tty/wintty.c +$(TARGETPFX)allmain.o: allmain.c $(HACK_H) +$(TARGETPFX)alloc.o: alloc.c $(CONFIG_H) ../include/nhlua.h +$(TARGETPFX)apply.o: apply.c $(HACK_H) +$(TARGETPFX)artifact.o: artifact.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)attrib.o: attrib.c $(HACK_H) +$(TARGETPFX)ball.o: ball.c $(HACK_H) +$(TARGETPFX)bones.o: bones.c $(HACK_H) +$(TARGETPFX)botl.o: botl.c $(HACK_H) +$(TARGETPFX)calendar.o: calendar.c $(HACK_H) +$(TARGETPFX)cfgfiles.o: cfgfiles.c $(HACK_H) +$(TARGETPFX)cmd.o: cmd.c $(HACK_H) ../include/func_tab.h +$(TARGETPFX)coloratt.o: coloratt.c $(HACK_H) +$(TARGETPFX)dbridge.o: dbridge.c $(HACK_H) +$(TARGETPFX)decl.o: decl.c $(HACK_H) +$(TARGETPFX)detect.o: detect.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)dig.o: dig.c $(HACK_H) +$(TARGETPFX)display.o: display.c $(HACK_H) +$(TARGETPFX)dlb.o: dlb.c $(CONFIG_H) ../include/dlb.h +$(TARGETPFX)do.o: do.c $(HACK_H) +$(TARGETPFX)do_name.o: do_name.c $(HACK_H) +$(TARGETPFX)do_wear.o: do_wear.c $(HACK_H) +$(TARGETPFX)dog.o: dog.c $(HACK_H) +$(TARGETPFX)dogmove.o: dogmove.c $(HACK_H) ../include/mfndpos.h +$(TARGETPFX)dokick.o: dokick.c $(HACK_H) +$(TARGETPFX)dothrow.o: dothrow.c $(HACK_H) +$(TARGETPFX)drawing.o: drawing.c $(CONFIG_H) ../include/defsym.h \ + ../include/objclass.h ../include/objects.h ../include/rm.h \ + ../include/sym.h ../include/wintype.h +$(TARGETPFX)dungeon.o: dungeon.c $(HACK_H) ../include/dgn_file.h \ + ../include/dlb.h +$(TARGETPFX)earlyarg.o: earlyarg.c $(HACK_H) +$(TARGETPFX)eat.o: eat.c $(HACK_H) +$(TARGETPFX)end.o: end.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)engrave.o: engrave.c $(HACK_H) +$(TARGETPFX)exper.o: exper.c $(HACK_H) +$(TARGETPFX)explode.o: explode.c $(HACK_H) +$(TARGETPFX)extralev.o: extralev.c $(HACK_H) +$(TARGETPFX)files.o: files.c $(HACK_H) ../include/dlb.h ../include/wintty.h \ + #zlib.h +$(TARGETPFX)fountain.o: fountain.c $(HACK_H) +$(TARGETPFX)getpos.o: getpos.c $(HACK_H) +$(TARGETPFX)glyphs.o: glyphs.c $(HACK_H) +$(TARGETPFX)hack.o: hack.c $(HACK_H) +$(TARGETPFX)hacklib.o: hacklib.c $(HACK_H) +$(TARGETPFX)iactions.o: iactions.c $(HACK_H) +$(TARGETPFX)insight.o: insight.c $(HACK_H) +$(TARGETPFX)invent.o: invent.c $(HACK_H) +$(TARGETPFX)isaac64.o: isaac64.c $(CONFIG_H) ../include/isaac64.h +$(TARGETPFX)light.o: light.c $(HACK_H) +$(TARGETPFX)lock.o: lock.c $(HACK_H) +$(TARGETPFX)mail.o: mail.c $(HACK_H) ../include/mail.h +$(TARGETPFX)makemon.o: makemon.c $(HACK_H) +$(TARGETPFX)mcastu.o: mcastu.c $(HACK_H) ../include/mcastu.h +$(TARGETPFX)mdlib.o: mdlib.c $(CONFIG_H) ../include/align.h \ + ../include/artilist.h ../include/attrib.h \ + ../include/context.h ../include/defsym.h ../include/dlb.h \ + ../include/dungeon.h ../include/flag.h ../include/hacklib.h \ + ../include/mextra.h ../include/monattk.h ../include/monflag.h \ + ../include/monst.h ../include/monsters.h ../include/obj.h \ + ../include/objclass.h ../include/objects.h \ + ../include/permonst.h ../include/prop.h ../include/seffects.h \ + ../include/skills.h ../include/sndprocs.h ../include/sym.h \ + ../include/weight.h ../include/wintype.h ../include/you.h +$(TARGETPFX)mhitm.o: mhitm.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)mhitu.o: mhitu.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)minion.o: minion.c $(HACK_H) +$(TARGETPFX)mklev.o: mklev.c $(HACK_H) +$(TARGETPFX)mkmap.o: mkmap.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)mkmaze.o: mkmaze.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)mkobj.o: mkobj.c $(HACK_H) +$(TARGETPFX)mkroom.o: mkroom.c $(HACK_H) +$(TARGETPFX)mon.o: mon.c $(HACK_H) ../include/mfndpos.h +$(TARGETPFX)mondata.o: mondata.c $(HACK_H) +$(TARGETPFX)monmove.o: monmove.c $(HACK_H) ../include/artifact.h \ + ../include/mfndpos.h +$(TARGETPFX)monst.o: monst.c $(CONFIG_H) ../include/align.h \ + ../include/defsym.h ../include/monattk.h ../include/monflag.h \ + ../include/monsters.h ../include/permonst.h ../include/sym.h \ + ../include/weight.h ../include/wintype.h +$(TARGETPFX)mplayer.o: mplayer.c $(HACK_H) +$(TARGETPFX)mthrowu.o: mthrowu.c $(HACK_H) +$(TARGETPFX)muse.o: muse.c $(HACK_H) +$(TARGETPFX)music.o: music.c $(HACK_H) +$(TARGETPFX)nhlobj.o: nhlobj.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)nhlsel.o: nhlsel.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)nhlua.o: nhlua.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)nhmd4.o: nhmd4.c $(HACK_H) ../include/nhmd4.h +$(TARGETPFX)o_init.o: o_init.c $(HACK_H) +$(TARGETPFX)objects.o: objects.c $(CONFIG_H) ../include/defsym.h \ + ../include/obj.h ../include/objclass.h ../include/objects.h \ + ../include/prop.h ../include/skills.h +$(TARGETPFX)objnam.o: objnam.c $(HACK_H) +$(TARGETPFX)options.o: options.c $(CONFIG_H) $(HACK_H) ../include/defsym.h \ + ../include/flag.h ../include/objclass.h ../include/objects.h \ + ../include/optlist.h ../include/tcap.h +$(TARGETPFX)pager.o: pager.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)pickup.o: pickup.c $(HACK_H) +$(TARGETPFX)pline.o: pline.c $(HACK_H) +$(TARGETPFX)polyself.o: polyself.c $(HACK_H) +$(TARGETPFX)potion.o: potion.c $(HACK_H) +$(TARGETPFX)pray.o: pray.c $(HACK_H) +$(TARGETPFX)priest.o: priest.c $(HACK_H) ../include/mfndpos.h +$(TARGETPFX)quest.o: quest.c $(HACK_H) +$(TARGETPFX)questpgr.o: questpgr.c $(HACK_H) ../include/dlb.h \ + ../include/wintty.h +$(TARGETPFX)read.o: read.c $(HACK_H) +$(TARGETPFX)rect.o: rect.c $(HACK_H) +$(TARGETPFX)region.o: region.c $(HACK_H) +$(TARGETPFX)report.o: report.c $(HACK_H) ../include/dlb.h ../include/nhmd4.h +$(TARGETPFX)restore.o: restore.c $(HACK_H) ../include/tcap.h +$(TARGETPFX)rip.o: rip.c $(HACK_H) +$(TARGETPFX)rnd.o: rnd.c $(HACK_H) ../include/isaac64.h +$(TARGETPFX)role.o: role.c $(HACK_H) +$(TARGETPFX)rumors.o: rumors.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)save.o: save.c $(HACK_H) +$(TARGETPFX)selvar.o: selvar.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)sfstruct.o: sfstruct.c $(HACK_H) ../include/sfprocs.h ../include/sfmacros.h +$(TARGETPFX)shk.o: shk.c $(HACK_H) +$(TARGETPFX)shknam.o: shknam.c $(HACK_H) +$(TARGETPFX)sit.o: sit.c $(HACK_H) ../include/artifact.h +$(TARGETPFX)sounds.o: sounds.c $(HACK_H) +$(TARGETPFX)sp_lev.o: sp_lev.c $(HACK_H) ../include/sp_lev.h +$(TARGETPFX)spell.o: spell.c $(HACK_H) +$(TARGETPFX)stairs.o: stairs.c $(HACK_H) +$(TARGETPFX)steal.o: steal.c $(HACK_H) +$(TARGETPFX)steed.o: steed.c $(HACK_H) +$(TARGETPFX)strutil.o: strutil.c $(HACK_H) +$(TARGETPFX)symbols.o: symbols.c $(HACK_H) ../include/tcap.h +$(TARGETPFX)sys.o: sys.c $(HACK_H) +$(TARGETPFX)teleport.o: teleport.c $(HACK_H) +$(TARGETPFX)tile.o: tile.c $(HACK_H) +$(TARGETPFX)timeout.o: timeout.c $(HACK_H) +$(TARGETPFX)topten.o: topten.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)track.o: track.c $(HACK_H) +$(TARGETPFX)trap.o: trap.c $(HACK_H) +$(TARGETPFX)u_init.o: u_init.c $(HACK_H) +$(TARGETPFX)uhitm.o: uhitm.c $(HACK_H) +$(TARGETPFX)utf8map.o: utf8map.c $(HACK_H) +$(TARGETPFX)vault.o: vault.c $(HACK_H) +$(TARGETPFX)version.o: version.c $(HACK_H) ../include/dlb.h +$(TARGETPFX)vision.o: vision.c $(HACK_H) +$(TARGETPFX)weapon.o: weapon.c $(HACK_H) +$(TARGETPFX)were.o: were.c $(HACK_H) +$(TARGETPFX)wield.o: wield.c $(HACK_H) +$(TARGETPFX)windows.o: windows.c $(HACK_H) ../include/dlb.h ../include/wintty.h +$(TARGETPFX)wizard.o: wizard.c $(HACK_H) +$(TARGETPFX)wizcmds.o: wizcmds.c $(HACK_H) ../include/func_tab.h +$(TARGETPFX)worm.o: worm.c $(HACK_H) +$(TARGETPFX)worn.o: worn.c $(HACK_H) +$(TARGETPFX)write.o: write.c $(HACK_H) +$(TARGETPFX)zap.o: zap.c $(HACK_H) +qt_kde0.moc: $(QTn_H) ../win/Qt/qt_kde0.h + $(MOCPATH) -o $@ ../win/Qt/qt_kde0.h +qt_main.moc: $(QTn_H) ../win/Qt/qt_kde0.h ../win/Qt/qt_main.h + $(MOCPATH) -o $@ ../win/Qt/qt_main.h +qt_map.moc: $(QTn_H) ../win/Qt/qt_clust.h ../win/Qt/qt_map.h ../win/Qt/qt_win.h + $(MOCPATH) -o $@ ../win/Qt/qt_map.h +qt_menu.moc: $(QTn_H) ../win/Qt/qt_menu.h ../win/Qt/qt_rip.h ../win/Qt/qt_win.h + $(MOCPATH) -o $@ ../win/Qt/qt_menu.h +qt_msg.moc: $(QTn_H) ../win/Qt/qt_msg.h ../win/Qt/qt_win.h + $(MOCPATH) -o $@ ../win/Qt/qt_msg.h +qt_plsel.moc: $(QTn_H) ../win/Qt/qt_plsel.h + $(MOCPATH) -o $@ ../win/Qt/qt_plsel.h +qt_set.moc: $(QTn_H) ../win/Qt/qt_bind.h ../win/Qt/qt_kde0.h \ + ../win/Qt/qt_main.h ../win/Qt/qt_set.h + $(MOCPATH) -o $@ ../win/Qt/qt_set.h +qt_stat.moc: $(QTn_H) ../win/Qt/qt_icon.h ../win/Qt/qt_stat.h \ + ../win/Qt/qt_win.h + $(MOCPATH) -o $@ ../win/Qt/qt_stat.h +qt_xcmd.moc: $(QTn_H) ../win/Qt/qt_xcmd.h + $(MOCPATH) -o $@ ../win/Qt/qt_xcmd.h +qt_yndlg.moc: $(QTn_H) ../win/Qt/qt_yndlg.h + $(MOCPATH) -o $@ ../win/Qt/qt_yndlg.h # DEPENDENCIES MUST END AT END OF FILE # IF YOU PUT STUFF HERE IT WILL GO AWAY # see make depend above diff --git a/sys/unix/Makefile.top b/sys/unix/Makefile.top index ad7607cd9..5ecca3232 100644 --- a/sys/unix/Makefile.top +++ b/sys/unix/Makefile.top @@ -1,32 +1,35 @@ # NetHack Top-level Makefile. -# NetHack 3.6 Makefile.top $NHDT-Date: 1524689449 2018/04/25 20:50:49 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.36 $ +# NetHack 5.0 Makefile.top $NHDT-Date: 1722119081 2024/07/27 22:24:41 $ $NHDT-Branch: keni-fetchlua $:$NHDT-Revision: 1.109 $ # Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland # NetHack may be freely redistributed. See license for details. -# Root of source tree: +# Root of source tree: (Note: dot is after setup.sh has been used +# to create the active Makefiles from sys/unix/Makefile.*. +# It isn't sys/unix/ where you might happen to be reading this.) NHSROOT=. -# newer makes predefine $(MAKE) to 'make' and do smarter processing of -# recursive make calls if $(MAKE) is used -# these makes allow $(MAKE) to be overridden by the environment if someone -# wants to (or has to) use something other than the standard make, so we do -# not want to unconditionally set $(MAKE) here +# Newer makes predefine $(MAKE) to 'make' and do smarter processing +# of recursive make calls if $(MAKE) is used. +# These makes allow $(MAKE) to be overridden by the environment if +# someone wants to (or has to) use something other than the standard +# make, so we do not want to unconditionally set $(MAKE) here. # -# unfortunately, some older makes do not predefine $(MAKE); if you have one of -# these, uncomment the following line -# (you will know that you have one if you get complaints about unable to -# execute things like 'data' and 'rumors') +# Unfortunately, some older makes do not predefine $(MAKE); if you +# have one of these, uncomment the following line. +# (You will know that you have one if you get complaints about unable +# to execute things like 'data' and 'rumors'.) # MAKE = make -# make NetHack +# make NetHack (as opposite to variants or such) #PREFIX = /usr GAME = nethack +# GAME = nethack.exe # GAME = nethack.prg #GAMEUID = games #GAMEGRP = bin -# Permissions - some places use setgid instead of setuid, for instance -# See also the option "SECURE" in include/config.h +# Permissions - some places use setgid instead of setuid, for instance. +# See also the option "SECURE" in include/config.h. #GAMEPERM = 04755 FILEPERM = 0644 # VARFILEPERM = 0644 @@ -34,79 +37,167 @@ EXEPERM = 0755 DIRPERM = 0755 # VARDIRPERM = 0755 -# VARDIR may also appear in unixconf.h as "VAR_PLAYGROUND" else HACKDIR +# VARDIR may also appear in unixconf.h as "VAR_PLAYGROUND" else HACKDIR # -# note that 'make install' believes in creating a nice tidy HACKDIR for -# installation, free of debris from previous NetHack versions -- -# therefore there should not be anything in HACKDIR that you want to keep -# (if there is, you'll have to do the installation by hand or modify the -# instructions) +# Note well! 'make install' believes in creating a nice tidy HACKDIR +# for installation, free of debris from previous NetHack versions -- +# therefore there should not be anything in HACKDIR that you want to +# keep (if there is, you'll have to do the installation by hand or +# modify the install commands below). #HACKDIR = $(PREFIX)/games/lib/$(GAME)dir #VARDIR = $(HACKDIR) -# Where nethack.sh in installed. If this is not defined, the wrapper is not used. +# Where nethack.sh is installed (as 'nethack'). +# If this is not defined, the shell wrapper script is not used. #SHELLDIR = $(PREFIX)/games +# Extra data files depending upon the interface(s) built into nethack. # per discussion in Install.X11 and Install.Qt -#VARDATND = +# Qt prefers nhtiles.bmp but can use x11tiles, and it ignores NetHack.ad. +# X11 uses those last two. +# Both can display a conventional text map instead of tiles. +# tty and/or curses (no extra data files outside of the dlb container): +#VARDATND = +# All X11 and/or Qt variations may also include tty or curses or both): +# X11 without Qt: # VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm +# X11 with GRAPHIC_TOMBSTONE (requires 'xpm'): # VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm rip.xpm -# for Atari/Gem -# VARDATND = nh16.img title.img GEM_RSC.RSC rip.img -# for BeOS -# VARDATND = beostiles -# for Gnome -# VARDATND = x11tiles pet_mark.xbm pilemark.xbm rip.xpm mapbg.xpm - -VARDATD = bogusmon data engrave epitaph oracles options quest.dat rumors +# both X11 and Qt: +# VARDATND = x11tiles nhtiles.bmp NetHack.ad pet_mark.xbm pilemark.xbm rip.xpm +# Qt without X11; assumes GRAPHIC_TOMBSTONE: +# VARDATND = nhtiles.bmp pet_mark.xbm pilemark.xbm rip.xpm + +VARDATD = bogusmon data engrave epitaph oracles options quest.lua rumors VARDAT = $(VARDATD) $(VARDATND) -# Some versions of make use the SHELL environment variable as the shell -# for running commands. We need this to be a Bourne shell. +# Some versions of make use the SHELL environment variable as the +# shell for running commands. We need this to be a Bourne shell. # SHELL = /bin/sh -# for Atari +# for Atari (obsolete) # SHELL=E:/GEMINI2/MUPFEL.TTP # Commands for setting the owner and group on files during installation. # Some systems fail with one or the other when installing over NFS or for # other permission-related reasons. If that happens, you may want to set the -# command to "true", which is a no-op. Note that disabling chown or chgrp +# command to "true", which is a no-op. Note that disabling chown or chgrp # will only work if setuid (or setgid) behavior is not desired or required. #CHOWN = chown #CHGRP = chgrp +# Lua version +LUA_VERSION = 5.4.8 + # # end of configuration # -DATHELP = help hh cmdhelp keyhelp history opthelp wizhelp +DATHELP = help hh cmdhelp keyhelp history opthelp optmenu usagehlp wizhelp -SPEC_LEVS = 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 -QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev +SPEC_LEVS = asmodeus.lua baalz.lua bigrm-*.lua castle.lua fakewiz?.lua \ + juiblex.lua knox.lua medusa-?.lua minend-?.lua minefill.lua \ + minetn-?.lua oracle.lua orcus.lua sanctum.lua soko?-?.lua \ + tower?.lua valley.lua wizard?.lua nhcore.lua nhlib.lua themerms.lua \ + astral.lua air.lua earth.lua fire.lua water.lua hellfill.lua tut-?.lua +QUEST_LEVS = ???-goal.lua ???-fil?.lua ???-loca.lua ???-strt.lua DATNODLB = $(VARDATND) license symbols -DATDLB = $(DATHELP) dungeon tribute $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD) +DATDLB = $(DATHELP) dungeon.lua tribute $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD) DAT = $(DATNODLB) $(DATDLB) -$(GAME): - ( cd src ; $(MAKE) ) - -all: $(GAME) recover Guidebook $(VARDAT) dungeon spec_levs check-dlb +# These get set only if they weren't already set above or in a hints file +#CHOWN ?= true +#CHGRP ?= true +#SYSCONFCREATE ?= cp sys/unix/sysconf $(INSTDIR)/sysconf +#SYSCONFINSTALL ?= $(SYSCONFCREATE) && \ +# $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \ +# $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \ +# chmod $(VARFILEPERM) $(INSTDIR)/sysconf; +#SYSCONFENSURE ?= (if ! test -f $(INSTDIR)/sysconf ; then \ +# $(SYSCONFCREATE) && \ +# $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \ +# $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \ +# chmod $(VARFILEPERM) $(INSTDIR)/sysconf; fi ); + +RECOVERBIN = recover + +# Lua +LUAHEADERS = lib/lua-$(LUA_VERSION)/src +LUATESTTARGET = $(LUAHEADERS)/lua.h +LUATOP = $(LUAHEADERS) +LUAMAKEFLAGS = CC='$(CC)' SYSCFLAGS='$(SYSCFLAGS)' +LUA2NHTOP = ../../.. +LUABASELIB = liblua-$(LUA_VERSION).a +TOPLUALIB = lib/lua/$(LUABASELIB) + +ALLDEP = $(PRECHECK) $(GAME) recover Guidebook $(VARDAT) spec_levs check-dlb + +# first target is also the default target for 'make' without any arguments +all: $(ALLDEP) true; $(MOREALL) @echo "Done." +$(GAME): lua_support + ( cd src ; $(MAKE) LUA_VERSION=$(LUA_VERSION) $(GAME) ) + +lua_support: include/nhlua.h + @true +$(LUATOP)/liblua.a: $(LUAHEADERS)/lua.h + ( cd $(LUATOP) && make $(LUAMAKEFLAGS) a ) +$(TOPLUALIB): $(LUATOP)/liblua.a + @( if test -d lib/lua ; then true ; else mkdir -p lib/lua ; fi ) + cp $(LUATOP)/liblua.a $@ + +include/nhlua.h: $(TOPLUALIB) + echo '/* nhlua.h - generated by top Makefile */' > $@ + @echo '#include "../$(LUAHEADERS)/lua.h"' >> $@ + @sed -e '/(lua_error)/!d' \ + -e '/(lua_error)/s/LUA_API/ATTRNORETURN LUA_API/1' \ + -e '/(lua_error)/s/;/ NORETURN;/1' < $(LUAHEADERS)/lua.h >> $@ + @echo '#include "../$(LUAHEADERS)/lualib.h"' >> $@ + @echo '#include "../$(LUAHEADERS)/lauxlib.h"' >> $@ + @echo '/*nhlua.h*/' >> $@ +# LUATESTTARGET is this by default +lib/lua-$(LUA_VERSION)/src/lua.h: + @echo "Please do 'make fetch-lua' in the top directory to obtain lua-$(LUA_VERSION)" + @false +luabin: + ( cd $(LUATOP) \ + && make $(LUAMAKEFILES) all && cd $(LUA2NHTOP) ) + +# This is only needed for some internal tools. +nhlua: + base=`ls -td lib/lua-*|head -1` ; \ + [ -z $$base ] && $(MAKE) fetch-lua ; \ + base=`ls -td lib/lua-*|head -1` ; \ + cp -R $$base/ lib/nhlsrc ; \ + rm -f util/nhlua ; \ + ( cd lib/nhlsrc && $(MAKE) clean posix ) ; \ + cp lib/nhlsrc/src/lua util/nhlua + +# hints file could set LUATESTTARGET to this if GITSUBMODULES is defined +submodules/lua/lua.h: + git submodule init submodules/lua + git submodule update submodules/lua +# git submodule update --remote submodules/lua + # Note: many of the dependencies below are here to allow parallel make # to generate valid output Guidebook: ( cd doc ; $(MAKE) Guidebook ) +Guidebook.txt: + ( cd doc ; $(MAKE) Guidebook.txt ) + +Guidebook.pdf: + ( cd doc ; $(MAKE) Guidebook.pdf ) + manpages: ( cd doc ; $(MAKE) manpages ) +distrib: + ( cd doc ; $(MAKE) distrib ) + data: $(GAME) ( cd dat ; $(MAKE) data ) @@ -129,25 +220,21 @@ oracles: $(GAME) options: $(GAME) ( cd dat ; $(MAKE) options ) -quest.dat: $(GAME) - ( cd dat ; $(MAKE) quest.dat ) +quest.lua: $(GAME) -spec_levs: dungeon - ( cd util ; $(MAKE) lev_comp ) +spec_levs: ( cd dat ; $(MAKE) spec_levs ) ( cd dat ; $(MAKE) quest_levs ) -dungeon: $(GAME) - ( cd util ; $(MAKE) dgn_comp ) - ( cd dat ; $(MAKE) dungeon ) - nhtiles.bmp: $(GAME) + ( cd util ; $(MAKE) tile2bmp ) ( cd dat ; $(MAKE) nhtiles.bmp ) x11tiles: $(GAME) ( cd util ; $(MAKE) tile2x11 ) ( cd dat ; $(MAKE) x11tiles ) +# obsolete beostiles: $(GAME) ( cd util ; $(MAKE) tile2beos ) ( cd dat ; $(MAKE) beostiles ) @@ -190,10 +277,21 @@ dlb: ( cd util ; $(MAKE) dlb ) ( cd dat ; LC_ALL=C ; ../util/dlb cf nhdat $(DATDLB) ) +wasm: + ( cd src ; $(MAKE) CROSS_TO_WASM=1 ../targets/wasm/nethack.js ) + +package: $(GAME) recover $(VARDAT) spec_levs + ( cd src ; $(MAKE) $(PACKAGE) ) + # recover can be used when INSURANCE is defined in include/config.h # and the checkpoint option is true recover: $(GAME) - ( cd util ; $(MAKE) recover ) + ( cd util ; $(MAKE) $(RECOVERBIN) ) + +# sfctool can be configured by the sysadmin to convert the savefile +# content format as necessary. +sfctool: $(GAME) + ( cd util ; $(MAKE) sfctool ) dofiles: target=`sed -n \ @@ -236,27 +334,121 @@ dofiles-nodlb: -( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) $(DAT) ; \ $(CHGRP) $(GAMEGRP) $(DAT) ; \ chmod $(FILEPERM) $(DAT) ) +# +# This is not part of the dependency build hierarchy. +# It requires an explicit "make fetch-Lua". + +LUA_URL :=www.lua.org/ftp +LUA_URL_MIRROR :=www.tecgraf.puc-rio.br/lua/mirror/ftp +LUA_URL_NHD :=www.nethack.org/download/thirdparty +LUA_URL_list:=$(LUA_URL) $(LUA_URL_MIRROR) $(LUA_URL_NHD) + +fetch-lua-mirror: LUA_URL_list:=$(LUA_URL_MIRROR) +fetch-lua-mirror: fetch-Lua + @true + +fetch-lua-nhd: LUA_URL_list:=$(LUA_URL_NHD) +fetch-lua-nhd: fetch-Lua + @true + +fetch-lua: fetch-Lua + @true + +fetch-Lua: + @( \ + shac1=`command -v shasum`; \ + shac2=`command -v sha256sum`; \ + if [ ! -z $$shac1 ]; then \ + shac="$$shac1 -a 256"; elif [ ! -z $$shac2 ]; then \ + shac=$$shac2; else echo "CAUTION: no way to check integrity"; \ + fi; \ + set -- DUMMY $(LUA_URL_list); \ + luafile=lua-$(LUA_VERSION).tar.gz; \ + export curlstatus=1; \ + mkdir -p lib && cd lib && \ + while [ $$# -gt 0 ]; do \ + shift; \ + if [ $$curlstatus -ne 0 ]; then \ + luaurl=https://$$1/$$luafile; \ + echo Trying $$luaurl; \ + curl -R -O $$luaurl; \ + curlstatus=$$?; \ + if [ $$curlstatus -eq 0 ]; then \ + if [ ! -z "$$shac" ]; then \ + CHKSUMS=../submodules/CHKSUMS; \ + CHKSUMSTMP=../submodules/CHKSUMS.tmp; \ + fgrep $$luafile < $$CHKSUMS > $$CHKSUMSTMP; \ + if [ -z $$CHKSUMSTMP ]; then \ + echo "Cannot check $$luafile - no checksum known"; \ + else \ + echo Checking integrity of $$luafile with $$shac; \ + $$shac -w --ignore-missing -c $$CHKSUMSTMP < $$luafile; \ + fi; \ + fi; \ + tar zxf $$luafile && \ + rm -f $$luafile; \ + fi; \ + fi; \ + done; \ + true ) + +# remove include/nhlua.h in case it was created for some other Lua version + @( if test -f include/nhlua.h ; then \ + rm -f include/nhlua.h && echo 'rm include/nhlua.h' ; fi ) + +fetch-lua-http: + ( mkdir -p lib && cd lib && \ + curl -R -O http://$(LUA_URL)/lua-$(LUA_VERSION).tar.gz && \ + tar zxf lua-$(LUA_VERSION).tar.gz && \ + rm -f lua-$(LUA_VERSION).tar.gz ) -update: $(GAME) recover $(VARDAT) dungeon spec_levs +# +# This is not part of the dependency build hierarchy. +# It requires an explicit "make fetch-docs". +fetch-docs: + @FDroot=https://www.nethack.org; \ + FDvmajor=`awk '/VERSION_MAJOR/{print $$3}' < include/patchlevel.h`; \ + FDvminor=`awk '/VERSION_MINOR/{print $$3}' < include/patchlevel.h`; \ + RDIR="NetHack-$${FDvmajor}.$${FDvminor}"; \ + echo "Fetching directory information for $${RDIR}"; \ + RDOCFILES=`curl --no-progress-meter $${FDroot}/cgi-bin/lsautodocs?$$RDIR`; \ + FDbase="$${FDroot}/autodocs/$${RDIR}"; \ + set -- $${RDOCFILES}; \ + echo "Fetching $$# files"; \ + while [ $$# -gt 0 ]; do \ + echo "Downloading: '$$1' from '$${FDbase}/$$1'"; \ + curl --no-progress-meter -R $${FDbase}/$$1 -o doc/$$1; \ + shift; \ + done + +makedefs: + ( cd util ; $(MAKE) makedefs ) + +stripbs: + ( cd util ; $(MAKE) stripbs ) + +# 'make update' can be used to install a revised version after making +# customizations or such. Unlike 'make install', it doesn't delete everything +# from the target directory to have a clean start. +update: $(PRECHECK) $(GAME) recover $(VARDAT) spec_levs sys/unix/sysconf # (don't yank the old version out from under people who're playing it) -mv $(INSTDIR)/$(GAME) $(INSTDIR)/$(GAME).old -# quest.dat is also kept open and has the same problems over NFS -# (quest.dat may be inside nhdat if dlb is in use) - -mv $(INSTDIR)/quest.dat $(INSTDIR)/quest.dat.old -mv $(INSTDIR)/nhdat $(INSTDIR)/nhdat.old # set up new versions of the game files ( $(MAKE) dofiles ) -# touch time-sensitive files - -touch -c $(VARDIR)/bones* $(VARDIR)/?lock* $(VARDIR)/wizard* - -touch -c $(VARDIR)/save/* +# should already be present, but make sure touch $(VARDIR)/perm $(VARDIR)/record +# sysconf, but only if it does not exist + true; $(SYSCONFENSURE) +# other steps from hints file + true; $(POSTUPDATE) # and a reminder @echo You may also want to install the man pages via the doc Makefile. rootcheck: @true; $(ROOTCHECK) -install: rootcheck $(GAME) recover $(VARDAT) dungeon spec_levs +install: rootcheck $(PRECHECK) $(GAME) recover $(VARDAT) spec_levs sys/unix/sysconf true; $(PREINSTALL) # set up the directories # not all mkdirs have -p; those that don't will create a -p directory @@ -273,10 +465,14 @@ install: rootcheck $(GAME) recover $(VARDAT) dungeon spec_levs # set up the game files ( $(MAKE) dofiles ) # set up some additional files - touch $(VARDIR)/perm $(VARDIR)/record $(VARDIR)/logfile $(VARDIR)/xlogfile - -( cd $(VARDIR) ; $(CHOWN) $(GAMEUID) perm record logfile xlogfile ; \ - $(CHGRP) $(GAMEGRP) perm record logfile xlogfile ; \ - chmod $(VARFILEPERM) perm record logfile xlogfile ) + touch $(VARDIR)/perm $(VARDIR)/record $(VARDIR)/logfile $(VARDIR)/xlogfile \ + $(VARDIR)/livelog + -( cd $(VARDIR) ; $(CHOWN) $(GAMEUID) perm record logfile xlogfile livelog ; \ + $(CHGRP) $(GAMEGRP) perm record logfile xlogfile livelog ; \ + chmod $(VARFILEPERM) perm record logfile xlogfile livelog ) +# sysconf + true; $(SYSCONFINSTALL) +# other steps from hints file true; $(POSTINSTALL) # and a reminder @echo You may also want to reinstall the man pages via the doc Makefile. @@ -284,7 +480,13 @@ install: rootcheck $(GAME) recover $(VARDAT) dungeon spec_levs # 'make clean' removes all the .o files, but leaves around all the executables # and compiled data files -clean: +clean: clean-lib clean-keep-lib + @true + +clean-lib: + -( cd $(LUATOP) && $(MAKE) clean ) + +clean-keep-lib: ( cd src ; $(MAKE) clean ) ( cd util ; $(MAKE) clean ) ( cd dat ; $(MAKE) clean ) @@ -292,8 +494,18 @@ clean: # 'make spotless' returns the source tree to near-distribution condition. # it removes .o files, executables, and compiled data files -spotless:: +spotless:: spotless-lib spotless-keep-lib + @true + +spotless-lib:: clean-lib + -( cd lib/lua && rm $(LUABASELIB) ) + +spotless-keep-lib: clean-keep-lib ( cd src ; $(MAKE) spotless ) ( cd util ; $(MAKE) spotless ) ( cd dat ; $(MAKE) spotless ) ( cd doc ; $(MAKE) spotless ) +spotless-clean-submodule: + @( if test -f submodules/lua/lua.h ; then \ + git submodule deinit submodules/lua ; fi ) + diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index 78e9d725f..ff064a5d7 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -1,8 +1,13 @@ # Makefile for NetHack's utility programs. -# NetHack 3.6 Makefile.utl $NHDT-Date: 1539968067 2018/10/19 16:54:27 $ $NHDT-Branch: keni-makedefsm $:$NHDT-Revision: 1.38 $ +# NetHack 5.0 Makefile.utl $NHDT-Date: 1693334279 2023/08/29 18:37:59 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.68 $ # Copyright (c) 2018 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. +# +# Note: as of NetHack 5.0, 'lev_comp' and 'dgn_comp' are no longer present +# so use of yacc and lex to build them is no longer required. +# + # Root of source tree: NHSROOT=.. @@ -18,6 +23,11 @@ NHSROOT=.. # execute things like 'foo.o') # MAKE = make +# NetHack 5.0 began introducing C99 code. +# +# If your compiler needs an appropriate switch to accept C99 code. +# CSTD = -std=c99 + # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment # CC = gcc @@ -84,7 +94,6 @@ NHSROOT=.. # LFLAGS = -b i486-linuxaout -L/usr/X11R6/lib # flags for BeOS using the command line -# remember to uncomment flex and bison below # BeOS on a Mac/BeBox: #CC = mwcc #CFLAGS = -I../include @@ -97,6 +106,12 @@ NHSROOT=.. #CFLAGS = -O -I../include #LFLAGS = +#fallback defaults if not set +CFLAGS ?= -I../include + +# -lm required by lua +LFLAGS += -lm + # we specify C preprocessor flags via CFLAGS; files built with default rules # might include $(CPPFLAGS) which could get a value from user's environment; # we avoid that by forcing it empty rather than by overriding default rules @@ -104,28 +119,13 @@ CPPFLAGS = LIBS = -# If you are cross-compiling, you must use this: -#OBJDIR = . -# otherwise, you can save a little bit of disk space with this: OBJDIR = ../src -# yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c. -# if, instead of yacc/lex you have bison/flex, comment/uncomment the following. -YACC = yacc -LEX = lex -# YACC = bison -y -# YACC = byacc -# LEX = flex - -# these are the names of the output files from YACC/LEX. Under MS-DOS -# and similar systems, they may differ -YTABC = y.tab.c -YTABH = y.tab.h -LEXYYC = lex.yy.c -# YTABC = y_tab.c -# YTABH = y_tab.h -# LEXYYC = lexyy.c - +# This is the universal ctags utility which produces the tags in the +# format that util/readtags requires. +# https://github.com/universal-ctags/ctags.git +#CTAGSCMD = universal-ctags +CTAGSCMD = ctags # if you change this to 1, feedback while building will omit -Dthis -Wthat # -Isomewhere so that each file being compiled is listed on one short line; @@ -139,6 +139,10 @@ QUIETCC=0 # in Makefile.src; these use '$(CC) $(LFLAGS)' and ought to be changed to use # $(LD) or $(LINK) as appropriate [quiet mode echoes a misleading $< value] +# [LINK might be defined to use $(CXX); we don't want that here.] +CLINK=$(CC) +CXXLINK=$(CXX) + # ---------------------------------------- # # Nothing below this line should have to be changed. @@ -150,7 +154,7 @@ QUIETCC=0 ACTUAL_CC := $(CC) ACTUAL_CXX := $(CXX) ACTUAL_LD := $(LD) -ACTUAL_LINK := $(LINK) +ACTUAL_CLINK := $(CLINK) CC_V0 = $(ACTUAL_CC) CC_V = $(CC_V0) @@ -165,7 +169,7 @@ CXX = $(CXX_V$(QUIETCC)) # LD and LINK might be based on invoking CC and may not be able to substitute # for QUIETCC, so feedback from them is handled differently (via $AT) LD = $(ACTUAL_LD) -LINK = $(ACTUAL_LINK) +CLINK = $(ACTUAL_CLINK) AT_V0 := AT_V := $(AT_V0) @@ -173,79 +177,90 @@ AT_V1 := @ AT = $(AT_V$(QUIETCC)) # Verbosity, end +GAME=nethack # timestamps for primary header files, matching src/Makefile CONFIG_H = ../src/config.h-t HACK_H = ../src/hack.h-t # utility .c files -MAKESRC = makedefs.c -SPLEVSRC = lev_yacc.c lev_lex.c lev_main.c -DGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c +MAKESRC = makedefs.c ../src/mdlib.c RECOVSRC = recover.c DLBSRC = dlb_main.c -UTILSRCS = $(MAKESRC) panic.c $(SPLEVSRC) $(DGNCOMPSRC) $(RECOVSRC) $(DLBSRC) +UTILSRCS = $(MAKESRC) panic.c $(RECOVSRC) $(DLBSRC) # files that define all monsters and objects CMONOBJ = ../src/monst.c ../src/objects.c OMONOBJ = $(OBJDIR)/monst.o $(OBJDIR)/objects.o # files that provide access to NetHack's names -CNAMING = ../src/drawing.c ../src/decl.c $(CMONOBJ) -ONAMING = $(OBJDIR)/drawing.o $(OBJDIR)/decl.o $(OMONOBJ) +CNAMING = ../src/drawing.c $(CMONOBJ) +ONAMING = $(OBJDIR)/drawing.o $(OMONOBJ) # dynamic memory allocation CALLOC = ../src/alloc.c panic.c OALLOC = $(OBJDIR)/alloc.o panic.o +# build time info +CDATE = ../src/date.c +ODATE = $(OBJDIR)/date.o -# object files for makedefs -MAKEOBJS = makedefs.o $(OMONOBJ) - -# object files for special levels compiler -SPLEVOBJS = lev_yacc.o lev_lex.o lev_main.o $(OALLOC) $(ONAMING) +# hacklib utility routines +HACKLIB = $(OBJDIR)/hacklib.a +HACKLIBSRC = ../src/hacklib.c +HACKLIBOBJ = $(OBJDIR)/hacklib.o panic.o -# object files for dungeon compiler -DGNCOMPOBJS = dgn_yacc.o dgn_lex.o dgn_main.o $(OALLOC) +# object files for makedefs +MAKEOBJS = makedefs.o $(OMONOBJ) $(ODATE) $(OALLOC) # object files for recovery utility -RECOVOBJS = recover.o +RECOVOBJS = recover.o recover-version.o # object files for the data librarian DLBOBJS = dlb_main.o $(OBJDIR)/dlb.o $(OALLOC) -# flags for creating distribution versions of sys/share/*_lex.c, using -# a more portable flex skeleton, which is not included in the distribution. -# hopefully keeping this out of the section to be edited will keep too -# many people from being confused by it... -# FLEXDIST = -L -S../sys/share/flexhack.skl -FLEXDIST = -# -# flags for creating distribution versions of sys/share/*_yacc.c, without -# line numbers so patches from version to version are practical -# YACCDIST = -l -YACCDIST = - +# Distinguish between the build tools for the native host +# and the build tools for the target environment in commands. +# This allows the same set of Makefiles to be used for native +# builds and for cross-compiles by overriding these in hints +# files or on the command line. + +TARGETPFX= +TARGET_CC = $(CC) +TARGET_CFLAGS = $(CFLAGS) $(CSTD) +TARGET_CLINK = $(CLINK) +TARGET_LFLAGS = $(LFLAGS) +TARGET_CXX = $(CXX) +TARGET_CXXFLAGS = $(CXXFLAGS) +TARGET_AR = $(AR) +# # dependencies for makedefs # -makedefs: $(MAKEOBJS) mdgrep.h - $(CC) $(LFLAGS) -o makedefs $(MAKEOBJS) +makedefs: $(HACKLIB) $(MAKEOBJS) mdgrep.h + $(CLINK) $(LFLAGS) -o makedefs $(MAKEOBJS) $(HACKLIB) + -makedefs.o: makedefs.c $(CONFIG_H) ../include/permonst.h \ - ../include/objclass.h ../include/monsym.h \ +# note: the headers listed here are maintained manually rather than via +# 'make depend'; only the ones which are directly included by +# makedefs.c are listed, without various nested ones that they include; +# for makedefs (but not for nethack's core), mdlib.c gets included +# rather than be compiled separately +makedefs.o: makedefs.c ../src/mdlib.c $(CONFIG_H) \ + ../include/permonst.h ../include/objclass.h \ ../include/artilist.h ../include/dungeon.h ../include/obj.h \ - ../include/monst.h ../include/you.h ../include/flag.h \ - ../include/dlb.h ../include/patchlevel.h ../include/qtext.h + ../include/monst.h ../include/monsters.h ../include/objects.h \ + ../include/you.h ../include/context.h ../include/flag.h \ + ../include/dlb.h ../include/patchlevel.h mdgrep.h + $(CC) $(CFLAGS) $(CSTD) -c makedefs.c -o $@ + +$(OBJDIR)/hacklib.o: $(HACKLIBSRC) # Don't require perl to build; that is why mdgrep.h is spelled wrong below. mdgreph: mdgrep.pl perl mdgrep.pl -../include/onames.h: makedefs +# These are for reference purposes only. They aren't required in the build. +../include/onames.h: makedefs ../include/objects.h ./makedefs -o -../include/pm.h: makedefs +../include/pm.h: makedefs ../include/monsters.h ./makedefs -p -../include/vis_tab.h: makedefs - ./makedefs -z -# makedefs -z makes both vis_tab.h and vis_tab.c, but writes the .h first -../src/vis_tab.c: ../include/vis_tab.h lintdefs: @lint -axbh -I../include -DLINT $(MAKESRC) $(CMONOBJ) | sed '/_flsbuf/d' @@ -256,108 +271,210 @@ lintdefs: ../include/date.h:: @( cd ../src ; $(MAKE) ../include/date.h ) +$(HACKLIB): $(CONFIG_H) $(HACKLIBSRC) panic.o + @( cd ../src ; $(MAKE) hacklib.a ) + # support code used by several of the utility programs (but not makedefs) panic.o: panic.c $(CONFIG_H) + $(CC) $(CFLAGS) $(CSTD) -c panic.c -o $@ -# dependencies for lev_comp -# -lev_comp: $(SPLEVOBJS) - $(CC) $(LFLAGS) -o lev_comp $(SPLEVOBJS) $(LIBS) - -lev_yacc.o: lev_yacc.c $(HACK_H) ../include/sp_lev.h -lev_main.o: lev_main.c $(HACK_H) ../include/sp_lev.h ../include/tcap.h \ - ../include/date.h - -# see lev_comp.l for WEIRD_LEX discussion -# egrep will return failure if it doesn't find anything, but we know there -# is one "_cplusplus" inside a comment -lev_lex.o: lev_lex.c $(HACK_H) ../include/lev_comp.h ../include/sp_lev.h - $(CC) -c $(CFLAGS) -DWEIRD_LEX=`egrep -c _cplusplus lev_lex.c` lev_lex.c - -# '$(YACC) -d' generates both $(YTABC) and $(YTABH) in one run -../include/lev_comp.h: lev_yacc.c - -lev_yacc.c: lev_comp.y - $(YACC) $(YACCDIST) -d lev_comp.y - sed -e 's#"$(YTABC)"#"$@"#' -e 's#$(YTABC):#$@:#' $(YTABC) > $@ \ - && rm $(YTABC) - sed -e 's#"$(YTABH)"#"lev_comp.h"#' $(YTABH) > ../include/lev_comp.h \ - && rm $(YTABH) - -lev_lex.c: lev_comp.l - $(LEX) $(FLEXDIST) lev_comp.l - sed -e 's#"$(LEXYYC)"#"$@"#' -e 's# *$$##' \ - -e 's#static void yyunput#void yyunput#' $(LEXYYC) > $@ \ - && rm $(LEXYYC) -# note: flex code construction using m4 macros results in some trailing -# spaces; is basic RE substitute for -# and we don't bother stripping trailing tabs because that gets messy; -# make expands into which is RE end-of-line. -# flex also creates yyunput() as a static routine, but lev_comp doesn't -# use it so compiler complaints can ensue; recent flex versions honor -# NO_YY_UNPUT to suppress it, but older ones don't; making it global to -# avoid an "unused function" warning is simpler than trying to remove -# the whole thing (although full 'lint' may still complain). - -# with all of extern.h's functions to complain about, we drown in -# 'defined but not used' without -u -lintlev: - @lint -axhu -I../include -DLINT $(SPLEVSRC) $(CALLOC) $(CNAMING) | sed '/_flsbuf/d' - - -# dependencies for dgn_comp -# -dgn_comp: $(DGNCOMPOBJS) - $(CC) $(LFLAGS) -o dgn_comp $(DGNCOMPOBJS) $(LIBS) - -dgn_yacc.o: dgn_yacc.c $(CONFIG_H) ../include/dgn_file.h ../include/date.h -dgn_main.o: dgn_main.c $(CONFIG_H) ../include/dlb.h - -# see dgn_comp.l for WEIRD_LEX discussion -dgn_lex.o: dgn_lex.c $(CONFIG_H) ../include/dgn_comp.h ../include/dgn_file.h - $(CC) -c $(CFLAGS) -DWEIRD_LEX=`egrep -c _cplusplus dgn_lex.c` dgn_lex.c - -# '$(YACC) -d' generates both $(YTABC) and $(YTABH) in one run -../include/dgn_comp.h: dgn_yacc.c - -dgn_yacc.c: dgn_comp.y - $(YACC) $(YACCDIST) -d dgn_comp.y - sed -e 's#"$(YTABC)"#"$@"#' -e 's#$(YTABC):#$@:#' $(YTABC) > $@ \ - && rm $(YTABC) - sed -e 's#"$(YTABH)"#"dgn_comp.h"#' $(YTABH) > ../include/dgn_comp.h \ - && rm $(YTABH) - -dgn_lex.c: dgn_comp.l - $(LEX) $(FLEXDIST) dgn_comp.l - sed -e 's#"$(LEXYYC)"#"$@"#' -e 's# *$$##' \ - -e 's#static void yyunput#void yyunput#' $(LEXYYC) > $@ \ - && rm $(LEXYYC) -# note: is basic RE substitute for - # with all of extern.h's functions to complain about, we drown in # 'defined but not used' without -u lintdgn: - @lint -axhu -I../include -DLINT $(DGNCOMPSRC) $(CALLOC) | sed '/_flsbuf/d' + @lint -axhu -I../include -DLINT $(UTILSRCS) $(CALLOC) \ + | sed '/_flsbuf/d' # dependencies for recover # -recover: $(RECOVOBJS) - $(CC) $(LFLAGS) -o recover $(RECOVOBJS) $(LIBS) +recover: $(RECOVOBJS) $(HACKLIB) + $(CLINK) $(LFLAGS) -o recover \ + $(RECOVOBJS) $(HACKLIB) $(LIBS) -recover.o: recover.c $(CONFIG_H) ../include/date.h +recover.o: recover.c $(CONFIG_H) + $(CC) $(CFLAGS) $(CSTD) -c recover.c -o $@ +recover-version.o: ../src/version.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) -DMINIMAL_FOR_RECOVER -c ../src/version.c -o $@ +# +# dependencies for optional sfctool +# +# object files for sfctool utility +SFCTOOLOBJS = $(TARGETPFX)sfctool.o \ + $(TARGETPFX)sf-alloc.o $(TARGETPFX)sfdata.o \ + $(TARGETPFX)sfexpasc.o $(TARGETPFX)sf-cfgfiles.o \ + $(TARGETPFX)sf-date.o $(TARGETPFX)sf-artifact.o \ + $(TARGETPFX)sf-calendar.o $(TARGETPFX)sf-decl.o \ + $(TARGETPFX)sf-dungeon.o $(TARGETPFX)sf-end.o \ + $(TARGETPFX)sf-engrave.o $(TARGETPFX)sf-files.o \ + $(TARGETPFX)sf-light.o $(TARGETPFX)sf-mdlib.o \ + $(TARGETPFX)sf-mkmaze.o $(TARGETPFX)sf-mkroom.o \ + $(TARGETPFX)sf-monst.o $(TARGETPFX)sf-nhlua.o \ + $(TARGETPFX)sf-objects.o $(TARGETPFX)sf-o_init.o \ + $(TARGETPFX)panic.o $(TARGETPFX)sf-region.o \ + $(TARGETPFX)sf-restore.o $(TARGETPFX)sf-rumors.o \ + $(TARGETPFX)sfbase.o $(TARGETPFX)sf-struct.o \ + $(TARGETPFX)strutil.o $(TARGETPFX)sf-sys.o \ + $(TARGETPFX)sf-timeout.o $(TARGETPFX)sf-track.o \ + $(TARGETPFX)sf-version.o $(TARGETPFX)sf-worm.o + +SFCTOOLBIN = sfctool + +SFFLAGS=-DSFCTOOL -DNOPANICTRACE -DNOCRASHREPORT -DNO_CHRONICLE +sfutil: $(SFCTOOLBIN) + @echo '$(SFCTOOLBIN) is up to date.' +$(SFCTOOLBIN): $(SFCTOOLOBJS) $(HACKLIB) + $(TARGET_CLINK) $(TARGET_LFLAGS) -o $@ $(SFCTOOLOBJS) $(HACKLIB) $(TARGET_LIBS) +$(TARGETPFX)sfctool.o: sfctool.c $(HACK_H) ../include/sfprocs.h + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c sfctool.c +$(TARGETPFX)sf-alloc.o: ../src/alloc.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/alloc.c +$(TARGETPFX)sf-calendar.o: ../src/calendar.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/calendar.c +$(TARGETPFX)sf-cfgfiles.o: ../src/cfgfiles.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/cfgfiles.c +$(TARGETPFX)sf-date.o: ../src/date.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/date.c +$(TARGETPFX)sf-decl.o: ../src/decl.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/decl.c +$(TARGETPFX)sf-monst.o: ../src/monst.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/monst.c +$(TARGETPFX)sf-objects.o: ../src/objects.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/objects.c +$(TARGETPFX)sf-panic.o: panic.c $(CONFIG_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c panic.c +$(TARGETPFX)sf-artifact.o: ../src/artifact.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/artifact.c +$(TARGETPFX)sf-dungeon.o: ../src/dungeon.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/dungeon.c +$(TARGETPFX)sf-end.o: ../src/end.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/end.c +$(TARGETPFX)sf-engrave.o: ../src/engrave.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/engrave.c +$(TARGETPFX)sf-files.o: ../src/files.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/files.c +$(TARGETPFX)sf-light.o: ../src/light.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/light.c +$(TARGETPFX)sf-mdlib.o: ../src/mdlib.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/mdlib.c +$(TARGETPFX)sf-mkmaze.o: ../src/mkmaze.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/mkmaze.c +$(TARGETPFX)sf-mkroom.o: ../src/mkroom.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/mkroom.c +$(TARGETPFX)sf-nhlua.o: ../src/nhlua.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/nhlua.c +$(TARGETPFX)sf-o_init.o: ../src/o_init.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/o_init.c +$(TARGETPFX)sf-region.o: ../src/region.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/region.c +$(TARGETPFX)sf-restore.o: ../src/restore.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/restore.c +$(TARGETPFX)sf-rumors.o: ../src/rumors.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/rumors.c +$(TARGETPFX)sfbase.o: ../src/sfbase.c $(HACK_H) ../include/sfmacros.h + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/sfbase.c +$(TARGETPFX)sfdata.o: sfdata.c $(HACK_H) ../include/sfprocs.h ../include/sfproto.h + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c sfdata.c +$(TARGETPFX)sfexpasc.o: sfexpasc.c $(HACK_H) ../include/sfprocs.h \ + ../include/sfproto.h ../include/sfmacros.h + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c sfexpasc.c +$(TARGETPFX)sf-struct.o: ../src/sfstruct.c $(HACK_H) ../include/sfmacros.h + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/sfstruct.c +$(TARGETPFX)strutil.o: ../src/strutil.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/strutil.c +$(TARGETPFX)sf-sys.o: ../src/sys.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/sys.c +$(TARGETPFX)sf-timeout.o: ../src/timeout.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/timeout.c +$(TARGETPFX)sf-track.o: ../src/track.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/track.c +$(TARGETPFX)sf-version.o: ../src/version.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/version.c +$(TARGETPFX)sf-worm.o: ../src/worm.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/worm.c + +sftags: sftags.o $(HACKLIB) $(TARGETPFX)sf-alloc.o $(TARGETPFX)panic.o + $(CLINK) $(LFLAGS) -o $@ sftags.o \ + $(TARGETPFX)sf-alloc.o $(TARGETPFX)panic.o \ + $(HACKLIB) $(LIBS) +sftags.o: sftags.c $(HACK_H) + $(CC) $(CFLAGS) -c sftags.c +../include/sfproto.h: sf.tags sftags + ./sftags +sfdata.c: sf.tags sftags + ./sftags +# dependencies for sftags +# # +CTAGDEP = ../include/align.h ../include/artifact.h ../include/artilist.h \ + ../include/attrib.h ../include/context.h ../include/coord.h \ + ../include/decl.h ../include/dungeon.h ../include/engrave.h \ + ../include/flag.h ../include/func_tab.h ../include/global.h \ + ../include/hack.h ../include/mextra.h \ + ../include/mkroom.h ../include/monst.h ../include/defsym.h \ + ../include/obj.h ../include/objclass.h ../include/prop.h \ + ../include/quest.h ../include/rect.h ../include/region.h \ + ../include/rm.h ../include/skills.h ../include/spell.h \ + ../include/sys.h ../include/timeout.h ../include/trap.h \ + ../include/you.h ../include/onames.h ../include/wintype.h +# ../include/permonst.h +CTAGSOPT = --language-force=c --sort=no -D"Bitfield(x,n)=unsigned x : n" --excmd=pattern +# +INCL=../include/ +SRC=../src/ +sf.tags: $(CTAGDEP) + $(CTAGSCMD) $(CTAGSOPT) -f $@ $(INCL)align.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)artifact.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)artifact.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)artilist.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)attrib.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)bones.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)context.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)coord.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)decl.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)decl.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)dungeon.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)engrave.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)engrave.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)flag.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)func_tab.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)global.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)hack.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)mextra.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)mkroom.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)monst.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)defsym.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)obj.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)objclass.h +# $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)permonst.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)prop.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)quest.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)rect.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)region.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)rm.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)skills.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)spell.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)stairs.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)sys.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)timeout.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)trap.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)you.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)onames.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)wintype.h # dependencies for dlb # -dlb: $(DLBOBJS) - $(CC) $(LFLAGS) -o dlb $(DLBOBJS) $(LIBS) +dlb: $(DLBOBJS) $(HACKLIB) + $(CLINK) $(LFLAGS) -o dlb $(DLBOBJS) $(HACKLIB) $(LIBS) -dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h ../include/date.h - $(CC) $(CFLAGS) -c dlb_main.c +dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h + $(CC) $(CFLAGS) $(CSTD) -c dlb_main.c -o $@ +stripbs: stripbs.o + $(CC) $(LFLAGS) -o stripbs stripbs.o +stripbs.o: stripbs.c + $(CC) $(CFLAGS) -c stripbs.c # dependencies for tile utilities # @@ -368,78 +485,82 @@ PPMWRITERS = ppmwrite.o tileutils: tilemap gif2txt txt2ppm tile2x11 gif2txt: $(GIFREADERS) $(TEXT_IO) - $(CC) $(LFLAGS) -o gif2txt $(GIFREADERS) $(TEXT_IO) $(LIBS) + $(CLINK) $(LFLAGS) -o gif2txt $(GIFREADERS) $(TEXT_IO) $(LIBS) txt2ppm: $(PPMWRITERS) $(TEXT_IO) - $(CC) $(LFLAGS) -o txt2ppm $(PPMWRITERS) $(TEXT_IO) $(LIBS) + $(CLINK) $(LFLAGS) -o txt2ppm $(PPMWRITERS) $(TEXT_IO) $(LIBS) -tile2x11: tile2x11.o $(TEXT_IO) - $(CC) $(LFLAGS) -o tile2x11 tile2x11.o $(TEXT_IO) $(LIBS) +tile2x11: tile2x11.o $(TEXT_IO) $(HACKLIB) + $(CLINK) $(LFLAGS) -o tile2x11 tile2x11.o $(TEXT_IO) \ + $(HACKLIB) $(LIBS) tile2img.ttp: tile2img.o bitmfile.o $(TEXT_IO) - $(CC) $(LFLAGS) -o tile2img.ttp tile2img.o bitmfile.o $(TEXT_IO) $(LIBS) + $(CLINK) $(LFLAGS) -o tile2img.ttp tile2img.o bitmfile.o \ + $(TEXT_IO) $(LIBS) -tile2bmp: tile2bmp.o $(TEXT_IO) - $(CC) $(LFLAGS) -o tile2bmp tile2bmp.o $(TEXT_IO) +tile2bmp: tile2bmp.o $(TEXT_IO) $(HACKLIB) + $(CLINK) $(LFLAGS) -o tile2bmp tile2bmp.o $(TEXT_IO) $(HACKLIB) xpm2img.ttp: xpm2img.o bitmfile.o - $(CC) $(LFLAGS) -o xpm2img.ttp xpm2img.o bitmfile.o $(LIBS) + $(CLINK) $(LFLAGS) -o xpm2img.ttp xpm2img.o bitmfile.o $(LIBS) -tile2beos: tile2beos.o $(TEXT_IO) - $(CC) $(LFLAGS) -o tile2beos tile2beos.o $(TEXT_IO) -lbe +tile2beos: tile2beos.o $(TEXT_IO) $(HACKLIB) + $(CXXLINK) $(LFLAGS) -o tile2beos tile2beos.o \ + $(TEXT_IO) $(HACKLIB) -lbe #--compiling and linking in one step leaves extra debugging files (in their # own subdirectories!) on OSX; compile and link separately to suppress # that without mucking about with extra OS-specific CFLAGS and/or LFLAGS #tilemap: ../win/share/tilemap.c $(HACK_H) # $(CC) $(CFLAGS) $(LFLAGS) -o tilemap ../win/share/tilemap.c $(LIBS) -tilemap: tilemap.o - $(CC) $(LFLAGS) -o tilemap tilemap.o $(LIBS) +tilemap: tilemap.o $(OBJDIR)/objects.o $(OBJDIR)/monst.o $(OBJDIR)/drawing.o \ + $(HACKLIB) + $(CLINK) $(LFLAGS) -o tilemap tilemap.o $(OBJDIR)/objects.o \ + $(OBJDIR)/monst.o $(OBJDIR)/drawing.o $(HACKLIB) \ + $(LIBS) ../src/tile.c: tilemap ./tilemap -../include/tile.h: ../win/share/tile.h - cp ../win/share/tile.h ../include/tile.h -tiletext.o: ../win/share/tiletext.c $(CONFIG_H) ../include/tile.h - $(CC) $(CFLAGS) -c ../win/share/tiletext.c -tiletxt.c: ./Makefile - @echo '/* alternate compilation for tilemap.c to create tiletxt.o' > tiletxt.c - @echo ' that does not rely on "cc -c -o tiletxt.o tilemap.c"' >> tiletxt.c - @echo ' since many pre-POSIX compilers did not support that */' >> tiletxt.c - echo '#define TILETEXT' >> tiletxt.c - echo '#include "../win/share/tilemap.c"' >> tiletxt.c - @echo '/*tiletxt.c*/' >> tiletxt.c -tiletxt.o: tiletxt.c ../win/share/tilemap.c $(HACK_H) - $(CC) $(CFLAGS) -c tiletxt.c +tiletext.o: ../win/share/tiletext.c $(CONFIG_H) ../win/share/tile.h + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/tiletext.c -o $@ +tiletxt.o: ../win/share/tiletxt.c ../win/share/tilemap.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/tiletxt.c -o $@ tilemap.o: ../win/share/tilemap.c $(HACK_H) - $(CC) $(CFLAGS) -c ../win/share/tilemap.c + $(CC) $(CFLAGS) $(CSTD) -c ../win/share/tilemap.c -o $@ -gifread.o: ../win/share/gifread.c $(CONFIG_H) ../include/tile.h - $(CC) $(CFLAGS) -c ../win/share/gifread.c -ppmwrite.o: ../win/share/ppmwrite.c $(CONFIG_H) ../include/tile.h - $(CC) $(CFLAGS) -c ../win/share/ppmwrite.c +gifread.o: ../win/share/gifread.c $(CONFIG_H) ../win/share/tile.h + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/gifread.c -o $@ +ppmwrite.o: ../win/share/ppmwrite.c $(CONFIG_H) ../win/share/tile.h + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/ppmwrite.c -o $@ -tile2bmp.o: ../win/share/tile2bmp.c $(HACK_H) ../include/tile.h - $(CC) $(CFLAGS) -c ../win/share/tile2bmp.c +tile2bmp.o: ../win/share/tile2bmp.c $(HACK_H) ../win/share/tile.h + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/tile2bmp.c -o $@ -tile2x11.o: ../win/X11/tile2x11.c $(HACK_H) ../include/tile.h \ +tile2x11.o: ../win/X11/tile2x11.c $(HACK_H) ../win/share/tile.h \ ../include/tile2x11.h - $(CC) $(CFLAGS) -c ../win/X11/tile2x11.c + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/X11/tile2x11.c -o $@ -tile2img.o: ../win/gem/tile2img.c $(HACK_H) ../include/tile.h \ +tile2img.o: ../win/gem/tile2img.c $(HACK_H) ../win/share/tile.h \ ../include/bitmfile.h - $(CC) $(CFLAGS) -c ../win/gem/tile2img.c + $(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/gem/tile2img.c -o $@ xpm2img.o: ../win/gem/xpm2img.c $(HACK_H) ../include/bitmfile.h - $(CC) $(CFLAGS) -c ../win/gem/xpm2img.c + $(CC) $(CFLAGS) $(CSTD) -c ../win/gem/xpm2img.c -o $@ bitmfile.o: ../win/gem/bitmfile.c ../include/bitmfile.h - $(CC) $(CFLAGS) -c ../win/gem/bitmfile.c + $(CC) $(CFLAGS) $(CSTD) -c ../win/gem/bitmfile.c -o $@ -tile2beos.o: ../win/BeOS/tile2beos.cpp $(HACK_H) ../include/tile.h - $(CXX) $(CFLAGS) -c ../win/BeOS/tile2beos.cpp +tile2beos.o: ../win/BeOS/tile2beos.cpp $(HACK_H) ../win/share/tile.h + $(CXX) $(CFLAGS) $(CSTD) -I../win/share -c ../win/BeOS/tile2beos.cpp -o $@ -tileedit: tileedit.cpp $(TEXT_IO) +# note: tileedit.cpp was developed for Qt2 and will not compile using Qt5 +tileedit.o: ../win/Qt/tileedit.cpp + $(CXX) -I../include -I$(QTDIR)/include ../win/Qt/tileedit.cpp +tileedit: tileedit.o $(TEXT_IO) $(QTDIR)/bin/moc -o tileedit.moc tileedit.h - $(CC) -o tileedit -I../include -I$(QTDIR)/include -L$(QTDIR)/lib \ - tileedit.cpp $(TEXT_IO) -lqt + $(CXXLINK) -o tileedit -L$(QTDIR)/lib tileedit.o $(TEXT_IO) -lqt + +uudecode: uudecode.o + $(CLINK) $(LFLAGS) -o uudecode uudecode.o $(LIBS) +uudecode.o: ../sys/share/uudecode.c + $(CC) $(CFLAGS) $(CSTD) -c -o uudecode.o ../sys/share/uudecode.c # using dependencies like # ../src/foo:: @@ -452,56 +573,60 @@ tileedit: tileedit.cpp $(TEXT_IO) # to improvise things not in the instructions, like 'make makedefs' here # in util... -# make sure object files from src are available when needed -# -$(OBJDIR)/alloc.o: ../src/alloc.c $(CONFIG_H) - $(CC) $(CFLAGS) -c ../src/alloc.c -o $@ -$(OBJDIR)/drawing.o: ../src/drawing.c $(CONFIG_H) - $(CC) $(CFLAGS) -c ../src/drawing.c -o $@ -$(OBJDIR)/decl.o: ../src/decl.c $(CONFIG_H) - $(CC) $(CFLAGS) -c ../src/decl.c -o $@ -$(OBJDIR)/monst.o: ../src/monst.c $(CONFIG_H) - $(CC) $(CFLAGS) -c ../src/monst.c -o $@ -$(OBJDIR)/objects.o: ../src/objects.c $(CONFIG_H) - $(CC) $(CFLAGS) -c ../src/objects.c -o $@ +# make sure host object files from src are available when needed +# (note: these dependencies have been copied from Makefile.src so only come +# indirectly from 'make depend', hence are subject to bit rot as src changes) +$(OBJDIR)/alloc.o: ../src/alloc.c $(CONFIG_H) ../include/nhlua.h + $(CC) $(CFLAGS) $(CSTD) -c ../src/alloc.c -o $@ +$(OBJDIR)/drawing.o: ../src/drawing.c $(CONFIG_H) ../include/color.h \ + ../include/rm.h ../include/objclass.h ../include/defsym.h \ + ../include/objects.h ../include/sym.h + $(CC) $(CFLAGS) $(CSTD) -c ../src/drawing.c -o $@ +$(OBJDIR)/decl.o: ../src/decl.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) -c ../src/decl.c -o $@ +$(OBJDIR)/monst.o: ../src/monst.c $(CONFIG_H) ../include/permonst.h \ + ../include/align.h ../include/monattk.h ../include/monflag.h \ + ../include/monsters.h ../include/wintype.h ../include/sym.h \ + ../include/defsym.h ../include/color.h + $(CC) $(CFLAGS) $(CSTD) -c ../src/monst.c -o $@ +$(OBJDIR)/objects.o: ../src/objects.c $(CONFIG_H) ../include/obj.h \ + ../include/prop.h ../include/skills.h ../include/color.h \ + ../include/objclass.h ../include/defsym.h ../include/objects.h + $(CC) $(CFLAGS) $(CSTD) -c ../src/objects.c -o $@ $(OBJDIR)/dlb.o: ../src/dlb.c $(CONFIG_H) ../include/dlb.h - $(CC) $(CFLAGS) -c ../src/dlb.c -o $@ - + $(CC) $(CFLAGS) $(CSTD) -c ../src/dlb.c -o $@ +# this differs substantially from what Makefile.src specifies +$(OBJDIR)/date.o: ../src/date.c $(CONFIG_H) + $(CC) $(CFLAGS) $(CSTD) -c ../src/date.c -o $@ +../include/nhlua.h: + @( cd .. ; $(MAKE) lua_support ) # make sure hack.h dependencies get transitive information $(HACK_H): $(CONFIG_H) @( cd ../src ; $(MAKE) $(HACK_H) ) $(CONFIG_H): ../include/config.h @( cd ../src ; $(MAKE) $(CONFIG_H) ) -# 'make dist' => put generated lex and yacc sources into place for distribution SYSSHARE=../sys/share/ -$(SYSSHARE)lev_lex.c: lev_lex.c - cp lev_lex.c $@ -$(SYSSHARE)lev_yacc.c: lev_yacc.c - cp lev_yacc.c $@ -$(SYSSHARE)lev_comp.h: ../include/lev_comp.h - cp ../include/lev_comp.h $@ -$(SYSSHARE)dgn_lex.c: dgn_lex.c - cp dgn_lex.c $@ -$(SYSSHARE)dgn_yacc.c: dgn_yacc.c - cp dgn_yacc.c $@ -$(SYSSHARE)dgn_comp.h: ../include/dgn_comp.h - cp ../include/dgn_comp.h $@ - -dist: $(SYSSHARE)lev_lex.c $(SYSSHARE)lev_yacc.c $(SYSSHARE)lev_comp.h \ - $(SYSSHARE)dgn_lex.c $(SYSSHARE)dgn_yacc.c $(SYSSHARE)dgn_comp.h - @echo 'pre-generated lex and yacc sources are in place in sys/share' tags: $(UTILSRCS) @ctags -tw $(UTILSRCS) -clean: +# note: 3.6 copied tile.h from win/share/ to include/ and if someone +# switches branches from 3.6 to 5.0 without executing 'make spotless' +# first, the old tile.h sticks around and gets found during compile +# instead of current one; various tile utilities won't build in that +# mis-configuration so allow 'make clean' and 'make spotless' in 5.0 +# to fix things up by deleting the out of date file (if present) +clean-fixup: + -rm -f ../include/tile.h + +clean: clean-fixup -rm -f *.o +# obsolete dgn_comp and lev_comp could be left around from 3.6.x spotless: clean - -rm -f lev_lex.c lev_yacc.c dgn_lex.c dgn_yacc.c - -rm -f ../include/lev_comp.h ../include/dgn_comp.h - -rm -f ../include/tile.h tiletxt.c - -rm -f makedefs lev_comp dgn_comp recover dlb + -rm -f makedefs recover dlb $(HACKLIB) -rm -f gif2txt txt2ppm tile2x11 tile2img.ttp xpm2img.ttp \ - tilemap tileedit tile2bmp + tilemap tileedit tile2bmp uudecode + -rm -f dgn_comp* dgn_lex.c dgn_yacc.c ../include/dgn_comp.h \ + lev_comp* lev_lex.c lev_yacc.c ../include/lev_comp.h diff --git a/sys/unix/NetHack.xcodeproj/.gitattributes b/sys/unix/NetHack.xcodeproj/.gitattributes new file mode 100644 index 000000000..0a7bada88 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/.gitattributes @@ -0,0 +1,2 @@ +* NH_filestag=(file%s_for_macOS_Xcode) + diff --git a/sys/unix/NetHack.xcodeproj/.gitignore b/sys/unix/NetHack.xcodeproj/.gitignore index 72068cdad..c96f6402f 100644 --- a/sys/unix/NetHack.xcodeproj/.gitignore +++ b/sys/unix/NetHack.xcodeproj/.gitignore @@ -1,4 +1,4 @@ -# OS X temporary files that should never be committed +# macOS temporary files that should never be committed # .DS_Store .Trashes diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index fdee88475..81a1eb1b9 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -3,12 +3,23 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 70; 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 */; }; + 056E43C62C810EE800FD1F52 /* coloratt.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43BC2C810EE800FD1F52 /* coloratt.c */; }; + 056E43C72C810EE800FD1F52 /* nhmd4.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43C02C810EE800FD1F52 /* nhmd4.c */; }; + 056E43C82C810EE800FD1F52 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 056E43BF2C810EE800FD1F52 /* Makefile */; }; + 056E43C92C810EE800FD1F52 /* report.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43C12C810EE800FD1F52 /* report.c */; }; + 056E43CA2C810EE800FD1F52 /* selvar.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43C22C810EE800FD1F52 /* selvar.c */; }; + 056E43CB2C810EE800FD1F52 /* calendar.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43BB2C810EE800FD1F52 /* calendar.c */; }; + 056E43CC2C810EE800FD1F52 /* stairs.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43C32C810EE800FD1F52 /* stairs.c */; }; + 056E43CD2C810EE800FD1F52 /* glyphs.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43BE2C810EE800FD1F52 /* glyphs.c */; }; + 056E43CE2C810EE800FD1F52 /* strutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43C42C810EE800FD1F52 /* strutil.c */; }; + 056E43CF2C810EE800FD1F52 /* getpos.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43BD2C810EE800FD1F52 /* getpos.c */; }; + 056E43D02C810EE800FD1F52 /* wizcmds.c in Sources */ = {isa = PBXBuildFile; fileRef = 056E43C52C810EE800FD1F52 /* wizcmds.c */; }; + 059660BE2C80B00400398EDE /* hacklib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36421A238040055BD01 /* hacklib.c */; }; + 059660C12C80B0C700398EDE /* hacklib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36421A238040055BD01 /* hacklib.c */; }; 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 */; }; @@ -18,7 +29,6 @@ 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 */; }; @@ -90,7 +100,6 @@ 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 */; }; @@ -116,7 +125,6 @@ 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 */; }; @@ -139,97 +147,73 @@ 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 */; }; + 5439B3BC275AADC600B8FB2F /* date.c in Sources */ = {isa = PBXBuildFile; fileRef = 5439B3BB275AADC600B8FB2F /* date.c */; }; + 543ECF6C297EEF3800A13155 /* macsound.m in Sources */ = {isa = PBXBuildFile; fileRef = 54AEB885297EE7C4005F1B13 /* macsound.m */; }; + 54435B52247999CB00804CB3 /* nhlobj.c in Sources */ = {isa = PBXBuildFile; fileRef = 54435B51247999CB00804CB3 /* nhlobj.c */; }; + 544768AB239949FA004B9739 /* sfstruct.c in Sources */ = {isa = PBXBuildFile; fileRef = 544768A8239949FA004B9739 /* sfstruct.c */; }; + 544768AE23994A17004B9739 /* nhlsel.c in Sources */ = {isa = PBXBuildFile; fileRef = 544768AC23994A17004B9739 /* nhlsel.c */; }; + 544768AF23994A17004B9739 /* nhlua.c in Sources */ = {isa = PBXBuildFile; fileRef = 544768AD23994A17004B9739 /* nhlua.c */; }; + 544768B123994A2C004B9739 /* mdlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 544768B023994A2C004B9739 /* mdlib.c */; }; + 544A5CF0277B40CF00734B53 /* panic.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42721A267E60055BD01 /* panic.c */; }; + 5462D14823E7B19200969423 /* insight.c in Sources */ = {isa = PBXBuildFile; fileRef = 5462D14723E7B19200969423 /* insight.c */; }; + 5493735A277AAE830031FE02 /* alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36521A238040055BD01 /* alloc.c */; }; + 54A3D3EC282C55A900143F8C /* utf8map.c in Sources */ = {isa = PBXBuildFile; fileRef = 54A3D3EB282C55A900143F8C /* utf8map.c */; }; + 54BD340D2D8B70350073C484 /* hacklib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36421A238040055BD01 /* hacklib.c */; }; + 54FB2B4B246310A600397C0E /* symbols.c in Sources */ = {isa = PBXBuildFile; fileRef = 54FB2B4A246310A600397C0E /* symbols.c */; }; 54FCE8292223261F00F393C8 /* isaac64.c in Sources */ = {isa = PBXBuildFile; fileRef = 54FCE8282223261F00F393C8 /* isaac64.c */; }; + BAB57DB527C1C3E200FCF150 /* libnhlua.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BAE8010A27B97760002B3786 /* libnhlua.a */; }; + BAE8013627B99CAD002B3786 /* lopcodes.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011427B99CAB002B3786 /* lopcodes.c */; }; + BAE8013727B99CAD002B3786 /* linit.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011527B99CAB002B3786 /* linit.c */; }; + BAE8013827B99CAD002B3786 /* lobject.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011627B99CAB002B3786 /* lobject.c */; settings = {COMPILER_FLAGS = "-Wno-conditional-uninitialized"; }; }; + BAE8013927B99CAD002B3786 /* loslib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011727B99CAC002B3786 /* loslib.c */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; }; + BAE8013A27B99CAD002B3786 /* lcorolib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011827B99CAC002B3786 /* lcorolib.c */; }; + BAE8013B27B99CAD002B3786 /* lutf8lib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011927B99CAC002B3786 /* lutf8lib.c */; }; + BAE8013C27B99CAD002B3786 /* ltable.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011A27B99CAC002B3786 /* ltable.c */; settings = {COMPILER_FLAGS = "-Wno-conditional-uninitialized"; }; }; + BAE8013D27B99CAD002B3786 /* ltablib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011B27B99CAC002B3786 /* ltablib.c */; settings = {COMPILER_FLAGS = "-Wno-conditional-uninitialized"; }; }; + BAE8013E27B99CAD002B3786 /* llex.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011C27B99CAC002B3786 /* llex.c */; }; + BAE8013F27B99CAD002B3786 /* lcode.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011D27B99CAC002B3786 /* lcode.c */; }; + BAE8014027B99CAD002B3786 /* lua.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011E27B99CAC002B3786 /* lua.c */; }; + BAE8014127B99CAD002B3786 /* ldo.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8011F27B99CAC002B3786 /* ldo.c */; }; + BAE8014227B99CAE002B3786 /* ldump.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012027B99CAC002B3786 /* ldump.c */; }; + BAE8014327B99CAE002B3786 /* lparser.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012127B99CAC002B3786 /* lparser.c */; }; + BAE8014427B99CAE002B3786 /* lstate.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012227B99CAC002B3786 /* lstate.c */; }; + BAE8014527B99CAE002B3786 /* lapi.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012327B99CAC002B3786 /* lapi.c */; }; + BAE8014627B99CAE002B3786 /* ldebug.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012427B99CAC002B3786 /* ldebug.c */; }; + BAE8014727B99CAE002B3786 /* lstring.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012527B99CAC002B3786 /* lstring.c */; }; + BAE8014827B99CAE002B3786 /* ltm.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012627B99CAC002B3786 /* ltm.c */; }; + BAE8014927B99CAE002B3786 /* lmem.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012727B99CAC002B3786 /* lmem.c */; }; + BAE8014A27B99CAE002B3786 /* lvm.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012827B99CAC002B3786 /* lvm.c */; settings = {COMPILER_FLAGS = "-Wno-conditional-uninitialized"; }; }; + BAE8014B27B99CAE002B3786 /* lfunc.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012927B99CAC002B3786 /* lfunc.c */; }; + BAE8014C27B99CAE002B3786 /* lgc.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012A27B99CAC002B3786 /* lgc.c */; }; + BAE8014D27B99CAE002B3786 /* lundump.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012B27B99CAD002B3786 /* lundump.c */; }; + BAE8014E27B99CAE002B3786 /* lbaselib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012C27B99CAD002B3786 /* lbaselib.c */; }; + BAE8014F27B99CAE002B3786 /* ldblib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012D27B99CAD002B3786 /* ldblib.c */; }; + BAE8015027B99CAE002B3786 /* lauxlib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012E27B99CAD002B3786 /* lauxlib.c */; }; + BAE8015127B99CAE002B3786 /* liolib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8012F27B99CAD002B3786 /* liolib.c */; settings = {COMPILER_FLAGS = "-Wno-conditional-uninitialized"; }; }; + BAE8015227B99CAE002B3786 /* lctype.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013027B99CAD002B3786 /* lctype.c */; }; + BAE8015327B99CAE002B3786 /* luac.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013127B99CAD002B3786 /* luac.c */; }; + BAE8015427B99CAE002B3786 /* loadlib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013227B99CAD002B3786 /* loadlib.c */; }; + BAE8015527B99CAE002B3786 /* lmathlib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013327B99CAD002B3786 /* lmathlib.c */; }; + BAE8015627B99CAE002B3786 /* lstrlib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013427B99CAD002B3786 /* lstrlib.c */; }; + BAE8015727B99CAE002B3786 /* lzio.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013527B99CAD002B3786 /* lzio.c */; }; + BAE8015A27B9C872002B3786 /* date.c in Sources */ = {isa = PBXBuildFile; fileRef = 5439B3BB275AADC600B8FB2F /* date.c */; }; + F50818312F6F564300D2AAFA /* iactions.c in Sources */ = {isa = PBXBuildFile; fileRef = F50818302F6F564300D2AAFA /* iactions.c */; }; + F5457B212DED146B00039D83 /* hacklib.c in Sources */ = {isa = PBXBuildFile; fileRef = F5457B202DED146B00039D83 /* hacklib.c */; }; + F5457B2C2DED16F200039D83 /* libhacklib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F5457B1C2DED143E00039D83 /* libhacklib.a */; }; + F5457B2D2DED171800039D83 /* libhacklib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F5457B1C2DED143E00039D83 /* libhacklib.a */; }; + F5857AA22DED026700A8CB4F /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32721A238010055BD01 /* version.c */; }; + F5857AA42DED032D00A8CB4F /* cfgfiles.c in Sources */ = {isa = PBXBuildFile; fileRef = F5857AA32DED032C00A8CB4F /* cfgfiles.c */; }; + F5857AA62DED03BB00A8CB4F /* sfbase.c in Sources */ = {isa = PBXBuildFile; fileRef = F5857AA52DED03BB00A8CB4F /* sfbase.c */; }; + F5E1A4CF2FA2F74C0014D115 /* macuuid.m in Sources */ = {isa = PBXBuildFile; fileRef = F5E1A4CE2FA2F74C0014D115 /* macuuid.m */; }; + F5E66A222F7D4B30000E30B7 /* earlyarg.c in Sources */ = {isa = PBXBuildFile; fileRef = F5E66A212F7D4B30000E30B7 /* earlyarg.c */; }; /* End PBXBuildFile section */ -/* Begin PBXBuildRule section */ - 317E7C5221A3774F00F6E4E5 /* PBXBuildRule */ = { - isa = PBXBuildRule; - compilerSpec = com.apple.compilers.proxy.script; - fileType = sourcecode.yacc; - inputFiles = ( - ); - isEditable = 1; - outputFiles = ( - "$(NH_INC_DIR)/lev_comp.h", - "$(NH_UTIL_DIR)/lev_yacc.c", - ); - 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; - compilerSpec = com.apple.compilers.proxy.script; - fileType = sourcecode.lex; - inputFiles = ( - ); - isEditable = 1; - outputFiles = ( - "$(NH_UTIL_DIR)/lev_lex.c", - ); - 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; - compilerSpec = com.apple.compilers.proxy.script; - filePatterns = dgn_comp.y; - fileType = sourcecode.yacc; - inputFiles = ( - ); - isEditable = 1; - outputFiles = ( - "$(NH_UTIL_DIR)/dgn_yacc.c", - "$(NH_INC_DIR)/dgn_comp.h", - ); - 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; - compilerSpec = com.apple.compilers.proxy.script; - fileType = sourcecode.lex; - inputFiles = ( - ); - isEditable = 1; - outputFiles = ( - "$(NH_UTIL_DIR)/dgn_lex.c", - ); - 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 */ - 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 */; @@ -258,40 +242,47 @@ remoteGlobalIDString = 31B8A45621A26A970055BD01; remoteInfo = dlb; }; - 3192867721A3AB0400325BEB /* PBXContainerItemProxy */ = { + 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; proxyType = 1; - remoteGlobalIDString = 31B8A43521A268DF0055BD01; - remoteInfo = dgn_comp; + remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; + remoteInfo = makedefs; }; - 3192867921A3AB0800325BEB /* PBXContainerItemProxy */ = { + BAE8011227B9996A002B3786 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; proxyType = 1; - remoteGlobalIDString = 31B8A41D21A2669A0055BD01; - remoteInfo = lev_comp; + remoteGlobalIDString = BAE8010927B97760002B3786; + remoteInfo = nhlua.a; }; - 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */ = { + F5457B222DED148700039D83 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; proxyType = 1; - remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; - remoteInfo = makedefs; + remoteGlobalIDString = F5457B1B2DED143E00039D83; + remoteInfo = hacklib; + }; + F5457B242DED149500039D83 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = F5457B1B2DED143E00039D83; + remoteInfo = hacklib; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 3189576F21A1FCC100FB2ABE /* CopyFiles */ = { + 059660C42C80B15300398EDE /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; + buildActionMask = 8; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; - 3189577D21A1FDA400FB2ABE /* CopyFiles */ = { + 3189576F21A1FCC100FB2ABE /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; @@ -300,19 +291,10 @@ ); runOnlyForDeploymentPostprocessing = 1; }; - 31B8A41C21A2669A0055BD01 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; - 31B8A43421A268DF0055BD01 /* CopyFiles */ = { + 3189577D21A1FDA400FB2ABE /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; + dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); @@ -327,77 +309,60 @@ ); runOnlyForDeploymentPostprocessing = 1; }; - 31B8A45521A26A970055BD01 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 056E43BB2C810EE800FD1F52 /* calendar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = calendar.c; path = ../../src/calendar.c; sourceTree = ""; }; + 056E43BC2C810EE800FD1F52 /* coloratt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = coloratt.c; path = ../../src/coloratt.c; sourceTree = ""; }; + 056E43BD2C810EE800FD1F52 /* getpos.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = getpos.c; path = ../../src/getpos.c; sourceTree = ""; }; + 056E43BE2C810EE800FD1F52 /* glyphs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = glyphs.c; path = ../../src/glyphs.c; sourceTree = ""; }; + 056E43BF2C810EE800FD1F52 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../src/Makefile; sourceTree = ""; }; + 056E43C02C810EE800FD1F52 /* nhmd4.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = nhmd4.c; path = ../../src/nhmd4.c; sourceTree = ""; }; + 056E43C12C810EE800FD1F52 /* report.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = report.c; path = ../../src/report.c; sourceTree = ""; }; + 056E43C22C810EE800FD1F52 /* selvar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = selvar.c; path = ../../src/selvar.c; sourceTree = ""; }; + 056E43C32C810EE800FD1F52 /* stairs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = stairs.c; path = ../../src/stairs.c; sourceTree = ""; }; + 056E43C42C810EE800FD1F52 /* strutil.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = strutil.c; path = ../../src/strutil.c; sourceTree = ""; }; + 056E43C52C810EE800FD1F52 /* wizcmds.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = wizcmds.c; path = ../../src/wizcmds.c; sourceTree = ""; }; 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 = ""; }; + 3186A38421A4B0FB0052BF02 /* sym.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sym.h; path = ../../include/sym.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 = ""; }; + 3186A38A21A4B0FB0052BF02 /* cstd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cstd.h; path = ../../include/cstd.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 = ""; }; + 3186A39B21A4B0FD0052BF02 /* windconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = windconf.h; path = ../../include/windconf.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 = ""; }; @@ -405,40 +370,27 @@ 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 = ""; }; @@ -449,8 +401,6 @@ 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 = ""; }; - 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 = ""; }; @@ -461,7 +411,6 @@ 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 = ""; }; @@ -560,7 +509,6 @@ 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 = ""; }; @@ -580,29 +528,129 @@ 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 = ""; }; + 5439B3BB275AADC600B8FB2F /* date.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = date.c; path = ../../src/date.c; sourceTree = ""; }; + 5439B3BD275AADCE00B8FB2F /* date.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = date.c; path = ../../src/date.c; sourceTree = ""; }; + 54435B51247999CB00804CB3 /* nhlobj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nhlobj.c; path = ../../src/nhlobj.c; sourceTree = ""; }; + 544768A8239949FA004B9739 /* sfstruct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sfstruct.c; path = ../../src/sfstruct.c; sourceTree = ""; }; + 544768AC23994A17004B9739 /* nhlsel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nhlsel.c; path = ../../src/nhlsel.c; sourceTree = ""; }; + 544768AD23994A17004B9739 /* nhlua.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nhlua.c; path = ../../src/nhlua.c; sourceTree = ""; }; + 544768B023994A2C004B9739 /* mdlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mdlib.c; path = ../../src/mdlib.c; sourceTree = ""; }; + 544768B423995447004B9739 /* isaac64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = isaac64.h; path = ../../include/isaac64.h; sourceTree = ""; }; + 544768B523995488004B9739 /* nhlua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nhlua.h; path = ../../include/nhlua.h; sourceTree = ""; }; + 544768B923995BB7004B9739 /* liblua.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblua.a; path = ../../lib/lua/liblua.a; sourceTree = ""; }; + 5462D14723E7B19200969423 /* insight.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = insight.c; path = ../../src/insight.c; sourceTree = ""; }; + 548FB9F9297F2B03000D04CF /* sndprocs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sndprocs.h; path = ../../include/sndprocs.h; sourceTree = ""; }; + 548FB9FA297F2BBD000D04CF /* optlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = optlist.h; path = ../../include/optlist.h; sourceTree = ""; }; + 548FB9FB297F2BBD000D04CF /* hacklib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = hacklib.h; path = ../../include/hacklib.h; sourceTree = ""; }; + 548FB9FC297F2BBD000D04CF /* warnings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = warnings.h; path = ../../include/warnings.h; sourceTree = ""; }; + 548FB9FD297F2BBD000D04CF /* defsym.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = defsym.h; path = ../../include/defsym.h; sourceTree = ""; }; + 548FB9FE297F2BBD000D04CF /* fnamesiz.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fnamesiz.h; path = ../../include/fnamesiz.h; sourceTree = ""; }; + 548FB9FF297F2BBD000D04CF /* objects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = objects.h; path = ../../include/objects.h; sourceTree = ""; }; + 548FBA00297F2BBD000D04CF /* tile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tile.h; path = ../../include/tile.h; sourceTree = ""; }; + 548FBA01297F2BBD000D04CF /* monsters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = monsters.h; path = ../../include/monsters.h; sourceTree = ""; }; + 54A3D3EB282C55A900143F8C /* utf8map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utf8map.c; path = ../../src/utf8map.c; sourceTree = ""; }; + 54AEB885297EE7C4005F1B13 /* macsound.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = macsound.m; path = ../../sound/macsound/macsound.m; sourceTree = ""; }; + 54BD340E2D8B711E0073C484 /* nhregex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nhregex.h; path = ../../include/nhregex.h; sourceTree = ""; }; + 54BD340F2D8B711E0073C484 /* seffects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = seffects.h; path = ../../include/seffects.h; sourceTree = ""; }; + 54BD34102D8B711E0073C484 /* selvar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = selvar.h; path = ../../include/selvar.h; sourceTree = ""; }; + 54BD34112D8B711E0073C484 /* stairs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = stairs.h; path = ../../include/stairs.h; sourceTree = ""; }; + 54BD34122D8B711E0073C484 /* weight.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = weight.h; path = ../../include/weight.h; sourceTree = ""; }; + 54EBA6D22DDED3F100CD20EC /* cfgfiles.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cfgfiles.c; path = ../../src/cfgfiles.c; sourceTree = ""; }; + 54FB2B4A246310A600397C0E /* symbols.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = symbols.c; path = ../../src/symbols.c; sourceTree = ""; }; 54FCE8282223261F00F393C8 /* isaac64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = isaac64.c; path = ../../src/isaac64.c; sourceTree = ""; }; + BAE8010A27B97760002B3786 /* libnhlua.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libnhlua.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BAE8011427B99CAB002B3786 /* lopcodes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lopcodes.c; path = "../../lib/lua-5.4.8/src/lopcodes.c"; sourceTree = ""; }; + BAE8011527B99CAB002B3786 /* linit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = linit.c; path = "../../lib/lua-5.4.8/src/linit.c"; sourceTree = ""; }; + BAE8011627B99CAB002B3786 /* lobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lobject.c; path = "../../lib/lua-5.4.8/src/lobject.c"; sourceTree = ""; }; + BAE8011727B99CAC002B3786 /* loslib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loslib.c; path = "../../lib/lua-5.4.8/src/loslib.c"; sourceTree = ""; }; + BAE8011827B99CAC002B3786 /* lcorolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcorolib.c; path = "../../lib/lua-5.4.8/src/lcorolib.c"; sourceTree = ""; }; + BAE8011927B99CAC002B3786 /* lutf8lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lutf8lib.c; path = "../../lib/lua-5.4.8/src/lutf8lib.c"; sourceTree = ""; }; + BAE8011A27B99CAC002B3786 /* ltable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltable.c; path = "../../lib/lua-5.4.8/src/ltable.c"; sourceTree = ""; }; + BAE8011B27B99CAC002B3786 /* ltablib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltablib.c; path = "../../lib/lua-5.4.8/src/ltablib.c"; sourceTree = ""; }; + BAE8011C27B99CAC002B3786 /* llex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = llex.c; path = "../../lib/lua-5.4.8/src/llex.c"; sourceTree = ""; }; + BAE8011D27B99CAC002B3786 /* lcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcode.c; path = "../../lib/lua-5.4.8/src/lcode.c"; sourceTree = ""; }; + BAE8011E27B99CAC002B3786 /* lua.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua.c; path = "../../lib/lua-5.4.8/src/lua.c"; sourceTree = ""; }; + BAE8011F27B99CAC002B3786 /* ldo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldo.c; path = "../../lib/lua-5.4.8/src/ldo.c"; sourceTree = ""; }; + BAE8012027B99CAC002B3786 /* ldump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldump.c; path = "../../lib/lua-5.4.8/src/ldump.c"; sourceTree = ""; }; + BAE8012127B99CAC002B3786 /* lparser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lparser.c; path = "../../lib/lua-5.4.8/src/lparser.c"; sourceTree = ""; }; + BAE8012227B99CAC002B3786 /* lstate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstate.c; path = "../../lib/lua-5.4.8/src/lstate.c"; sourceTree = ""; }; + BAE8012327B99CAC002B3786 /* lapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lapi.c; path = "../../lib/lua-5.4.8/src/lapi.c"; sourceTree = ""; }; + BAE8012427B99CAC002B3786 /* ldebug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldebug.c; path = "../../lib/lua-5.4.8/src/ldebug.c"; sourceTree = ""; }; + BAE8012527B99CAC002B3786 /* lstring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstring.c; path = "../../lib/lua-5.4.8/src/lstring.c"; sourceTree = ""; }; + BAE8012627B99CAC002B3786 /* ltm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltm.c; path = "../../lib/lua-5.4.8/src/ltm.c"; sourceTree = ""; }; + BAE8012727B99CAC002B3786 /* lmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmem.c; path = "../../lib/lua-5.4.8/src/lmem.c"; sourceTree = ""; }; + BAE8012827B99CAC002B3786 /* lvm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lvm.c; path = "../../lib/lua-5.4.8/src/lvm.c"; sourceTree = ""; }; + BAE8012927B99CAC002B3786 /* lfunc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lfunc.c; path = "../../lib/lua-5.4.8/src/lfunc.c"; sourceTree = ""; }; + BAE8012A27B99CAC002B3786 /* lgc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lgc.c; path = "../../lib/lua-5.4.8/src/lgc.c"; sourceTree = ""; }; + BAE8012B27B99CAD002B3786 /* lundump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lundump.c; path = "../../lib/lua-5.4.8/src/lundump.c"; sourceTree = ""; }; + BAE8012C27B99CAD002B3786 /* lbaselib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lbaselib.c; path = "../../lib/lua-5.4.8/src/lbaselib.c"; sourceTree = ""; }; + BAE8012D27B99CAD002B3786 /* ldblib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldblib.c; path = "../../lib/lua-5.4.8/src/ldblib.c"; sourceTree = ""; }; + BAE8012E27B99CAD002B3786 /* lauxlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lauxlib.c; path = "../../lib/lua-5.4.8/src/lauxlib.c"; sourceTree = ""; }; + BAE8012F27B99CAD002B3786 /* liolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = liolib.c; path = "../../lib/lua-5.4.8/src/liolib.c"; sourceTree = ""; }; + BAE8013027B99CAD002B3786 /* lctype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lctype.c; path = "../../lib/lua-5.4.8/src/lctype.c"; sourceTree = ""; }; + BAE8013127B99CAD002B3786 /* luac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = luac.c; path = "../../lib/lua-5.4.8/src/luac.c"; sourceTree = ""; }; + BAE8013227B99CAD002B3786 /* loadlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loadlib.c; path = "../../lib/lua-5.4.8/src/loadlib.c"; sourceTree = ""; }; + BAE8013327B99CAD002B3786 /* lmathlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmathlib.c; path = "../../lib/lua-5.4.8/src/lmathlib.c"; sourceTree = ""; }; + BAE8013427B99CAD002B3786 /* lstrlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstrlib.c; path = "../../lib/lua-5.4.8/src/lstrlib.c"; sourceTree = ""; }; + BAE8013527B99CAD002B3786 /* lzio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lzio.c; path = "../../lib/lua-5.4.8/src/lzio.c"; sourceTree = ""; }; + F50818302F6F564300D2AAFA /* iactions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = iactions.c; path = ../../src/iactions.c; sourceTree = ""; }; + F515A6F32DED074D006E1F63 /* sfctool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfctool.c; path = ../../util/sfctool.c; sourceTree = ""; }; + F515A6F52DED0916006E1F63 /* date.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = date.c; path = ../../src/date.c; sourceTree = ""; }; + F515A6F62DED0916006E1F63 /* sfbase.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfbase.c; path = ../../src/sfbase.c; sourceTree = ""; }; + F515A6F72DED0916006E1F63 /* sys.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sys.c; path = ../../src/sys.c; sourceTree = ""; }; + F515A6F82DED0917006E1F63 /* calendar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = calendar.c; path = ../../src/calendar.c; sourceTree = ""; }; + F515A6F92DED0917006E1F63 /* sfstruct.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfstruct.c; path = ../../src/sfstruct.c; sourceTree = ""; }; + F515A6FA2DED0917006E1F63 /* engrave.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = engrave.c; path = ../../src/engrave.c; sourceTree = ""; }; + F515A6FB2DED0917006E1F63 /* mdlib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mdlib.c; path = ../../src/mdlib.c; sourceTree = ""; }; + F515A6FC2DED0917006E1F63 /* o_init.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = o_init.c; path = ../../src/o_init.c; sourceTree = ""; }; + F515A6FD2DED0917006E1F63 /* mkmaze.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mkmaze.c; path = ../../src/mkmaze.c; sourceTree = ""; }; + F515A6FE2DED0917006E1F63 /* version.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = version.c; path = ../../src/version.c; sourceTree = ""; }; + F515A6FF2DED0918006E1F63 /* alloc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = alloc.c; path = ../../src/alloc.c; sourceTree = ""; }; + F515A7002DED0918006E1F63 /* artifact.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = artifact.c; path = ../../src/artifact.c; sourceTree = ""; }; + F515A7012DED0918006E1F63 /* cfgfiles.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cfgfiles.c; path = ../../src/cfgfiles.c; sourceTree = ""; }; + F515A7022DED0918006E1F63 /* nhlua.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = nhlua.c; path = ../../src/nhlua.c; sourceTree = ""; }; + F515A7032DED0918006E1F63 /* objects.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = objects.c; path = ../../src/objects.c; sourceTree = ""; }; + F515A7042DED0918006E1F63 /* strutil.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = strutil.c; path = ../../src/strutil.c; sourceTree = ""; }; + F515A7052DED0919006E1F63 /* decl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = decl.c; path = ../../src/decl.c; sourceTree = ""; }; + F515A7062DED0919006E1F63 /* mkroom.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mkroom.c; path = ../../src/mkroom.c; sourceTree = ""; }; + F515A7072DED0919006E1F63 /* rumors.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rumors.c; path = ../../src/rumors.c; sourceTree = ""; }; + F515A7082DED0919006E1F63 /* monst.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = monst.c; path = ../../src/monst.c; sourceTree = ""; }; + F515A7092DED0919006E1F63 /* files.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = files.c; path = ../../src/files.c; sourceTree = ""; }; + F515A70A2DED091A006E1F63 /* restore.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = restore.c; path = ../../src/restore.c; sourceTree = ""; }; + F515A70B2DED091A006E1F63 /* end.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = end.c; path = ../../src/end.c; sourceTree = ""; }; + F515A70C2DED091A006E1F63 /* worm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = worm.c; path = ../../src/worm.c; sourceTree = ""; }; + F515A7252DED0978006E1F63 /* sfexpasc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfexpasc.c; path = ../../util/sfexpasc.c; sourceTree = ""; }; + F515A7262DED0978006E1F63 /* panic.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = panic.c; path = ../../util/panic.c; sourceTree = ""; }; + F515A72A2DED0A7C006E1F63 /* sftags.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sftags.c; path = ../../util/sftags.c; sourceTree = ""; }; + F515A73B2DED0B47006E1F63 /* hacklib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hacklib.c; path = ../../src/hacklib.c; sourceTree = ""; }; + F5457B1C2DED143E00039D83 /* libhacklib.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libhacklib.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F5457B202DED146B00039D83 /* hacklib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hacklib.c; path = ../../src/hacklib.c; sourceTree = ""; }; + F54C1AE12E43D22A006CAA8E /* nhmd4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nhmd4.h; path = ../../include/include/nhmd4.h; sourceTree = ""; }; + F54C1AE22E43D22A006CAA8E /* savefile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = savefile.h; path = ../../include/include/savefile.h; sourceTree = ""; }; + F54C1AE32E43D22A006CAA8E /* sfmacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sfmacros.h; path = ../../include/include/sfmacros.h; sourceTree = ""; }; + F54C1AE42E43D22A006CAA8E /* sfprocs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sfprocs.h; path = ../../include/include/sfprocs.h; sourceTree = ""; }; + F5857AA32DED032C00A8CB4F /* cfgfiles.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cfgfiles.c; path = ../../src/cfgfiles.c; sourceTree = ""; }; + F5857AA52DED03BB00A8CB4F /* sfbase.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfbase.c; path = ../../src/sfbase.c; sourceTree = ""; }; + F5E1A4CE2FA2F74C0014D115 /* macuuid.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = macuuid.m; sourceTree = ""; }; + F5E66A212F7D4B30000E30B7 /* earlyarg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = earlyarg.c; path = ../../src/earlyarg.c; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedRootGroup section */ + F515A7322DED0B08006E1F63 /* hacklib */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = hacklib; sourceTree = ""; }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 3189576E21A1FCC100FB2ABE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F5457B2C2DED16F200039D83 /* libhacklib.a in Frameworks */, + BAB57DB527C1C3E200FCF150 /* libnhlua.a in Frameworks */, 31B8A41721A243E80055BD01 /* libncurses.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -611,31 +659,32 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F5457B2D2DED171800039D83 /* libhacklib.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A41B21A2669A0055BD01 /* Frameworks */ = { + 31B8A44721A26A4B0055BD01 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A43321A268DF0055BD01 /* Frameworks */ = { + 31B8A45421A26A970055BD01 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A44721A26A4B0055BD01 /* Frameworks */ = { + BAE8010827B97760002B3786 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A45421A26A970055BD01 /* Frameworks */ = { + F5457B1A2DED143E00039D83 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -648,12 +697,51 @@ 3189576821A1FCC100FB2ABE = { isa = PBXGroup; children = ( + F5E1A4CE2FA2F74C0014D115 /* macuuid.m */, + F5E66A212F7D4B30000E30B7 /* earlyarg.c */, + F50818302F6F564300D2AAFA /* iactions.c */, + F515A73B2DED0B47006E1F63 /* hacklib.c */, + F5457B202DED146B00039D83 /* hacklib.c */, + F515A72A2DED0A7C006E1F63 /* sftags.c */, + F515A7262DED0978006E1F63 /* panic.c */, + F515A7252DED0978006E1F63 /* sfexpasc.c */, + F515A6FF2DED0918006E1F63 /* alloc.c */, + F515A7002DED0918006E1F63 /* artifact.c */, + F515A6F82DED0917006E1F63 /* calendar.c */, + F515A7012DED0918006E1F63 /* cfgfiles.c */, + F515A6F52DED0916006E1F63 /* date.c */, + F515A7052DED0919006E1F63 /* decl.c */, + F515A70B2DED091A006E1F63 /* end.c */, + F515A6FA2DED0917006E1F63 /* engrave.c */, + F515A7092DED0919006E1F63 /* files.c */, + F515A6FB2DED0917006E1F63 /* mdlib.c */, + F515A6FD2DED0917006E1F63 /* mkmaze.c */, + F515A7062DED0919006E1F63 /* mkroom.c */, + F515A7082DED0919006E1F63 /* monst.c */, + F515A7022DED0918006E1F63 /* nhlua.c */, + F515A6FC2DED0917006E1F63 /* o_init.c */, + F515A7032DED0918006E1F63 /* objects.c */, + F515A70A2DED091A006E1F63 /* restore.c */, + F515A7072DED0919006E1F63 /* rumors.c */, + F515A6F62DED0916006E1F63 /* sfbase.c */, + F515A6F92DED0917006E1F63 /* sfstruct.c */, + F515A7042DED0918006E1F63 /* strutil.c */, + F515A6F72DED0916006E1F63 /* sys.c */, + F515A6FE2DED0917006E1F63 /* version.c */, + F515A70C2DED091A006E1F63 /* worm.c */, + F515A6F32DED074D006E1F63 /* sfctool.c */, + F5857AA52DED03BB00A8CB4F /* sfbase.c */, + F5857AA32DED032C00A8CB4F /* cfgfiles.c */, + 54AEB886297EE7E9005F1B13 /* sound */, + 54AEB885297EE7C4005F1B13 /* macsound.m */, + BAE8015827B99D44002B3786 /* nhlualib */, 2A953FB221A3F404007906E5 /* XCode.xcconfig */, 31B8A3F821A23E490055BD01 /* win */, 31B8A3E921A23CC40055BD01 /* sys */, 3189579621A2046700FB2ABE /* include */, 3189579321A200EC00FB2ABE /* util */, 3189578C21A1FF8200FB2ABE /* src */, + F515A7322DED0B08006E1F63 /* hacklib */, 3189577221A1FCC100FB2ABE /* Products */, 31B8A41421A243CB0055BD01 /* Frameworks */, ); @@ -664,10 +752,10 @@ children = ( 3189577121A1FCC100FB2ABE /* NetHack */, 3189577F21A1FDA400FB2ABE /* makedefs */, - 31B8A41E21A2669A0055BD01 /* lev_comp */, - 31B8A43621A268DF0055BD01 /* dgn_comp */, 31B8A44A21A26A4B0055BD01 /* recover */, 31B8A45721A26A970055BD01 /* dlb */, + BAE8010A27B97760002B3786 /* libnhlua.a */, + F5457B1C2DED143E00039D83 /* libhacklib.a */, ); name = Products; sourceTree = ""; @@ -675,6 +763,26 @@ 3189578C21A1FF8200FB2ABE /* src */ = { isa = PBXGroup; children = ( + 54EBA6D22DDED3F100CD20EC /* cfgfiles.c */, + 056E43BB2C810EE800FD1F52 /* calendar.c */, + 056E43BC2C810EE800FD1F52 /* coloratt.c */, + 056E43BD2C810EE800FD1F52 /* getpos.c */, + 056E43BE2C810EE800FD1F52 /* glyphs.c */, + 056E43BF2C810EE800FD1F52 /* Makefile */, + 056E43C02C810EE800FD1F52 /* nhmd4.c */, + 056E43C12C810EE800FD1F52 /* report.c */, + 056E43C22C810EE800FD1F52 /* selvar.c */, + 056E43C32C810EE800FD1F52 /* stairs.c */, + 056E43C42C810EE800FD1F52 /* strutil.c */, + 056E43C52C810EE800FD1F52 /* wizcmds.c */, + 54A3D3EB282C55A900143F8C /* utf8map.c */, + 54435B51247999CB00804CB3 /* nhlobj.c */, + 54FB2B4A246310A600397C0E /* symbols.c */, + 544768B023994A2C004B9739 /* mdlib.c */, + 544768AC23994A17004B9739 /* nhlsel.c */, + 544768AD23994A17004B9739 /* nhlua.c */, + 544768A8239949FA004B9739 /* sfstruct.c */, + 5439B3BB275AADC600B8FB2F /* date.c */, 31B8A35521A238030055BD01 /* allmain.c */, 31B8A36521A238040055BD01 /* alloc.c */, 31B8A35E21A238040055BD01 /* apply.c */, @@ -709,13 +817,13 @@ 31B8A33921A238020055BD01 /* fountain.c */, 31B8A35821A238040055BD01 /* hack.c */, 31B8A36421A238040055BD01 /* hacklib.c */, + 5462D14723E7B19200969423 /* insight.c */, 31B8A33121A238010055BD01 /* invent.c */, 54FCE8282223261F00F393C8 /* isaac64.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 */, @@ -773,7 +881,6 @@ 31B8A34721A238030055BD01 /* uhitm.c */, 31B8A37321A238050055BD01 /* vault.c */, 31B8A32721A238010055BD01 /* version.c */, - 31B8A3E721A23AB50055BD01 /* vis_tab.c */, 31B8A33E21A238020055BD01 /* vision.c */, 31B8A34221A238020055BD01 /* weapon.c */, 31B8A32D21A238010055BD01 /* were.c */, @@ -791,18 +898,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 */, - 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 */, ); @@ -812,22 +909,24 @@ 3189579621A2046700FB2ABE /* include */ = { isa = PBXGroup; children = ( + F54C1AE12E43D22A006CAA8E /* nhmd4.h */, + F54C1AE22E43D22A006CAA8E /* savefile.h */, + F54C1AE32E43D22A006CAA8E /* sfmacros.h */, + F54C1AE42E43D22A006CAA8E /* sfprocs.h */, 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 */, + 31B8A30A21A20D730055BD01 /* config.h */, 3186A3C621A4B0FE0052BF02 /* config1.h */, 3186A37121A4B0FA0052BF02 /* context.h */, 3186A3C521A4B0FE0052BF02 /* coord.h */, + 3186A38A21A4B0FB0052BF02 /* cstd.h */, 3186A3B021A4B0FD0052BF02 /* date.h */, 3186A3D021A4B0FE0052BF02 /* decl.h */, - 3186A3AF21A4B0FD0052BF02 /* def_os2.h */, - 3186A38621A4B0FB0052BF02 /* dgn_comp.h */, + 548FB9FD297F2BBD000D04CF /* defsym.h */, 3186A3A021A4B0FD0052BF02 /* dgn_file.h */, 3186A3A921A4B0FD0052BF02 /* display.h */, 3186A38E21A4B0FC0052BF02 /* dlb.h */, @@ -835,22 +934,14 @@ 3186A3A221A4B0FD0052BF02 /* engrave.h */, 3186A37021A4B0FA0052BF02 /* extern.h */, 3186A3B521A4B0FD0052BF02 /* flag.h */, + 548FB9FE297F2BBD000D04CF /* fnamesiz.h */, 3186A37321A4B0FA0052BF02 /* func_tab.h */, - 3186A3CC21A4B0FE0052BF02 /* gem_rsc.h */, 3186A3C121A4B0FD0052BF02 /* global.h */, 3186A3A521A4B0FD0052BF02 /* hack.h */, + 548FB9FB297F2BBD000D04CF /* hacklib.h */, 3186A37A21A4B0FA0052BF02 /* integer.h */, - 3186A39021A4B0FC0052BF02 /* lev_comp.h */, - 3186A3CF21A4B0FE0052BF02 /* lev.h */, + 544768B423995447004B9739 /* isaac64.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 */, @@ -860,50 +951,45 @@ 3186A3C821A4B0FE0052BF02 /* mondata.h */, 3186A38F21A4B0FC0052BF02 /* monflag.h */, 3186A3BB21A4B0FD0052BF02 /* monst.h */, - 3186A38421A4B0FB0052BF02 /* monsym.h */, - 3186A38921A4B0FB0052BF02 /* mttypriv.h */, - 3186A39B21A4B0FD0052BF02 /* ntconf.h */, + 548FBA01297F2BBD000D04CF /* monsters.h */, + 544768B523995488004B9739 /* nhlua.h */, + 54BD340E2D8B711E0073C484 /* nhregex.h */, 3186A39521A4B0FC0052BF02 /* obj.h */, 3186A3A821A4B0FD0052BF02 /* objclass.h */, - 3186A38B21A4B0FC0052BF02 /* onames.h */, - 3186A39621A4B0FC0052BF02 /* os2conf.h */, + 548FB9FF297F2BBD000D04CF /* objects.h */, + 548FB9FA297F2BBD000D04CF /* optlist.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 */, + 54BD340F2D8B711E0073C484 /* seffects.h */, + 54BD34102D8B711E0073C484 /* selvar.h */, 3186A38221A4B0FB0052BF02 /* skills.h */, + 548FB9F9297F2B03000D04CF /* sndprocs.h */, 3186A3B621A4B0FD0052BF02 /* sp_lev.h */, 3186A3A321A4B0FD0052BF02 /* spell.h */, + 54BD34112D8B711E0073C484 /* stairs.h */, + 3186A38421A4B0FB0052BF02 /* sym.h */, 3186A3CB21A4B0FE0052BF02 /* sys.h */, - 3186A38A21A4B0FB0052BF02 /* system.h */, 3186A3C321A4B0FE0052BF02 /* tcap.h */, + 548FBA00297F2BBD000D04CF /* tile.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 */, + 548FB9FC297F2BBD000D04CF /* warnings.h */, + 54BD34122D8B711E0073C484 /* weight.h */, 3186A3AA21A4B0FD0052BF02 /* winami.h */, 3186A37621A4B0FA0052BF02 /* wincurs.h */, - 3186A37D21A4B0FA0052BF02 /* wingem.h */, - 3186A3CE21A4B0FE0052BF02 /* winGnome.h */, + 3186A39B21A4B0FD0052BF02 /* windconf.h */, 3186A36F21A4B0FA0052BF02 /* winprocs.h */, 3186A39A21A4B0FD0052BF02 /* wintty.h */, 3186A3C021A4B0FD0052BF02 /* wintype.h */, @@ -912,7 +998,6 @@ 3186A36D21A4B0F90052BF02 /* xwindowp.h */, 3186A3BF21A4B0FD0052BF02 /* you.h */, 3186A3A721A4B0FD0052BF02 /* youprop.h */, - 31B8A30A21A20D730055BD01 /* config.h */, ); name = include; sourceTree = ""; @@ -991,13 +1076,80 @@ 31B8A41421A243CB0055BD01 /* Frameworks */ = { isa = PBXGroup; children = ( + 544768B923995BB7004B9739 /* liblua.a */, 31B8A41521A243CC0055BD01 /* libncurses.tbd */, ); name = Frameworks; sourceTree = ""; }; + 54AEB886297EE7E9005F1B13 /* sound */ = { + isa = PBXGroup; + children = ( + ); + path = sound; + sourceTree = ""; + }; + BAE8015827B99D44002B3786 /* nhlualib */ = { + isa = PBXGroup; + children = ( + BAE8011727B99CAC002B3786 /* loslib.c */, + BAE8012127B99CAC002B3786 /* lparser.c */, + BAE8012227B99CAC002B3786 /* lstate.c */, + BAE8012527B99CAC002B3786 /* lstring.c */, + BAE8013427B99CAD002B3786 /* lstrlib.c */, + BAE8011A27B99CAC002B3786 /* ltable.c */, + BAE8011B27B99CAC002B3786 /* ltablib.c */, + BAE8012627B99CAC002B3786 /* ltm.c */, + BAE8011E27B99CAC002B3786 /* lua.c */, + BAE8013127B99CAD002B3786 /* luac.c */, + BAE8012B27B99CAD002B3786 /* lundump.c */, + BAE8011927B99CAC002B3786 /* lutf8lib.c */, + BAE8012827B99CAC002B3786 /* lvm.c */, + BAE8013527B99CAD002B3786 /* lzio.c */, + 5439B3BD275AADCE00B8FB2F /* date.c */, + BAE8012327B99CAC002B3786 /* lapi.c */, + BAE8012E27B99CAD002B3786 /* lauxlib.c */, + BAE8012C27B99CAD002B3786 /* lbaselib.c */, + BAE8011D27B99CAC002B3786 /* lcode.c */, + BAE8011827B99CAC002B3786 /* lcorolib.c */, + BAE8013027B99CAD002B3786 /* lctype.c */, + BAE8012D27B99CAD002B3786 /* ldblib.c */, + BAE8012427B99CAC002B3786 /* ldebug.c */, + BAE8011F27B99CAC002B3786 /* ldo.c */, + BAE8012027B99CAC002B3786 /* ldump.c */, + BAE8012927B99CAC002B3786 /* lfunc.c */, + BAE8012A27B99CAC002B3786 /* lgc.c */, + BAE8011527B99CAB002B3786 /* linit.c */, + BAE8012F27B99CAD002B3786 /* liolib.c */, + BAE8011C27B99CAC002B3786 /* llex.c */, + BAE8013327B99CAD002B3786 /* lmathlib.c */, + BAE8012727B99CAC002B3786 /* lmem.c */, + BAE8013227B99CAD002B3786 /* loadlib.c */, + BAE8011627B99CAB002B3786 /* lobject.c */, + BAE8011427B99CAB002B3786 /* lopcodes.c */, + ); + name = nhlualib; + sourceTree = ""; + }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + BAE8010627B97760002B3786 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F5457B182DED143E00039D83 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ 3189577021A1FCC100FB2ABE /* NetHack */ = { isa = PBXNativeTarget; @@ -1014,9 +1166,9 @@ buildRules = ( ); dependencies = ( + F5457B232DED148700039D83 /* PBXTargetDependency */, + BAE8011327B9996A002B3786 /* PBXTargetDependency */, 31B8A31421A2355C0055BD01 /* PBXTargetDependency */, - 3192867A21A3AB0800325BEB /* PBXTargetDependency */, - 3192867821A3AB0400325BEB /* PBXTargetDependency */, 3192867621A3AAFE00325BEB /* PBXTargetDependency */, 3192867421A3AAFA00325BEB /* PBXTargetDependency */, ); @@ -1033,67 +1185,23 @@ 3189577C21A1FDA400FB2ABE /* Frameworks */, 3189577D21A1FDA400FB2ABE /* CopyFiles */, 317E7C4B21A35F0500F6E4E5 /* Copy makedefs */, + 059660C02C80B07100398EDE /* Codesign makedefs */, 319CBA3821A3458100150830 /* Build data */, 317E7C4521A3548F00F6E4E5 /* Build rumors */, - 317E7C4621A355E700F6E4E5 /* Build quest.dat */, - 317E7C4E21A3697300F6E4E5 /* Build options and headers */, + 317E7C4E21A3697300F6E4E5 /* Build options */, 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */, 3192867F21A3AF8000325BEB /* Build oracles */, ); buildRules = ( ); dependencies = ( + F5457B252DED149500039D83 /* PBXTargetDependency */, ); 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 */, - 317E7C4C21A3625000F6E4E5 /* Copy lev_comp */, - 317E7C4A21A35E9400F6E4E5 /* Build special levels */, - 317E7C4D21A3649B00F6E4E5 /* Build quest levels */, - ); - buildRules = ( - 317E7C5321A3796200F6E4E5 /* PBXBuildRule */, - 317E7C5221A3774F00F6E4E5 /* PBXBuildRule */, - ); - dependencies = ( - 316B91C921A3BD5C00EC3E81 /* PBXTargetDependency */, - ); - 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 */, - 317E7C5021A3735300F6E4E5 /* Copy dgn_comp */, - 317E7C5121A373E100F6E4E5 /* Build dungeon */, - ); - buildRules = ( - 31B8A46721A286E70055BD01 /* PBXBuildRule */, - 31B8A46321A270680055BD01 /* PBXBuildRule */, - ); - dependencies = ( - 316B91C721A3BD5000EC3E81 /* PBXTargetDependency */, - ); - 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" */; @@ -1101,6 +1209,8 @@ 31B8A44621A26A4B0055BD01 /* Sources */, 31B8A44721A26A4B0055BD01 /* Frameworks */, 31B8A44821A26A4B0055BD01 /* CopyFiles */, + 059660C32C80B12300398EDE /* Copy recover */, + 059660C52C80B1A000398EDE /* Codesign recover */, ); buildRules = ( ); @@ -1118,8 +1228,9 @@ buildPhases = ( 31B8A45321A26A970055BD01 /* Sources */, 31B8A45421A26A970055BD01 /* Frameworks */, - 31B8A45521A26A970055BD01 /* CopyFiles */, - 3192867221A3AA5700325BEB /* copy dlb */, + 059660C42C80B15300398EDE /* CopyFiles */, + 3192867221A3AA5700325BEB /* Copy dlb */, + 059660C22C80B0FD00398EDE /* Codesign dlb */, ); buildRules = ( ); @@ -1131,13 +1242,52 @@ productReference = 31B8A45721A26A970055BD01 /* dlb */; productType = "com.apple.product-type.tool"; }; + BAE8010927B97760002B3786 /* nhlua */ = { + isa = PBXNativeTarget; + buildConfigurationList = BAE8010B27B97760002B3786 /* Build configuration list for PBXNativeTarget "nhlua" */; + buildPhases = ( + BAE8010E27B977F7002B3786 /* Fetch Lua */, + BAE8010627B97760002B3786 /* Headers */, + BAE8010727B97760002B3786 /* Sources */, + BAE8010827B97760002B3786 /* Frameworks */, + BAE8010F27B9825E002B3786 /* Build nhlua.h */, + 056E43A42C81094100FD1F52 /* Copy libnhlua.a */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = nhlua; + productName = nhlua.a; + productReference = BAE8010A27B97760002B3786 /* libnhlua.a */; + productType = "com.apple.product-type.library.static"; + }; + F5457B1B2DED143E00039D83 /* hacklib */ = { + isa = PBXNativeTarget; + buildConfigurationList = F5457B1D2DED143E00039D83 /* Build configuration list for PBXNativeTarget "hacklib" */; + buildPhases = ( + F5457B182DED143E00039D83 /* Headers */, + F5457B192DED143E00039D83 /* Sources */, + F5457B1A2DED143E00039D83 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = hacklib; + packageProductDependencies = ( + ); + productName = hacklib; + productReference = F5457B1C2DED143E00039D83 /* libhacklib.a */; + productType = "com.apple.product-type.library.static"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 3189576921A1FCC100FB2ABE /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1130; + LastUpgradeCheck = 1220; ORGANIZATIONNAME = "Bart House"; TargetAttributes = { 3189577021A1FCC100FB2ABE = { @@ -1146,18 +1296,18 @@ 3189577E21A1FDA400FB2ABE = { CreatedOnToolsVersion = 10.1; }; - 31B8A41D21A2669A0055BD01 = { - CreatedOnToolsVersion = 10.1; - }; - 31B8A43521A268DF0055BD01 = { - CreatedOnToolsVersion = 10.1; - }; 31B8A44921A26A4B0055BD01 = { CreatedOnToolsVersion = 10.1; }; 31B8A45621A26A970055BD01 = { CreatedOnToolsVersion = 10.1; }; + BAE8010927B97760002B3786 = { + CreatedOnToolsVersion = 13.2.1; + }; + F5457B1B2DED143E00039D83 = { + CreatedOnToolsVersion = 16.4; + }; }; }; buildConfigurationList = 3189576C21A1FCC100FB2ABE /* Build configuration list for PBXProject "NetHack" */; @@ -1175,16 +1325,16 @@ targets = ( 3189577021A1FCC100FB2ABE /* NetHack */, 3189577E21A1FDA400FB2ABE /* makedefs */, - 31B8A41D21A2669A0055BD01 /* lev_comp */, - 31B8A43521A268DF0055BD01 /* dgn_comp */, 31B8A44921A26A4B0055BD01 /* recover */, 31B8A45621A26A970055BD01 /* dlb */, + F5457B1B2DED143E00039D83 /* hacklib */, + BAE8010927B97760002B3786 /* nhlua */, ); }; /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ - 317E7C4521A3548F00F6E4E5 /* Build rumors */ = { + 056E43A42C81094100FD1F52 /* Copy libnhlua.a */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1192,92 +1342,56 @@ inputFileListPaths = ( ); inputPaths = ( - "$(NH_DAT_DIR)/rumors.tru", - "$(NH_DAT_DIR)/rumors.fal", - "$(NH_UTIL_DIR)/makedefs", ); - name = "Build rumors"; + name = "Copy libnhlua.a"; outputFileListPaths = ( ); outputPaths = ( - "$(NH_DAT_DIR)/rumors", + "${NH_LIB_DIR}/libnhlua.a", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -r\n"; + shellScript = "echo \"Copying ${BUILT_PRODUCTS_DIR}/libnhlua.a to ${NH_LIB_DIR}/libnhlua.a\"\ncp \"${BUILT_PRODUCTS_DIR}\"/libnhlua.a \"${NH_LIB_DIR}\"/libnhlua.a\necho \"Copying ${BUILT_PRODUCTS_DIR}/libnhlua.a to ${NH_LIB_DIR}/libnhlua.a\"\ncp \"${BUILT_PRODUCTS_DIR}\"/libnhlua.a \"${NH_LIB_DIR}\"/libnhlua.a\n"; }; - 317E7C4621A355E700F6E4E5 /* Build quest.dat */ = { + 059660C02C80B07100398EDE /* Codesign makedefs */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "$(NH_DAT_DIR)/quest.txt", - "$(NH_UTIL_DIR)/makedefs", ); - name = "Build quest.dat"; + name = "Codesign makedefs"; 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"; + shellScript = "codesign --force --deep -s - \"${NH_UTIL_DIR}\"/makedefs\n"; }; - 317E7C4A21A35E9400F6E4E5 /* Build special levels */ = { + 059660C22C80B0FD00398EDE /* Codesign dlb */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "$(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 special levels"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(NH_DAT_DIR)/spec_levs", ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - 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"; - }; - 317E7C4B21A35F0500F6E4E5 /* Copy makedefs */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/makedefs", - ); - name = "Copy makedefs"; + name = "Codesign dlb"; outputFileListPaths = ( ); outputPaths = ( - "$(NH_UTIL_DIR)/makedefs", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cp ${BUILT_PRODUCTS_DIR}/makedefs ${NH_UTIL_DIR}/makedefs\n"; + shellScript = "codesign --force --deep -s - \"${NH_UTIL_DIR}\"/dlb\n"; }; - 317E7C4C21A3625000F6E4E5 /* Copy lev_comp */ = { + 059660C32C80B12300398EDE /* Copy recover */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1285,19 +1399,18 @@ inputFileListPaths = ( ); inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/lev_comp", ); - name = "Copy lev_comp"; + name = "Copy recover"; outputFileListPaths = ( ); outputPaths = ( - "$(NH_UTIL_DIR)/lev_comp", + "$(NH_UTIL_DIR}/recover", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cp ${BUILT_PRODUCTS_DIR}/lev_comp ${NH_UTIL_DIR}/lev_comp\n"; + shellScript = "cp \"${BUILT_PRODUCTS_DIR}\"/recover \"${NH_UTIL_DIR}\"/recover\n"; }; - 317E7C4D21A3649B00F6E4E5 /* Build quest levels */ = { + 059660C52C80B1A000398EDE /* Codesign recover */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1305,32 +1418,17 @@ 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"; + ); + name = "Codesign recover"; 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"; + shellScript = "codesign --force --deep -s - \"${NH_UTIL_DIR}\"/recover\n"; }; - 317E7C4E21A3697300F6E4E5 /* Build options and headers */ = { + 317E7C4521A3548F00F6E4E5 /* Build rumors */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1338,24 +1436,21 @@ inputFileListPaths = ( ); inputPaths = ( + "$(NH_DAT_DIR)/rumors.tru", + "$(NH_DAT_DIR)/rumors.fal", "$(NH_UTIL_DIR)/makedefs", ); - name = "Build options and headers"; + name = "Build rumors"; 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", + "$(NH_DAT_DIR)/rumors", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - 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"; + shellScript = "cd \"${NH_DAT_DIR}\"\n\"${NH_UTIL_DIR}\"/makedefs -r\n"; }; - 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */ = { + 317E7C4B21A35F0500F6E4E5 /* Copy makedefs */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1363,23 +1458,19 @@ inputFileListPaths = ( ); inputPaths = ( - "$(NH_DAT_DIR)/engrave.txt", - "$(NH_DAT_DIR)/epitaph.txt", - "$(NH_DAT_DIR)/bogusmon.txt", + "$(BUILT_PRODUCTS_DIR)/makedefs", ); - name = "Build engrave, epitaph and bogusmon"; + name = "Copy makedefs"; outputFileListPaths = ( ); outputPaths = ( - "$(NH_DAT_DIR)/engrave", - "$(NH_DAT_DIR)/epitaph", - "$(NH_DAT_DIR)/bogusmon", + "$(NH_UTIL_DIR)/makedefs", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -s\n"; + shellScript = "cp \"${BUILT_PRODUCTS_DIR}\"/makedefs \"${NH_UTIL_DIR}\"/makedefs\n"; }; - 317E7C5021A3735300F6E4E5 /* Copy dgn_comp */ = { + 317E7C4E21A3697300F6E4E5 /* Build options */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1387,19 +1478,19 @@ inputFileListPaths = ( ); inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/dgn_comp", + "$(NH_UTIL_DIR)/makedefs", ); - name = "Copy dgn_comp"; + name = "Build options"; outputFileListPaths = ( ); outputPaths = ( - "${NH_UTIL_DIR}/dgn_comp", + "$(NH_UTIL_DIR)/options", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cp ${BUILT_PRODUCTS_DIR}/dgn_comp ${NH_UTIL_DIR}/dgn_comp\n"; + shellScript = "cd \"${NH_DAT_DIR}\"\n\"${NH_UTIL_DIR}\"/makedefs -v\n"; }; - 317E7C5121A373E100F6E4E5 /* Build dungeon */ = { + 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1407,23 +1498,25 @@ inputFileListPaths = ( ); inputPaths = ( - "$(NH_UTIL_DIR)/makedefs", - "$(NH_UTIL_DIR)/dgn_comp", - "$(NH_DAT_DIR)/dungeon.pdf", + "$(NH_DAT_DIR)/engrave.txt", + "$(NH_DAT_DIR)/epitaph.txt", + "$(NH_DAT_DIR)/bogusmon.txt", ); - name = "Build dungeon"; + name = "Build engrave, epitaph and bogusmon"; outputFileListPaths = ( ); outputPaths = ( - "$(NH_DAT_DIR)/dungeon", + "$(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 -e\n${NH_UTIL_DIR}/dgn_comp dungeon.pdf\n"; + shellScript = "cd \"${NH_DAT_DIR}\"\n\"${NH_UTIL_DIR}\"/makedefs -s\n"; }; 317E7C5421A3804400F6E4E5 /* Build Guidebook */ = { isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; + buildActionMask = 8; files = ( ); inputFileListPaths = ( @@ -1440,9 +1533,9 @@ outputPaths = ( "$(NH_DOC_DIR)/Guidebook", ); - runOnlyForDeploymentPostprocessing = 0; + runOnlyForDeploymentPostprocessing = 1; 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"; + 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; @@ -1452,143 +1545,153 @@ 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)/optmenu", "$(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", + "$(NH_DAT_DIR)/air.lua", + "$(NH_DAT_DIR)/Arc-fila.lua", + "$(NH_DAT_DIR)/Arc-filb.lua", + "$(NH_DAT_DIR)/Arc-goal.lua", + "$(NH_DAT_DIR)/Arc-loca.lua", + "$(NH_DAT_DIR)/Arc-strt.lua", + "$(NH_DAT_DIR)/asmodeus.lua", + "$(NH_DAT_DIR)/astral.lua", + "$(NH_DAT_DIR)/baalz.lua", + "$(NH_DAT_DIR)/Bar-fila.lua", + "$(NH_DAT_DIR)/Bar-filb.lua", + "$(NH_DAT_DIR)/Bar-goal.lua", + "$(NH_DAT_DIR)/Bar-loca.lua", + "$(NH_DAT_DIR)/Bar-strt.lua", + "$(NH_DAT_DIR)/bigrm-1.lua", + "$(NH_DAT_DIR)/bigrm-10.lua", + "$(NH_DAT_DIR)/bigrm-11.lua", + "$(NH_DAT_DIR)/bigrm-12.lua", + "$(NH_DAT_DIR)/bigrm-13.lua", + "$(NH_DAT_DIR)/bigrm-2.lua", + "$(NH_DAT_DIR)/bigrm-3.lua", + "$(NH_DAT_DIR)/bigrm-4.lua", + "$(NH_DAT_DIR)/bigrm-5.lua", + "$(NH_DAT_DIR)/bigrm-6.lua", + "$(NH_DAT_DIR)/bigrm-7.lua", + "$(NH_DAT_DIR)/bigrm-8.lua", + "$(NH_DAT_DIR)/bigrm-9.lua", + "$(NH_DAT_DIR)/castle.lua", + "$(NH_DAT_DIR)/Cav-fila.lua", + "$(NH_DAT_DIR)/Cav-filb.lua", + "$(NH_DAT_DIR)/Cav-goal.lua", + "$(NH_DAT_DIR)/Cav-loca.lua", + "$(NH_DAT_DIR)/Cav-strt.lua", + "$(NH_DAT_DIR)/dungeon.lua", + "$(NH_DAT_DIR)/earth.lua", + "$(NH_DAT_DIR)/fakewiz1.lua", + "$(NH_DAT_DIR)/fakewiz2.lua", + "$(NH_DAT_DIR)/fire.lua", + "$(NH_DAT_DIR)/Hea-fila.lua", + "$(NH_DAT_DIR)/Hea-filb.lua", + "$(NH_DAT_DIR)/Hea-goal.lua", + "$(NH_DAT_DIR)/Hea-loca.lua", + "$(NH_DAT_DIR)/Hea-strt.lua", + "$(NH_DAT_DIR)/hellfill.lua", + "$(NH_DAT_DIR)/juiblex.lua", + "$(NH_DAT_DIR)/Kni-fila.lua", + "$(NH_DAT_DIR)/Kni-filb.lua", + "$(NH_DAT_DIR)/Kni-goal.lua", + "$(NH_DAT_DIR)/Kni-loca.lua", + "$(NH_DAT_DIR)/Kni-strt.lua", + "$(NH_DAT_DIR)/knox.lua", + "$(NH_DAT_DIR)/medusa-1.lua", + "$(NH_DAT_DIR)/medusa-2.lua", + "$(NH_DAT_DIR)/medusa-3.lua", + "$(NH_DAT_DIR)/medusa-4.lua", + "$(NH_DAT_DIR)/minefill.lua", + "$(NH_DAT_DIR)/minend-1.lua", + "$(NH_DAT_DIR)/minend-2.lua", + "$(NH_DAT_DIR)/minend-3.lua", + "$(NH_DAT_DIR)/minetn-1.lua", + "$(NH_DAT_DIR)/minetn-2.lua", + "$(NH_DAT_DIR)/minetn-3.lua", + "$(NH_DAT_DIR)/minetn-4.lua", + "$(NH_DAT_DIR)/minetn-5.lua", + "$(NH_DAT_DIR)/minetn-6.lua", + "$(NH_DAT_DIR)/minetn-7.lua", + "$(NH_DAT_DIR)/Mon-fila.lua", + "$(NH_DAT_DIR)/Mon-filb.lua", + "$(NH_DAT_DIR)/Mon-goal.lua", + "$(NH_DAT_DIR)/Mon-loca.lua", + "$(NH_DAT_DIR)/Mon-strt.lua", + "$(NH_DAT_DIR)/nhcore.lua", + "$(NH_DAT_DIR)/nhlib.lua", + "$(NH_DAT_DIR)/oracle.lua", + "$(NH_DAT_DIR)/orcus.lua", + "$(NH_DAT_DIR)/Pri-fila.lua", + "$(NH_DAT_DIR)/Pri-filb.lua", + "$(NH_DAT_DIR)/Pri-goal.lua", + "$(NH_DAT_DIR)/Pri-loca.lua", + "$(NH_DAT_DIR)/Pri-strt.lua", + "$(NH_DAT_DIR)/quest.lua", + "$(NH_DAT_DIR)/Ran-fila.lua", + "$(NH_DAT_DIR)/Ran-filb.lua", + "$(NH_DAT_DIR)/Ran-goal.lua", + "$(NH_DAT_DIR)/Ran-loca.lua", + "$(NH_DAT_DIR)/Ran-strt.lua", + "$(NH_DAT_DIR)/Rog-fila.lua", + "$(NH_DAT_DIR)/Rog-filb.lua", + "$(NH_DAT_DIR)/Rog-goal.lua", + "$(NH_DAT_DIR)/Rog-loca.lua", + "$(NH_DAT_DIR)/Rog-strt.lua", + "$(NH_DAT_DIR)/Sam-fila.lua", + "$(NH_DAT_DIR)/Sam-filb.lua", + "$(NH_DAT_DIR)/Sam-goal.lua", + "$(NH_DAT_DIR)/Sam-loca.lua", + "$(NH_DAT_DIR)/Sam-strt.lua", + "$(NH_DAT_DIR)/sanctum.lua", + "$(NH_DAT_DIR)/soko1-1.lua", + "$(NH_DAT_DIR)/soko1-2.lua", + "$(NH_DAT_DIR)/soko2-1.lua", + "$(NH_DAT_DIR)/soko2-2.lua", + "$(NH_DAT_DIR)/soko3-1.lua", + "$(NH_DAT_DIR)/soko3-2.lua", + "$(NH_DAT_DIR)/soko4-1.lua", + "$(NH_DAT_DIR)/soko4-2.lua", + "$(NH_DAT_DIR)/themerms.lua", + "$(NH_DAT_DIR)/Tou-fila.lua", + "$(NH_DAT_DIR)/Tou-filb.lua", + "$(NH_DAT_DIR)/Tou-goal.lua", + "$(NH_DAT_DIR)/Tou-loca.lua", + "$(NH_DAT_DIR)/Tou-strt.lua", + "$(NH_DAT_DIR)/tower1.lua", + "$(NH_DAT_DIR)/tower2.lua", + "$(NH_DAT_DIR)/tower3.lua", + "$(NH_DAT_DIR)/tut-1.lua", + "$(NH_DAT_DIR)/tut-2.lua", + "$(NH_DAT_DIR)/Val-fila.lua", + "$(NH_DAT_DIR)/Val-filb.lua", + "$(NH_DAT_DIR)/Val-goal.lua", + "$(NH_DAT_DIR)/Val-loca.lua", + "$(NH_DAT_DIR)/Val-strt.lua", + "$(NH_DAT_DIR)/valley.lua", + "$(NH_DAT_DIR)/water.lua", + "$(NH_DAT_DIR)/Wiz-fila.lua", + "$(NH_DAT_DIR)/Wiz-filb.lua", + "$(NH_DAT_DIR)/Wiz-goal.lua", + "$(NH_DAT_DIR)/Wiz-loca.lua", + "$(NH_DAT_DIR)/Wiz-strt.lua", + "$(NH_DAT_DIR)/wizard1.lua", + "$(NH_DAT_DIR)/wizard2.lua", + "$(NH_DAT_DIR)/wizard3.lua", ); name = "Build nhdat"; outputFileListPaths = ( @@ -1598,11 +1701,11 @@ ); 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"; + shellScript = "cd \"${NH_DAT_DIR}\"\n\"${NH_UTIL_DIR}\"/dlb cf nhdat help hh cmdhelp keyhelp history opthelp optmenu wizhelp dungeon.lua tribute asmodeus.lua baalz.lua bigrm-*.lua castle.lua fakewiz?.lua juiblex.lua knox.lua medusa-?.lua minend-?.lua minefill.lua minetn-?.lua oracle.lua orcus.lua sanctum.lua soko?-?.lua tower?.lua tut-?.lua valley.lua wizard?.lua nhcore.lua nhlib.lua themerms.lua hellfill.lua astral.lua air.lua earth.lua fire.lua water.lua ???-goal.lua ???-fil?.lua ???-loca.lua ???-strt.lua bogusmon data engrave epitaph oracles options quest.lua rumors\n"; }; 3192867021A39F6A00325BEB /* Install */ = { isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; + buildActionMask = 12; files = ( ); inputFileListPaths = ( @@ -1629,7 +1732,7 @@ ); 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"; + 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 \"${BUILT_PRODUCTS_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\ntouch \"${NH_INSTALL_DIR}\"/livelog\ncd \"${NH_UNIX_DIR}\"\nsh hints/macosx.sh editsysconf sysconf \"${NH_INSTALL_DIR}\"/sysconf\n"; }; 3192867121A3A2D500325BEB /* Copy nethack */ = { isa = PBXShellScriptBuildPhase; @@ -1649,9 +1752,9 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cp ${BUILT_PRODUCTS_DIR}/nethack ${NH_SRC_DIR}/nethack\n"; + shellScript = "cp \"${BUILT_PRODUCTS_DIR}\"/nethack \"${NH_SRC_DIR}\"/nethack\n"; }; - 3192867221A3AA5700325BEB /* copy dlb */ = { + 3192867221A3AA5700325BEB /* Copy dlb */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1661,7 +1764,7 @@ inputPaths = ( "${BUILT_PRODUCTS_DIR}/dlb", ); - name = "copy dlb"; + name = "Copy dlb"; outputFileListPaths = ( ); outputPaths = ( @@ -1669,7 +1772,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cp ${BUILT_PRODUCTS_DIR}/dlb ${NH_UTIL_DIR}/dlb\n"; + shellScript = "cp \"${BUILT_PRODUCTS_DIR}\"/dlb \"${NH_UTIL_DIR}\"/dlb\n"; }; 3192867F21A3AF8000325BEB /* Build oracles */ = { isa = PBXShellScriptBuildPhase; @@ -1689,7 +1792,7 @@ ); 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}\"/makedefs -h\n"; }; 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; @@ -1710,7 +1813,47 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# make data from data.base\ncd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -d\n"; + shellScript = "# make data from data.base\ncd \"${NH_DAT_DIR}\"\n\"${NH_UTIL_DIR}\"/makedefs -d\n"; + }; + BAE8010E27B977F7002B3786 /* Fetch Lua */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Fetch Lua"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(SRCROOT)/lib/llua-$(LUA_VERSION)/Makefile", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd $NH_ROOT_DIR\necho LUA VERSION: $LUA_VERSION\nif test ! -d lib/lua-$LUA_VERSION ; then ( echo \"Fetching $LUA_VERSION\" && \\\n mkdir -p lib && cd lib && \\\n curl -s -S -R -O https://www.lua.org/ftp/lua-$LUA_VERSION.tar.gz && \\\n tar zxf lua-$LUA_VERSION.tar.gz && \\\n rm -f lua-$LUA_VERSION.tar.gz ) ; fi\n"; + }; + BAE8010F27B9825E002B3786 /* Build nhlua.h */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/libnhlua.a", + ); + name = "Build nhlua.h"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_INC_DIR)/nhlua.h", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "LUAHEADERS=$NH_ROOT_DIR/lib/lua-$LUA_VERSION/src\nQ='\"'\necho '/* nhlua.h - generated by Xcode nhlua build phase */' > $SCRIPT_OUTPUT_FILE_0\necho \"#include $Q$LUAHEADERS/lua.h$Q\" >> $SCRIPT_OUTPUT_FILE_0\nsed -e '/(lua_error)/!d' -e '/(lua_error)/s/;/ NORETURN;/1' \\\n < $LUAHEADERS/lua.h >> $SCRIPT_OUTPUT_FILE_0\necho \"#include $Q$LUAHEADERS/lualib.h$Q\" >> $SCRIPT_OUTPUT_FILE_0\necho \"#include $Q$LUAHEADERS/lauxlib.h$Q\" >> $SCRIPT_OUTPUT_FILE_0\necho '/*nhlua.h*/' >> $SCRIPT_OUTPUT_FILE_0\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1719,8 +1862,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F5857AA62DED03BB00A8CB4F /* sfbase.c in Sources */, + F5857AA42DED032D00A8CB4F /* cfgfiles.c in Sources */, + BAE8015A27B9C872002B3786 /* date.c in Sources */, + 54435B52247999CB00804CB3 /* nhlobj.c in Sources */, 31B8A3BC21A238060055BD01 /* eat.c in Sources */, 31B8A3A921A238060055BD01 /* music.c in Sources */, + 544768B123994A2C004B9739 /* mdlib.c in Sources */, 31B8A3D221A238060055BD01 /* engrave.c in Sources */, 31B8A3A021A238060055BD01 /* exper.c in Sources */, 31B8A38A21A238060055BD01 /* priest.c in Sources */, @@ -1730,13 +1878,15 @@ 31B8A3C621A238060055BD01 /* dbridge.c in Sources */, 31B8A38521A238060055BD01 /* rnd.c in Sources */, 31B8A38B21A238060055BD01 /* topten.c in Sources */, - 31B8A38121A238060055BD01 /* mapglyph.c in Sources */, + 5462D14823E7B19200969423 /* insight.c in Sources */, 31B8A41321A23F650055BD01 /* version.c in Sources */, 31B8A3BB21A238060055BD01 /* allmain.c in Sources */, 31B8A39521A238060055BD01 /* windows.c in Sources */, + F5E66A222F7D4B30000E30B7 /* earlyarg.c in Sources */, 31B8A38621A238060055BD01 /* mondata.c in Sources */, 31B8A41921A244940055BD01 /* objects.c in Sources */, 31B8A3AA21A238060055BD01 /* wizard.c in Sources */, + F5E1A4CF2FA2F74C0014D115 /* macuuid.m in Sources */, 31B8A3D021A238060055BD01 /* explode.c in Sources */, 31B8A3DE21A238060055BD01 /* sys.c in Sources */, 31B8A38021A238060055BD01 /* sit.c in Sources */, @@ -1753,10 +1903,22 @@ 31B8A3C321A238060055BD01 /* steed.c in Sources */, 31B8A39D21A238060055BD01 /* artifact.c in Sources */, 31B8A3FF21A23E6E0055BD01 /* topl.c in Sources */, + 544768AF23994A17004B9739 /* nhlua.c in Sources */, 31B8A3C021A238060055BD01 /* dig.c in Sources */, 31B8A3CB21A238060055BD01 /* alloc.c in Sources */, 31B8A39821A238060055BD01 /* mail.c in Sources */, 31B8A3C821A238060055BD01 /* options.c in Sources */, + 056E43C62C810EE800FD1F52 /* coloratt.c in Sources */, + 056E43C72C810EE800FD1F52 /* nhmd4.c in Sources */, + 056E43C82C810EE800FD1F52 /* Makefile in Sources */, + 056E43C92C810EE800FD1F52 /* report.c in Sources */, + 056E43CA2C810EE800FD1F52 /* selvar.c in Sources */, + 056E43CB2C810EE800FD1F52 /* calendar.c in Sources */, + 056E43CC2C810EE800FD1F52 /* stairs.c in Sources */, + 056E43CD2C810EE800FD1F52 /* glyphs.c in Sources */, + 056E43CE2C810EE800FD1F52 /* strutil.c in Sources */, + 056E43CF2C810EE800FD1F52 /* getpos.c in Sources */, + 056E43D02C810EE800FD1F52 /* wizcmds.c in Sources */, 31B8A3CD21A238060055BD01 /* write.c in Sources */, 31B8A40F21A23EEC0055BD01 /* cursmesg.c in Sources */, 31B8A3DF21A238060055BD01 /* end.c in Sources */, @@ -1765,6 +1927,7 @@ 31B8A40121A23E6E0055BD01 /* wintty.c in Sources */, 31B8A3FE21A23E6E0055BD01 /* termcap.c in Sources */, 31B8A39621A238060055BD01 /* attrib.c in Sources */, + 544768AE23994A17004B9739 /* nhlsel.c in Sources */, 31B8A40C21A23EEC0055BD01 /* cursdial.c in Sources */, 31B8A3A321A238060055BD01 /* mhitm.c in Sources */, 31B8A3DC21A238060055BD01 /* polyself.c in Sources */, @@ -1778,17 +1941,19 @@ 31B8A3AD21A238060055BD01 /* uhitm.c in Sources */, 31B8A3B321A238060055BD01 /* track.c in Sources */, 31B8A41221A23EEC0055BD01 /* curswins.c in Sources */, + 544768AB239949FA004B9739 /* sfstruct.c in Sources */, 31B8A3A721A238060055BD01 /* minion.c in Sources */, 31B8A3F021A23D420055BD01 /* unixtty.c in Sources */, + 543ECF6C297EEF3800A13155 /* macsound.m in Sources */, 31B8A37F21A238060055BD01 /* extralev.c in Sources */, 31B8A39B21A238060055BD01 /* dogmove.c in Sources */, + 54A3D3EC282C55A900143F8C /* utf8map.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 */, @@ -1800,11 +1965,11 @@ 31B8A3A821A238060055BD01 /* weapon.c in Sources */, 31B8A3DA21A238060055BD01 /* mkmaze.c in Sources */, 31B8A37E21A238060055BD01 /* steal.c in Sources */, + 54FB2B4B246310A600397C0E /* symbols.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 */, @@ -1826,6 +1991,7 @@ 31B8A38421A238060055BD01 /* do_name.c in Sources */, 31B8A3C421A238060055BD01 /* apply.c in Sources */, 31B8A3F721A23DD10055BD01 /* unixres.c in Sources */, + F50818312F6F564300D2AAFA /* iactions.c in Sources */, 31B8A3BD21A238060055BD01 /* files.c in Sources */, 31B8A39221A238060055BD01 /* do_wear.c in Sources */, 31B8A3E521A238B30055BD01 /* dlb.c in Sources */, @@ -1853,74 +2019,90 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 059660BE2C80B00400398EDE /* hacklib.c in Sources */, + 544A5CF0277B40CF00734B53 /* panic.c in Sources */, + 5493735A277AAE830031FE02 /* alloc.c in Sources */, + 5439B3BC275AADC600B8FB2F /* date.c in Sources */, 31B8A31021A20DC10055BD01 /* monst.c in Sources */, 31B8A30F21A20DC10055BD01 /* objects.c in Sources */, 31B8A30C21A20D8B0055BD01 /* makedefs.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A41A21A2669A0055BD01 /* Sources */ = { + 31B8A44621A26A4B0055BD01 /* Sources */ = { 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 */, + F5857AA22DED026700A8CB4F /* version.c in Sources */, + 54BD340D2D8B70350073C484 /* hacklib.c in Sources */, + 31B8A45221A26A750055BD01 /* recover.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A43221A268DF0055BD01 /* Sources */ = { + 31B8A45321A26A970055BD01 /* 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 */, + 059660C12C80B0C700398EDE /* hacklib.c in Sources */, + 31B8A46121A26AF60055BD01 /* panic.c in Sources */, + 31B8A45E21A26ACF0055BD01 /* dlb.c in Sources */, + 31B8A46021A26AE70055BD01 /* dlb_main.c in Sources */, + 31B8A46221A26B020055BD01 /* alloc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A44621A26A4B0055BD01 /* Sources */ = { + BAE8010727B97760002B3786 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 31B8A45221A26A750055BD01 /* recover.c in Sources */, + BAE8014027B99CAD002B3786 /* lua.c in Sources */, + BAE8013727B99CAD002B3786 /* linit.c in Sources */, + BAE8013B27B99CAD002B3786 /* lutf8lib.c in Sources */, + BAE8013C27B99CAD002B3786 /* ltable.c in Sources */, + BAE8013E27B99CAD002B3786 /* llex.c in Sources */, + BAE8013827B99CAD002B3786 /* lobject.c in Sources */, + BAE8014E27B99CAE002B3786 /* lbaselib.c in Sources */, + BAE8013D27B99CAD002B3786 /* ltablib.c in Sources */, + BAE8015527B99CAE002B3786 /* lmathlib.c in Sources */, + BAE8014D27B99CAE002B3786 /* lundump.c in Sources */, + BAE8014227B99CAE002B3786 /* ldump.c in Sources */, + BAE8013927B99CAD002B3786 /* loslib.c in Sources */, + BAE8015027B99CAE002B3786 /* lauxlib.c in Sources */, + BAE8014327B99CAE002B3786 /* lparser.c in Sources */, + BAE8014C27B99CAE002B3786 /* lgc.c in Sources */, + BAE8014927B99CAE002B3786 /* lmem.c in Sources */, + BAE8015627B99CAE002B3786 /* lstrlib.c in Sources */, + BAE8013A27B99CAD002B3786 /* lcorolib.c in Sources */, + BAE8014A27B99CAE002B3786 /* lvm.c in Sources */, + BAE8014127B99CAD002B3786 /* ldo.c in Sources */, + BAE8014827B99CAE002B3786 /* ltm.c in Sources */, + BAE8014627B99CAE002B3786 /* ldebug.c in Sources */, + BAE8015327B99CAE002B3786 /* luac.c in Sources */, + BAE8014727B99CAE002B3786 /* lstring.c in Sources */, + BAE8013627B99CAD002B3786 /* lopcodes.c in Sources */, + BAE8014B27B99CAE002B3786 /* lfunc.c in Sources */, + BAE8014527B99CAE002B3786 /* lapi.c in Sources */, + BAE8015127B99CAE002B3786 /* liolib.c in Sources */, + BAE8013F27B99CAD002B3786 /* lcode.c in Sources */, + BAE8015427B99CAE002B3786 /* loadlib.c in Sources */, + BAE8015227B99CAE002B3786 /* lctype.c in Sources */, + BAE8015727B99CAE002B3786 /* lzio.c in Sources */, + BAE8014F27B99CAE002B3786 /* ldblib.c in Sources */, + BAE8014427B99CAE002B3786 /* lstate.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 31B8A45321A26A970055BD01 /* Sources */ = { + F5457B192DED143E00039D83 /* 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 */, + F5457B212DED146B00039D83 /* hacklib.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* 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 */; @@ -1941,20 +2123,25 @@ target = 31B8A45621A26A970055BD01 /* dlb */; targetProxy = 3192867521A3AAFE00325BEB /* PBXContainerItemProxy */; }; - 3192867821A3AB0400325BEB /* PBXTargetDependency */ = { + 31B8A31421A2355C0055BD01 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3189577E21A1FDA400FB2ABE /* makedefs */; + targetProxy = 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */; + }; + BAE8011327B9996A002B3786 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 31B8A43521A268DF0055BD01 /* dgn_comp */; - targetProxy = 3192867721A3AB0400325BEB /* PBXContainerItemProxy */; + target = BAE8010927B97760002B3786 /* nhlua */; + targetProxy = BAE8011227B9996A002B3786 /* PBXContainerItemProxy */; }; - 3192867A21A3AB0800325BEB /* PBXTargetDependency */ = { + F5457B232DED148700039D83 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 31B8A41D21A2669A0055BD01 /* lev_comp */; - targetProxy = 3192867921A3AB0800325BEB /* PBXContainerItemProxy */; + target = F5457B1B2DED143E00039D83 /* hacklib */; + targetProxy = F5457B222DED148700039D83 /* PBXContainerItemProxy */; }; - 31B8A31421A2355C0055BD01 /* PBXTargetDependency */ = { + F5457B252DED149500039D83 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 3189577E21A1FDA400FB2ABE /* makedefs */; - targetProxy = 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */; + target = F5457B1B2DED143E00039D83 /* hacklib */; + targetProxy = F5457B242DED149500039D83 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1968,7 +2155,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "c++98"; CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = NO; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -1986,6 +2173,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = NO; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1994,6 +2182,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -2005,6 +2194,7 @@ "DEBUG=1", "$(inherited)", ); + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "NHUUID=1"; GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_PEDANTIC = YES; @@ -2013,6 +2203,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include"; + LUA_VERSION = 5.4.8; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -2020,6 +2211,7 @@ NH_DOC_DIR = "$(NH_ROOT_DIR)/doc"; NH_INC_DIR = "$(NH_ROOT_DIR)/include"; NH_INSTALL_DIR = "$(HOME)/nethackdir"; + NH_LIB_DIR = "$(NH_ROOT_DIR)/sys/unix/../../lib"; NH_ROOT_DIR = "$(SOURCE_ROOT)/../.."; NH_SRC_DIR = "$(NH_ROOT_DIR)/src"; NH_UNIX_DIR = "$(NH_ROOT_DIR)/sys/unix"; @@ -2036,6 +2228,9 @@ "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", "-DSECURE", "-DCURSES_GRAPHICS", + "-DSND_LIB_MACSOUND", + "-DSND_SOUNDEFFECTS_AUTOMAP", + "-DUSER_SOUNDS", ); SDKROOT = macosx; }; @@ -2050,7 +2245,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "c++98"; CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = NO; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -2068,6 +2263,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = NO; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -2076,6 +2272,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -2089,6 +2286,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include"; + LUA_VERSION = 5.4.8; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -2096,6 +2294,7 @@ NH_DOC_DIR = "$(NH_ROOT_DIR)/doc"; NH_INC_DIR = "$(NH_ROOT_DIR)/include"; NH_INSTALL_DIR = "$(HOME)/nethackdir"; + NH_LIB_DIR = "$(NH_ROOT_DIR)/sys/unix/../../lib"; NH_ROOT_DIR = "$(SOURCE_ROOT)/../.."; NH_SRC_DIR = "$(NH_ROOT_DIR)/src"; NH_UNIX_DIR = "$(NH_ROOT_DIR)/sys/unix"; @@ -2121,7 +2320,34 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 5J8MP36Y73; GCC_C_LANGUAGE_STANDARD = c99; + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = ( + "DEBUG=1", + "$(inherited)", + ); + INSTALL_PATH = "$(NH_INSTALL_DIR)"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_CFLAGS = ( + "-Wno-ambiguous-macro", + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + "-DSND_LIB_MACSOUND", + "-DSND_SOUNDEFFECTS_AUTOMAP", + "-DUSER_SOUNDS", + "-DCURSES_UNICODE", + "-D_XOPEN_SOURCE_EXTENDED", + ); + "OTHER_LDFLAGS[arch=*]" = "-L${NH_LIB_DIR}/lua"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -2131,7 +2357,28 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 5J8MP36Y73; GCC_C_LANGUAGE_STANDARD = c99; + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = "NHUUID=1"; + INSTALL_PATH = "$(NH_INSTALL_DIR)"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_CFLAGS = ( + "-Wno-ambiguous-macro", + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + "-DCURSES_UNICODE", + "-D_XOPEN_SOURCE_EXTENDED", + ); + "OTHER_LDFLAGS[arch=*]" = "-L${NH_LIB_DIR}/lua"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -2141,6 +2388,8 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -2150,85 +2399,202 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; - 31B8A42321A2669A0055BD01 /* Debug */ = { + 31B8A44F21A26A4B0055BD01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_CFLAGS = ( + "-DMINIMAL_FOR_RECOVER", + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + "-DSND_LIB_MACSOUND", + "-DSND_SOUNDEFFECTS_AUTOMAP", + "-DUSER_SOUNDS", + ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; - 31B8A42421A2669A0055BD01 /* Release */ = { + 31B8A45021A26A4B0055BD01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_CFLAGS = ( + "-DMINIMAL_FOR_RECOVER", + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", + "-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; }; - 31B8A43B21A268E00055BD01 /* Debug */ = { + 31B8A45C21A26A970055BD01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; - 31B8A43C21A268E00055BD01 /* Release */ = { + 31B8A45D21A26A970055BD01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; - 31B8A44F21A26A4B0055BD01 /* Debug */ = { + BAE8010C27B97760002B3786 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 5J8MP36Y73; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_CFLAGS = ( + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + "-Wno-gnu-label-as-value", + "-DLUA_USE_POSIX", + ); PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; }; name = Debug; }; - 31B8A45021A26A4B0055BD01 /* Release */ = { + BAE8010D27B97760002B3786 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 5J8MP36Y73; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_CFLAGS = ( + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + "-Wno-gnu-label-as-value", + "-DLUA_USE_POSIX", + ); PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; }; name = Release; }; - 31B8A45C21A26A970055BD01 /* Debug */ = { + F5457B1E2DED143E00039D83 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_COMMA = NO; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 5J8MP36Y73; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 15.5; PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; }; name = Debug; }; - 31B8A45D21A26A970055BD01 /* Release */ = { + F5457B1F2DED143E00039D83 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_COMMA = NO; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 5J8MP36Y73; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 15.5; PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; }; name = Release; }; @@ -2262,38 +2628,38 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 31B8A42221A2669A0055BD01 /* Build configuration list for PBXNativeTarget "lev_comp" */ = { + 31B8A44E21A26A4B0055BD01 /* Build configuration list for PBXNativeTarget "recover" */ = { isa = XCConfigurationList; buildConfigurations = ( - 31B8A42321A2669A0055BD01 /* Debug */, - 31B8A42421A2669A0055BD01 /* Release */, + 31B8A44F21A26A4B0055BD01 /* Debug */, + 31B8A45021A26A4B0055BD01 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 31B8A43A21A268E00055BD01 /* Build configuration list for PBXNativeTarget "dgn_comp" */ = { + 31B8A45B21A26A970055BD01 /* Build configuration list for PBXNativeTarget "dlb" */ = { isa = XCConfigurationList; buildConfigurations = ( - 31B8A43B21A268E00055BD01 /* Debug */, - 31B8A43C21A268E00055BD01 /* Release */, + 31B8A45C21A26A970055BD01 /* Debug */, + 31B8A45D21A26A970055BD01 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 31B8A44E21A26A4B0055BD01 /* Build configuration list for PBXNativeTarget "recover" */ = { + BAE8010B27B97760002B3786 /* Build configuration list for PBXNativeTarget "nhlua" */ = { isa = XCConfigurationList; buildConfigurations = ( - 31B8A44F21A26A4B0055BD01 /* Debug */, - 31B8A45021A26A4B0055BD01 /* Release */, + BAE8010C27B97760002B3786 /* Debug */, + BAE8010D27B97760002B3786 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 31B8A45B21A26A970055BD01 /* Build configuration list for PBXNativeTarget "dlb" */ = { + F5457B1D2DED143E00039D83 /* Build configuration list for PBXNativeTarget "hacklib" */ = { isa = XCConfigurationList; buildConfigurations = ( - 31B8A45C21A26A970055BD01 /* Debug */, - 31B8A45D21A26A970055BD01 /* Release */, + F5457B1E2DED143E00039D83 /* Debug */, + F5457B1F2DED143E00039D83 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index 0c67376eb..f9b0d7c5e 100644 --- a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -1,5 +1,8 @@ - + + PreviewsEnabled + + diff --git a/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme index 7abc16af5..f8a152db6 100644 --- a/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme +++ b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme @@ -1,6 +1,6 @@ Preferences). +Launch XCode and open the preferences dialog (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, +your apple ID account 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). @@ -34,6 +34,6 @@ 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 +In XCode open the project file sys/unix/NetHack.xcodeproj, select the product NetHack and build. The build results are placed in -~nethackdir. +~/nethackdir. diff --git a/sys/unix/XCode.xcconfig b/sys/unix/XCode.xcconfig index 06ce911fa..212b93f89 100644 --- a/sys/unix/XCode.xcconfig +++ b/sys/unix/XCode.xcconfig @@ -16,7 +16,7 @@ // // Your DEVELOPMENT_TEAM can be found by opening Keychain Access // (found by Finder->Applications->Utilities). Click on "Login" key chain. -// Click on catagory "My Certificates". +// Click on category "My Certificates". // // Look for your "Mac Developer" certificate. Double click on // the certificate to open a dialog that shows certificate details. diff --git a/sys/unix/cpp1.shr b/sys/unix/cpp1.shr deleted file mode 100644 index f2b133d45..000000000 --- a/sys/unix/cpp1.shr +++ /dev/null @@ -1,1783 +0,0 @@ -# This is a shell archive. Save it in a file, remove anything before -# this line, and then unpack it by entering "sh file". Note, it may -# create directories; files and directories will be owned by you and -# have default permissions. -# -# This archive contains: -# -# makefile.txt -# readme.txt -# cpp.mem -# cpp.h -# cppdef.h -# cpp2.c -# -echo x - makefile.txt -sed 's/^X//' >makefile.txt << 'END-of-makefile.txt' -X# -X# The redefinition of strchr() and strrchr() are needed for -X# Ultrix-32, Unix 4.2 bsd (and maybe some other Unices). -X# -XBSDDEFINE = -Dstrchr=index -Dstrrchr=rindex -X# -X# On certain systems, such as Unix System III, you may need to define -X# $(LINTFLAGS) in the make command line to set system-specific lint flags. -X# -X# This Makefile assumes cpp will replace the "standard" preprocessor. -X# Delete the reference to -DLINE_PREFIX=\"\" if cpp is used stand-alone. -X# LINEFIX is a sed script filter that reinserts #line -- used for testing -X# if LINE_PREFIX is set to "". Note that we must stand on our heads to -X# match the # and a line had better not begin with $. By the way, what -X# we really want is -X# LINEFIX = | sed "s/^#/#line/" -X# -XCPPDEFINE = -DLINE_PREFIX=\"\" -XLINEFIX = | sed "s/^[^ !\"%-~]/&line/" -X# -X# Define OLD_PREPROCESSOR non-zero to make a preprocessor which is -X# "as compatible as possible" with the standard Unix V7 or Ultrix -X# preprocessors. This is needed to rebuild 4.2bsd, for example, as -X# the preprocessor is used to modify assembler code, rather than C. -X# This is not recommended for current development. OLD_PREPROCESSOR -X# forces the following definitions: -X# OK_DOLLAR FALSE $ is not allowed in variables -X# OK_CONCAT FALSE # cannot concatenate tokens -X# COMMENT_INVISIBLE TRUE old-style comment concatenation -X# STRING_FORMAL TRUE old-style string expansion -X# -XOLDDEFINE = -DOLD_PREPROCESSOR=1 -X# -X# DEFINES collects all -D arguments for cc and lint: -X# Change DEFINES = $(BSDDEFINE) $(CPPDEFINE) $(OLDDEFINE) -X# for an old-style preprocessor. -X# -X# DEFINES = $(BSDDEFINE) $(CPPDEFINE) -XDEFINES = $(CPPDEFINE) -X -XCFLAGS = -O $(DEFINES) -X -X# -X# ** compile cpp -X# -XSRCS = cpp1.c cpp2.c cpp3.c cpp4.c cpp5.c cpp6.c -XOBJS = cpp1.o cpp2.o cpp3.o cpp4.o cpp5.o cpp6.o -Xcpp: $(OBJS) -X $(CC) $(CFLAGS) $(OBJS) -o cpp -X -X# -X# ** Test cpp by preprocessing itself, compiling the result, -X# ** repeating the process and diff'ing the result. Note: this -X# ** is not a good test of cpp, but a simple verification. -X# ** The diff's should not report any changes. -X# ** Note that a sed script may be executed for each compile -X# -Xtest: -X cpp cpp1.c $(LINEFIX) >old.tmp1.c -X cpp cpp2.c $(LINEFIX) >old.tmp2.c -X cpp cpp3.c $(LINEFIX) >old.tmp3.c -X cpp cpp4.c $(LINEFIX) >old.tmp4.c -X cpp cpp5.c $(LINEFIX) >old.tmp5.c -X cpp cpp6.c $(LINEFIX) >old.tmp6.c -X $(CC) $(CFLAGS) old.tmp[123456].c -X a.out cpp1.c >new.tmp1.c -X a.out cpp2.c >new.tmp2.c -X a.out cpp3.c >new.tmp3.c -X a.out cpp4.c >new.tmp4.c -X a.out cpp5.c >new.tmp5.c -X a.out cpp6.c >new.tmp6.c -X diff old.tmp1.c new.tmp1.c -X diff old.tmp2.c new.tmp2.c -X diff old.tmp3.c new.tmp3.c -X diff old.tmp4.c new.tmp4.c -X diff old.tmp5.c new.tmp5.c -X diff old.tmp6.c new.tmp6.c -X rm a.out old.tmp[123456].* new.tmp[123456].* -X -X# -X# A somewhat more extensive test is provided by the "clock" -X# program (which is not distributed). Substitute your favorite -X# macro-rich program here. -X# -Xclock: clock.c cpp -X cpp clock.c $(LINEFIX) >temp.cpp.c -X cc temp.cpp.c -lcurses -ltermcap -o clock -X rm temp.cpp.c -X -X# -X# ** Lint the code -X# -X -Xlint: $(SRCS) -X lint $(LINTFLAGS) $(DEFINES) $(SRCS) -X -X# -X# ** Remove unneeded files -X# -Xclean: -X rm -f $(OBJS) cpp -X -X# -X# ** Rebuild the archive files needed to distribute cpp -X# ** Uses the Decus C archive utility. -X# -X -Xarchc: archc.c -X $(CC) $(CFLAGS) archc.c -o archc -X -Xarchx: archx.c -X $(CC) $(CFLAGS) archx.c -o archx -X -Xarchive: archc -X archc readme.txt cpp.mem archx.c archc.c cpp.rno makefile.txt \ -X cpp*.h >cpp1.arc -X archc cpp1.c cpp2.c cpp3.c >cpp2.arc -X archc cpp4.c cpp5.c cpp6.c >cpp3.arc -X -X# -X# Object module dependencies -X# -X -Xcpp1.o : cpp1.c cpp.h cppdef.h -X -Xcpp2.o : cpp2.c cpp.h cppdef.h -X -Xcpp3.o : cpp3.c cpp.h cppdef.h -X -Xcpp4.o : cpp4.c cpp.h cppdef.h -X -Xcpp5.o : cpp5.c cpp.h cppdef.h -X -Xcpp6.o : cpp6.c cpp.h cppdef.h -X -X -END-of-makefile.txt -echo x - readme.txt -sed 's/^X//' >readme.txt << 'END-of-readme.txt' -X -XDecus cpp is a public-domain implementation of the C preprocessor. -XIt runs on VMS native (Vax C), VMS compatibilty mode (Decus C), -XRSX-11M, RSTS/E, P/OS, and RT11, as well as on several varieties -Xof Unix, including Ultrix. Decus cpp attempts to implement features -Xin the Draft ANSI Standard for the C language. It should be noted, -Xhowever, that this standard is under active development: the current -Xdraft of the standard explicitly states that "readers are requested -Xnot to specify or claim conformance to this draft." Thus readers -Xand users of Decus cpp should not assume that it conforms to the -Xdraft standard, or that it will conform to the actual C language -Xstandard. -X -XThese notes describe how to extract the cpp source files, configure it -Xfor your needs, and mention a few design decisions that may be of interest -Xto maintainers. -X -X Installation -X -XBecause the primary development of cpp was not on Unix, it -Xis distributed using the Decus C archive program (quite similar -Xto the archiver published in Kernighan and Plauger's Software -XTools). To extract the files from the net.sources distribution, -Xsave this message as cpp1.arc and the other two distribution -Xfiles as cpp2.arc and cpp3.arc. Then, using your favorite editor, -Xlocate the archx.c program, just following the line beginning with -X"-h- archx.c" -- the format of the distribution is just: -X -X -h- readme.txt -X ... this file -X -h- cpp.mem -X ... description of cpp -X -h- archx.c -X ... archx.c program -- extracts archives -X -h- archc.c -X ... archc.c program -- creates archives -X -XCompile archx.c -- it shouldn't require any special editing. -XThen run it as follows: -X -X archx *.arc -X -XYou do not need to remove mail headers from the saved messages. -X -XYou should then read through cppdef.h to make sure the HOST and -XTARGET (and other implementation-specific) definitions are set -Xcorrectly for your machine, editing them as needed. -X -XYou may then copy makefile.txt to Makefile, editing it as needed -Xfor your particular system. On Unix, cpp should be compiled -Xby make without further difficulty. On other operating systems, -Xyou should compile the six source modules, linking them together. -XNote that, on Decus C based systems, you must extend the default -Xstack allocation. The Decus C build utility will create the -Xappropriate command file. -X -X Support Notes -X -XThe USENET distribution kit was designed to keep all submissions around -X50,000 bytes: -X -Xcpp1.arc: -X readme.txt This file -X cpp.mem Documentation page (see below) -X archx.c Archive extraction program -X archc.c Archive construction program -X cpp.rno Source for cpp.mem (see below) -X makefile.txt Unix makefile -- copy to Makefile -X cpp.h Main header file (structure def's and globals) -X cppdef.h Configuration file (host and target definitions) -X -Xcpp2.arc: -X cpp1.c Mainline code, documentation master sources -X cpp2.c most #control processing -X cpp3.c filename stuff and command line parsing -Xcpp3.arc: -X cpp4.c #define processor -X cpp5.c #if processor -X cpp6.c Support code (symbol table and I/O routines) -X -XCpp intentionally does not rely on the presence of a full-scale -Xmacro preprocessor, it does require the simple parameter substitution -Xpreprocessor capabilities of Unix V6 and Decus C. If your C -Xlanguage lacks full preprocessing, you should make sure "nomacargs" -Xis #define'd in cpp.h. (This is done automatically by the Decus C -Xcompiler.) -X -XThe documentation (manual page) for cpp is included as cpp.mem -Xand cpp.rno. Cpp.rno is in Dec Runoff format, built by a Decus C -Xutility (getrno) from original source which is embedded in cpp1.c. -XTo my knowledge, there is no equivalent program that creates -Xthe nroff source appropriate for Unix. -X -XI would be happy to receive fixes to any problems you encounter. -XAs I do not maintain distribution kit base-levels, bare-bones -Xdiff listings without sufficient context are not very useful. -XIt is unlikely that I can find time to help you with other -Xdifficulties. -X -X Acknowledgements -X -XI received a great deal of help from many people in debugging cpp. -XAlan Feuer and Sam Kendall used "state of the art" run-time code -Xcheckers to locate several errors. Ed Keiser found problems when -Xcpp was used on machines with different int and pointer sizes. -XDave Conroy helped with the initial debugging, while Arthur Olsen -Xand George Rosenberg found (and solved) several problems in the -Xfirst USENET release. -X -XMartin Minow -Xdecvax!minow -X -END-of-readme.txt -echo x - cpp.mem -sed 's/^X//' >cpp.mem << 'END-of-cpp.mem' -X -X -X -X -X 1.0 C Pre-Processor -X -X -X -X ******* -X * cpp * -X ******* -X -X -X -X NAME: cpp -- C Pre-Processor -X -X SYNOPSIS: -X -X cpp [-options] [infile [outfile]] -X -X DESCRIPTION: -X -X CPP reads a C source file, expands macros and include -X files, and writes an input file for the C compiler. If -X no file arguments are given, CPP reads from stdin and -X writes to stdout. If one file argument is given, it -X will define the input file, while two file arguments -X define both input and output files. The file name "-" -X is a synonym for stdin or stdout as appropriate. -X -X The following options are supported. Options may be -X given in either case. -X -X -C If set, source-file comments are written -X to the output file. This allows the -X output of CPP to be used as the input to -X a program, such as lint, that expects -X commands embedded in specially-formatted -X comments. -X -X -Dname=value Define the name as if the programmer -X wrote -X -X #define name value -X -X at the start of the first file. If -X "=value" is not given, a value of "1" -X will be used. -X -X On non-unix systems, all alphabetic text -X will be forced to upper-case. -X -X -E Always return "success" to the operating -X system, even if errors were detected. -X Note that some fatal errors, such as a -X missing #include file, will terminate -X CPP, returning "failure" even if the -E -X option is given. -X Page 2 -X cpp C Pre-Processor -X -X -X -Idirectory Add this directory to the list of -X directories searched for #include "..." -X and #include <...> commands. Note that -X there is no space between the "-I" and -X the directory string. More than one -I -X command is permitted. On non-Unix -X systems "directory" is forced to -X upper-case. -X -X -N CPP normally predefines some symbols -X defining the target computer and -X operating system. If -N is specified, -X no symbols will be predefined. If -N -N -X is specified, the "always present" -X symbols, __LINE__, __FILE__, and -X __DATE__ are not defined. -X -X -Stext CPP normally assumes that the size of -X the target computer's basic variable -X types is the same as the size of these -X types of the host computer. (This can -X be overridden when CPP is compiled, -X however.) The -S option allows dynamic -X respecification of these values. "text" -X is a string of numbers, separated by -X commas, that specifies correct sizes. -X The sizes must be specified in the exact -X order: -X -X char short int long float double -X -X If you specify the option as "-S*text", -X pointers to these types will be -X specified. -S* takes one additional -X argument for pointer to function (e.g. -X int (*)()) -X -X For example, to specify sizes -X appropriate for a PDP-11, you would -X write: -X -X c s i l f d func -X -S1,2,2,2,4,8, -X -S*2,2,2,2,2,2,2 -X -X Note that all values must be specified. -X -X -Uname Undefine the name as if -X -X #undef name -X -X were given. On non-Unix systems, "name" -X will be forced to upper-case. -X Page 3 -X cpp C Pre-Processor -X -X -X -Xnumber Enable debugging code. If no value is -X given, a value of 1 will be used. (For -X maintenence of CPP only.) -X -X -X PRE-DEFINED VARIABLES: -X -X When CPP begins processing, the following variables will -X have been defined (unless the -N option is specified): -X -X Target computer (as appropriate): -X -X pdp11, vax, M68000 m68000 m68k -X -X Target operating system (as appropriate): -X -X rsx, rt11, vms, unix -X -X Target compiler (as appropriate): -X -X decus, vax11c -X -X The implementor may add definitions to this list. The -X default definitions match the definition of the host -X computer, operating system, and C compiler. -X -X The following are always available unless undefined (or -X -N was specified twice): -X -X __FILE__ The input (or #include) file being -X compiled (as a quoted string). -X -X __LINE__ The line number being compiled. -X -X __DATE__ The date and time of compilation as a -X Unix ctime quoted string (the trailing -X newline is removed). Thus, -X -X printf("Bug at line %s,", __LINE__); -X printf(" source file %s", __FILE__); -X printf(" compiled on %s", __DATE__); -X -X -X DRAFT PROPOSED ANSI STANDARD CONSIDERATIONS: -X -X The current version of the Draft Proposed Standard -X explicitly states that "readers are requested not to -X specify or claim conformance to this draft." Readers and -X users of Decus CPP should not assume that Decus CPP -X conforms to the standard, or that it will conform to the -X actual C Language Standard. -X -X When CPP is itself compiled, many features of the Draft -X Proposed Standard that are incompatible with existing -X Page 4 -X cpp C Pre-Processor -X -X -X preprocessors may be disabled. See the comments in -X CPP's source for details. -X -X The latest version of the Draft Proposed Standard (as -X reflected in Decus CPP) is dated November 12, 1984. -X -X Comments are removed from the input text. The comment -X is replaced by a single space character. The -C option -X preserves comments, writing them to the output file. -X -X The '$' character is considered to be a letter. This is -X a permitted extension. -X -X The following new features of C are processed by CPP: -X -X #elif expression (#else #if) -X '\xNNN' (Hexadecimal constant) -X '\a' (Ascii BELL) -X '\v' (Ascii Vertical Tab) -X #if defined NAME 1 if defined, 0 if not -X #if defined (NAME) 1 if defined, 0 if not -X #if sizeof (basic type) -X unary + -X 123U, 123LU Unsigned ints and longs. -X 12.3L Long double numbers -X token#token Token concatenation -X #include token Expands to filename -X -X The Draft Proposed Standard has extended C, adding a -X constant string concatenation operator, where -X -X "foo" "bar" -X -X is regarded as the single string "foobar". (This does -X not affect CPP's processing but does permit a limited -X form of macro argument substitution into strings as will -X be discussed.) -X -X The Standard Committee plans to add token concatenation -X to #define command lines. One suggested implementation -X is as follows: the sequence "Token1#Token2" is treated -X as if the programmer wrote "Token1Token2". This could -X be used as follows: -X -X #line 123 -X #define ATLINE foo#__LINE__ -X -X ATLINE would be defined as foo123. -X -X Note that "Token2" must either have the format of an -X identifier or be a string of digits. Thus, the string -X -X #define ATLINE foo#1x3 -X Page 5 -X cpp C Pre-Processor -X -X -X generates two tokens: "foo1" and "x3". -X -X If the tokens T1 and T2 are concatenated into T3, this -X implementation operates as follows: -X -X 1. Expand T1 if it is a macro. -X 2. Expand T2 if it is a macro. -X 3. Join the tokens, forming T3. -X 4. Expand T3 if it is a macro. -X -X A macro formal parameter will be substituted into a -X string or character constant if it is the only component -X of that constant: -X -X #define VECSIZE 123 -X #define vprint(name, size) \ -X printf("name" "[" "size" "] = {\n") -X ... vprint(vector, VECSIZE); -X -X expands (effectively) to -X -X vprint("vector[123] = {\n"); -X -X Note that this will be useful if your C compiler -X supports the new string concatenation operation noted -X above. As implemented here, if you write -X -X #define string(arg) "arg" -X ... string("foo") ... -X -X This implementation generates "foo", rather than the -X strictly correct ""foo"" (which will probably generate -X an error message). This is, strictly speaking, an error -X in CPP and may be removed from future releases. -X -X ERROR MESSAGES: -X -X Many. CPP prints warning or error messages if you try -X to use multiple-byte character constants -X (non-transportable) if you #undef a symbol that was not -X defined, or if your program has potentially nested -X comments. -X -X AUTHOR: -X -X Martin Minow -X -X BUGS: -X -X The #if expression processor uses signed integers only. -X I.e, #if 0xFFFFu < 0 may be TRUE. -X -END-of-cpp.mem -echo x - cpp.h -sed 's/^X//' >cpp.h << 'END-of-cpp.h' -X -X/* -X * I n t e r n a l D e f i n i t i o n s f o r C P P -X * -X * In general, definitions in this file should not be changed. -X */ -X -X#ifndef TRUE -X#define TRUE 1 -X#define FALSE 0 -X#endif -X#ifndef EOS -X/* -X * This is predefined in Decus C -X */ -X#define EOS '\0' /* End of string */ -X#endif -X#define EOF_CHAR 0 /* Returned by get() on eof */ -X#define NULLST ((char *) NULL) /* Pointer to nowhere (linted) */ -X#define DEF_NOARGS (-1) /* #define foo vs #define foo() */ -X -X/* -X * The following may need to change if the host system doesn't use ASCII. -X */ -X#define DEF_MAGIC 0x1D /* Magic for #defines */ -X#define TOK_SEP 0x1E /* Token concatenation delim. */ -X#define COM_SEP 0x1F /* Magic comment separator */ -X -X/* -X * Note -- in Ascii, the following will map macro formals onto DEL + the -X * C1 control character region (decimal 128 .. (128 + PAR_MAC)) which will -X * be ok as long as PAR_MAC is less than 33). Note that the last PAR_MAC -X * value is reserved for string substitution. -X */ -X -X#define MAC_PARM 0x7F /* Macro formals start here */ -X#if PAR_MAC >= 33 -X assertion fails -- PAR_MAC isn't less than 33 -X#endif -X#define LASTPARM (PAR_MAC - 1) -X -X/* -X * Character type codes. -X */ -X -X#define INV 0 /* Invalid, must be zero */ -X#define OP_EOE INV /* End of expression */ -X#define DIG 1 /* Digit */ -X#define LET 2 /* Identifier start */ -X#define FIRST_BINOP OP_ADD -X#define OP_ADD 3 -X#define OP_SUB 4 -X#define OP_MUL 5 -X#define OP_DIV 6 -X#define OP_MOD 7 -X#define OP_ASL 8 -X#define OP_ASR 9 -X#define OP_AND 10 /* &, not && */ -X#define OP_OR 11 /* |, not || */ -X#define OP_XOR 12 -X#define OP_EQ 13 -X#define OP_NE 14 -X#define OP_LT 15 -X#define OP_LE 16 -X#define OP_GE 17 -X#define OP_GT 18 -X#define OP_ANA 19 /* && */ -X#define OP_ORO 20 /* || */ -X#define OP_QUE 21 /* ? */ -X#define OP_COL 22 /* : */ -X#define OP_CMA 23 /* , (relevant?) */ -X#define LAST_BINOP OP_CMA /* Last binary operand */ -X/* -X * The following are unary. -X */ -X#define FIRST_UNOP OP_PLU /* First Unary operand */ -X#define OP_PLU 24 /* + (draft ANSI standard) */ -X#define OP_NEG 25 /* - */ -X#define OP_COM 26 /* ~ */ -X#define OP_NOT 27 /* ! */ -X#define LAST_UNOP OP_NOT -X#define OP_LPA 28 /* ( */ -X#define OP_RPA 29 /* ) */ -X#define OP_END 30 /* End of expression marker */ -X#define OP_MAX (OP_END + 1) /* Number of operators */ -X#define OP_FAIL (OP_END + 1) /* For error returns */ -X -X/* -X * The following are for lexical scanning only. -X */ -X -X#define QUO 65 /* Both flavors of quotation */ -X#define DOT 66 /* . might start a number */ -X#define SPA 67 /* Space and tab */ -X#define BSH 68 /* Just a backslash */ -X#define END 69 /* EOF */ -X -X/* -X * These bits are set in ifstack[] -X */ -X#define WAS_COMPILING 1 /* TRUE if compile set at entry */ -X#define ELSE_SEEN 2 /* TRUE when #else processed */ -X#define TRUE_SEEN 4 /* TRUE when #if TRUE processed */ -X -X/* -X * Define bits for the basic types and their adjectives -X */ -X -X#define T_CHAR 1 -X#define T_INT 2 -X#define T_FLOAT 4 -X#define T_DOUBLE 8 -X#define T_SHORT 16 -X#define T_LONG 32 -X#define T_SIGNED 64 -X#define T_UNSIGNED 128 -X#define T_PTR 256 /* Pointer */ -X#define T_FPTR 512 /* Pointer to functions */ -X -X/* -X * The DEFBUF structure stores information about #defined -X * macros. Note that the defbuf->repl information is always -X * in malloc storage. -X */ -X -Xtypedef struct defbuf { -X struct defbuf *link; /* Next define in chain */ -X char *repl; /* -> replacement */ -X int hash; /* Symbol table hash */ -X int nargs; /* For define(args) */ -X char name[1]; /* #define name */ -X} DEFBUF; -X -X/* -X * The FILEINFO structure stores information about open files -X * and macros being expanded. -X */ -X -Xtypedef struct fileinfo { -X char *bptr; /* Buffer pointer */ -X int line; /* for include or macro */ -X FILE *fp; /* File if non-null */ -X struct fileinfo *parent; /* Link to includer */ -X char *filename; /* File/macro name */ -X char *progname; /* From #line statement */ -X unsigned int unrecur; /* For macro recursion */ -X char buffer[1]; /* current input line */ -X} FILEINFO; -X -X/* -X * The SIZES structure is used to store the values for #if sizeof -X */ -X -Xtypedef struct sizes { -X short bits; /* If this bit is set, */ -X short size; /* this is the datum size value */ -X short psize; /* this is the pointer size */ -X} SIZES; -X/* -X * nomacarg is a built-in #define on Decus C. -X */ -X -X#ifdef nomacarg -X#define cput output /* cput concatenates tokens */ -X#else -X#if COMMENT_INVISIBLE -X#define cput(c) { if (c != TOK_SEP && c != COM_SEP) putchar(c); } -X#else -X#define cput(c) { if (c != TOK_SEP) putchar(c); } -X#endif -X#endif -X -X#ifndef nomacarg -X#define streq(s1, s2) (strcmp(s1, s2) == 0) -X#endif -X -X/* -X * Error codes. VMS uses system definitions. -X * Decus C codes are defined in stdio.h. -X * Others are cooked to order. -X */ -X -X#if HOST == SYS_VMS -X#include -X#include -X#define IO_NORMAL (SS$_NORMAL | STS$M_INHIB_MSG) -X#define IO_ERROR SS$_ABORT -X#endif -X/* -X * Note: IO_NORMAL and IO_ERROR are defined in the Decus C stdio.h file -X */ -X#ifndef IO_NORMAL -X#define IO_NORMAL 0 -X#endif -X#ifndef IO_ERROR -X#define IO_ERROR 1 -X#endif -X -X/* -X * Externs -X */ -X -Xextern int line; /* Current line number */ -Xextern int wrongline; /* Force #line to cc pass 1 */ -Xextern char type[]; /* Character classifier */ -Xextern char token[IDMAX + 1]; /* Current input token */ -Xextern int instring; /* TRUE if scanning string */ -Xextern int inmacro; /* TRUE if scanning #define */ -Xextern int errors; /* Error counter */ -Xextern int recursion; /* Macro depth counter */ -Xextern char ifstack[BLK_NEST]; /* #if information */ -X#define compiling ifstack[0] -Xextern char *ifptr; /* -> current ifstack item */ -Xextern char *incdir[NINCLUDE]; /* -i directories */ -Xextern char **incend; /* -> active end of incdir */ -Xextern int cflag; /* -C option (keep comments) */ -Xextern int eflag; /* -E option (ignore errors) */ -Xextern int nflag; /* -N option (no pre-defines) */ -Xextern int rec_recover; /* unwind recursive macros */ -Xextern char *preset[]; /* Standard predefined symbols */ -Xextern char *magic[]; /* Magic predefined symbols */ -Xextern FILEINFO *infile; /* Current input file */ -Xextern char work[NWORK + 1]; /* #define scratch */ -Xextern char *workp; /* Free space in work */ -X#if DEBUG -Xextern int debug; /* Debug level */ -X#endif -Xextern int keepcomments; /* Don't remove comments if set */ -Xextern SIZES size_table[]; /* For #if sizeof sizes */ -Xextern char *getmem(); /* Get memory or die. */ -Xextern DEFBUF *lookid(); /* Look for a #define'd thing */ -Xextern DEFBUF *defendel(); /* Symbol table enter/delete */ -Xextern char *savestring(); /* Stuff string in malloc mem. */ -Xextern char *strcpy(); -Xextern char *strcat(); -Xextern char *strrchr(); -Xextern char *strchr(); -Xextern long time(); -X/* extern char *sprintf(); /* Lint needs this */ -END-of-cpp.h -echo x - cppdef.h -sed 's/^X//' >cppdef.h << 'END-of-cppdef.h' -X/* -X * S y s t e m D e p e n d e n t -X * D e f i n i t i o n s f o r C P P -X * -X * Definitions in this file may be edited to configure CPP for particular -X * host operating systems and target configurations. -X * -X * NOTE: cpp assumes it is compiled by a compiler that supports macros -X * with arguments. If this is not the case (as for Decus C), #define -X * nomacarg -- and provide function equivalents for all macros. -X * -X * cpp also assumes the host and target implement the Ascii character set. -X * If this is not the case, you will have to do some editing here and there. -X */ -X -X/* -X * This redundant definition of TRUE and FALSE works around -X * a limitation of Decus C. -X */ -X#ifndef TRUE -X#define TRUE 1 -X#define FALSE 0 -X#endif -X -X/* -X * Define the HOST operating system. This is needed so that -X * cpp can use appropriate filename conventions. -X */ -X#define SYS_UNKNOWN 0 -X#define SYS_UNIX 1 -X#define SYS_VMS 2 -X#define SYS_RSX 3 -X#define SYS_RT11 4 -X#define SYS_LATTICE 5 -X#define SYS_ONYX 6 -X#define SYS_68000 7 -X#define SYS_GCOS 8 -X#define SYS_IBM 9 -X#define SYS_OS 10 -X#define SYS_TSS 11 -X -X#ifndef HOST -X#ifdef unix -X#define HOST SYS_UNIX -X#else -X#ifdef vms -X#define HOST SYS_VMS -X#else -X#ifdef rsx -X#define HOST SYS_RSX -X#else -X#ifdef rt11 -X#define HOST SYS_RT11 -X#else -X#ifdef dmert -X#define HOST SYS_DMERT -X#else -X#ifdef gcos -X#define HOST SYS_GCOS -X#else -X#ifdef ibm -X#define HOST SYS_IBM -X#else -X#ifdef os -X#define HOST SYS_OS -X#else -X#ifdef tss -X#define HOST SYS_TSS -X#endif -X#endif -X#endif -X#endif -X#endif -X#endif -X#endif -X#endif -X#endif -X -X#ifndef HOST -X#define HOST SYS_UNKNOWN -X#endif -X -X/* -X * We assume that the target is the same as the host system -X */ -X#ifndef TARGET -X#define TARGET HOST -X#endif -X -X/* -X * In order to predefine machine-dependent constants, -X * several strings are defined here: -X * -X * MACHINE defines the target cpu (by name) -X * SYSTEM defines the target operating system -X * COMPILER defines the target compiler -X * -X * The above may be #defined as "" if they are not wanted. -X * They should not be #defined as NULL. -X * -X * LINE_PREFIX defines the # output line prefix, if not "line" -X * This should be defined as "" if cpp is to replace -X * the "standard" C pre-processor. -X * -X * FILE_LOCAL marks functions which are referenced only in the -X * file they reside. Some C compilers allow these -X * to be marked "static" even though they are referenced -X * by "extern" statements elsewhere. -X * -X * OK_DOLLAR Should be set TRUE if $ is a valid alphabetic character -X * in identifiers (default), or zero if $ is invalid. -X * Default is TRUE. -X * -X * OK_CONCAT Should be set TRUE if # may be used to concatenate -X * tokens in macros (per the Ansi Draft Standard) or -X * FALSE for old-style # processing (needed if cpp is -X * to process assembler source code). -X * -X * OK_DATE Predefines the compilation date if set TRUE. -X * Not permitted by the Nov. 12, 1984 Draft Standard. -X * -X * S_CHAR etc. Define the sizeof the basic TARGET machine word types. -X * By default, sizes are set to the values for the HOST -X * computer. If this is inappropriate, see the code in -X * cpp3.c for details on what to change. Also, if you -X * have a machine where sizeof (signed int) differs from -X * sizeof (unsigned int), you will have to edit code and -X * tables in cpp3.c (and extend the -S option definition.) -X * -X * CPP_LIBRARY May be defined if you have a site-specific include directory -X * which is to be searched *before* the operating-system -X * specific directories. -X */ -X -X#if TARGET == SYS_LATTICE -X/* -X * We assume the operating system is pcdos for the IBM-PC. -X * We also assume the small model (just like the PDP-11) -X */ -X#define MACHINE "i8086" -X#define SYSTEM "pcdos" -X#endif -X -X#if TARGET == SYS_ONYX -X#define MACHINE "z8000" -X#define SYSTEM "unix" -X#endif -X -X#if TARGET == SYS_VMS -X#define MACHINE "vax" -X#define SYSTEM "vms" -X#define COMPILER "vax11c" -X#endif -X -X#if TARGET == SYS_RSX -X#define MACHINE "pdp11" -X#define SYSTEM "rsx" -X#define COMPILER "decus" -X#endif -X -X#if TARGET == SYS_RT11 -X#define MACHINE "pdp11" -X#define SYSTEM "rt11" -X#define COMPILER "decus" -X#endif -X -X#if TARGET == SYS_68000 -X/* -X * All three machine designators have been seen in various systems. -X * Warning -- compilers differ as to sizeof (int). cpp3 assumes that -X * sizeof (int) == 2 -X */ -X#define MACHINE "M68000", "m68000", "m68k" -X#define SYSTEM "unix" -X#endif -X -X#if TARGET == SYS_UNIX -X#define SYSTEM "unix" -X#ifdef pdp11 -X#define MACHINE "pdp11" -X#endif -X#ifdef vax -X#define MACHINE "vax" -X#endif -X#ifdef u370 -X#define MACHINE "u370" -X#endif -X#ifdef interdata -X#define MACHINE "interdata" -X#endif -X#ifdef u3b -X#define MACHINE "u3b" -X#endif -X#ifdef u3b5 -X#define MACHINE "u3b5" -X#endif -X#ifdef u3b2 -X#define MACHINE "u3b2" -X#endif -X#ifdef u3b20d -X#define MACHINE "u3b20d" -X#endif -X#endif -X#endif -X -X/* -X * defaults -X */ -X -X#ifndef MSG_PREFIX -X#define MSG_PREFIX "cpp: " -X#endif -X -X#ifndef LINE_PREFIX -X#ifdef decus -X#define LINE_PREFIX "" -X#else -X#define LINE_PREFIX "line" -X#endif -X#endif -X -X/* -X * OLD_PREPROCESSOR forces the definition of OK_DOLLAR, OK_CONCAT, -X * COMMENT_INVISIBLE, and STRING_FORMAL to values appropriate for -X * an old-style preprocessor. -X */ -X -X#ifndef OLD_PREPROCESSOR -X#define OLD_PREPROCESSOR FALSE -X#endif -X -X#if OLD_PREPROCESSOR -X#define OK_DOLLAR FALSE -X#define OK_CONCAT FALSE -X#define COMMENT_INVISIBLE TRUE -X#define STRING_FORMAL TRUE -X#endif -X -X/* -X * RECURSION_LIMIT may be set to -1 to disable the macro recursion test. -X */ -X#ifndef RECURSION_LIMIT -X#define RECURSION_LIMIT 1000 -X#endif -X -X/* -X * BITS_CHAR may be defined to set the number of bits per character. -X * it is needed only for multi-byte character constants. -X */ -X#ifndef BITS_CHAR -X#define BITS_CHAR 8 -X#endif -X -X/* -X * BIG_ENDIAN is set TRUE on machines (such as the IBM 360 series) -X * where 'ab' stores 'a' in the high-bits and 'b' in the low-bits. -X * It is set FALSE on machines (such as the PDP-11 and Vax-11) -X * where 'ab' stores 'a' in the low-bits and 'b' in the high-bits. -X * (Or is it the other way around?) -- Warning: BIG_ENDIAN code is untested. -X */ -X#ifndef BIG_ENDIAN -X#define BIG_ENDIAN FALSE -X#endif -X -X/* -X * COMMENT_INVISIBLE may be defined to allow "old-style" comment -X * processing, whereby the comment becomes a zero-length token -X * delimiter. This permitted tokens to be concatenated in macro -X * expansions. This was removed from the Draft Ansi Standard. -X */ -X#ifndef COMMENT_INVISIBLE -X#define COMMENT_INVISIBLE FALSE -X#endif -X -X/* -X * STRING_FORMAL may be defined to allow recognition of macro parameters -X * anywhere in replacement strings. This was removed from the Draft Ansi -X * Standard and a limited recognition capability added. -X */ -X#ifndef STRING_FORMAL -X#define STRING_FORMAL FALSE -X#endif -X -X/* -X * OK_DOLLAR enables use of $ as a valid "letter" in identifiers. -X * This is a permitted extension to the Ansi Standard and is required -X * for e.g., VMS, RSX-11M, etc. It should be set FALSE if cpp is -X * used to preprocess assembler source on Unix systems. OLD_PREPROCESSOR -X * sets OK_DOLLAR FALSE for that reason. -X */ -X#ifndef OK_DOLLAR -X#define OK_DOLLAR TRUE -X#endif -X -X/* -X * OK_CONCAT enables (one possible implementation of) token concatenation. -X * If cpp is used to preprocess Unix assembler source, this should be -X * set FALSE as the concatenation character, #, is used by the assembler. -X */ -X#ifndef OK_CONCAT -X#define OK_CONCAT TRUE -X#endif -X -X/* -X * OK_DATE may be enabled to predefine today's date as a string -X * at the start of each compilation. This is apparently not permitted -X * by the Draft Ansi Standard. -X */ -X#ifndef OK_DATE -X#define OK_DATE TRUE -X#endif -X -X/* -X * Some common definitions. -X */ -X -X#ifndef DEBUG -X#define DEBUG FALSE -X#endif -X -X/* -X * The following definitions are used to allocate memory for -X * work buffers. In general, they should not be modified -X * by implementors. -X * -X * PAR_MAC The maximum number of #define parameters (31 per Standard) -X * Note: we need another one for strings. -X * IDMAX The longest identifier, 31 per Ansi Standard -X * NBUFF Input buffer size -X * NWORK Work buffer size -- the longest macro -X * must fit here after expansion. -X * NEXP The nesting depth of #if expressions -X * NINCLUDE The number of directories that may be specified -X * on a per-system basis, or by the -I option. -X * BLK_NEST The number of nested #if's permitted. -X */ -X -X#define IDMAX 31 -X#define PAR_MAC (31 + 1) -X#define NBUFF 1024 -X#define NWORK 1024 -X#define NEXP 128 -X#define NINCLUDE 7 -X#define NPARMWORK (NWORK * 2) -X#define BLK_NEST 32 -X -X/* -X * Some special constants. These may need to be changed if cpp -X * is ported to a wierd machine. -X * -X * NOTE: if cpp is run on a non-ascii machine, ALERT and VT may -X * need to be changed. They are used to implement the proposed -X * ANSI standard C control characters '\a' and '\v' only. -X * DEL is used to tag macro tokens to prevent #define foo foo -X * from looping. Note that we don't try to prevent more elaborate -X * #define loops from occurring. -X */ -X -X#ifndef ALERT -X#define ALERT '\007' /* '\a' is "Bell" */ -X#endif -X -X#ifndef VT -X#define VT '\013' /* Vertical Tab CTRL/K */ -X#endif -X -X -X#ifndef FILE_LOCAL -X#ifdef decus -X#define FILE_LOCAL static -X#else -X#ifdef vax11c -X#define FILE_LOCAL static -X#else -X#define FILE_LOCAL /* Others are global */ -X#endif -X#endif -X#endif -X -END-of-cppdef.h -echo x - cpp2.c -sed 's/^X//' >cpp2.c << 'END-of-cpp2.c' -X/* -X * C P P 2 . C -X * -X * Process #control lines -X * -X * Edit history -X * 13-Nov-84 MM Split from cpp1.c -X */ -X -X#include -X#include -X#include "cppdef.h" -X#include "cpp.h" -X#if HOST == SYS_VMS -X/* -X * Include the rms stuff. (We can't just include rms.h as it uses the -X * VaxC-specific library include syntax that Decus CPP doesn't support. -X * By including things by hand, we can CPP ourself.) -X */ -X#include -X#include -X#include -X#include -X#endif -X -X/* -X * Generate (by hand-inspection) a set of unique values for each control -X * operator. Note that this is not guaranteed to work for non-Ascii -X * machines. CPP won't compile if there are hash conflicts. -X */ -X -X#define L_assert ('a' + ('s' << 1)) -X#define L_define ('d' + ('f' << 1)) -X#define L_elif ('e' + ('i' << 1)) -X#define L_else ('e' + ('s' << 1)) -X#define L_endif ('e' + ('d' << 1)) -X#define L_ident ('i' + ('e' << 1)) -X#define L_if ('i' + (EOS << 1)) -X#define L_ifdef ('i' + ('d' << 1)) -X#define L_ifndef ('i' + ('n' << 1)) -X#define L_include ('i' + ('c' << 1)) -X#define L_line ('l' + ('n' << 1)) -X#define L_nogood (EOS + (EOS << 1)) /* To catch #i */ -X#define L_pragma ('p' + ('a' << 1)) -X#define L_sccs ('s' + ('c' << 1)) -X#define L_undef ('u' + ('d' << 1)) -X#if DEBUG -X#define L_debug ('d' + ('b' << 1)) /* #debug */ -X#define L_nodebug ('n' + ('d' << 1)) /* #nodebug */ -X#endif -X -Xint -Xcontrol(counter) -Xint counter; /* Pending newline counter */ -X/* -X * Process #control lines. Simple commands are processed inline, -X * while complex commands have their own subroutines. -X * -X * The counter is used to force out a newline before #line, and -X * #pragma commands. This prevents these commands from ending up at -X * the end of the previous line if cpp is invoked with the -C option. -X */ -X{ -X register int c; -X register char *tp; -X register int hash; -X char *ep; -X -X c = skipws(); -X if (c == '\n' || c == EOF_CHAR) -X return (counter + 1); -X if (!isdigit(c)) -X scanid(c); /* Get #word to token[] */ -X else { -X unget(); /* Hack -- allow #123 as a */ -X strcpy(token, "line"); /* synonym for #line 123 */ -X } -X hash = (token[1] == EOS) ? L_nogood : (token[0] + (token[2] << 1)); -X switch (hash) { -X case L_assert: tp = "assert"; break; -X case L_define: tp = "define"; break; -X case L_elif: tp = "elif"; break; -X case L_else: tp = "else"; break; -X case L_endif: tp = "endif"; break; -X case L_ident: tp = "ident"; break; -X case L_if: tp = "if"; break; -X case L_ifdef: tp = "ifdef"; break; -X case L_ifndef: tp = "ifndef"; break; -X case L_include: tp = "include"; break; -X case L_line: tp = "line"; break; -X case L_pragma: tp = "pragma"; break; -X case L_sccs: tp = "sccs"; break; -X case L_undef: tp = "undef"; break; -X#if DEBUG -X case L_debug: tp = "debug"; break; -X case L_nodebug: tp = "nodebug"; break; -X#endif -X default: hash = L_nogood; -X case L_nogood: tp = ""; break; -X } -X if (!streq(tp, token)) -X hash = L_nogood; -X /* -X * hash is set to a unique value corresponding to the -X * control keyword (or L_nogood if we think it's nonsense). -X */ -X if (infile->fp == NULL) -X cwarn("Control line \"%s\" within macro expansion", token); -X if (!compiling) { /* Not compiling now */ -X switch (hash) { -X case L_if: /* These can't turn */ -X case L_ifdef: /* compilation on, but */ -X case L_ifndef: /* we must nest #if's */ -X if (++ifptr >= &ifstack[BLK_NEST]) -X goto if_nest_err; -X *ifptr = 0; /* !WAS_COMPILING */ -X case L_line: /* Many */ -X /* -X * Are pragma's always processed? -X */ -X case L_ident: -X case L_sccs: -X case L_pragma: /* options */ -X case L_include: /* are uninteresting */ -X case L_define: /* if we */ -X case L_undef: /* aren't */ -X case L_assert: /* compiling. */ -Xdump_line: skipnl(); /* Ignore rest of line */ -X return (counter + 1); -X } -X } -X /* -X * Make sure that #line and #pragma are output on a fresh line. -X */ -X if (counter > 0 && (hash == L_line || hash == L_pragma)) { -X putchar('\n'); -X counter--; -X } -X switch (hash) { -X case L_line: -X /* -X * Parse the line to update the line number and "progname" -X * field and line number for the next input line. -X * Set wrongline to force it out later. -X */ -X c = skipws(); -X workp = work; /* Save name in work */ -X while (c != '\n' && c != EOF_CHAR) { -X save(c); -X c = get(); -X } -X unget(); -X save(EOS); -X /* -X * Split #line argument into and -X * We subtract 1 as we want the number of the next line. -X */ -X line = atoi(work) - 1; /* Reset line number */ -X for (tp = work; isdigit(*tp) || type[*tp] == SPA; tp++) -X ; /* Skip over digits */ -X if (*tp != EOS) { /* Got a filename, so: */ -X if (*tp == '"' && (ep = strrchr(tp + 1, '"')) != NULL) { -X tp++; /* Skip over left quote */ -X *ep = EOS; /* And ignore right one */ -X } -X if (infile->progname != NULL) /* Give up the old name */ -X free(infile->progname); /* if it's allocated. */ -X infile->progname = savestring(tp); -X } -X wrongline = TRUE; /* Force output later */ -X break; -X -X case L_include: -X doinclude(); -X break; -X -X case L_define: -X dodefine(); -X break; -X -X case L_undef: -X doundef(); -X break; -X -X case L_else: -X if (ifptr == &ifstack[0]) -X goto nest_err; -X else if ((*ifptr & ELSE_SEEN) != 0) -X goto else_seen_err; -X *ifptr |= ELSE_SEEN; -X if ((*ifptr & WAS_COMPILING) != 0) { -X if (compiling || (*ifptr & TRUE_SEEN) != 0) -X compiling = FALSE; -X else { -X compiling = TRUE; -X } -X } -X break; -X -X case L_elif: -X if (ifptr == &ifstack[0]) -X goto nest_err; -X else if ((*ifptr & ELSE_SEEN) != 0) { -Xelse_seen_err: cerror("#%s may not follow #else", token); -X goto dump_line; -X } -X if ((*ifptr & (WAS_COMPILING | TRUE_SEEN)) != WAS_COMPILING) { -X compiling = FALSE; /* Done compiling stuff */ -X goto dump_line; /* Skip this clause */ -X } -X doif(L_if); -X break; -X -X case L_if: -X case L_ifdef: -X case L_ifndef: -X if (++ifptr >= &ifstack[BLK_NEST]) -Xif_nest_err: cfatal("Too many nested #%s statements", token); -X *ifptr = WAS_COMPILING; -X doif(hash); -X break; -X -X case L_endif: -X if (ifptr == &ifstack[0]) { -Xnest_err: cerror("#%s must be in an #if", token); -X goto dump_line; -X } -X if (!compiling && (*ifptr & WAS_COMPILING) != 0) -X wrongline = TRUE; -X compiling = ((*ifptr & WAS_COMPILING) != 0); -X --ifptr; -X break; -X -X case L_assert: -X if (eval() == 0) -X cerror("Preprocessor assertion failure", NULLST); -X break; -X -X case L_ident: -X case L_sccs: -X goto dump_line; -X break; -X -X case L_pragma: -X /* -X * #pragma is provided to pass "options" to later -X * passes of the compiler. cpp doesn't have any yet. -X */ -X printf("#pragma "); -X while ((c = get()) != '\n' && c != EOF_CHAR) -X cput(c); -X unget(); -X break; -X -X#if DEBUG -X case L_debug: -X if (debug == 0) -X dumpdef("debug set on"); -X debug++; -X break; -X -X case L_nodebug: -X debug--; -X break; -X#endif -X -X default: -X /* -X * Undefined #control keyword. -X * Note: the correct behavior may be to warn and -X * pass the line to a subsequent compiler pass. -X * This would allow #asm or similar extensions. -X */ -X cerror("Illegal # command \"%s\"", token); -X break; -X } -X if (hash != L_include) { -X#if OLD_PREPROCESSOR || !VERBOSE -X /* -X * Ignore the rest of the #control line so you can write -X * #if foo -X * #endif foo -X */ -X goto dump_line; /* Take common exit */ -X#else -X if (skipws() != '\n') { -X cwarn("Unexpected text in #control line ignored", NULLST); -X skipnl(); -X } -X#endif -X } -X return (counter + 1); -X} -X -XFILE_LOCAL -Xdoif(hash) -Xint hash; -X/* -X * Process an #if, #ifdef, or #ifndef. The latter two are straightforward, -X * while #if needs a subroutine of its own to evaluate the expression. -X * -X * doif() is called only if compiling is TRUE. If false, compilation -X * is always supressed, so we don't need to evaluate anything. This -X * supresses unnecessary warnings. -X */ -X{ -X register int c; -X register int found; -X -X if ((c = skipws()) == '\n' || c == EOF_CHAR) { -X unget(); -X goto badif; -X } -X if (hash == L_if) { -X unget(); -X found = (eval() != 0); /* Evaluate expr, != 0 is TRUE */ -X hash = L_ifdef; /* #if is now like #ifdef */ -X } -X else { -X if (type[c] != LET) /* Next non-blank isn't letter */ -X goto badif; /* ... is an error */ -X found = (lookid(c) != NULL); /* Look for it in symbol table */ -X } -X if (found == (hash == L_ifdef)) { -X compiling = TRUE; -X *ifptr |= TRUE_SEEN; -X } -X else { -X compiling = FALSE; -X } -X return; -X -Xbadif: cerror("#if, #ifdef, or #ifndef without an argument", NULLST); -X#if !OLD_PREPROCESSOR -X skipnl(); /* Prevent an extra */ -X unget(); /* Error message */ -X#endif -X return; -X} -X -XFILE_LOCAL -Xdoinclude() -X/* -X * Process the #include control line. -X * There are three variations: -X * #include "file" search somewhere relative to the -X * current source file, if not found, -X * treat as #include . -X * #include Search in an implementation-dependent -X * list of places. -X * #include token Expand the token, it must be one of -X * "file" or , process as such. -X * -X * Note: the November 12 draft forbids '>' in the #include format. -X * This restriction is unnecessary and not implemented. -X */ -X{ -X register int c; -X register int delim; -X#if HOST == SYS_VMS -X char def_filename[NAM$C_MAXRSS + 1]; -X#endif -X -X delim = macroid(skipws()); -X if (delim != '<' && delim != '"') -X goto incerr; -X if (delim == '<') -X delim = '>'; -X workp = work; -X instring = TRUE; /* Accept all characters */ -X while ((c = get()) != '\n' && c != delim && c != EOF_CHAR) -X save(c); /* Put it away. */ -X skipnl(); -X /* -X * The draft is unclear if the following should be done. -X */ -X -X while (--workp >= work && (type[*workp] == SPA)) -X ; /* Trim blanks from filename */ -X -X/* -X * if (*workp != delim) -X * goto incerr; -X */ -X *(workp + 1) = EOS; /* Terminate filename */ -X instring = FALSE; -X#if HOST == SYS_VMS -X /* -X * Assume the default .h filetype. -X */ -X if (!vmsparse(work, ".H", def_filename)) { -X perror(work); /* Oops. */ -X goto incerr; -X } -X else if (openinclude(def_filename, (delim == '"'))) -X return; -X#else -X if (openinclude(work, (delim == '"'))) -X return; -X#endif -X /* -X * No sense continuing if #include file isn't there. -X */ -X cfatal("Cannot open include file \"%s\"", work); -X -Xincerr: cerror("#include syntax error", NULLST); -X return; -X} -X -XFILE_LOCAL int -Xopeninclude(filename, searchlocal) -Xchar *filename; /* Input file name */ -Xint searchlocal; /* TRUE if #include "file" */ -X/* -X * Actually open an include file. This routine is only called from -X * doinclude() above, but was written as a separate subroutine for -X * programmer convenience. It searches the list of directories -X * and actually opens the file, linking it into the list of -X * active files. Returns TRUE if the file was opened, FALSE -X * if openinclude() fails. No error message is printed. -X */ -X{ -X register char **incptr; -X#if HOST == SYS_VMS -X#if NWORK < (NAM$C_MAXRSS + 1) -X << error, NWORK isn't greater than NAM$C_MAXRSS >> -X#endif -X#endif -X char tmpname[NWORK]; /* Filename work area */ -X -X if (searchlocal) { -X /* -X * Look in local directory first -X */ -X#if HOST == SYS_UNIX -X /* -X * Try to open filename relative to the directory of the current -X * source file (as opposed to the current directory). (ARF, SCK). -X */ -X if (filename[0] != '/' -X && hasdirectory(infile->filename, tmpname)) -X strcat(tmpname, filename); -X else { -X strcpy(tmpname, filename); -X } -X#else -X if (!hasdirectory(filename, tmpname) -X && hasdirectory(infile->filename, tmpname)) -X strcat(tmpname, filename); -X else { -X strcpy(tmpname, filename); -X } -X#endif -X if (openfile(tmpname)) -X return (TRUE); -X } -X /* -X * Look in any directories specified by -I command line -X * arguments, then in the builtin search list. -X */ -X for (incptr = incdir; incptr < incend; incptr++) { -X if (strlen(*incptr) + strlen(filename) >= (NWORK - 1)) -X cfatal("Filename work buffer overflow", NULLST); -X else { -X#if HOST == SYS_UNIX -X if (filename[0] == '/') -X strcpy(tmpname, filename); -X else { -X sprintf(tmpname, "%s/%s", *incptr, filename); -X } -X#else -X if (!hasdirectory(filename, tmpname)) -X sprintf(tmpname, "%s%s", *incptr, filename); -X#endif -X if (openfile(tmpname)) -X return (TRUE); -X } -X } -X return (FALSE); -X} -X -XFILE_LOCAL int -Xhasdirectory(source, result) -Xchar *source; /* Directory to examine */ -Xchar *result; /* Put directory stuff here */ -X/* -X * If a device or directory is found in the source filename string, the -X * node/device/directory part of the string is copied to result and -X * hasdirectory returns TRUE. Else, nothing is copied and it returns FALSE. -X */ -X{ -X#if HOST == SYS_UNIX -X register char *tp; -X -X if ((tp = strrchr(source, '/')) == NULL) -X return (FALSE); -X else { -X strncpy(result, source, tp - source + 1); -X result[tp - source + 1] = EOS; -X return (TRUE); -X } -X#else -X#if HOST == SYS_VMS -X if (vmsparse(source, NULLST, result) -X && result[0] != EOS) -X return (TRUE); -X else { -X return (FALSE); -X } -X#else -X /* -X * Random DEC operating system (RSX, RT11, RSTS/E) -X */ -X register char *tp; -X -X if ((tp = strrchr(source, ']')) == NULL -X && (tp = strrchr(source, ':')) == NULL) -X return (FALSE); -X else { -X strncpy(result, source, tp - source + 1); -X result[tp - source + 1] = EOS; -X return (TRUE); -X } -X#endif -X#endif -X} -X -X#if HOST == SYS_VMS -X -X/* -X * EXP_DEV is set if a device was specified, EXP_DIR if a directory -X * is specified. (Both set indicate a file-logical, but EXP_DEV -X * would be set by itself if you are reading, say, SYS$INPUT:) -X */ -X#define DEVDIR (NAM$M_EXP_DEV | NAM$M_EXP_DIR) -X -XFILE_LOCAL int -Xvmsparse(source, defstring, result) -Xchar *source; -Xchar *defstring; /* non-NULL -> default string. */ -Xchar *result; /* Size is at least NAM$C_MAXRSS + 1 */ -X/* -X * Parse the source string, applying the default (properly, using -X * the system parse routine), storing it in result. -X * TRUE if it parsed, FALSE on error. -X * -X * If defstring is NULL, there are no defaults and result gets -X * (just) the node::[directory] part of the string (possibly "") -X */ -X{ -X struct FAB fab = cc$rms_fab; /* File access block */ -X struct NAM nam = cc$rms_nam; /* File name block */ -X char fullname[NAM$C_MAXRSS + 1]; -X register char *rp; /* Result pointer */ -X -X fab.fab$l_nam = &nam; /* fab -> nam */ -X fab.fab$l_fna = source; /* Source filename */ -X fab.fab$b_fns = strlen(source); /* Size of source */ -X fab.fab$l_dna = defstring; /* Default string */ -X if (defstring != NULLST) -X fab.fab$b_dns = strlen(defstring); /* Size of default */ -X nam.nam$l_esa = fullname; /* Expanded filename */ -X nam.nam$b_ess = NAM$C_MAXRSS; /* Expanded name size */ -X if (sys$parse(&fab) == RMS$_NORMAL) { /* Parse away */ -X fullname[nam.nam$b_esl] = EOS; /* Terminate string */ -X result[0] = EOS; /* Just in case */ -X rp = &result[0]; -X /* -X * Remove stuff added implicitly, accepting node names and -X * dev:[directory] strings (but not process-permanent files). -X */ -X if ((nam.nam$l_fnb & NAM$M_PPF) == 0) { -X if ((nam.nam$l_fnb & NAM$M_NODE) != 0) { -X strncpy(result, nam.nam$l_node, nam.nam$b_node); -X rp += nam.nam$b_node; -X *rp = EOS; -X } -X if ((nam.nam$l_fnb & DEVDIR) == DEVDIR) { -X strncpy(rp, nam.nam$l_dev, nam.nam$b_dev + nam.nam$b_dir); -X rp += nam.nam$b_dev + nam.nam$b_dir; -X *rp = EOS; -X } -X } -X if (defstring != NULLST) { -X strncpy(rp, nam.nam$l_name, nam.nam$b_name + nam.nam$b_type); -X rp += nam.nam$b_name + nam.nam$b_type; -X *rp = EOS; -X if ((nam.nam$l_fnb & NAM$M_EXP_VER) != 0) { -X strncpy(rp, nam.nam$l_ver, nam.nam$b_ver); -X rp[nam.nam$b_ver] = EOS; -X } -X } -X return (TRUE); -X } -X return (FALSE); -X} -X#endif -X -END-of-cpp2.c -exit diff --git a/sys/unix/cpp2.shr b/sys/unix/cpp2.shr deleted file mode 100644 index ccadfc054..000000000 --- a/sys/unix/cpp2.shr +++ /dev/null @@ -1,1763 +0,0 @@ -# This is a shell archive. Save it in a file, remove anything before -# this line, and then unpack it by entering "sh file". Note, it may -# create directories; files and directories will be owned by you and -# have default permissions. -# -# This archive contains: -# -# cpp1.c -# cpp3.c -# cpp4.c -# -echo x - cpp1.c -sed 's/^X//' >cpp1.c << 'END-of-cpp1.c' -X/* -X * CPP main program. -X * -X * Edit history -X * 21-May-84 MM "Field test" release -X * 23-May-84 MM Some minor hacks. -X * 30-May-84 ARF Didn't get enough memory for __DATE__ -X * Added code to read stdin if no input -X * files are provided. -X * 29-Jun-84 MM Added ARF's suggestions, Unixifying cpp. -X * 11-Jul-84 MM "Official" first release (that's what I thought!) -X * 22-Jul-84 MM/ARF/SCK Fixed line number bugs, added cpp recognition -X * of #line, fixed problems with #include. -X * 23-Jul-84 MM More (minor) include hacking, some documentation. -X * Also, redid cpp's #include files -X * 25-Jul-84 MM #line filename isn't used for #include searchlist -X * #line format is -X * 25-Jul-84 ARF/MM Various bugs, mostly serious. Removed homemade doprint -X * 01-Aug-84 MM Fixed recursion bug, remove extra newlines and -X * leading whitespace from cpp output. -X * 02-Aug-84 MM Hacked (i.e. optimized) out blank lines and unneeded -X * whitespace in general. Cleaned up unget()'s. -X * 03-Aug-84 Keie Several bug fixes from Ed Keizer, Vrije Universitet. -X * -- corrected arg. count in -D and pre-defined -X * macros. Also, allow \n inside macro actual parameter -X * lists. -X * 06-Aug-84 MM If debugging, dump the preset vector at startup. -X * 12-Aug-84 MM/SCK Some small changes from Sam Kendall -X * 15-Aug-84 Keie/MM cerror, cwarn, etc. take a single string arg. -X * cierror, etc. take a single int. arg. -X * changed LINE_PREFIX slightly so it can be -X * changed in the makefile. -X * 31-Aug-84 MM USENET net.sources release. -X * 7-Sep-84 SCH/ado Lint complaints -X * 10-Sep-84 Keie Char's can't be signed in some implementations -X * 11-Sep-84 ado Added -C flag, pathological line number fix -X * 13-Sep-84 ado Added -E flag (does nothing) and "-" file for stdin. -X * 14-Sep-84 MM Allow # 123 as a synonym for #line 123 -X * 19-Sep-84 MM scanid always reads to token, make sure #line is -X * written to a new line, even if -C switch given. -X * Also, cpp - - reads stdin, writes stdout. -X * 03-Oct-84 ado/MM Several changes to line counting and keepcomments -X * stuff. Also a rewritten control() hasher -- much -X * simpler and no less "perfect". Note also changes -X * in cpp3.c to fix numeric scanning. -X * 04-Oct-84 MM Added recognition of macro formal parameters if -X * they are the only thing in a string, per the -X * draft standard. -X * 08-Oct-84 MM One more attack on scannumber -X * 15-Oct-84 MM/ado Added -N to disable predefined symbols. Fixed -X * linecount if COMMENT_INVISIBLE enabled. -X * 22-Oct-84 MM Don't evaluate the #if/#ifdef argument if -X * compilation is supressed. This prevents -X * unnecessary error messages in sequences such as -X * #ifdef FOO -- undefined -X * #if FOO == 10 -- shouldn't print warning -X * 25-Oct-84 MM Fixed bug in false ifdef supression. On vms, -X * #include should open foo.h -- this duplicates -X * the behavior of Vax-C -X * 31-Oct-84 ado/MM Parametized $ in indentifiers. Added a better -X * token concatenator and took out the trial -X * concatenation code. Also improved #ifdef code -X * and cleaned up the macro recursion tester. -X * 2-Nov-84 MM/ado Some bug fixes in token concatenation, also -X * a variety of minor (uninteresting) hacks. -X * 6-Nov-84 MM Happy Birthday. Broke into 4 files and added -X * #if sizeof (basic_types) -X * 9-Nov-84 MM Added -S* for pointer type sizes -X * 13-Nov-84 MM Split cpp1.c, added vms defaulting -X * 23-Nov-84 MM/ado -E supresses error exit, added CPP_INCLUDE, -X * fixed strncpy bug. -X * 3-Dec-84 ado/MM Added OLD_PREPROCESSOR -X * 7-Dec-84 MM Stuff in Nov 12 Draft Standard -X * 17-Dec-84 george Fixed problems with recursive macros -X * 17-Dec-84 MM Yet another attack on #if's (f/t)level removed. -X * 07-Jan-85 ado Init defines before doing command line options -X * so -Uunix works. -X */ -X -X/*)BUILD -X $(PROGRAM) = cpp -X $(FILES) = { cpp1 cpp2 cpp3 cpp4 cpp5 cpp6 } -X $(INCLUDE) = { cppdef.h cpp.h } -X $(STACK) = 2000 -X $(TKBOPTIONS) = { -X STACK = 2000 -X } -X*/ -X -X#ifdef DOCUMENTATION -X -Xtitle cpp C Pre-Processor -Xindex C pre-processor -X -Xsynopsis -X .s.nf -X cpp [-options] [infile [outfile]] -X .s.f -Xdescription -X -X CPP reads a C source file, expands macros and include -X files, and writes an input file for the C compiler. -X If no file arguments are given, CPP reads from stdin -X and writes to stdout. If one file argument is given, -X it will define the input file, while two file arguments -X define both input and output files. The file name "-" -X is a synonym for stdin or stdout as appropriate. -X -X The following options are supported. Options may -X be given in either case. -X .lm +16 -X .p -16 -X -C If set, source-file comments are written -X to the output file. This allows the output of CPP to be -X used as the input to a program, such as lint, that expects -X commands embedded in specially-formatted comments. -X .p -16 -X -Dname=value Define the name as if the programmer wrote -X -X #define name value -X -X at the start of the first file. If "=value" is not -X given, a value of "1" will be used. -X -X On non-unix systems, all alphabetic text will be forced -X to upper-case. -X .p -16 -X -E Always return "success" to the operating -X system, even if errors were detected. Note that some fatal -X errors, such as a missing #include file, will terminate -X CPP, returning "failure" even if the -E option is given. -X .p -16 -X -Idirectory Add this directory to the list of -X directories searched for #include "..." and #include <...> -X commands. Note that there is no space between the -X "-I" and the directory string. More than one -I command -X is permitted. On non-Unix systems "directory" is forced -X to upper-case. -X .p -16 -X -N CPP normally predefines some symbols defining -X the target computer and operating system. If -N is specified, -X no symbols will be predefined. If -N -N is specified, the -X "always present" symbols, __LINE__, __FILE__, and __DATE__ -X are not defined. -X .p -16 -X -Stext CPP normally assumes that the size of -X the target computer's basic variable types is the same as the size -X of these types of the host computer. (This can be overridden -X when CPP is compiled, however.) The -S option allows dynamic -X respecification of these values. "text" is a string of -X numbers, separated by commas, that specifies correct sizes. -X The sizes must be specified in the exact order: -X -X char short int long float double -X -X If you specify the option as "-S*text", pointers to these -X types will be specified. -S* takes one additional argument -X for pointer to function (e.g. int (*)()) -X -X For example, to specify sizes appropriate for a PDP-11, -X you would write: -X -X c s i l f d func -X -S1,2,2,2,4,8, -X -S*2,2,2,2,2,2,2 -X -X Note that all values must be specified. -X .p -16 -X -Uname Undefine the name as if -X -X #undef name -X -X were given. On non-Unix systems, "name" will be forced to -X upper-case. -X .p -16 -X -Xnumber Enable debugging code. If no value is -X given, a value of 1 will be used. (For maintenence of -X CPP only.) -X .s.lm -16 -X -XPre-Defined Variables -X -X When CPP begins processing, the following variables will -X have been defined (unless the -N option is specified): -X .s -X Target computer (as appropriate): -X .s -X pdp11, vax, M68000 m68000 m68k -X .s -X Target operating system (as appropriate): -X .s -X rsx, rt11, vms, unix -X .s -X Target compiler (as appropriate): -X .s -X decus, vax11c -X .s -X The implementor may add definitions to this list. -X The default definitions match the definition of the -X host computer, operating system, and C compiler. -X .s -X The following are always available unless undefined (or -X -N was specified twice): -X .lm +16 -X .p -12 -X __FILE__ The input (or #include) file being compiled -X (as a quoted string). -X .p -12 -X __LINE__ The line number being compiled. -X .p -12 -X __DATE__ The date and time of compilation as -X a Unix ctime quoted string (the trailing newline is removed). -X Thus, -X .s -X printf("Bug at line %s,", __LINE__); -X printf(" source file %s", __FILE__); -X printf(" compiled on %s", __DATE__); -X .s.lm -16 -X -XDraft Proposed Ansi Standard Considerations -X -X The current version of the Draft Proposed Standard -X explicitly states that "readers are requested not to specify -X or claim conformance to this draft." Readers and users -X of Decus CPP should not assume that Decus CPP conforms -X to the standard, or that it will conform to the actual -X C Language Standard. -X -X When CPP is itself compiled, many features of the Draft -X Proposed Standard that are incompatible with existing -X preprocessors may be disabled. See the comments in CPP's -X source for details. -X -X The latest version of the Draft Proposed Standard (as reflected -X in Decus CPP) is dated November 12, 1984. -X -X Comments are removed from the input text. The comment -X is replaced by a single space character. The -C option -X preserves comments, writing them to the output file. -X -X The '$' character is considered to be a letter. This is -X a permitted extension. -X -X The following new features of C are processed by CPP: -X .s.comment Note: significant spaces, not tabs, .br quotes #if, #elif -X .br;####_#elif expression (_#else _#if) -X .br;####'_\xNNN' (Hexadecimal constant) -X .br;####'_\a' (Ascii BELL) -X .br;####'_\v' (Ascii Vertical Tab) -X .br;####_#if defined NAME 1 if defined, 0 if not -X .br;####_#if defined (NAME) 1 if defined, 0 if not -X .br;####_#if sizeof (basic type) -X .br;####unary + -X .br;####123U, 123LU Unsigned ints and longs. -X .br;####12.3L Long double numbers -X .br;####token_#token Token concatenation -X .br;####_#include token Expands to filename -X -X The Draft Proposed Standard has extended C, adding a constant -X string concatenation operator, where -X -X "foo" "bar" -X -X is regarded as the single string "foobar". (This does not -X affect CPP's processing but does permit a limited form of -X macro argument substitution into strings as will be discussed.) -X -X The Standard Committee plans to add token concatenation -X to #define command lines. One suggested implementation -X is as follows: the sequence "Token1#Token2" is treated -X as if the programmer wrote "Token1Token2". This could -X be used as follows: -X -X #line 123 -X #define ATLINE foo#__LINE__ -X -X ATLINE would be defined as foo123. -X -X Note that "Token2" must either have the format of an -X identifier or be a string of digits. Thus, the string -X -X #define ATLINE foo#1x3 -X -X generates two tokens: "foo1" and "x3". -X -X If the tokens T1 and T2 are concatenated into T3, -X this implementation operates as follows: -X -X 1. Expand T1 if it is a macro. -X 2. Expand T2 if it is a macro. -X 3. Join the tokens, forming T3. -X 4. Expand T3 if it is a macro. -X -X A macro formal parameter will be substituted into a string -X or character constant if it is the only component of that -X constant: -X -X #define VECSIZE 123 -X #define vprint(name, size) \ -X printf("name" "[" "size" "] = {\n") -X ... vprint(vector, VECSIZE); -X -X expands (effectively) to -X -X vprint("vector[123] = {\n"); -X -X Note that this will be useful if your C compiler supports -X the new string concatenation operation noted above. -X As implemented here, if you write -X -X #define string(arg) "arg" -X ... string("foo") ... -X -X This implementation generates "foo", rather than the strictly -X correct ""foo"" (which will probably generate an error message). -X This is, strictly speaking, an error in CPP and may be removed -X from future releases. -X -Xerror messages -X -X Many. CPP prints warning or error messages if you try to -X use multiple-byte character constants (non-transportable) -X if you #undef a symbol that was not defined, or if your -X program has potentially nested comments. -X -Xauthor -X -X Martin Minow -X -Xbugs -X -X The #if expression processor uses signed integers only. -X I.e, #if 0xFFFFu < 0 may be TRUE. -X -X#endif -X -X#include -X#include -X#include "cppdef.h" -X#include "cpp.h" -X -X/* -X * Commonly used global variables: -X * line is the current input line number. -X * wrongline is set in many places when the actual output -X * line is out of sync with the numbering, e.g, -X * when expanding a macro with an embedded newline. -X * -X * token holds the last identifier scanned (which might -X * be a candidate for macro expansion). -X * errors is the running cpp error counter. -X * infile is the head of a linked list of input files (extended by -X * #include and macros being expanded). infile always points -X * to the current file/macro. infile->parent to the includer, -X * etc. infile->fd is NULL if this input stream is a macro. -X */ -Xint line; /* Current line number */ -Xint wrongline; /* Force #line to compiler */ -Xchar token[IDMAX + 1]; /* Current input token */ -Xint errors; /* cpp error counter */ -XFILEINFO *infile = NULL; /* Current input file */ -X#if DEBUG -Xint debug; /* TRUE if debugging now */ -X#endif -X/* -X * This counter is incremented when a macro expansion is initiated. -X * If it exceeds a built-in value, the expansion stops -- this tests -X * for a runaway condition: -X * #define X Y -X * #define Y X -X * X -X * This can be disabled by falsifying rec_recover. (Nothing does this -X * currently: it is a hook for an eventual invocation flag.) -X */ -Xint recursion; /* Infinite recursion counter */ -Xint rec_recover = TRUE; /* Unwind recursive macros */ -X -X/* -X * instring is set TRUE when a string is scanned. It modifies the -X * behavior of the "get next character" routine, causing all characters -X * to be passed to the caller (except ). Note especially that -X * comments and \ are not removed from the source. (This -X * prevents cpp output lines from being arbitrarily long). -X * -X * inmacro is set by #define -- it absorbs comments and converts -X * form-feed and vertical-tab to space, but returns \ -X * to the caller. Strictly speaking, this is a bug as \ -X * shouldn't delimit tokens, but we'll worry about that some other -X * time -- it is more important to prevent infinitly long output lines. -X * -X * instring and inmarcor are parameters to the get() routine which -X * were made global for speed. -X */ -Xint instring = FALSE; /* TRUE if scanning string */ -Xint inmacro = FALSE; /* TRUE if #defining a macro */ -X -X/* -X * work[] and workp are used to store one piece of text in a temporay -X * buffer. To initialize storage, set workp = work. To store one -X * character, call save(c); (This will fatally exit if there isn't -X * room.) To terminate the string, call save(EOS). Note that -X * the work buffer is used by several subroutines -- be sure your -X * data won't be overwritten. The extra byte in the allocation is -X * needed for string formal replacement. -X */ -Xchar work[NWORK + 1]; /* Work buffer */ -Xchar *workp; /* Work buffer pointer */ -X -X/* -X * keepcomments is set TRUE by the -C option. If TRUE, comments -X * are written directly to the output stream. This is needed if -X * the output from cpp is to be passed to lint (which uses commands -X * embedded in comments). cflag contains the permanent state of the -X * -C flag. keepcomments is always falsified when processing #control -X * commands and when compilation is supressed by a false #if -X * -X * If eflag is set, CPP returns "success" even if non-fatal errors -X * were detected. -X * -X * If nflag is non-zero, no symbols are predefined except __LINE__. -X * __FILE__, and __DATE__. If nflag > 1, absolutely no symbols -X * are predefined. -X */ -Xint keepcomments = FALSE; /* Write out comments flag */ -Xint cflag = FALSE; /* -C option (keep comments) */ -Xint eflag = FALSE; /* -E option (never fail) */ -Xint nflag = 0; /* -N option (no predefines) */ -X -X/* -X * ifstack[] holds information about nested #if's. It is always -X * accessed via *ifptr. The information is as follows: -X * WAS_COMPILING state of compiling flag at outer level. -X * ELSE_SEEN set TRUE when #else seen to prevent 2nd #else. -X * TRUE_SEEN set TRUE when #if or #elif succeeds -X * ifstack[0] holds the compiling flag. It is TRUE if compilation -X * is currently enabled. Note that this must be initialized TRUE. -X */ -Xchar ifstack[BLK_NEST] = { TRUE }; /* #if information */ -Xchar *ifptr = ifstack; /* -> current ifstack[] */ -X -X/* -X * incdir[] stores the -i directories (and the system-specific -X * #include <...> directories. -X */ -Xchar *incdir[NINCLUDE]; /* -i directories */ -Xchar **incend = incdir; /* -> free space in incdir[] */ -X -X/* -X * This is the table used to predefine target machine and operating -X * system designators. It may need hacking for specific circumstances. -X * Note: it is not clear that this is part of the Ansi Standard. -X * The -N option supresses preset definitions. -X */ -Xchar *preset[] = { /* names defined at cpp start */ -X#ifdef MACHINE -X MACHINE, -X#endif -X#ifdef SYSTEM -X SYSTEM, -X#endif -X#ifdef COMPILER -X COMPILER, -X#endif -X#if DEBUG -X "decus_cpp", /* Ourselves! */ -X#endif -X NULL /* Must be last */ -X}; -X -X/* -X * The value of these predefined symbols must be recomputed whenever -X * they are evaluated. The order must not be changed. -X */ -Xchar *magic[] = { /* Note: order is important */ -X "__LINE__", -X "__FILE__", -X NULL /* Must be last */ -X}; -X -Xmain(argc, argv) -Xint argc; -Xchar *argv[]; -X{ -X register int i; -X -X#if HOST == SYS_VMS -X argc = getredirection(argc, argv); /* vms >file and stdin */ -X /* -X * Open input file, "-" means use stdin. -X */ -X if (!streq(argv[1], "-")) { -X if (freopen(argv[1], "r", stdin) == NULL) { -X perror(argv[1]); -X cerror("Can't open input file \"%s\"", argv[1]); -X exit(IO_ERROR); -X } -X strcpy(work, argv[1]); /* Remember input filename */ -X break; -X } /* Else, just get stdin */ -X case 0: /* No args? */ -X case 1: /* No files, stdin -> stdout */ -X#if HOST == SYS_UNIX -X work[0] = EOS; /* Unix can't find stdin name */ -X#else -X fgetname(stdin, work); /* Vax-11C, Decus C know name */ -X#endif -X break; -X -X default: -X exit(IO_ERROR); /* Can't happen */ -X } -X setincdirs(); /* Setup -I include directories */ -X addfile(stdin, work); /* "open" main input file */ -X#if DEBUG -X if (debug > 0) -X dumpdef("preset #define symbols"); -X#endif -X cppmain(); /* Process main file */ -X if ((i = (ifptr - &ifstack[0])) != 0) { -X#if OLD_PREPROCESSOR -X ciwarn("Inside #ifdef block at end of input, depth = %d", i); -X#else -X cierror("Inside #ifdef block at end of input, depth = %d", i); -X#endif -X } -X fclose(stdout); -X if (errors > 0) { -X fprintf(stderr, (errors == 1) -X ? "%d error in preprocessor\n" -X : "%d errors in preprocessor\n", errors); -X if (!eflag) -X exit(IO_ERROR); -X } -X exit(IO_NORMAL); /* No errors or -E option set */ -X} -X -XFILE_LOCAL -Xcppmain() -X/* -X * Main process for cpp -- copies tokens from the current input -X * stream (main file, include file, or a macro) to the output -X * file. -X */ -X{ -X register int c; /* Current character */ -X register int counter; /* newlines and spaces */ -X extern int output(); /* Output one character */ -X -X /* -X * Explicitly output a #line at the start of cpp output so -X * that lint (etc.) knows the name of the original source -X * file. If we don't do this explicitly, we may get -X * the name of the first #include file instead. -X */ -X sharp(); -X /* -X * This loop is started "from the top" at the beginning of each line -X * wrongline is set TRUE in many places if it is necessary to write -X * a #line record. (But we don't write them when expanding macros.) -X * -X * The counter variable has two different uses: at -X * the start of a line, it counts the number of blank lines that -X * have been skipped over. These are then either output via -X * #line records or by outputting explicit blank lines. -X * When expanding tokens within a line, the counter remembers -X * whether a blank/tab has been output. These are dropped -X * at the end of the line, and replaced by a single blank -X * within lines. -X */ -X for (;;) { -X counter = 0; /* Count empty lines */ -X for (;;) { /* For each line, ... */ -X while (type[(c = get())] == SPA) /* Skip leading blanks */ -X ; /* in this line. */ -X if (c == '\n') /* If line's all blank, */ -X ++counter; /* Do nothing now */ -X else if (c == '#') { /* Is 1st non-space '#' */ -X keepcomments = FALSE; /* Don't pass comments */ -X counter = control(counter); /* Yes, do a #command */ -X keepcomments = (cflag && compiling); -X } -X else if (c == EOF_CHAR) /* At end of file? */ -X break; -X else if (!compiling) { /* #ifdef false? */ -X skipnl(); /* Skip to newline */ -X counter++; /* Count it, too. */ -X } -X else { -X break; /* Actual token */ -X } -X } -X if (c == EOF_CHAR) /* Exit process at */ -X break; /* End of file */ -X /* -X * If the loop didn't terminate because of end of file, we -X * know there is a token to compile. First, clean up after -X * absorbing newlines. counter has the number we skipped. -X */ -X if ((wrongline && infile->fp != NULL) || counter > 4) -X sharp(); /* Output # line number */ -X else { /* If just a few, stuff */ -X while (--counter >= 0) /* them out ourselves */ -X putchar('\n'); -X } -X /* -X * Process each token on this line. -X */ -X unget(); /* Reread the char. */ -X for (;;) { /* For the whole line, */ -X do { /* Token concat. loop */ -X for (counter = 0; (type[(c = get())] == SPA);) { -X#if COMMENT_INVISIBLE -X if (c != COM_SEP) -X counter++; -X#else -X counter++; /* Skip over blanks */ -X#endif -X } -X if (c == EOF_CHAR || c == '\n') -X goto end_line; /* Exit line loop */ -X else if (counter > 0) /* If we got any spaces */ -X putchar(' '); /* Output one space */ -X c = macroid(c); /* Grab the token */ -X } while (type[c] == LET && catenate()); -X if (c == EOF_CHAR || c == '\n') /* From macro exp error */ -X goto end_line; /* Exit line loop */ -X switch (type[c]) { -X case LET: -X fputs(token, stdout); /* Quite ordinary token */ -X break; -X -X -X case DIG: /* Output a number */ -X case DOT: /* Dot may begin floats */ -X scannumber(c, output); -X break; -X -X case QUO: /* char or string const */ -X scanstring(c, output); /* Copy it to output */ -X break; -X -X default: /* Some other character */ -X cput(c); /* Just output it */ -X break; -X } /* Switch ends */ -X } /* Line for loop */ -Xend_line: if (c == '\n') { /* Compiling at EOL? */ -X putchar('\n'); /* Output newline, if */ -X if (infile->fp == NULL) /* Expanding a macro, */ -X wrongline = TRUE; /* Output # line later */ -X } -X } /* Continue until EOF */ -X} -X -Xoutput(c) -Xint c; -X/* -X * Output one character to stdout -- output() is passed as an -X * argument to scanstring() -X */ -X{ -X#if COMMENT_INVISIBLE -X if (c != TOK_SEP && c != COM_SEP) -X#else -X if (c != TOK_SEP) -X#endif -X putchar(c); -X} -X -Xstatic char *sharpfilename = NULL; -X -XFILE_LOCAL -Xsharp() -X/* -X * Output a line number line. -X */ -X{ -X register char *name; -X -X if (keepcomments) /* Make sure # comes on */ -X putchar('\n'); /* a fresh, new line. */ -X printf("#%s %d", LINE_PREFIX, line); -X if (infile->fp != NULL) { -X name = (infile->progname != NULL) -X ? infile->progname : infile->filename; -X if (sharpfilename == NULL -X || sharpfilename != NULL && !streq(name, sharpfilename)) { -X if (sharpfilename != NULL) -X free(sharpfilename); -X sharpfilename = savestring(name); -X printf(" \"%s\"", name); -X } -X } -X putchar('\n'); -X wrongline = FALSE; -X} -END-of-cpp1.c -echo x - cpp3.c -sed 's/^X//' >cpp3.c << 'END-of-cpp3.c' -X/* -X * C P P 3 . C -X * -X * File open and command line options -X * -X * Edit history -X * 13-Nov-84 MM Split from cpp1.c -X */ -X -X#include -X#include -X#include "cppdef.h" -X#include "cpp.h" -X#if DEBUG && (HOST == SYS_VMS || HOST == SYS_UNIX) -X#include -Xextern int abort(); /* For debugging */ -X#endif -X -Xint -Xopenfile(filename) -Xchar *filename; -X/* -X * Open a file, add it to the linked list of open files. -X * This is called only from openfile() above. -X */ -X{ -X register FILE *fp; -X -X if ((fp = fopen(filename, "r")) == NULL) { -X#if DEBUG -X perror(filename); -X#endif -X return (FALSE); -X } -X#if DEBUG -X if (debug) -X fprintf(stderr, "Reading from \"%s\"\n", filename); -X#endif -X addfile(fp, filename); -X return (TRUE); -X} -X -Xaddfile(fp, filename) -XFILE *fp; /* Open file pointer */ -Xchar *filename; /* Name of the file */ -X/* -X * Initialize tables for this open file. This is called from openfile() -X * above (for #include files), and from the entry to cpp to open the main -X * input file. It calls a common routine, getfile() to build the FILEINFO -X * structure which is used to read characters. (getfile() is also called -X * to setup a macro replacement.) -X */ -X{ -X register FILEINFO *file; -X extern FILEINFO *getfile(); -X -X file = getfile(NBUFF, filename); -X file->fp = fp; /* Better remember FILE * */ -X file->buffer[0] = EOS; /* Initialize for first read */ -X line = 1; /* Working on line 1 now */ -X wrongline = TRUE; /* Force out initial #line */ -X} -X -Xsetincdirs() -X/* -X * Append system-specific directories to the include directory list. -X * Called only when cpp is started. -X */ -X{ -X -X#ifdef CPP_INCLUDE -X *incend++ = CPP_INCLUDE; -X#define IS_INCLUDE 1 -X#else -X#define IS_INCLUDE 0 -X#endif -X -X#if HOST == SYS_UNIX -X *incend++ = "/usr/include"; -X#define MAXINCLUDE (NINCLUDE - 1 - IS_INCLUDE) -X#endif -X -X#if HOST == SYS_VMS -X extern char *getenv(); -X -X if (getenv("C$LIBRARY") != NULL) -X *incend++ = "C$LIBRARY:"; -X *incend++ = "SYS$LIBRARY:"; -X#define MAXINCLUDE (NINCLUDE - 2 - IS_INCLUDE) -X#endif -X -X#if HOST == SYS_RSX -X extern int $$rsts; /* TRUE on RSTS/E */ -X extern int $$pos; /* TRUE on PRO-350 P/OS */ -X extern int $$vms; /* TRUE on VMS compat. */ -X -X if ($$pos) { /* P/OS? */ -X *incend++ = "SY:[ZZDECUSC]"; /* C #includes */ -X *incend++ = "LB:[1,5]"; /* RSX library */ -X } -X else if ($$rsts) { /* RSTS/E? */ -X *incend++ = "SY:@"; /* User-defined account */ -X *incend++ = "C:"; /* Decus-C library */ -X *incend++ = "LB:[1,1]"; /* RSX library */ -X } -X else if ($$vms) { /* VMS compatibility? */ -X *incend++ = "C:"; -X } -X else { /* Plain old RSX/IAS */ -X *incend++ = "LB:[1,1]"; -X } -X#define MAXINCLUDE (NINCLUDE - 3 - IS_INCLUDE) -X#endif -X -X#if HOST == SYS_RT11 -X extern int $$rsts; /* RSTS/E emulation? */ -X -X if ($$rsts) -X *incend++ = "SY:@"; /* User-defined account */ -X *incend++ = "C:"; /* Decus-C library disk */ -X *incend++ = "SY:"; /* System (boot) disk */ -X#define MAXINCLUDE (NINCLUDE - 3 - IS_INCLUDE) -X#endif -X} -X -Xint -Xdooptions(argc, argv) -Xint argc; -Xchar *argv[]; -X/* -X * dooptions is called to process command line arguments (-Detc). -X * It is called only at cpp startup. -X */ -X{ -X register char *ap; -X register DEFBUF *dp; -X register int c; -X int i, j; -X char *arg; -X SIZES *sizp; /* For -S */ -X int size; /* For -S */ -X int isdatum; /* FALSE for -S* */ -X int endtest; /* For -S */ -X -X for (i = j = 1; i < argc; i++) { -X arg = ap = argv[i]; -X if (*ap++ != '-' || *ap == EOS) -X argv[j++] = argv[i]; -X else { -X c = *ap++; /* Option byte */ -X if (islower(c)) /* Normalize case */ -X c = toupper(c); -X switch (c) { /* Command character */ -X case 'C': /* Keep comments */ -X cflag = TRUE; -X keepcomments = TRUE; -X break; -X -X case 'D': /* Define symbol */ -X#if HOST != SYS_UNIX -X zap_uc(ap); /* Force define to U.C. */ -X#endif -X /* -X * If the option is just "-Dfoo", make it -Dfoo=1 -X */ -X while (*ap != EOS && *ap != '=') -X ap++; -X if (*ap == EOS) -X ap = "1"; -X else -X *ap++ = EOS; -X /* -X * Now, save the word and its definition. -X */ -X dp = defendel(argv[i] + 2, FALSE); -X dp->repl = savestring(ap); -X dp->nargs = DEF_NOARGS; -X break; -X -X case 'E': /* Ignore non-fatal */ -X eflag = TRUE; /* errors. */ -X break; -X -X case 'I': /* Include directory */ -X if (incend >= &incdir[MAXINCLUDE]) -X cfatal("Too many include directories", NULLST); -X *incend++ = ap; -X break; -X -X case 'N': /* No predefineds */ -X nflag++; /* Repeat to undefine */ -X break; /* __LINE__, etc. */ -X -X case 'S': -X sizp = size_table; -X if (isdatum = (*ap != '*')) /* If it's just -S, */ -X endtest = T_FPTR; /* Stop here */ -X else { /* But if it's -S* */ -X ap++; /* Step over '*' */ -X endtest = 0; /* Stop at end marker */ -X } -X while (sizp->bits != endtest && *ap != EOS) { -X if (!isdigit(*ap)) { /* Skip to next digit */ -X ap++; -X continue; -X } -X size = 0; /* Compile the value */ -X while (isdigit(*ap)) { -X size *= 10; -X size += (*ap++ - '0'); -X } -X if (isdatum) -X sizp->size = size; /* Datum size */ -X else -X sizp->psize = size; /* Pointer size */ -X sizp++; -X } -X if (sizp->bits != endtest) -X cwarn("-S, too few values specified in %s", argv[i]); -X else if (*ap != EOS) -X cwarn("-S, too many values, \"%s\" unused", ap); -X break; -X -X case 'U': /* Undefine symbol */ -X#if HOST != SYS_UNIX -X zap_uc(ap); -X#endif -X if (defendel(ap, TRUE) == NULL) -X cwarn("\"%s\" wasn't defined", ap); -X break; -X -X#if DEBUG -X case 'X': /* Debug */ -X debug = (isdigit(*ap)) ? atoi(ap) : 1; -X#if (HOST == SYS_VMS || HOST == SYS_UNIX) -X signal(SIGINT, abort); /* Trap "interrupt" */ -X#endif -X fprintf(stderr, "Debug set to %d\n", debug); -X break; -X#endif -X -X default: /* What is this one? */ -X cwarn("Unknown option \"%s\"", arg); -X fprintf(stderr, "The following options are valid:\n\ -X -C\t\t\tWrite source file comments to output\n\ -X -Dsymbol=value\tDefine a symbol with the given (optional) value\n\ -X -Idirectory\t\tAdd a directory to the #include search list\n\ -X -N\t\t\tDon't predefine target-specific names\n\ -X -Stext\t\tSpecify sizes for #if sizeof\n\ -X -Usymbol\t\tUndefine symbol\n"); -X#if DEBUG -X fprintf(stderr, " -Xvalue\t\tSet internal debug flag\n"); -X#endif -X break; -X } /* Switch on all options */ -X } /* If it's a -option */ -X } /* For all arguments */ -X if (j > 3) { -X cerror( -X "Too many file arguments. Usage: cpp [input [output]]", -X NULLST); -X } -X return (j); /* Return new argc */ -X} -X -X#if HOST != SYS_UNIX -XFILE_LOCAL -Xzap_uc(ap) -Xregister char *ap; -X/* -X * Dec operating systems mangle upper-lower case in command lines. -X * This routine forces the -D and -U arguments to uppercase. -X * It is called only on cpp startup by dooptions(). -X */ -X{ -X while (*ap != EOS) { -X /* -X * Don't use islower() here so it works with Multinational -X */ -X if (*ap >= 'a' && *ap <= 'z') -X *ap = toupper(*ap); -X ap++; -X } -X} -X#endif -X -Xinitdefines() -X/* -X * Initialize the built-in #define's. There are two flavors: -X * #define decus 1 (static definitions) -X * #define __FILE__ ?? (dynamic, evaluated by magic) -X * Called only on cpp startup. -X * -X * Note: the built-in static definitions are supressed by the -N option. -X * __LINE__, __FILE__, and __DATE__ are always present. -X */ -X{ -X register char **pp; -X register char *tp; -X register DEFBUF *dp; -X int i; -X long tvec; -X extern char *ctime(); -X -X /* -X * Predefine the built-in symbols. Allow the -X * implementor to pre-define a symbol as "" to -X * eliminate it. -X */ -X if (nflag == 0) { -X for (pp = preset; *pp != NULL; pp++) { -X if (*pp[0] != EOS) { -X dp = defendel(*pp, FALSE); -X dp->repl = savestring("1"); -X dp->nargs = DEF_NOARGS; -X } -X } -X } -X /* -X * The magic pre-defines (__FILE__ and __LINE__ are -X * initialized with negative argument counts. expand() -X * notices this and calls the appropriate routine. -X * DEF_NOARGS is one greater than the first "magic" definition. -X */ -X if (nflag < 2) { -X for (pp = magic, i = DEF_NOARGS; *pp != NULL; pp++) { -X dp = defendel(*pp, FALSE); -X dp->nargs = --i; -X } -X#if OK_DATE -X /* -X * Define __DATE__ as today's date. -X */ -X dp = defendel("__DATE__", FALSE); -X dp->repl = tp = getmem(27); -X dp->nargs = DEF_NOARGS; -X time(&tvec); -X *tp++ = '"'; -X strcpy(tp, ctime(&tvec)); -X tp[24] = '"'; /* Overwrite newline */ -X#endif -X } -X} -X -X#if HOST == SYS_VMS -X/* -X * getredirection() is intended to aid in porting C programs -X * to VMS (Vax-11 C) which does not support '>' and '<' -X * I/O redirection. With suitable modification, it may -X * useful for other portability problems as well. -X */ -X -Xint -Xgetredirection(argc, argv) -Xint argc; -Xchar **argv; -X/* -X * Process vms redirection arg's. Exit if any error is seen. -X * If getredirection() processes an argument, it is erased -X * from the vector. getredirection() returns a new argc value. -X * -X * Warning: do not try to simplify the code for vms. The code -X * presupposes that getredirection() is called before any data is -X * read from stdin or written to stdout. -X * -X * Normal usage is as follows: -X * -X * main(argc, argv) -X * int argc; -X * char *argv[]; -X * { -X * argc = getredirection(argc, argv); -X * } -X */ -X{ -X register char *ap; /* Argument pointer */ -X int i; /* argv[] index */ -X int j; /* Output index */ -X int file; /* File_descriptor */ -X extern int errno; /* Last vms i/o error */ -X -X for (j = i = 1; i < argc; i++) { /* Do all arguments */ -X switch (*(ap = argv[i])) { -X case '<': /* ': /* >file or >>file */ -X if (*++ap == '>') { /* >>file */ -X /* -X * If the file exists, and is writable by us, -X * call freopen to append to the file (using the -X * file's current attributes). Otherwise, create -X * a new file with "vanilla" attributes as if the -X * argument was given as ">filename". -X * access(name, 2) returns zero if we can write on -X * the specified file. -X */ -X if (access(++ap, 2) == 0) { -X if (freopen(ap, "a", stdout) != NULL) -X break; /* Exit case statement */ -X perror(ap); /* Error, can't append */ -X exit(errno); /* After access test */ -X } /* If file accessable */ -X } -X /* -X * On vms, we want to create the file using "standard" -X * record attributes. creat(...) creates the file -X * using the caller's default protection mask and -X * "variable length, implied carriage return" -X * attributes. dup2() associates the file with stdout. -X */ -X if ((file = creat(ap, 0, "rat=cr", "rfm=var")) == -1 -X || dup2(file, fileno(stdout)) == -1) { -X perror(ap); /* Can't create file */ -X exit(errno); /* is a fatal error */ -X } /* If '>' creation */ -X break; /* Exit case test */ -X -X default: -X argv[j++] = ap; /* Not a redirector */ -X break; /* Exit case test */ -X } -X } /* For all arguments */ -X argv[j] = NULL; /* Terminate argv[] */ -X return (j); /* Return new argc */ -X} -X#endif -X -X -X -END-of-cpp3.c -echo x - cpp4.c -sed 's/^X//' >cpp4.c << 'END-of-cpp4.c' -X/* -X * C P P 4 . C -X * M a c r o D e f i n i t i o n s -X * -X * Edit History -X * 31-Aug-84 MM USENET net.sources release -X * 04-Oct-84 MM __LINE__ and __FILE__ must call ungetstring() -X * so they work correctly with token concatenation. -X * Added string formal recognition. -X * 25-Oct-84 MM "Short-circuit" evaluate #if's so that we -X * don't print unnecessary error messages for -X * #if !defined(FOO) && FOO != 0 && 10 / FOO ... -X * 31-Oct-84 ado/MM Added token concatenation -X * 6-Nov-84 MM Split off eval stuff -X */ -X -X#include -X#include -X#include "cppdef.h" -X#include "cpp.h" -X/* -X * parm[], parmp, and parlist[] are used to store #define() argument -X * lists. nargs contains the actual number of parameters stored. -X */ -Xstatic char parm[NPARMWORK + 1]; /* define param work buffer */ -Xstatic char *parmp; /* Free space in parm */ -Xstatic char *parlist[LASTPARM]; /* -> start of each parameter */ -Xstatic int nargs; /* Parameters for this macro */ -X -Xdodefine() -X/* -X * Called from control when a #define is scanned. This module -X * parses formal parameters and the replacement string. When -X * the formal parameter name is encountered in the replacement -X * string, it is replaced by a character in the range 128 to -X * 128+NPARAM (this allows up to 32 parameters within the -X * Dec Multinational range). If cpp is ported to an EBCDIC -X * machine, you will have to make other arrangements. -X * -X * There is some special case code to distinguish -X * #define foo bar -X * from #define foo() bar -X * -X * Also, we make sure that -X * #define foo foo -X * expands to "foo" but doesn't put cpp into an infinite loop. -X * -X * A warning message is printed if you redefine a symbol to a -X * different text. I.e, -X * #define foo 123 -X * #define foo 123 -X * is ok, but -X * #define foo 123 -X * #define foo +123 -X * is not. -X * -X * The following subroutines are called from define(): -X * checkparm called when a token is scanned. It checks through the -X * array of formal parameters. If a match is found, the -X * token is replaced by a control byte which will be used -X * to locate the parameter when the macro is expanded. -X * textput puts a string in the macro work area (parm[]), updating -X * parmp to point to the first free byte in parm[]. -X * textput() tests for work buffer overflow. -X * charput puts a single character in the macro work area (parm[]) -X * in a manner analogous to textput(). -X */ -X{ -X register int c; -X register DEFBUF *dp; /* -> new definition */ -X int isredefine; /* TRUE if redefined */ -X char *old; /* Remember redefined */ -X extern int save(); /* Save char in work[] */ -X -X if (type[(c = skipws())] != LET) -X goto bad_define; -X isredefine = FALSE; /* Set if redefining */ -X if ((dp = lookid(c)) == NULL) /* If not known now */ -X dp = defendel(token, FALSE); /* Save the name */ -X else { /* It's known: */ -X isredefine = TRUE; /* Remember this fact */ -X old = dp->repl; /* Remember replacement */ -X dp->repl = NULL; /* No replacement now */ -X } -X parlist[0] = parmp = parm; /* Setup parm buffer */ -X if ((c = get()) == '(') { /* With arguments? */ -X nargs = 0; /* Init formals counter */ -X do { /* Collect formal parms */ -X if (nargs >= LASTPARM) -X cfatal("Too many arguments for macro", NULLST); -X else if ((c = skipws()) == ')') -X break; /* Got them all */ -X else if (type[c] != LET) /* Bad formal syntax */ -X goto bad_define; -X scanid(c); /* Get the formal param */ -X parlist[nargs++] = parmp; /* Save its start */ -X textput(token); /* Save text in parm[] */ -X } while ((c = skipws()) == ','); /* Get another argument */ -X if (c != ')') /* Must end at ) */ -X goto bad_define; -X c = ' '; /* Will skip to body */ -X } -X else { -X /* -X * DEF_NOARGS is needed to distinguish between -X * "#define foo" and "#define foo()". -X */ -X nargs = DEF_NOARGS; /* No () parameters */ -X } -X if (type[c] == SPA) /* At whitespace? */ -X c = skipws(); /* Not any more. */ -X workp = work; /* Replacement put here */ -X inmacro = TRUE; /* Keep \ now */ -X while (c != EOF_CHAR && c != '\n') { /* Compile macro body */ -X#if OK_CONCAT -X if (c == '#') { /* Token concatenation? */ -X while (workp > work && type[workp[-1]] == SPA) -X --workp; /* Erase leading spaces */ -X save(TOK_SEP); /* Stuff a delimiter */ -X c = skipws(); /* Eat whitespace */ -X if (type[c] == LET) /* Another token here? */ -X ; /* Stuff it normally */ -X else if (type[c] == DIG) { /* Digit string after? */ -X while (type[c] == DIG) { /* Stuff the digits */ -X save(c); -X c = get(); -X } -X save(TOK_SEP); /* Delimit 2nd token */ -X } -X else { -X ciwarn("Strange character after # (%d.)", c); -X } -X continue; -X } -X#endif -X switch (type[c]) { -X case LET: -X checkparm(c, dp); /* Might be a formal */ -X break; -X -X case DIG: /* Number in mac. body */ -X case DOT: /* Maybe a float number */ -X scannumber(c, save); /* Scan it off */ -X break; -X -X case QUO: /* String in mac. body */ -X#if STRING_FORMAL -X stparmscan(c, dp); /* Do string magic */ -X#else -X stparmscan(c); -X#endif -X break; -X -X case BSH: /* Backslash */ -X save('\\'); -X if ((c = get()) == '\n') -X wrongline = TRUE; -X save(c); -X break; -X -X case SPA: /* Absorb whitespace */ -X /* -X * Note: the "end of comment" marker is passed on -X * to allow comments to separate tokens. -X */ -X if (workp[-1] == ' ') /* Absorb multiple */ -X break; /* spaces */ -X else if (c == '\t') -X c = ' '; /* Normalize tabs */ -X /* Fall through to store character */ -X default: /* Other character */ -X save(c); -X break; -X } -X c = get(); -X } -X inmacro = FALSE; /* Stop newline hack */ -X unget(); /* For control check */ -X if (workp > work && workp[-1] == ' ') /* Drop trailing blank */ -X workp--; -X *workp = EOS; /* Terminate work */ -X dp->repl = savestring(work); /* Save the string */ -X dp->nargs = nargs; /* Save arg count */ -X#if DEBUG -X if (debug) -X dumpadef("macro definition", dp); -X#endif -X if (isredefine) { /* Error if redefined */ -X if ((old != NULL && dp->repl != NULL && !streq(old, dp->repl)) -X || (old == NULL && dp->repl != NULL) -X || (old != NULL && dp->repl == NULL)) { -X cerror("Redefining defined variable \"%s\"", dp->name); -X } -X if (old != NULL) /* We don't need the */ -X free(old); /* old definition now. */ -X } -X return; -X -Xbad_define: -X cerror("#define syntax error", NULLST); -X inmacro = FALSE; /* Stop hack */ -X} -X -Xcheckparm(c, dp) -Xregister int c; -XDEFBUF *dp; -X/* -X * Replace this param if it's defined. Note that the macro name is a -X * possible replacement token. We stuff DEF_MAGIC in front of the token -X * which is treated as a LETTER by the token scanner and eaten by -X * the output routine. This prevents the macro expander from -X * looping if someone writes "#define foo foo". -X */ -X{ -X register int i; -X register char *cp; -X -X scanid(c); /* Get parm to token[] */ -X for (i = 0; i < nargs; i++) { /* For each argument */ -X if (streq(parlist[i], token)) { /* If it's known */ -X save(i + MAC_PARM); /* Save a magic cookie */ -X return; /* And exit the search */ -X } -X } -X if (streq(dp->name, token)) /* Macro name in body? */ -X save(DEF_MAGIC); /* Save magic marker */ -X for (cp = token; *cp != EOS;) /* And save */ -X save(*cp++); /* The token itself */ -X} -X -X#if STRING_FORMAL -Xstparmscan(delim, dp) -Xint delim; -Xregister DEFBUF *dp; -X/* -X * Scan the string (starting with the given delimiter). -X * The token is replaced if it is the only text in this string or -X * character constant. The algorithm follows checkparm() above. -X * Note that scanstring() has approved of the string. -X */ -X{ -X register int c; -X -X /* -X * Warning -- this code hasn't been tested for a while. -X * It exists only to preserve compatibility with earlier -X * implementations of cpp. It is not part of the Draft -X * ANSI Standard C language. -X */ -X save(delim); -X instring = TRUE; -X while ((c = get()) != delim -X && c != '\n' -X && c != EOF_CHAR) { -X if (type[c] == LET) /* Maybe formal parm */ -X checkparm(c, dp); -X else { -X save(c); -X if (c == '\\') -X save(get()); -X } -X } -X instring = FALSE; -X if (c != delim) -X cerror("Unterminated string in macro body", NULLST); -X save(c); -X} -X#else -Xstparmscan(delim) -Xint delim; -X/* -X * Normal string parameter scan. -X */ -X{ -X register char *wp; -X register int i; -X extern int save(); -X -X wp = workp; /* Here's where it starts */ -X if (!scanstring(delim, save)) -X return; /* Exit on scanstring error */ -X workp[-1] = EOS; /* Erase trailing quote */ -X wp++; /* -> first string content byte */ -X for (i = 0; i < nargs; i++) { -X if (streq(parlist[i], wp)) { -X *wp++ = MAC_PARM + PAR_MAC; /* Stuff a magic marker */ -X *wp++ = (i + MAC_PARM); /* Make a formal marker */ -X *wp = wp[-3]; /* Add on closing quote */ -X workp = wp + 1; /* Reset string end */ -X return; -X } -X } -X workp[-1] = wp[-1]; /* Nope, reset end quote. */ -X} -X#endif -X -Xdoundef() -X/* -X * Remove the symbol from the defined list. -X * Called from the #control processor. -X */ -X{ -X register int c; -X -X if (type[(c = skipws())] != LET) -X cerror("Illegal #undef argument", NULLST); -X else { -X scanid(c); /* Get name to token[] */ -X if (defendel(token, TRUE) == NULL) { -X cwarn("Symbol \"%s\" not defined in #undef", token); -X } -X } -X} -X -Xtextput(text) -Xchar *text; -X/* -X * Put the string in the parm[] buffer. -X */ -X{ -X register int size; -X -X size = strlen(text) + 1; -X if ((parmp + size) >= &parm[NPARMWORK]) -X cfatal("Macro work area overflow", NULLST); -X else { -X strcpy(parmp, text); -X parmp += size; -X } -X} -X -Xcharput(c) -Xregister int c; -X/* -X * Put the byte in the parm[] buffer. -X */ -X{ -X if (parmp >= &parm[NPARMWORK]) -X cfatal("Macro work area overflow", NULLST); -X else { -X *parmp++ = c; -X } -X} -X -X/* -X * M a c r o E x p a n s i o n -X */ -X -Xstatic DEFBUF *macro; /* Catches start of infinite macro */ -X -Xexpand(tokenp) -Xregister DEFBUF *tokenp; -X/* -X * Expand a macro. Called from the cpp mainline routine (via subroutine -X * macroid()) when a token is found in the symbol table. It calls -X * expcollect() to parse actual parameters, checking for the correct number. -X * It then creates a "file" containing a single line containing the -X * macro with actual parameters inserted appropriately. This is -X * "pushed back" onto the input stream. (When the get() routine runs -X * off the end of the macro line, it will dismiss the macro itself.) -X */ -X{ -X register int c; -X register FILEINFO *file; -X extern FILEINFO *getfile(); -X -X#if DEBUG -X if (debug) -X dumpadef("expand entry", tokenp); -X#endif -X /* -X * If no macro is pending, save the name of this macro -X * for an eventual error message. -X */ -X if (recursion++ == 0) -X macro = tokenp; -X else if (recursion == RECURSION_LIMIT) { -X cerror("Recursive macro definition of \"%s\"", tokenp->name); -X fprintf(stderr, "(Defined by \"%s\")\n", macro->name); -X if (rec_recover) { -X do { -X c = get(); -X } while (infile != NULL && infile->fp == NULL); -X unget(); -X recursion = 0; -X return; -X } -X } -X /* -X * Here's a macro to expand. -X */ -X nargs = 0; /* Formals counter */ -X parmp = parm; /* Setup parm buffer */ -X switch (tokenp->nargs) { -X case (-2): /* __LINE__ */ -X sprintf(work, "%d", line); -X ungetstring(work); -X break; -X -X case (-3): /* __FILE__ */ -X for (file = infile; file != NULL; file = file->parent) { -X if (file->fp != NULL) { -X sprintf(work, "\"%s\"", (file->progname != NULL) -X ? file->progname : file->filename); -X ungetstring(work); -X break; -X } -X } -X break; -X -X default: -X /* -X * Nothing funny about this macro. -X */ -X if (tokenp->nargs < 0) -X cfatal("Bug: Illegal __ macro \"%s\"", tokenp->name); -X while ((c = skipws()) == '\n') /* Look for (, skipping */ -X wrongline = TRUE; /* spaces and newlines */ -X if (c != '(') { -X /* -X * If the programmer writes -X * #define foo() ... -X * ... -X * foo [no ()] -X * just write foo to the output stream. -X */ -X unget(); -X cwarn("Macro \"%s\" needs arguments", tokenp->name); -X fputs(tokenp->name, stdout); -X return; -X } -X else if (expcollect()) { /* Collect arguments */ -X if (tokenp->nargs != nargs) { /* Should be an error? */ -X cwarn("Wrong number of macro arguments for \"%s\"", -X tokenp->name); -X } -X#if DEBUG -X if (debug) -X dumpparm("expand"); -X#endif -X } /* Collect arguments */ -X case DEF_NOARGS: /* No parameters just stuffs */ -X expstuff(tokenp); /* Do actual parameters */ -X } /* nargs switch */ -X} -X -XFILE_LOCAL int -Xexpcollect() -X/* -X * Collect the actual parameters for this macro. TRUE if ok. -X */ -X{ -X register int c; -X register int paren; /* For embedded ()'s */ -X extern int charput(); -X -X for (;;) { -X paren = 0; /* Collect next arg. */ -X while ((c = skipws()) == '\n') /* Skip over whitespace */ -X wrongline = TRUE; /* and newlines. */ -X if (c == ')') { /* At end of all args? */ -X /* -X * Note that there is a guard byte in parm[] -X * so we don't have to check for overflow here. -X */ -X *parmp = EOS; /* Make sure terminated */ -X break; /* Exit collection loop */ -X } -X else if (nargs >= LASTPARM) -X cfatal("Too many arguments in macro expansion", NULLST); -X parlist[nargs++] = parmp; /* At start of new arg */ -X for (;; c = cget()) { /* Collect arg's bytes */ -X if (c == EOF_CHAR) { -X cerror("end of file within macro argument", NULLST); -X return (FALSE); /* Sorry. */ -X } -X else if (c == '\\') { /* Quote next character */ -X charput(c); /* Save the \ for later */ -X charput(cget()); /* Save the next char. */ -X continue; /* And go get another */ -X } -X else if (type[c] == QUO) { /* Start of string? */ -X scanstring(c, charput); /* Scan it off */ -X continue; /* Go get next char */ -X } -X else if (c == '(') /* Worry about balance */ -X paren++; /* To know about commas */ -X else if (c == ')') { /* Other side too */ -X if (paren == 0) { /* At the end? */ -X unget(); /* Look at it later */ -X break; /* Exit arg getter. */ -X } -X paren--; /* More to come. */ -X } -X else if (c == ',' && paren == 0) /* Comma delimits args */ -X break; -X else if (c == '\n') /* Newline inside arg? */ -X wrongline = TRUE; /* We'll need a #line */ -X charput(c); /* Store this one */ -X } /* Collect an argument */ -X charput(EOS); /* Terminate argument */ -X#if DEBUG -X if (debug) -X printf("parm[%d] = \"%s\"\n", nargs, parlist[nargs - 1]); -X#endif -X } /* Collect all args. */ -X return (TRUE); /* Normal return */ -X} -X -XFILE_LOCAL -Xexpstuff(tokenp) -XDEFBUF *tokenp; /* Current macro being expanded */ -X/* -X * Stuff the macro body, replacing formal parameters by actual parameters. -X */ -X{ -X register int c; /* Current character */ -X register char *inp; /* -> repl string */ -X register char *defp; /* -> macro output buff */ -X int size; /* Actual parm. size */ -X char *defend; /* -> output buff end */ -X int string_magic; /* String formal hack */ -X FILEINFO *file; /* Funny #include */ -X extern FILEINFO *getfile(); -X -X file = getfile(NBUFF, tokenp->name); -X inp = tokenp->repl; /* -> macro replacement */ -X defp = file->buffer; /* -> output buffer */ -X defend = defp + (NBUFF - 1); /* Note its end */ -X if (inp != NULL) { -X while ((c = (*inp++ & 0xFF)) != EOS) { -X if (c >= MAC_PARM && c <= (MAC_PARM + PAR_MAC)) { -X string_magic = (c == (MAC_PARM + PAR_MAC)); -X if (string_magic) -X c = (*inp++ & 0xFF); -X /* -X * Replace formal parameter by actual parameter string. -X */ -X if ((c -= MAC_PARM) < nargs) { -X size = strlen(parlist[c]); -X if ((defp + size) >= defend) -X goto nospace; -X /* -X * Erase the extra set of quotes. -X */ -X if (string_magic && defp[-1] == parlist[c][0]) { -X strcpy(defp-1, parlist[c]); -X defp += (size - 2); -X } -X else { -X strcpy(defp, parlist[c]); -X defp += size; -X } -X } -X } -X else if (defp >= defend) { -Xnospace: cfatal("Out of space in macro \"%s\" arg expansion", -X tokenp->name); -X } -X else { -X *defp++ = c; -X } -X } -X } -X *defp = EOS; -X#if DEBUG -X if (debug > 1) -X printf("macroline: \"%s\"\n", file->buffer); -X#endif -X} -X -X#if DEBUG -Xdumpparm(why) -Xchar *why; -X/* -X * Dump parameter list. -X */ -X{ -X register int i; -X -X printf("dump of %d parameters (%d bytes total) %s\n", -X nargs, parmp - parm, why); -X for (i = 0; i < nargs; i++) { -X printf("parm[%d] (%d) = \"%s\"\n", -X i + 1, strlen(parlist[i]), parlist[i]); -X } -X} -X#endif -END-of-cpp4.c -exit diff --git a/sys/unix/cpp3.shr b/sys/unix/cpp3.shr deleted file mode 100644 index d437d3693..000000000 --- a/sys/unix/cpp3.shr +++ /dev/null @@ -1,1901 +0,0 @@ -# This is a shell archive. Save it in a file, remove anything before -# this line, and then unpack it by entering "sh file". Note, it may -# create directories; files and directories will be owned by you and -# have default permissions. -# -# This archive contains: -# -# cpp5.c -# cpp6.c -# -echo x - cpp5.c -sed 's/^X//' >cpp5.c << 'END-of-cpp5.c' -X/* -X * C P P 5 . C -X * E x p r e s s i o n E v a l u a t i o n -X * -X * Edit History -X * 31-Aug-84 MM USENET net.sources release -X * 04-Oct-84 MM __LINE__ and __FILE__ must call ungetstring() -X * so they work correctly with token concatenation. -X * Added string formal recognition. -X * 25-Oct-84 MM "Short-circuit" evaluate #if's so that we -X * don't print unnecessary error messages for -X * #if !defined(FOO) && FOO != 0 && 10 / FOO ... -X * 31-Oct-84 ado/MM Added token concatenation -X * 6-Nov-84 MM Split from #define stuff, added sizeof stuff -X * 19-Nov-84 ado #if error returns TRUE for (sigh) compatibility -X */ -X -X#include -X#include -X#include "cppdef.h" -X#include "cpp.h" -X -X/* -X * Evaluate an #if expression. -X */ -X -Xstatic char *opname[] = { /* For debug and error messages */ -X"end of expression", "val", "id", -X "+", "-", "*", "/", "%", -X "<<", ">>", "&", "|", "^", -X "==", "!=", "<", "<=", ">=", ">", -X "&&", "||", "?", ":", ",", -X "unary +", "unary -", "~", "!", "(", ")", "(none)", -X}; -X -X/* -X * opdope[] has the operator precedence: -X * Bits -X * 7 Unused (so the value is always positive) -X * 6-2 Precedence (000x .. 017x) -X * 1-0 Binary op. flags: -X * 01 The binop flag should be set/cleared when this op is seen. -X * 10 The new value of the binop flag. -X * Note: Expected, New binop -X * constant 0 1 Binop, end, or ) should follow constants -X * End of line 1 0 End may not be preceeded by an operator -X * binary 1 0 Binary op follows a value, value follows. -X * unary 0 0 Unary op doesn't follow a value, value follows -X * ( 0 0 Doesn't follow value, value or unop follows -X * ) 1 1 Follows value. Op follows. -X */ -X -Xstatic char opdope[OP_MAX] = { -X 0001, /* End of expression */ -X 0002, /* Digit */ -X 0000, /* Letter (identifier) */ -X 0141, 0141, 0151, 0151, 0151, /* ADD, SUB, MUL, DIV, MOD */ -X 0131, 0131, 0101, 0071, 0071, /* ASL, ASR, AND, OR, XOR */ -X 0111, 0111, 0121, 0121, 0121, 0121, /* EQ, NE, LT, LE, GE, GT */ -X 0061, 0051, 0041, 0041, 0031, /* ANA, ORO, QUE, COL, CMA */ -X/* -X * Unary op's follow -X */ -X 0160, 0160, 0160, 0160, /* NEG, PLU, COM, NOT */ -X 0170, 0013, 0023, /* LPA, RPA, END */ -X}; -X/* -X * OP_QUE and OP_RPA have alternate precedences: -X */ -X#define OP_RPA_PREC 0013 -X#define OP_QUE_PREC 0034 -X -X/* -X * S_ANDOR and S_QUEST signal "short-circuit" boolean evaluation, so that -X * #if FOO != 0 && 10 / FOO ... -X * doesn't generate an error message. They are stored in optab.skip. -X */ -X#define S_ANDOR 2 -X#define S_QUEST 1 -X -Xtypedef struct optab { -X char op; /* Operator */ -X char prec; /* Its precedence */ -X char skip; /* Short-circuit: TRUE to skip */ -X} OPTAB; -Xstatic int evalue; /* Current value from evallex() */ -X -X#ifdef nomacargs -XFILE_LOCAL int -Xisbinary(op) -Xregister int op; -X{ -X return (op >= FIRST_BINOP && op <= LAST_BINOP); -X} -X -XFILE_LOCAL int -Xisunary(op) -Xregister int op; -X{ -X return (op >= FIRST_UNOP && op <= LAST_UNOP); -X} -X#else -X#define isbinary(op) (op >= FIRST_BINOP && op <= LAST_BINOP) -X#define isunary(op) (op >= FIRST_UNOP && op <= LAST_UNOP) -X#endif -X -X/* -X * The following definitions are used to specify basic variable sizes. -X */ -X -X#ifndef S_CHAR -X#define S_CHAR (sizeof (char)) -X#endif -X#ifndef S_SINT -X#define S_SINT (sizeof (short int)) -X#endif -X#ifndef S_INT -X#define S_INT (sizeof (int)) -X#endif -X#ifndef S_LINT -X#define S_LINT (sizeof (long int)) -X#endif -X#ifndef S_FLOAT -X#define S_FLOAT (sizeof (float)) -X#endif -X#ifndef S_DOUBLE -X#define S_DOUBLE (sizeof (double)) -X#endif -X#ifndef S_PCHAR -X#define S_PCHAR (sizeof (char *)) -X#endif -X#ifndef S_PSINT -X#define S_PSINT (sizeof (short int *)) -X#endif -X#ifndef S_PINT -X#define S_PINT (sizeof (int *)) -X#endif -X#ifndef S_PLINT -X#define S_PLINT (sizeof (long int *)) -X#endif -X#ifndef S_PFLOAT -X#define S_PFLOAT (sizeof (float *)) -X#endif -X#ifndef S_PDOUBLE -X#define S_PDOUBLE (sizeof (double *)) -X#endif -X#ifndef S_PFPTR -X#define S_PFPTR (sizeof (int (*)())) -X#endif -X -Xtypedef struct types { -X short type; /* This is the bit if */ -X char *name; /* this is the token word */ -X} TYPES; -X -Xstatic TYPES basic_types[] = { -X { T_CHAR, "char", }, -X { T_INT, "int", }, -X { T_FLOAT, "float", }, -X { T_DOUBLE, "double", }, -X { T_SHORT, "short", }, -X { T_LONG, "long", }, -X { T_SIGNED, "signed", }, -X { T_UNSIGNED, "unsigned", }, -X { 0, NULL, }, /* Signal end */ -X}; -X -X/* -X * Test_table[] is used to test for illegal combinations. -X */ -Xstatic short test_table[] = { -X T_FLOAT | T_DOUBLE | T_LONG | T_SHORT, -X T_FLOAT | T_DOUBLE | T_CHAR | T_INT, -X T_FLOAT | T_DOUBLE | T_SIGNED | T_UNSIGNED, -X T_LONG | T_SHORT | T_CHAR, -X 0 /* end marker */ -X}; -X -X/* -X * The order of this table is important -- it is also referenced by -X * the command line processor to allow run-time overriding of the -X * built-in size values. The order must not be changed: -X * char, short, int, long, float, double (func pointer) -X */ -XSIZES size_table[] = { -X { T_CHAR, S_CHAR, S_PCHAR }, /* char */ -X { T_SHORT, S_SINT, S_PSINT }, /* short int */ -X { T_INT, S_INT, S_PINT }, /* int */ -X { T_LONG, S_LINT, S_PLINT }, /* long */ -X { T_FLOAT, S_FLOAT, S_PFLOAT }, /* float */ -X { T_DOUBLE, S_DOUBLE, S_PDOUBLE }, /* double */ -X { T_FPTR, 0, S_PFPTR }, /* int (*()) */ -X { 0, 0, 0 }, /* End of table */ -X}; -X -Xint -Xeval() -X/* -X * Evaluate an expression. Straight-forward operator precedence. -X * This is called from control() on encountering an #if statement. -X * It calls the following routines: -X * evallex Lexical analyser -- returns the type and value of -X * the next input token. -X * evaleval Evaluate the current operator, given the values on -X * the value stack. Returns a pointer to the (new) -X * value stack. -X * For compatiblity with older cpp's, this return returns 1 (TRUE) -X * if a syntax error is detected. -X */ -X{ -X register int op; /* Current operator */ -X register int *valp; /* -> value vector */ -X register OPTAB *opp; /* Operator stack */ -X int prec; /* Op precedence */ -X int binop; /* Set if binary op. needed */ -X int op1; /* Operand from stack */ -X int skip; /* For short-circuit testing */ -X int value[NEXP]; /* Value stack */ -X OPTAB opstack[NEXP]; /* Operand stack */ -X extern int *evaleval(); /* Does actual evaluation */ -X -X valp = value; -X opp = opstack; -X opp->op = OP_END; /* Mark bottom of stack */ -X opp->prec = opdope[OP_END]; /* And its precedence */ -X opp->skip = 0; /* Not skipping now */ -X binop = 0; -Xagain: ; -X#ifdef DEBUG_EVAL -X printf("In #if at again: skip = %d, binop = %d, line is: %s", -X opp->skip, binop, infile->bptr); -X#endif -X if ((op = evallex(opp->skip)) == OP_SUB && binop == 0) -X op = OP_NEG; /* Unary minus */ -X else if (op == OP_ADD && binop == 0) -X op = OP_PLU; /* Unary plus */ -X else if (op == OP_FAIL) -X return (1); /* Error in evallex */ -X#ifdef DEBUG_EVAL -X printf("op = %s, opdope = %03o, binop = %d, skip = %d\n", -X opname[op], opdope[op], binop, opp->skip); -X#endif -X if (op == DIG) { /* Value? */ -X if (binop != 0) { -X cerror("misplaced constant in #if", NULLST); -X return (1); -X } -X else if (valp >= &value[NEXP-1]) { -X cerror("#if value stack overflow", NULLST); -X return (1); -X } -X else { -X#ifdef DEBUG_EVAL -X printf("pushing %d onto value stack[%d]\n", -X evalue, valp - value); -X#endif -X *valp++ = evalue; -X binop = 1; -X } -X goto again; -X } -X else if (op > OP_END) { -X cerror("Illegal #if line", NULLST); -X return (1); -X } -X prec = opdope[op]; -X if (binop != (prec & 1)) { -X cerror("Operator %s in incorrect context", opname[op]); -X return (1); -X } -X binop = (prec & 2) >> 1; -X for (;;) { -X#ifdef DEBUG_EVAL -X printf("op %s, prec %d., stacked op %s, prec %d, skip %d\n", -X opname[op], prec, opname[opp->op], opp->prec, opp->skip); -X#endif -X if (prec > opp->prec) { -X if (op == OP_LPA) -X prec = OP_RPA_PREC; -X else if (op == OP_QUE) -X prec = OP_QUE_PREC; -X op1 = opp->skip; /* Save skip for test */ -X /* -X * Push operator onto op. stack. -X */ -X opp++; -X if (opp >= &opstack[NEXP]) { -X cerror("expression stack overflow at op \"%s\"", -X opname[op]); -X return (1); -X } -X opp->op = op; -X opp->prec = prec; -X skip = (valp[-1] != 0); /* Short-circuit tester */ -X /* -X * Do the short-circuit stuff here. Short-circuiting -X * stops automagically when operators are evaluated. -X */ -X if ((op == OP_ANA && !skip) -X || (op == OP_ORO && skip)) -X opp->skip = S_ANDOR; /* And/or skip starts */ -X else if (op == OP_QUE) /* Start of ?: operator */ -X opp->skip = (op1 & S_ANDOR) | ((!skip) ? S_QUEST : 0); -X else if (op == OP_COL) { /* : inverts S_QUEST */ -X opp->skip = (op1 & S_ANDOR) -X | (((op1 & S_QUEST) != 0) ? 0 : S_QUEST); -X } -X else { /* Other ops leave */ -X opp->skip = op1; /* skipping unchanged. */ -X } -X#ifdef DEBUG_EVAL -X printf("stacking %s, valp[-1] == %d at %s", -X opname[op], valp[-1], infile->bptr); -X dumpstack(opstack, opp, value, valp); -X#endif -X goto again; -X } -X /* -X * Pop operator from op. stack and evaluate it. -X * End of stack and '(' are specials. -X */ -X skip = opp->skip; /* Remember skip value */ -X switch ((op1 = opp->op)) { /* Look at stacked op */ -X case OP_END: /* Stack end marker */ -X if (op == OP_EOE) -X return (valp[-1]); /* Finished ok. */ -X goto again; /* Read another op. */ -X -X case OP_LPA: /* ( on stack */ -X if (op != OP_RPA) { /* Matches ) on input */ -X cerror("unbalanced paren's, op is \"%s\"", opname[op]); -X return (1); -X } -X opp--; /* Unstack it */ -X /* goto again; -- Fall through */ -X -X case OP_QUE: -X goto again; /* Evaluate true expr. */ -X -X case OP_COL: /* : on stack. */ -X opp--; /* Unstack : */ -X if (opp->op != OP_QUE) { /* Matches ? on stack? */ -X cerror("Misplaced '?' or ':', previous operator is %s", -X opname[opp->op]); -X return (1); -X } -X /* -X * Evaluate op1. -X */ -X default: /* Others: */ -X opp--; /* Unstack the operator */ -X#ifdef DEBUG_EVAL -X printf("Stack before evaluation of %s\n", opname[op1]); -X dumpstack(opstack, opp, value, valp); -X#endif -X valp = evaleval(valp, op1, skip); -X#ifdef DEBUG_EVAL -X printf("Stack after evaluation\n"); -X dumpstack(opstack, opp, value, valp); -X#endif -X } /* op1 switch end */ -X } /* Stack unwind loop */ -X} -X -XFILE_LOCAL int -Xevallex(skip) -Xint skip; /* TRUE if short-circuit evaluation */ -X/* -X * Return next eval operator or value. Called from eval(). It -X * calls a special-purpose routines for 'char' strings and -X * numeric values: -X * evalchar called to evaluate 'x' -X * evalnum called to evaluate numbers. -X */ -X{ -X register int c, c1, t; -X -Xagain: do { /* Collect the token */ -X c = skipws(); -X if ((c = macroid(c)) == EOF_CHAR || c == '\n') { -X unget(); -X return (OP_EOE); /* End of expression */ -X } -X } while ((t = type[c]) == LET && catenate()); -X if (t == INV) { /* Total nonsense */ -X if (!skip) { -X if (isascii(c) && isprint(c)) -X cierror("illegal character '%c' in #if", c); -X else -X cierror("illegal character (%d decimal) in #if", c); -X } -X return (OP_FAIL); -X } -X else if (t == QUO) { /* ' or " */ -X if (c == '\'') { /* Character constant */ -X evalue = evalchar(skip); /* Somewhat messy */ -X#ifdef DEBUG_EVAL -X printf("evalchar returns %d.\n", evalue); -X#endif -X return (DIG); /* Return a value */ -X } -X cerror("Can't use a string in an #if", NULLST); -X return (OP_FAIL); -X } -X else if (t == LET) { /* ID must be a macro */ -X if (streq(token, "defined")) { /* Or defined name */ -X c1 = c = skipws(); -X if (c == '(') /* Allow defined(name) */ -X c = skipws(); -X if (type[c] == LET) { -X evalue = (lookid(c) != NULL); -X if (c1 != '(' /* Need to balance */ -X || skipws() == ')') /* Did we balance? */ -X return (DIG); /* Parsed ok */ -X } -X cerror("Bad #if ... defined() syntax", NULLST); -X return (OP_FAIL); -X } -X else if (streq(token, "sizeof")) /* New sizeof hackery */ -X return (dosizeof()); /* Gets own routine */ -X /* -X * The Draft ANSI C Standard says that an undefined symbol -X * in an #if has the value zero. We are a bit pickier, -X * warning except where the programmer was careful to write -X * #if defined(foo) ? foo : 0 -X */ -X#ifdef VERBOSE -X if (!skip) -X cwarn("undefined symbol \"%s\" in #if, 0 used", token); -X#endif -X evalue = 0; -X return (DIG); -X } -X else if (t == DIG) { /* Numbers are harder */ -X evalue = evalnum(c); -X#ifdef DEBUG_EVAL -X printf("evalnum returns %d.\n", evalue); -X#endif -X } -X else if (strchr("!=<>&|\\", c) != NULL) { -X /* -X * Process a possible multi-byte lexeme. -X */ -X c1 = cget(); /* Peek at next char */ -X switch (c) { -X case '!': -X if (c1 == '=') -X return (OP_NE); -X break; -X -X case '=': -X if (c1 != '=') { /* Can't say a=b in #if */ -X unget(); -X cerror("= not allowed in #if", NULLST); -X return (OP_FAIL); -X } -X return (OP_EQ); -X -X case '>': -X case '<': -X if (c1 == c) -X return ((c == '<') ? OP_ASL : OP_ASR); -X else if (c1 == '=') -X return ((c == '<') ? OP_LE : OP_GE); -X break; -X -X case '|': -X case '&': -X if (c1 == c) -X return ((c == '|') ? OP_ORO : OP_ANA); -X break; -X -X case '\\': -X if (c1 == '\n') /* Multi-line if */ -X goto again; -X cerror("Unexpected \\ in #if", NULLST); -X return (OP_FAIL); -X } -X unget(); -X } -X return (t); -X} -X -XFILE_LOCAL int -Xdosizeof() -X/* -X * Process the sizeof (basic type) operation in an #if string. -X * Sets evalue to the size and returns -X * DIG success -X * OP_FAIL bad parse or something. -X */ -X{ -X register int c; -X register TYPES *tp; -X register SIZES *sizp; -X register short *testp; -X short typecode; -X -X if ((c = skipws()) != '(') -X goto nogood; -X /* -X * Scan off the tokens. -X */ -X typecode = 0; -X while ((c = skipws())) { -X if ((c = macroid(c)) == EOF_CHAR || c == '\n') -X goto nogood; /* End of line is a bug */ -X else if (c == '(') { /* thing (*)() func ptr */ -X if (skipws() == '*' -X && skipws() == ')') { /* We found (*) */ -X if (skipws() != '(') /* Let () be optional */ -X unget(); -X else if (skipws() != ')') -X goto nogood; -X typecode |= T_FPTR; /* Function pointer */ -X } -X else { /* Junk is a bug */ -X goto nogood; -X } -X } -X else if (type[c] != LET) /* Exit if not a type */ -X break; -X else if (!catenate()) { /* Maybe combine tokens */ -X /* -X * Look for this unexpandable token in basic_types. -X * The code accepts "int long" as well as "long int" -X * which is a minor bug as bugs go (and one shared with -X * a lot of C compilers). -X */ -X for (tp = basic_types; tp->name != NULLST; tp++) { -X if (streq(token, tp->name)) -X break; -X } -X if (tp->name == NULLST) { -X cerror("#if sizeof, unknown type \"%s\"", token); -X return (OP_FAIL); -X } -X typecode |= tp->type; /* Or in the type bit */ -X } -X } -X /* -X * We are at the end of the type scan. Chew off '*' if necessary. -X */ -X if (c == '*') { -X typecode |= T_PTR; -X c = skipws(); -X } -X if (c == ')') { /* Last syntax check */ -X for (testp = test_table; *testp != 0; testp++) { -X if (!bittest(typecode & *testp)) { -X cerror("#if ... sizeof: illegal type combination", NULLST); -X return (OP_FAIL); -X } -X } -X /* -X * We assume that all function pointers are the same size: -X * sizeof (int (*)()) == sizeof (float (*)()) -X * We assume that signed and unsigned don't change the size: -X * sizeof (signed int) == (sizeof unsigned int) -X */ -X if ((typecode & T_FPTR) != 0) /* Function pointer */ -X typecode = T_FPTR | T_PTR; -X else { /* Var or var * datum */ -X typecode &= ~(T_SIGNED | T_UNSIGNED); -X if ((typecode & (T_SHORT | T_LONG)) != 0) -X typecode &= ~T_INT; -X } -X if ((typecode & ~T_PTR) == 0) { -X cerror("#if sizeof() error, no type specified", NULLST); -X return (OP_FAIL); -X } -X /* -X * Exactly one bit (and possibly T_PTR) may be set. -X */ -X for (sizp = size_table; sizp->bits != 0; sizp++) { -X if ((typecode & ~T_PTR) == sizp->bits) { -X evalue = ((typecode & T_PTR) != 0) -X ? sizp->psize : sizp->size; -X return (DIG); -X } -X } /* We shouldn't fail */ -X cierror("#if ... sizeof: bug, unknown type code 0x%x", typecode); -X return (OP_FAIL); -X } -X -Xnogood: unget(); -X cerror("#if ... sizeof() syntax error", NULLST); -X return (OP_FAIL); -X} -X -XFILE_LOCAL int -Xbittest(value) -X/* -X * TRUE if value is zero or exactly one bit is set in value. -X */ -X{ -X#if (4096 & ~(-4096)) == 0 -X return ((value & ~(-value)) == 0); -X#else -X /* -X * Do it the hard way (for non 2's complement machines) -X */ -X return (value == 0 || value ^ (value - 1) == (value * 2 - 1)); -X#endif -X} -X -XFILE_LOCAL int -Xevalnum(c) -Xregister int c; -X/* -X * Expand number for #if lexical analysis. Note: evalnum recognizes -X * the unsigned suffix, but only returns a signed int value. -X */ -X{ -X register int value; -X register int base; -X register int c1; -X -X if (c != '0') -X base = 10; -X else if ((c = cget()) == 'x' || c == 'X') { -X base = 16; -X c = cget(); -X } -X else base = 8; -X value = 0; -X for (;;) { -X c1 = c; -X if (isascii(c) && isupper(c1)) -X c1 = tolower(c1); -X if (c1 >= 'a') -X c1 -= ('a' - 10); -X else c1 -= '0'; -X if (c1 < 0 || c1 >= base) -X break; -X value *= base; -X value += c1; -X c = cget(); -X } -X if (c == 'u' || c == 'U') /* Unsigned nonsense */ -X c = cget(); -X unget(); -X return (value); -X} -X -XFILE_LOCAL int -Xevalchar(skip) -Xint skip; /* TRUE if short-circuit evaluation */ -X/* -X * Get a character constant -X */ -X{ -X register int c; -X register int value; -X register int count; -X -X instring = TRUE; -X if ((c = cget()) == '\\') { -X switch ((c = cget())) { -X case 'a': /* New in Standard */ -X#if ('a' == '\a' || '\a' == ALERT) -X value = ALERT; /* Use predefined value */ -X#else -X value = '\a'; /* Use compiler's value */ -X#endif -X break; -X -X case 'b': -X value = '\b'; -X break; -X -X case 'f': -X value = '\f'; -X break; -X -X case 'n': -X value = '\n'; -X break; -X -X case 'r': -X value = '\r'; -X break; -X -X case 't': -X value = '\t'; -X break; -X -X case 'v': /* New in Standard */ -X#if ('v' == '\v' || '\v' == VT) -X value = VT; /* Use predefined value */ -X#else -X value = '\v'; /* Use compiler's value */ -X#endif -X break; -X -X case 'x': /* '\xFF' */ -X count = 3; -X value = 0; -X while ((((c = get()) >= '0' && c <= '9') -X || (c >= 'a' && c <= 'f') -X || (c >= 'A' && c <= 'F')) -X && (--count >= 0)) { -X value *= 16; -X value += (c <= '9') ? (c - '0') : ((c & 0xF) + 9); -X } -X unget(); -X break; -X -X default: -X if (c >= '0' && c <= '7') { -X count = 3; -X value = 0; -X while (c >= '0' && c <= '7' && --count >= 0) { -X value *= 8; -X value += (c - '0'); -X c = get(); -X } -X unget(); -X } -X else value = c; -X break; -X } -X } -X else if (c == '\'') -X value = 0; -X else value = c; -X /* -X * We warn on multi-byte constants and try to hack -X * (big|little)endian machines. -X */ -X#if BIG_ENDIAN -X count = 0; -X#endif -X while ((c = get()) != '\'' && c != EOF_CHAR && c != '\n') { -X if (!skip) -X ciwarn("multi-byte constant '%c' isn't portable", c); -X#if BIG_ENDIAN -X count += BITS_CHAR; -X value += (c << count); -X#else -X value <<= BITS_CHAR; -X value += c; -X#endif -X } -X instring = FALSE; -X return (value); -X} -X -XFILE_LOCAL int * -Xevaleval(valp, op, skip) -Xregister int *valp; -Xint op; -Xint skip; /* TRUE if short-circuit evaluation */ -X/* -X * Apply the argument operator to the data on the value stack. -X * One or two values are popped from the value stack and the result -X * is pushed onto the value stack. -X * -X * OP_COL is a special case. -X * -X * evaleval() returns the new pointer to the top of the value stack. -X */ -X{ -X register int v1, v2; -X -X if (isbinary(op)) -X v2 = *--valp; -X v1 = *--valp; -X#ifdef DEBUG_EVAL -X printf("%s op %s", (isbinary(op)) ? "binary" : "unary", -X opname[op]); -X if (isbinary(op)) -X printf(", v2 = %d.", v2); -X printf(", v1 = %d.\n", v1); -X#endif -X switch (op) { -X case OP_EOE: -X break; -X -X case OP_ADD: -X v1 += v2; -X break; -X -X case OP_SUB: -X v1 -= v2; -X break; -X -X case OP_MUL: -X v1 *= v2; -X break; -X -X case OP_DIV: -X case OP_MOD: -X if (v2 == 0) { -X if (!skip) { -X cwarn("%s by zero in #if, zero result assumed", -X (op == OP_DIV) ? "divide" : "mod"); -X } -X v1 = 0; -X } -X else if (op == OP_DIV) -X v1 /= v2; -X else -X v1 %= v2; -X break; -X -X case OP_ASL: -X v1 <<= v2; -X break; -X -X case OP_ASR: -X v1 >>= v2; -X break; -X -X case OP_AND: -X v1 &= v2; -X break; -X -X case OP_OR: -X v1 |= v2; -X break; -X -X case OP_XOR: -X v1 ^= v2; -X break; -X -X case OP_EQ: -X v1 = (v1 == v2); -X break; -X -X case OP_NE: -X v1 = (v1 != v2); -X break; -X -X case OP_LT: -X v1 = (v1 < v2); -X break; -X -X case OP_LE: -X v1 = (v1 <= v2); -X break; -X -X case OP_GE: -X v1 = (v1 >= v2); -X break; -X -X case OP_GT: -X v1 = (v1 > v2); -X break; -X -X case OP_ANA: -X v1 = (v1 && v2); -X break; -X -X case OP_ORO: -X v1 = (v1 || v2); -X break; -X -X case OP_COL: -X /* -X * v1 has the "true" value, v2 the "false" value. -X * The top of the value stack has the test. -X */ -X v1 = (*--valp) ? v1 : v2; -X break; -X -X case OP_NEG: -X v1 = (-v1); -X break; -X -X case OP_PLU: -X break; -X -X case OP_COM: -X v1 = ~v1; -X break; -X -X case OP_NOT: -X v1 = !v1; -X break; -X -X default: -X cierror("#if bug, operand = %d.", op); -X v1 = 0; -X } -X *valp++ = v1; -X return (valp); -X} -X -X#ifdef DEBUG_EVAL -Xdumpstack(opstack, opp, value, valp) -XOPTAB opstack[NEXP]; /* Operand stack */ -Xregister OPTAB *opp; /* Operator stack */ -Xint value[NEXP]; /* Value stack */ -Xregister int *valp; /* -> value vector */ -X{ -X printf("index op prec skip name -- op stack at %s", infile->bptr); -X while (opp > opstack) { -X printf(" [%2d] %2d %03o %d %s\n", opp - opstack, -X opp->op, opp->prec, opp->skip, opname[opp->op]); -X opp--; -X } -X while (--valp >= value) { -X printf("value[%d] = %d\n", (valp - value), *valp); -X } -X} -X#endif -X -END-of-cpp5.c -echo x - cpp6.c -sed 's/^X//' >cpp6.c << 'END-of-cpp6.c' -X/* -X * C P P 6 . C -X * S u p p o r t R o u t i n e s -X * -X * Edit History -X * 25-May-84 MM Added 8-bit support to type table. -X * 30-May-84 ARF sharp() should output filename in quotes -X * 02-Aug-84 MM Newline and #line hacking. sharp() now in cpp1.c -X * 31-Aug-84 MM USENET net.sources release -X * 11-Sep-84 ado/MM Keepcomments, also line number pathological -X * 12-Sep-84 ado/MM bug if comment changes to space and we unget later. -X * 03-Oct-84 gkr/MM Fixed scannumber bug for '.e' (as in struct.element). -X * 04-Oct-84 MM Added ungetstring() for token concatenation -X * 08-Oct-84 MM Yet another attack on number scanning -X * 31-Oct-84 ado Parameterized $ in identifiers -X * 2-Nov-84 MM Token concatenation is messier than I thought -X * 6-Dec-84 MM \ is everywhere invisible. -X */ -X -X#include -X#include -X#include "cppdef.h" -X#include "cpp.h" -X -X/* -X * skipnl() skips over input text to the end of the line. -X * skipws() skips over "whitespace" (spaces or tabs), but -X * not skip over the end of the line. It skips over -X * TOK_SEP, however (though that shouldn't happen). -X * scanid() reads the next token (C identifier) into token[]. -X * The caller has already read the first character of -X * the identifier. Unlike macroid(), the token is -X * never expanded. -X * macroid() reads the next token (C identifier) into token[]. -X * If it is a #defined macro, it is expanded, and -X * macroid() returns TRUE, otherwise, FALSE. -X * catenate() Does the dirty work of token concatenation, TRUE if it did. -X * scanstring() Reads a string from the input stream, calling -X * a user-supplied function for each character. -X * This function may be output() to write the -X * string to the output file, or save() to save -X * the string in the work buffer. -X * scannumber() Reads a C numeric constant from the input stream, -X * calling the user-supplied function for each -X * character. (output() or save() as noted above.) -X * save() Save one character in the work[] buffer. -X * savestring() Saves a string in malloc() memory. -X * getfile() Initialize a new FILEINFO structure, called when -X * #include opens a new file, or a macro is to be -X * expanded. -X * getmem() Get a specified number of bytes from malloc memory. -X * output() Write one character to stdout (calling putchar) -- -X * implemented as a function so its address may be -X * passed to scanstring() and scannumber(). -X * lookid() Scans the next token (identifier) from the input -X * stream. Looks for it in the #defined symbol table. -X * Returns a pointer to the definition, if found, or NULL -X * if not present. The identifier is stored in token[]. -X * defnedel() Define enter/delete subroutine. Updates the -X * symbol table. -X * get() Read the next byte from the current input stream, -X * handling end of (macro/file) input and embedded -X * comments appropriately. Note that the global -X * instring is -- essentially -- a parameter to get(). -X * cget() Like get(), but skip over TOK_SEP. -X * unget() Push last gotten character back on the input stream. -X * cerror(), cwarn(), cfatal(), cierror(), ciwarn() -X * These routines format an print messages to the user. -X * cerror & cwarn take a format and a single string argument. -X * cierror & ciwarn take a format and a single int (char) argument. -X * cfatal takes a format and a single string argument. -X */ -X -X/* -X * This table must be rewritten for a non-Ascii machine. -X * -X * Note that several "non-visible" characters have special meaning: -X * Hex 1D DEF_MAGIC -- a flag to prevent #define recursion. -X * Hex 1E TOK_SEP -- a delimiter for token concatenation -X * Hex 1F COM_SEP -- a zero-width whitespace for comment concatenation -X */ -X#if TOK_SEP != 0x1E || COM_SEP != 0x1F || DEF_MAGIC != 0x1D -X << error type table isn't correct >> -X#endif -X -X#if OK_DOLLAR -X#define DOL LET -X#else -X#define DOL 000 -X#endif -X -Xchar type[256] = { /* Character type codes Hex */ -X END, 000, 000, 000, 000, 000, 000, 000, /* 00 */ -X 000, SPA, 000, 000, 000, 000, 000, 000, /* 08 */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 10 */ -X 000, 000, 000, 000, 000, LET, 000, SPA, /* 18 */ -X SPA,OP_NOT, QUO, 000, DOL,OP_MOD,OP_AND, QUO, /* 20 !"#$%&' */ -XOP_LPA,OP_RPA,OP_MUL,OP_ADD, 000,OP_SUB, DOT,OP_DIV, /* 28 ()*+,-./ */ -X DIG, DIG, DIG, DIG, DIG, DIG, DIG, DIG, /* 30 01234567 */ -X DIG, DIG,OP_COL, 000, OP_LT, OP_EQ, OP_GT,OP_QUE, /* 38 89:;<=>? */ -X 000, LET, LET, LET, LET, LET, LET, LET, /* 40 @ABCDEFG */ -X LET, LET, LET, LET, LET, LET, LET, LET, /* 48 HIJKLMNO */ -X LET, LET, LET, LET, LET, LET, LET, LET, /* 50 PQRSTUVW */ -X LET, LET, LET, 000, BSH, 000,OP_XOR, LET, /* 58 XYZ[\]^_ */ -X 000, LET, LET, LET, LET, LET, LET, LET, /* 60 `abcdefg */ -X LET, LET, LET, LET, LET, LET, LET, LET, /* 68 hijklmno */ -X LET, LET, LET, LET, LET, LET, LET, LET, /* 70 pqrstuvw */ -X LET, LET, LET, 000, OP_OR, 000,OP_NOT, 000, /* 78 xyz{|}~ */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ -X}; -X -Xskipnl() -X/* -X * Skip to the end of the current input line. -X */ -X{ -X register int c; -X -X do { /* Skip to newline */ -X c = get(); -X } while (c != '\n' && c != EOF_CHAR); -X} -X -Xint -Xskipws() -X/* -X * Skip over whitespace -X */ -X{ -X register int c; -X -X do { /* Skip whitespace */ -X c = get(); -X#if COMMENT_INVISIBLE -X } while (type[c] == SPA || c == COM_SEP); -X#else -X } while (type[c] == SPA); -X#endif -X return (c); -X} -X -Xscanid(c) -Xregister int c; /* First char of id */ -X/* -X * Get the next token (an id) into the token buffer. -X * Note: this code is duplicated in lookid(). -X * Change one, change both. -X */ -X{ -X register char *bp; -X -X if (c == DEF_MAGIC) /* Eat the magic token */ -X c = get(); /* undefiner. */ -X bp = token; -X do { -X if (bp < &token[IDMAX]) /* token dim is IDMAX+1 */ -X *bp++ = c; -X c = get(); -X } while (type[c] == LET || type[c] == DIG); -X unget(); -X *bp = EOS; -X} -X -Xint -Xmacroid(c) -Xregister int c; -X/* -X * If c is a letter, scan the id. if it's #defined, expand it and scan -X * the next character and try again. -X * -X * Else, return the character. If type[c] is a LET, the token is in token. -X */ -X{ -X register DEFBUF *dp; -X -X if (infile != NULL && infile->fp != NULL) -X recursion = 0; -X while (type[c] == LET && (dp = lookid(c)) != NULL) { -X expand(dp); -X c = get(); -X } -X return (c); -X} -X -Xint -Xcatenate() -X/* -X * A token was just read (via macroid). -X * If the next character is TOK_SEP, concatenate the next token -X * return TRUE -- which should recall macroid after refreshing -X * macroid's argument. If it is not TOK_SEP, unget() the character -X * and return FALSE. -X */ -X{ -X register int c; -X register char *token1; -X -X#if OK_CONCAT -X if (get() != TOK_SEP) { /* Token concatenation */ -X unget(); -X return (FALSE); -X } -X else { -X token1 = savestring(token); /* Save first token */ -X c = macroid(get()); /* Scan next token */ -X switch(type[c]) { /* What was it? */ -X case LET: /* An identifier, ... */ -X if (strlen(token1) + strlen(token) >= NWORK) -X cfatal("work buffer overflow doing %s #", token1); -X sprintf(work, "%s%s", token1, token); -X break; -X -X case DIG: /* A digit string */ -X strcpy(work, token1); -X workp = work + strlen(work); -X do { -X save(c); -X } while ((c = get()) != TOK_SEP); -X /* -X * The trailing TOK_SEP is no longer needed. -X */ -X save(EOS); -X break; -X -X default: /* An error, ... */ -X if (isprint(c)) -X cierror("Strange character '%c' after #", c); -X else -X cierror("Strange character (%d.) after #", c); -X strcpy(work, token1); -X unget(); -X break; -X } -X /* -X * work has the concatenated token and token1 has -X * the first token (no longer needed). Unget the -X * new (concatenated) token after freeing token1. -X * Finally, setup to read the new token. -X */ -X free(token1); /* Free up memory */ -X ungetstring(work); /* Unget the new thing, */ -X return (TRUE); -X } -X#else -X return (FALSE); /* Not supported */ -X#endif -X} -X -Xint -Xscanstring(delim, outfun) -Xregister int delim; /* ' or " */ -Xint (*outfun)(); /* Output function */ -X/* -X * Scan off a string. Warning if terminated by newline or EOF. -X * outfun() outputs the character -- to a buffer if in a macro. -X * TRUE if ok, FALSE if error. -X */ -X{ -X register int c; -X -X instring = TRUE; /* Don't strip comments */ -X (*outfun)(delim); -X while ((c = get()) != delim -X && c != '\n' -X && c != EOF_CHAR) { -X (*outfun)(c); -X if (c == '\\') -X (*outfun)(get()); -X } -X instring = FALSE; -X if (c == delim) { -X (*outfun)(c); -X return (TRUE); -X } -X else { -X cerror("Unterminated string", NULLST); -X unget(); -X return (FALSE); -X } -X} -X -Xscannumber(c, outfun) -Xregister int c; /* First char of number */ -Xregister int (*outfun)(); /* Output/store func */ -X/* -X * Process a number. We know that c is from 0 to 9 or dot. -X * Algorithm from Dave Conroy's Decus C. -X */ -X{ -X register int radix; /* 8, 10, or 16 */ -X int expseen; /* 'e' seen in floater */ -X int signseen; /* '+' or '-' seen */ -X int octal89; /* For bad octal test */ -X int dotflag; /* TRUE if '.' was seen */ -X -X expseen = FALSE; /* No exponent seen yet */ -X signseen = TRUE; /* No +/- allowed yet */ -X octal89 = FALSE; /* No bad octal yet */ -X radix = 10; /* Assume decimal */ -X if ((dotflag = (c == '.')) != FALSE) { /* . something? */ -X (*outfun)('.'); /* Always out the dot */ -X if (type[(c = get())] != DIG) { /* If not a float numb, */ -X unget(); /* Rescan strange char */ -X return; /* All done for now */ -X } -X } /* End of float test */ -X else if (c == '0') { /* Octal or hex? */ -X (*outfun)(c); /* Stuff initial zero */ -X radix = 8; /* Assume it's octal */ -X c = get(); /* Look for an 'x' */ -X if (c == 'x' || c == 'X') { /* Did we get one? */ -X radix = 16; /* Remember new radix */ -X (*outfun)(c); /* Stuff the 'x' */ -X c = get(); /* Get next character */ -X } -X } -X for (;;) { /* Process curr. char. */ -X /* -X * Note that this algorithm accepts "012e4" and "03.4" -X * as legitimate floating-point numbers. -X */ -X if (radix != 16 && (c == 'e' || c == 'E')) { -X if (expseen) /* Already saw 'E'? */ -X break; /* Exit loop, bad nbr. */ -X expseen = TRUE; /* Set exponent seen */ -X signseen = FALSE; /* We can read '+' now */ -X radix = 10; /* Decimal exponent */ -X } -X else if (radix != 16 && c == '.') { -X if (dotflag) /* Saw dot already? */ -X break; /* Exit loop, two dots */ -X dotflag = TRUE; /* Remember the dot */ -X radix = 10; /* Decimal fraction */ -X } -X else if (c == '+' || c == '-') { /* 1.0e+10 */ -X if (signseen) /* Sign in wrong place? */ -X break; /* Exit loop, not nbr. */ -X /* signseen = TRUE; */ /* Remember we saw it */ -X } -X else { /* Check the digit */ -X switch (c) { -X case '8': case '9': /* Sometimes wrong */ -X octal89 = TRUE; /* Do check later */ -X case '0': case '1': case '2': case '3': -X case '4': case '5': case '6': case '7': -X break; /* Always ok */ -X -X case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': -X case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': -X if (radix == 16) /* Alpha's are ok only */ -X break; /* if reading hex. */ -X default: /* At number end */ -X goto done; /* Break from for loop */ -X } /* End of switch */ -X } /* End general case */ -X (*outfun)(c); /* Accept the character */ -X signseen = TRUE; /* Don't read sign now */ -X c = get(); /* Read another char */ -X } /* End of scan loop */ -X /* -X * When we break out of the scan loop, c contains the first -X * character (maybe) not in the number. If the number is an -X * integer, allow a trailing 'L' for long and/or a trailing 'U' -X * for unsigned. If not those, push the trailing character back -X * on the input stream. Floating point numbers accept a trailing -X * 'L' for "long double". -X */ -Xdone: if (dotflag || expseen) { /* Floating point? */ -X if (c == 'l' || c == 'L') { -X (*outfun)(c); -X c = get(); /* Ungotten later */ -X } -X } -X else { /* Else it's an integer */ -X /* -X * We know that dotflag and expseen are both zero, now: -X * dotflag signals "saw 'L'", and -X * expseen signals "saw 'U'". -X */ -X for (;;) { -X switch (c) { -X case 'l': -X case 'L': -X if (dotflag) -X goto nomore; -X dotflag = TRUE; -X break; -X -X case 'u': -X case 'U': -X if (expseen) -X goto nomore; -X expseen = TRUE; -X break; -X -X default: -X goto nomore; -X } -X (*outfun)(c); /* Got 'L' or 'U'. */ -X c = get(); /* Look at next, too. */ -X } -X } -Xnomore: unget(); /* Not part of a number */ -X if (octal89 && radix == 8) -X cwarn("Illegal digit in octal number", NULLST); -X} -X -Xsave(c) -Xregister int c; -X{ -X if (workp >= &work[NWORK]) -X cfatal("Work buffer overflow", NULLST); -X else *workp++ = c; -X} -X -Xchar * -Xsavestring(text) -Xchar *text; -X/* -X * Store a string into free memory. -X */ -X{ -X register char *result; -X -X result = getmem(strlen(text) + 1); -X strcpy(result, text); -X return (result); -X} -X -XFILEINFO * -Xgetfile(bufsize, name) -Xint bufsize; /* Line or define buffer size */ -Xchar *name; /* File or macro name string */ -X/* -X * Common FILEINFO buffer initialization for a new file or macro. -X */ -X{ -X register FILEINFO *file; -X register int size; -X -X size = strlen(name); /* File/macro name */ -X file = (FILEINFO *) getmem(sizeof (FILEINFO) + bufsize + size); -X file->parent = infile; /* Chain files together */ -X file->fp = NULL; /* No file yet */ -X file->filename = savestring(name); /* Save file/macro name */ -X file->progname = NULL; /* No #line seen yet */ -X file->unrecur = 0; /* No macro fixup */ -X file->bptr = file->buffer; /* Initialize line ptr */ -X file->buffer[0] = EOS; /* Force first read */ -X file->line = 0; /* (Not used just yet) */ -X if (infile != NULL) /* If #include file */ -X infile->line = line; /* Save current line */ -X infile = file; /* New current file */ -X line = 1; /* Note first line */ -X return (file); /* All done. */ -X} -X -Xchar * -Xgetmem(size) -Xint size; -X/* -X * Get a block of free memory. -X */ -X{ -X register char *result; -X extern char *malloc(); -X -X if ((result = malloc((unsigned) size)) == NULL) -X cfatal("Out of memory", NULLST); -X return (result); -X} -X -X/* -X * C P P S y m b o l T a b l e s -X */ -X -X/* -X * SBSIZE defines the number of hash-table slots for the symbol table. -X * It must be a power of 2. -X */ -X#ifndef SBSIZE -X#define SBSIZE 64 -X#endif -X#define SBMASK (SBSIZE - 1) -X#if (SBSIZE ^ SBMASK) != ((SBSIZE * 2) - 1) -X << error, SBSIZE must be a power of 2 >> -X#endif -X -Xstatic DEFBUF *symtab[SBSIZE]; /* Symbol table queue headers */ -X -XDEFBUF * -Xlookid(c) -Xint c; /* First character of token */ -X/* -X * Look for the next token in the symbol table. Returns token in "token". -X * If found, returns the table pointer; Else returns NULL. -X */ -X{ -X register int nhash; -X register DEFBUF *dp; -X register char *np; -X int temp; -X int isrecurse; /* For #define foo foo */ -X -X np = token; -X nhash = 0; -X if ((isrecurse = (c == DEF_MAGIC))) /* If recursive macro */ -X c = get(); /* hack, skip DEF_MAGIC */ -X do { -X if (np < &token[IDMAX]) { /* token dim is IDMAX+1 */ -X *np++ = c; /* Store token byte */ -X nhash += c; /* Update hash value */ -X } -X c = get(); /* And get another byte */ -X } while (type[c] == LET || type[c] == DIG); -X unget(); /* Rescan terminator */ -X *np = EOS; /* Terminate token */ -X if (isrecurse) /* Recursive definition */ -X return (NULL); /* undefined just now */ -X nhash += (np - token); /* Fix hash value */ -X dp = symtab[nhash & SBMASK]; /* Starting bucket */ -X while (dp != (DEFBUF *) NULL) { /* Search symbol table */ -X if (dp->hash == nhash /* Fast precheck */ -X && (temp = strcmp(dp->name, token)) >= 0) -X break; -X dp = dp->link; /* Nope, try next one */ -X } -X return ((temp == 0) ? dp : NULL); -X} -X -XDEFBUF * -Xdefendel(name, delete) -Xchar *name; -Xint delete; /* TRUE to delete a symbol */ -X/* -X * Enter this name in the lookup table (delete = FALSE) -X * or delete this name (delete = TRUE). -X * Returns a pointer to the define block (delete = FALSE) -X * Returns NULL if the symbol wasn't defined (delete = TRUE). -X */ -X{ -X register DEFBUF *dp; -X register DEFBUF **prevp; -X register char *np; -X int nhash; -X int temp; -X int size; -X -X for (nhash = 0, np = name; *np != EOS;) -X nhash += *np++; -X size = (np - name); -X nhash += size; -X prevp = &symtab[nhash & SBMASK]; -X while ((dp = *prevp) != (DEFBUF *) NULL) { -X if (dp->hash == nhash -X && (temp = strcmp(dp->name, name)) >= 0) { -X if (temp > 0) -X dp = NULL; /* Not found */ -X else { -X *prevp = dp->link; /* Found, unlink and */ -X if (dp->repl != NULL) /* Free the replacement */ -X free(dp->repl); /* if any, and then */ -X free((char *) dp); /* Free the symbol */ -X } -X break; -X } -X prevp = &dp->link; -X } -X if (!delete) { -X dp = (DEFBUF *) getmem(sizeof (DEFBUF) + size); -X dp->link = *prevp; -X *prevp = dp; -X dp->hash = nhash; -X dp->repl = NULL; -X dp->nargs = 0; -X strcpy(dp->name, name); -X } -X return (dp); -X} -X -X#if DEBUG -X -Xdumpdef(why) -Xchar *why; -X{ -X register DEFBUF *dp; -X register DEFBUF **syp; -X -X printf("CPP symbol table dump %s\n", why); -X for (syp = symtab; syp < &symtab[SBSIZE]; syp++) { -X if ((dp = *syp) != (DEFBUF *) NULL) { -X printf("symtab[%d]\n", (syp - symtab)); -X do { -X dumpadef((char *) NULL, dp); -X } while ((dp = dp->link) != (DEFBUF *) NULL); -X } -X } -X} -X -Xdumpadef(why, dp) -Xchar *why; /* Notation */ -Xregister DEFBUF *dp; -X{ -X register char *cp; -X register int c; -X -X printf(" \"%s\" [%d]", dp->name, dp->nargs); -X if (why != NULL) -X printf(" (%s)", why); -X if (dp->repl != NULL) { -X printf(" => "); -X for (cp = dp->repl; (c = *cp++ & 0xFF) != EOS;) { -X if (c >= MAC_PARM && c <= (MAC_PARM + PAR_MAC)) -X printf("<%d>", c - MAC_PARM); -X else if (isprint(c) || c == '\n' || c == '\t') -X putchar(c); -X else if (c < ' ') -X printf("<^%c>", c + '@'); -X else -X printf("<\\0%o>", c); -X } -X } -X else { -X printf(", no replacement."); -X } -X putchar('\n'); -X} -X#endif -X -X/* -X * G E T -X */ -X -Xint -Xget() -X/* -X * Return the next character from a macro or the current file. -X * Handle end of file from #include files. -X */ -X{ -X register int c; -X register FILEINFO *file; -X register int popped; /* Recursion fixup */ -X -X popped = 0; -Xget_from_file: -X if ((file = infile) == NULL) -X return (EOF_CHAR); -Xnewline: -X#if 0 -X printf("get(%s), recursion %d, line %d, bptr = %d, buffer \"%s\"\n", -X file->filename, recursion, line, -X file->bptr - file->buffer, file->buffer); -X#endif -X /* -X * Read a character from the current input line or macro. -X * At EOS, either finish the current macro (freeing temp. -X * storage) or read another line from the current input file. -X * At EOF, exit the current file (#include) or, at EOF from -X * the cpp input file, return EOF_CHAR to finish processing. -X */ -X if ((c = *file->bptr++ & 0xFF) == EOS) { -X /* -X * Nothing in current line or macro. Get next line (if -X * input from a file), or do end of file/macro processing. -X * In the latter case, jump back to restart from the top. -X */ -X if (file->fp == NULL) { /* NULL if macro */ -X popped++; -X recursion -= file->unrecur; -X if (recursion < 0) -X recursion = 0; -X infile = file->parent; /* Unwind file chain */ -X } -X else { /* Else get from a file */ -X if ((file->bptr = fgets(file->buffer, NBUFF, file->fp)) -X != NULL) { -X#if DEBUG -X if (debug > 1) { /* Dump it to stdout */ -X printf("\n#line %d (%s), %s", -X line, file->filename, file->buffer); -X } -X#endif -X goto newline; /* process the line */ -X } -X else { -X fclose(file->fp); /* Close finished file */ -X if ((infile = file->parent) != NULL) { -X /* -X * There is an "ungotten" newline in the current -X * infile buffer (set there by doinclude() in -X * cpp1.c). Thus, we know that the mainline code -X * is skipping over blank lines and will do a -X * #line at its convenience. -X */ -X wrongline = TRUE; /* Need a #line now */ -X } -X } -X } -X /* -X * Free up space used by the (finished) file or macro and -X * restart input from the parent file/macro, if any. -X */ -X free(file->filename); /* Free name and */ -X if (file->progname != NULL) /* if a #line was seen, */ -X free(file->progname); /* free it, too. */ -X free((char *) file); /* Free file space */ -X if (infile == NULL) /* If at end of file */ -X return (EOF_CHAR); /* Return end of file */ -X line = infile->line; /* Reset line number */ -X goto get_from_file; /* Get from the top. */ -X } -X /* -X * Common processing for the new character. -X */ -X if (c == DEF_MAGIC && file->fp != NULL) /* Don't allow delete */ -X goto newline; /* from a file */ -X if (file->parent != NULL) { /* Macro or #include */ -X if (popped != 0) -X file->parent->unrecur += popped; -X else { -X recursion -= file->parent->unrecur; -X if (recursion < 0) -X recursion = 0; -X file->parent->unrecur = 0; -X } -X } -X if (c == '\n') /* Maintain current */ -X ++line; /* line counter */ -X if (instring) /* Strings just return */ -X return (c); /* the character. */ -X else if (c == '/') { /* Comment? */ -X instring = TRUE; /* So get() won't loop */ -X if ((c = get()) != '*') { /* Next byte '*'? */ -X instring = FALSE; /* Nope, no comment */ -X unget(); /* Push the char. back */ -X return ('/'); /* Return the slash */ -X } -X if (keepcomments) { /* If writing comments */ -X putchar('/'); /* Write out the */ -X putchar('*'); /* initializer */ -X } -X for (;;) { /* Eat a comment */ -X c = get(); -Xtest: if (keepcomments && c != EOF_CHAR) -X cput(c); -X switch (c) { -X case EOF_CHAR: -X cerror("EOF in comment", NULLST); -X return (EOF_CHAR); -X -X case '/': -X if ((c = get()) != '*') /* Don't let comments */ -X goto test; /* Nest. */ -X#ifdef VERBOSE -X cwarn("Nested comments", NULLST); -X#endif -X /* Fall into * stuff */ -X case '*': -X if ((c = get()) != '/') /* If comment doesn't */ -X goto test; /* end, look at next */ -X instring = FALSE; /* End of comment, */ -X if (keepcomments) { /* Put out the comment */ -X cput(c); /* terminator, too */ -X } -X /* -X * A comment is syntactically "whitespace" -- -X * however, there are certain strange sequences -X * such as -X * #define foo(x) (something) -X * foo|* comment *|(123) -X * these are '/' ^ ^ -X * where just returning space (or COM_SEP) will cause -X * problems. This can be "fixed" by overwriting the -X * '/' in the input line buffer with ' ' (or COM_SEP) -X * but that may mess up an error message. -X * So, we peek ahead -- if the next character is -X * "whitespace" we just get another character, if not, -X * we modify the buffer. All in the name of purity. -X */ -X if (*file->bptr == '\n' -X || type[*file->bptr & 0xFF] == SPA) -X goto newline; -X#if COMMENT_INVISIBLE -X /* -X * Return magic (old-fashioned) syntactic space. -X */ -X return ((file->bptr[-1] = COM_SEP)); -X#else -X return ((file->bptr[-1] = ' ')); -X#endif -X -X case '\n': /* we'll need a #line */ -X if (!keepcomments) -X wrongline = TRUE; /* later... */ -X default: /* Anything else is */ -X break; /* Just a character */ -X } /* End switch */ -X } /* End comment loop */ -X } /* End if in comment */ -X else if (!inmacro && c == '\\') { /* If backslash, peek */ -X if ((c = get()) == '\n') { /* for a . If so, */ -X wrongline = TRUE; -X goto newline; -X } -X else { /* Backslash anything */ -X unget(); /* Get it later */ -X return ('\\'); /* Return the backslash */ -X } -X } -X else if (c == '\f' || c == VT) /* Form Feed, Vertical */ -X c = ' '; /* Tab are whitespace */ -X return (c); /* Just return the char */ -X} -X -Xunget() -X/* -X * Backup the pointer to reread the last character. Fatal error -X * (code bug) if we backup too far. unget() may be called, -X * without problems, at end of file. Only one character may -X * be ungotten. If you need to unget more, call ungetstring(). -X */ -X{ -X register FILEINFO *file; -X -X if ((file = infile) == NULL) -X return; /* Unget after EOF */ -X if (--file->bptr < file->buffer) -X cfatal("Too much pushback", NULLST); -X if (*file->bptr == '\n') /* Ungetting a newline? */ -X --line; /* Unget the line number, too */ -X} -X -Xungetstring(text) -Xchar *text; -X/* -X * Push a string back on the input stream. This is done by treating -X * the text as if it were a macro. -X */ -X{ -X register FILEINFO *file; -X extern FILEINFO *getfile(); -X -X file = getfile(strlen(text) + 1, ""); -X strcpy(file->buffer, text); -X} -X -Xint -Xcget() -X/* -X * Get one character, absorb "funny space" after comments or -X * token concatenation -X */ -X{ -X register int c; -X -X do { -X c = get(); -X#if COMMENT_INVISIBLE -X } while (c == TOK_SEP || c == COM_SEP); -X#else -X } while (c == TOK_SEP); -X#endif -X return (c); -X} -X -X/* -X * Error messages and other hacks. The first byte of severity -X * is 'S' for string arguments and 'I' for int arguments. This -X * is needed for portability with machines that have int's that -X * are shorter than char *'s. -X */ -X -Xstatic -Xdomsg(severity, format, arg) -Xchar *severity; /* "Error", "Warning", "Fatal" */ -Xchar *format; /* Format for the error message */ -Xchar *arg; /* Something for the message */ -X/* -X * Print filenames, macro names, and line numbers for error messages. -X */ -X{ -X register char *tp; -X register FILEINFO *file; -X -X fprintf(stderr, "%sline %d, %s: ", MSG_PREFIX, line, &severity[1]); -X if (*severity == 'S') -X fprintf(stderr, format, arg); -X else -X fprintf(stderr, format, (int) arg); -X putc('\n', stderr); -X if ((file = infile) == NULL) -X return; /* At end of file */ -X if (file->fp != NULL) { -X tp = file->buffer; /* Print current file */ -X fprintf(stderr, "%s", tp); /* name, making sure */ -X if (tp[strlen(tp) - 1] != '\n') /* there's a newline */ -X putc('\n', stderr); -X } -X while ((file = file->parent) != NULL) { /* Print #includes, too */ -X if (file->fp == NULL) -X fprintf(stderr, "from macro %s\n", file->filename); -X else { -X tp = file->buffer; -X fprintf(stderr, "from file %s, line %d:\n%s", -X (file->progname != NULL) -X ? file->progname : file->filename, -X file->line, tp); -X if (tp[strlen(tp) - 1] != '\n') -X putc('\n', stderr); -X } -X } -X} -X -Xcerror(format, sarg) -Xchar *format; -Xchar *sarg; /* Single string argument */ -X/* -X * Print a normal error message, string argument. -X */ -X{ -X domsg("SError", format, sarg); -X errors++; -X} -X -Xcierror(format, narg) -Xchar *format; -Xint narg; /* Single numeric argument */ -X/* -X * Print a normal error message, numeric argument. -X */ -X{ -X domsg("IError", format, (char *) narg); -X errors++; -X} -X -Xcfatal(format, sarg) -Xchar *format; -Xchar *sarg; /* Single string argument */ -X/* -X * A real disaster -X */ -X{ -X domsg("SFatal error", format, sarg); -X exit(IO_ERROR); -X} -X -Xcwarn(format, sarg) -Xchar *format; -Xchar *sarg; /* Single string argument */ -X/* -X * A non-fatal error, string argument. -X */ -X{ -X domsg("SWarning", format, sarg); -X} -X -Xciwarn(format, narg) -Xchar *format; -Xint narg; /* Single numeric argument */ -X/* -X * A non-fatal error, numeric argument. -X */ -X{ -X domsg("IWarning", format, (char *) narg); -X} -X -X -X -END-of-cpp6.c -exit diff --git a/sys/unix/depend.awk b/sys/unix/depend.awk index d10f48a57..edb8fb4e7 100644 --- a/sys/unix/depend.awk +++ b/sys/unix/depend.awk @@ -1,9 +1,16 @@ # depend.awk -- awk script used to construct makefile dependencies # for nethack's source files (`make depend' support for Makefile.src). -# $NHDT-Date: 1546220373 2018/12/31 01:39:33 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.8 $ +# $NHDT-Date: 1709577497 2024/03/04 18:38:17 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.18 $ # # usage: -# cd src ; nawk -f depend.awk ../include/*.h list-of-.c/.cpp-files +# awk -f depend.awk ../include/*.h list-of-.c/.cpp-files +# (might need nawk or gawk instead of plain awk if it is really old) +# meta usage: +# ( cd src ; make all ; cp ../sys/unix/Makefile.src ./Makefile ; \ +# make depend ; cp ./Makefile ../sys/unix/Makefile.src ; \ +# cd .. ; sh sys/unix/setup.sh [sys/unix/hints/FOO] ) +# newer usage: +# cd sys/unix ; make -f Makefile.src updatedepend # # This awk program scans each file in sequence, looking for lines beginning # with `#include "' and recording the name inside the quotes. For .h files, @@ -11,6 +18,10 @@ # corresponding .o file; dependencies in nested header files are propagated # to the .o target. # +# Variables that can be set on the command line: +# -v dontsortdeps=1 do not sort the dependencies +# -v dontsortfules=1 do not sort the rules +# # config.h and hack.h get special handling because of their heavy use; # timestamps for them allow make to avoid rechecking dates on # subsidiary headers for every source file; @@ -18,6 +29,7 @@ # during development; # patchlev.h gets special handling because it only exists on systems # which consider filename patchlevel.h to be too long; +# amiconf.h moved from ../include/ to ../outdated/include/ so skip it # interp.c gets special handling because it usually doesn't exist; it's # assumed to be the last #include in the file where it occurs. # win32api.h gets special handling because it only exists for some ports; @@ -29,6 +41,7 @@ BEGIN { FS = "\"" #for `#include "X"', $2 is X special[++sp_cnt] = "../include/hack.h" alt_deps["../include/extern.h"] = "" alt_deps["../include/patchlev.h"] = "" + alt_deps["../include/amiconf.h"] = "" alt_deps["interp.c"] = " #interp.c" #comment it out alt_deps["../include/win32api.h"] = " #../include/win32api.h" alt_deps["../include/zlib.h"] = " #zlib.h" #comment it out @@ -36,26 +49,40 @@ BEGIN { FS = "\"" #for `#include "X"', $2 is X FNR == 1 { output_dep() #finish previous file file = FILENAME #setup for current file } -/^\#[ \t]*include[ \t]+\"/ { #find `#include "X"' +/^[#][ \t]*include[ \t]+["]/ { #find `#include "X"' incl = $2 #[3.4.0: gnomehack headers currently aren't in include] #[3.6.2: Qt4 headers aren't in include either] #[3.6.2: curses headers likewise] - if (incl ~ /\.h$/) { - if (incl ~ "curses\.h") - incl = "" # skip "curses.h"; it should be + #[NetHack 5.0.0: Qt headers have moved; process 'moc' files] + if (incl ~ /[.]h$/) { + if (incl ~ "curses[.]h") + incl = "" # skip "curses.h"; it should be + else if (incl ~ /^..\/lib\/lua-.*\/src\/l/) + incl = "" # skip lua headers else if (incl ~ /^curs/) # curses special case incl = "../win/curses/" incl - else if (incl ~ /^qt4/) # Qt v4 special case - incl = "../win/Qt4/" incl - else if (incl ~ /^gn/) # gnomehack special case + else if (incl ~ /(.*\/)*qt_/) { # Qt special cases + # Qt v3 headers are in ../win/Qt3 + # Qt v4/v5/v6 headers are in ../win/Qt + # *.moc files have path in their #include + if (file ~ /[.]moc$/) + ; # keep 'incl' as-is + else if (file ~ /^[.][.]\/win\/Qt3\/.*/) + incl = "../win/Qt3/" incl + else # Qt v4/v5/v6 + incl = "../win/Qt/" incl + } else if (incl ~ /^gn/) # gnomehack special case incl = "../win/gnome/" incl else incl = "../include/" incl } deps[file] = deps[file] " " incl } -END { output_dep() } #finish the last file +END { + output_dep() #finish the last file + output_final() #write output + } # @@ -63,16 +90,48 @@ END { output_dep() } #finish the last file # don't do anything (we've just been collecting their dependencies); # for .c files, output the `make' rule for corresponding .o file # -function output_dep( targ) + +function output_dep(){ + if(!dontsortrules){ + worklist[++worklistctr] = file + } else { + output_final2() + } +} + +function output_final( x) { - if (file ~ /\.cp*$/) { + if(!dontsortrules){ + nhsort(worklist, 1, worklistctr, 1) + for(x=1;x<=worklistctr;x++){ + file = worklist[x] + output_final2() + } + } else { + return + } +} + +function output_final2( base, targ, moc) +{ + #get the file's base name (including suffix) + base = file; sub("^.+/", "", base) + #for qt source files, add qt timestamp file as extra dependency + moc = (base ~ /[.]moc$/) + if (moc || base ~ /(.+\/)*qt_.*[.]cpp$/) { + deps[file] = deps[file] " $(QTn_H)" + } + if ((base ~ /[.]cp*$/ || moc) && !(file in filedone)) { #prior to very first .c|.cpp file, handle some special header file cases if (!c_count++) output_specials() #construct object filename from source filename - targ = file; sub("^.+/", "", targ); sub("\\.cp*$", ".o", targ) + targ = base; sub("[.]cp*$", ".o", targ) #format and write the collected dependencies format_dep(targ, file) + #generated file tile.c can appear more than once in the list of files + #so track which files have already been handled; can't reuse done[] here + filedone[file]++; } } @@ -86,7 +145,7 @@ function output_specials( i, sp, alt_sp) #change "../include/foo.h" first to "foo.h", then ultimately to "$(FOO_H)" alt_sp = sp; sub("^.+/", "", alt_sp) print "#", alt_sp, "timestamp" #output a `make' comment - #- sub("\\.", "_", alt_sp); alt_sp = "$(" toupper(alt_sp) ")" + #- sub("[.]", "_", alt_sp); alt_sp = "$(" toupper(alt_sp) ")" #+ Some nawks don't have toupper(), so hardwire these instead. sub("config.h", "$(CONFIG_H)", alt_sp); sub("hack.h", "$(HACK_H)", alt_sp) format_dep(alt_sp, sp) #output the target @@ -100,16 +159,26 @@ function output_specials( i, sp, alt_sp) # write a target and its dependency list in pretty-printed format; # if target's primary source file has a path prefix, also write build command # -function format_dep(target, source, n, i, list) +function format_dep(target, source, col, n, i, list, prefix, moc) { split("", done) #``for (x in done) delete done[x]'' - printf("%s:", target); col = length(target) + 1 + moc = (target ~ /[.]moc$/) + prefix = (moc || substr(target,1,1) == "$") ? "" : "$(TARGETPFX)" + printf("%s%s:", prefix, target); col = length(target) + 1 + length(prefix) #- printf("\t"); col += 8 - (col % 8); #- if (col == 8) { printf("\t"); col += 8 } source = depend("", source, 0) + sub(" +$", "", source) #strip trailing spaces, if any n = split(source, list, " +") - for (i = 2; i <= n; i++) { #(leading whitespace yields empty 1st element) - if (col + length(list[i]) >= (i < n ? 78 : 80)) { + #first: leading whitespace yields empty 1st element; not sure why moc + #files duplicate the target as next element but we need to skip that too + first = moc ? 3 : 2 + source = list[first] + if (!dontsortdeps){ + nhsort(list, first, n, 0) + } + for (i = first; i <= n; i++) { + if (col + length(list[i]) >= (i < n ? 78 : 80) - 1) { printf(" \\\n\t\t"); col = 16 #make a backslash+newline split } else { printf(" "); col++; @@ -118,16 +187,17 @@ function format_dep(target, source, n, i, list) } printf("\n") #terminate #write build command if first source entry has non-include path prefix - source = list[2] - if (source ~ /\// && substr(source, 1, 11) != "../include/") { - if (source ~ /\.cpp$/ ) - print "\t$(CXX) $(CXXFLAGS) -c -o $@ " source + if (moc) { + print "\t$(MOCPATH) -o $@ " source + } else if (source ~ /\// && substr(source, 1, 11) != "../include/") { + if (source ~ /[.]cpp$/ ) + print "\t$(TARGET_CXX) $(TARGET_CXXFLAGS) -c -o $@ " source else if (source ~ /\/X11\//) # "../win/X11/foo.c" - print "\t$(CC) $(CFLAGS) $(X11CFLAGS) -c -o $@ " source + print "\t$(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -c -o $@ " source else if (source ~ /\/gnome\//) # "../win/gnome/foo.c" - print "\t$(CC) $(CFLAGS) $(GNOMEINC) -c -o $@ " source + print "\t$(TARGET_CC) $(TARGET_CFLAGS) $(GNOMEINC) -c -o $@ " source else - print "\t$(CC) $(CFLAGS) -c -o $@ " source + print "\t$(TARGET_CC) $(TARGET_CFLAGS) -c -o $@ " source } } @@ -161,4 +231,58 @@ function depend(inout, name, skip, n, i, list) return inout } +# +# sort list[first]..list[last] +# Derived from: https://www.baeldung.com/linux/awk-begin-and-end-rules +# +function nhsort(list, first, last, cmpid, i,j,temp) +{ + for (i = first; i <= last-1; i++) { + for (j = i+1; j <= last; j++) { + if (nhcmp(list[i], list[j], cmpid)) { + temp = list[i] + list[i] = list[j] + list[j] = temp + } + } + } +} + +function nhcmp(a,b,cmpid) +{ + if(cmpid == 0){ # sort dependencies + # commented out entry (there can be only one) MUST be last + if (a ~ /^#/){ return 1} + if (b ~ /^#/){ return 0} + # 2 .c or .cpp files + if (a ~ /\.c(pp)?$/ && b ~ /\.c(pp)?$/ ){ return a > b } + # a .c or .cpp file and anything else + if (a ~ /\.c(pp)?$/){ return 0 } + if (b ~ /\.c(pp)?$/){ return 1 } + # default + return a > b + } else if(cmpid == 1){ # sort rules + # 2 .h files + if (a ~ /\.h$/ && b ~ /\/.h$/){ return a > b } + # a .h and anything else + if (a ~ /\.h$/){ return 0 } + if (b ~ /\.h$/){ return 1 } + # 2 .c or .cpp files + if (a ~ /\.c(pp)?$/ && b ~ /\.c(pp)?$/ ){ return a > b } + # a .c or .cpp file and anything else + if (a ~ /\.c(pp)?$/){ return 0 } + if (b ~ /\.c(pp)?$/){ return 1 } + # 2 .moc files + if (a ~ /\.moc$/ && b ~ /\.moc$/){ return a > b } + # a .moc and anything else + if (a ~ /\.moc$/){ return 0 } + if (b ~ /\.moc$/){ return 1 } + # default + return a > b + } else { + print "internal error cmpid=" cmpid + exit 1 + } +} + #depend.awk# diff --git a/sys/unix/gitinfo.sh b/sys/unix/gitinfo.sh index 9ab309f84..817a7f310 100755 --- a/sys/unix/gitinfo.sh +++ b/sys/unix/gitinfo.sh @@ -1,5 +1,5 @@ #!/bin/sh -# NetHack 3.6 gitinfo.sh $NHDT-Date: 1524689450 2018/04/25 20:50:50 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.2 $ +# NetHack 5.0 gitinfo.sh $NHDT-Date: 1596498289 2020/08/03 23:44:49 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.3 $ # Copyright (c) 2018 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. diff --git a/sys/unix/hints/include/compiler.500 b/sys/unix/hints/include/compiler.500 new file mode 100755 index 000000000..d04b06381 --- /dev/null +++ b/sys/unix/hints/include/compiler.500 @@ -0,0 +1,266 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 compiler.500 $NHDT-Date: 1668359835 2022/11/13 17:17:15 $ $NHDT-Branch: NetHack-5.0 $ + +# compiler flags: CCFLAGS is used to construct a value for CFLAGS with +# various -I, -D, and -W settings appended below; +# these are the settings of most interest for an end-user build +# (clang doesn't support '-Og', gcc needs 4.x or later) +CCFLAGS = -g +#CCFLAGS = -g -Og +#CCFLAGS = -O2 +# Note: this is not the usual 'CFLAGS' which is used in default +# rules for compiling C code; specifying a value for that on the +# 'make' command line should be avoided. + +#If you want to force use of one particular set of compilers, do it +#here, ahead of the detection, so that the detection will match your +#choice and set variables CCISCLANG, CCISGCC, GCCGTEQ, CLANGPPGTEQ9 etc. +#accordingly. +# +#CC= gcc +#CXX= g++ -std-gnu++11 +# +#CC= clang +#CXX=clang++ -std=gnu++11 +# +# If these are set on entry, preparation for C++ compiles is affected. +# CPLUSPLUS_NEEDED = 1 C++ compile bits included +# CPLUSPLUS_NEED17 = 1 C++ -std=c++17 (at least) +# CPLUSPLUS_NEED20 = 1 C++ -std=c++20 (at least) +# CPLUSPLUS_NEED_DEPSUPPRESS = 1 C++ -Wno-deprecated-copy, +# -Wno-deprecated-declarations + +ifeq "$(WANT_ASAN)" "1" +USE_ASAN=1 +endif + +ifeq "$(WANT_UBSAN)" "1" +USE_UBSAN=1 +endif + +# If you want to override the compiler detection just carried out +# uncomment one of the following pairs. Note, however, that +# doing this after the detection above will likely result in +# mismatched variable values for CCISCLANG, CCISGCC, GCCGTEQ, CLANGPPGTEQ9 etc. +# +#CC= gcc +#CXX= g++ -std-gnu++11 +# +#CC= clang +#CXX=clang++ -std=gnu++11 + +CFLAGS=$(CCFLAGS) -I../include -DNOTPARMDECL +CFLAGS+=-Wall -Wextra \ + -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings +CFLAGS+=-pedantic +CFLAGS+=-Wmissing-declarations +#CFLAGS+=-Wformat=2 +#CFLAGS+=-Wdiscarded-qualifiers + +# these are left out of the C++ flags +CFLAGS+=-Wformat-nonliteral +CFLAGS+=-Wunreachable-code + +# +# the following are not allowed in C++ +CFLAGS+=-Wimplicit +CFLAGS+=-Wimplicit-function-declaration +CFLAGS+=-Wimplicit-int +CFLAGS+=-Wmissing-prototypes +CFLAGS+=-Wold-style-definition +CFLAGS+=-Wstrict-prototypes +CFLAGS+=-Wnonnull + +#detection of clang vs gcc +CCTEST := $(shell echo `$(CC) --version` | grep clang) +ifneq "$(CCTEST)" "" +CCISCLANG=1 +CCISGCC= +else +CCISCLANG= +CCISGCC=1 +endif +#$(info CCISCLANG=$(CCISCLANG), CCISGCC=$(CCISGCC)) + +ifeq "$(CCISGCC)" "1" +# gcc-specific follows +CXX=g++ -std=gnu++11 +# get the version of gcc +GCCGTEQ9 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 9) +GCCGTEQ11 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 11) +GCCGTEQ12 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 12) +GCCGTEQ14 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 14) +ifeq "$(GCCGTEQ9)" "1" +# flags present in gcc version greater than or equal to 9 can go here +CFLAGS+=-Wformat-overflow +CFLAGS+=-Wmissing-parameter-type +endif # GCC greater than or equal to 9 +#ifeq "$(GCCGTEQ11)" "1" +CFLAGS+=-Wimplicit-fallthrough +#endif +#ifeq "$(GCCGTEQ12)" "1" +#endif +#ifeq "$(GCCGTEQ14)" "1" +#endif +# end of gcc-specific +else # gcc or clang? +# clang-specific follows +CXX=clang++ -std=gnu++11 +CLANGGTEQ12 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 12) +CLANGGTEQ14 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 14) +CLANGGTEQ21 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 21) +ifeq "$(CLANGGTEQ12)" "1" +CFLAGS+=-Wimplicit-fallthrough +endif +ifeq "$(CLANGGTEQ14)" "1" +ifneq "$(VIEWDEPRECATIONS)" "1" +CFLAGS+=-Wno-deprecated-declarations +endif # not VIEWDEPRECATIONS +else +# older versions complain about things newer ones don't without this +CFLAGS+=-Wno-missing-field-initializers +endif +ifeq "$(CLANGGTEQ21)" "1" +CFLAGS+=-Wno-deprecated-octal-literals +endif +# none +endif # clang-specific ends here + +ifdef MAKEFILE_SRC +ifdef CPLUSPLUS_NEEDED +CCXXFLAGS = -g -I../include -DNOTPARMDECL +CCXXFLAGS+=-Wall -Wextra -Wno-missing-field-initializers \ + -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings +CCXXFLAGS+=-pedantic +CCXXFLAGS+=-Wmissing-declarations +#detection of clang++ vs g++ +CXXISCLANG := $(shell echo `$(CXX) --version` | grep clang) +ifeq "$(CXXISCLANG)" "" +# g++-specific +CCXX=g++ -std=gnu++11 +# get the version of g++ +GPPGTEQ9 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 9) +GPPGTEQ11 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 11) +GPPGTEQ12 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 12) +GPPGTEQ14 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 14) +ifeq "$(GPPGTEQ9)" "1" +CCXXFLAGS+=-Wformat-overflow +ifdef CPLUSPLUS_NEED_DEPSUPPRESS +ifneq "$(VIEWDEPRECATIONS)" "1" +CCXXFLAGS+=-Wno-deprecated-copy +CCXXFLAGS+=-Wno-deprecated-declarations +endif # not VIEWDEPRECATIONS +endif # CPLUSPLUS_NEED_DEPSUPPRESS +endif # g++ version greater than or equal to 9 +ifeq "$(GPPGTEQ11)" "1" +# the g++ linker will have trouble linking if the following isn't included +# when compiling the C files. +CFLAGS+=-fPIC +endif # g++ version greater than or equal to 11 +ifdef CPLUSPLUS_NEED17 +ifeq "$(GPPGTEQ12)" "1" +CCXX=g++ -std=c++17 +else # g++ version greater than or equal to 12? (no follows) +CCXX=g++ -std=c++17 +endif # g++ version greater than or equal to 12 +endif # CPLUSPLUS_NEED17 +ifdef CPLUSPLUS_NEED20 +ifeq "$(GPPGTEQ9)" "1" +CCXX=g++ -std=c++20 +else # g++ version greater than or equal to 9? (no follows) +CCXX=g++ -std=c++17 +endif # g++ version greater than or equal to 9 +endif # CPLUSPLUS_NEED20 + + +else # g++ or clang++ ? + +# clang++-specific +CCXX=clang++ -std=c++11 +# get the version of clang++ +CLANGPPGTEQ9 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 9) +CLANGPPGTEQ11 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 11) +CLANGPPGTEQ14 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 14) +CLANGPPGTEQ16 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 16) +CLANGPPGTEQ17 := $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 17) +ifeq "$(CLANGPPGTEQ9)" "1" +#CCXXFLAGS+=-Wformat-overflow +endif +ifeq "$(CLANGPPGTEQ14)" "1" +CPLUSPLUS_NEED_DEPSUPPRESS=1 +endif +ifdef CPLUSPLUS_NEED_DEPSUPPRESS +ifneq "$(VIEWDEPRECATIONS)" "1" +CCXXFLAGS+=-Wno-deprecated +CCXXFLAGS+=-Wno-deprecated-declarations +endif # not VIEWDEPRECATIONS +endif # CPLUSPLUS_NEED_DEPSUPPRESS +# The clang++ linker seems to have trouble linking if the following isn't +# included when compiling the C files by clang.. +CFLAGS+=-fPIC +ifdef CPLUSPLUS_NEED17 +ifeq "$(CLANGPPGTEQ14)" "1" +CCXX=clang++ -std=c++17 +endif # clang++ greater than or equal to 14 +ifeq "$(CLANGPPGTEQ17)" "1" +CCXX=clang++ -std=c++17 +endif # clang++ greater than or equal to 17 +endif # CPLUSPLUS_NEED17 +ifdef CPLUSPLUS_NEED20 +ifeq "$(CLANGPPGTEQ17)" "1" +CCXX=clang++ -std=c++20 +endif # clang++ greater than or equal to 17 +endif # CPLUSPLUS_NEED20 +endif # end of clang++-specific section +CXX=$(CCXX) +endif # CPLUSPLUS_NEEDED +endif # MAKEFILE_SRC + +ifeq "$(c89)" "1" +HAVECSTD=c89 +endif +ifeq "$(C89)" "1" +HAVECSTD=c89 +endif + +ifeq "$(c99)" "1" +HAVECSTD=c99 +endif +ifeq "$(C99)" "1" +HAVECSTD=c99 +endif + +ifeq "$(c11)" "1" +HAVECSTD=c11 +endif +ifeq "$(C11)" "1" +HAVECSTD=c11 +endif + +ifeq "$(c23)" "1" +HAVECSTD=c2x +endif +ifeq "$(C23)" "1" +HAVECSTD=c2x +endif + +ifeq "$(c2x)" "1" +HAVECSTD=c2x +endif +ifeq "$(C2X)" "1" +HAVECSTD=c2x +endif + +ifeq "$(c2y)" "1" +HAVECSTD=c2y +endif +ifeq "$(C2Y)" "1" +HAVECSTD=c2y +endif + +ifneq "$(HAVECSTD)" "" +CSTD = -std=$(HAVECSTD) +endif + +#end of compiler.500 +#------------------------------------------------------------------------------ diff --git a/sys/unix/hints/include/cross-post.500 b/sys/unix/hints/include/cross-post.500 new file mode 100644 index 000000000..512906d8f --- /dev/null +++ b/sys/unix/hints/include/cross-post.500 @@ -0,0 +1,494 @@ +#===============-================================================= +# NetHack 5.0 include/cross-post $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ +# +# Cross-compiling -POST section + +ifdef CROSS_TO_MSDOS +# +$(TARGETPFX)msdos.o : ../sys/msdos/msdos.c $(HACK_H) +$(TARGETPFX)font.o : ../sys/msdos/font.c ../sys/msdos/font.h $(HACK_H) +$(TARGETPFX)pckeys.o : ../sys/msdos/pckeys.c $(HACK_H) +$(TARGETPFX)pctiles.o : ../sys/msdos/pctiles.c ../sys/msdos/portio.h $(HACK_H) +$(TARGETPFX)video.o : ../sys/msdos/video.c ../sys/msdos/portio.h $(HACK_H) +$(TARGETPFX)vidtxt.o : ../sys/msdos/vidtxt.c ../sys/msdos/portio.h \ + ../win/share/tile.h ../include/tileset.h $(HACK_H) +$(TARGETPFX)vidvga.o : ../sys/msdos/vidvga.c ../sys/msdos/portio.h \ + ../win/share/tile.h ../include/tileset.h $(HACK_H) +$(TARGETPFX)vidvesa.o : ../sys/msdos/vidvesa.c ../sys/msdos/portio.h \ + ../win/share/tile.h ../include/tileset.h ../sys/msdos/font.h $(HACK_H) +$(TARGETPFX)vidstub.o : ../sys/msdos/vidvesa.c ../sys/msdos/portio.h \ + $(HACK_H) +$(TARGETPFX)tile.o : tile.c +$(TARGETPFX)exceptn.o : ../lib/djgpp/djgpp-patch/src/libc/go32/exceptn.S + $(TARGET_CC) -c -o $@ ../lib/djgpp/djgpp-patch/src/libc/go32/exceptn.S + $(TARGET_AR) ru ../lib/djgpp/i586-pc-msdosdjgpp/lib/libc.a $(TARGETPFX)exceptn.o +$(GAMEBIN) : $(HOBJ) $(TARGETPFX)date.o $(TARGET_HACKLIB) $(LUACROSSLIB) + $(TARGET_LINK) $(TARGET_LFLAGS) -o $@ \ + $(HOBJ) $(TARGET_HACKLIB) $(WINLIB) $(TARGET_LIBS) +$(DOSFONT)/ter-u16b.psf: $(FONTTOP)/ter-u16b.bdf $(DOSFONT)/nh-u16b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u16b.bdf $(DOSFONT)/nh-u16b.bdf $@ +$(DOSFONT)/ter-u16v.psf: $(FONTTOP)/ter-u16v.bdf $(DOSFONT)/nh-u16v.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u16v.bdf $(DOSFONT)/nh-u16v.bdf $@ +$(DOSFONT)/ter-u18b.psf: $(FONTTOP)/ter-u18b.bdf $(DOSFONT)/nh-u18b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u18b.bdf $(DOSFONT)/nh-u18b.bdf $@ +$(DOSFONT)/ter-u20b.psf: $(FONTTOP)/ter-u20b.bdf $(DOSFONT)/nh-u20b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u20b.bdf $(DOSFONT)/nh-u20b.bdf $@ +$(DOSFONT)/ter-u22b.psf: $(FONTTOP)/ter-u22b.bdf $(DOSFONT)/nh-u22b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u22b.bdf $(DOSFONT)/nh-u22b.bdf $@ +$(DOSFONT)/ter-u24b.psf: $(FONTTOP)/ter-u24b.bdf $(DOSFONT)/nh-u24b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u24b.bdf $(DOSFONT)/nh-u24b.bdf $@ +$(DOSFONT)/ter-u28b.psf: $(FONTTOP)/ter-u28b.bdf $(DOSFONT)/nh-u28b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u28b.bdf $(DOSFONT)/nh-u28b.bdf $@ +$(DOSFONT)/ter-u32b.psf: $(FONTTOP)/ter-u32b.bdf $(DOSFONT)/nh-u32b.bdf $(DOSFONT)/makefont.lua $(LUABIN) + $(LUABIN) $(DOSFONT)/makefont.lua $(FONTTOP)/ter-u32b.bdf $(DOSFONT)/nh-u32b.bdf $@ +# +.PHONY: dodata dospkg dosfonts +dosfonts: $(FONTTARGETS) +dospkg: dodata dosfonts $(GAMEBIN) $(TARGETPFX)recover.exe ../dat/nhtiles.bmp + $(TARGET_STUBEDIT) $(GAMEBIN) minstack=2048K + mkdir -p $(TARGETPFX)pkg + cp $(GAMEBIN) $(TARGETPFX)pkg/NETHACK.EXE + cp $(TARGETPFX)recover.exe $(TARGETPFX)pkg/RECOVER.EXE + -cp $(SFCTOOLBIN) $(TARGETPFX)pkg/SFCTOOL.EXE + cp ../dat/nhdat $(TARGETPFX)pkg/NHDAT + cp ../dat/license $(TARGETPFX)pkg/LICENSE + cp ../dat/nhtiles.bmp $(TARGETPFX)pkg/NHTILES.BMP + cp ../dat/symbols $(TARGETPFX)pkg/SYMBOLS + cp ../sys/share/NetHack.cnf $(TARGETPFX)pkg/NETHACK.CNF + cp ../sys/msdos/sysconf $(TARGETPFX)pkg/SYSCONF + cp ../doc/nethack.txt $(TARGETPFX)pkg/NETHACK.TXT + -cp $(DOSFONT)/ter-u16b.psf $(TARGETPFX)pkg/TER-U16B.PSF + -cp $(DOSFONT)/ter-u16v.psf $(TARGETPFX)pkg/TER-U16V.PSF + -cp $(DOSFONT)/ter-u18b.psf $(TARGETPFX)pkg/TER-U18B.PSF + -cp $(DOSFONT)/ter-u20b.psf $(TARGETPFX)pkg/TER-U20B.PSF + -cp $(DOSFONT)/ter-u22b.psf $(TARGETPFX)pkg/TER-U22B.PSF + -cp $(DOSFONT)/ter-u24b.psf $(TARGETPFX)pkg/TER-U24B.PSF + -cp $(DOSFONT)/ter-u28b.psf $(TARGETPFX)pkg/TER-U28B.PSF + -cp $(DOSFONT)/ter-u32b.psf $(TARGETPFX)pkg/TER-U32B.PSF + cp ../lib/djgpp/cwsdpmi/bin/CWSDPMI.EXE $(TARGETPFX)pkg/CWSDPMI.EXE + ( if [ -f ../lib/djgpp/target/bin/symify.exe ]; then \ + cp ../lib/djgpp/target/bin/symify.exe $(TARGETPFX)pkg/SYMIFY.EXE; \ + else \ + pwd; echo "../lib/djgpp/target/bin/symify.exe not found"; \ + fi; ) +ifeq "$(WANT_DEBUG)" "1" + ( if [ -f $(GDBEXE) ]; \ + then \ + cp $(GDBEXE) $(TARGETPFX)pkg/GDB.EXE; \ + echo "gdb -ex '$(GDBCMDLINE)' NETHACK.EXE"> $(TARGETPFX)pkg/$(GDBBAT); \ + else \ + pwd; echo "$(GDBEXE) not found and WANT_DEBUG=1 specified"; \ + fi; ) +else + -( if [ -f $(TARGETPFX)pkg/GDB.EXE ]; \ + then \ + rm $(TARGETPFX)pkg/GDB.EXE; \ + fi; ) + -( if [ -f $(TARGETPFX)pkg/NHGDB.BAT ]; \ + then \ + rm $(TARGETPFX)pkg/NHGDB.BAT; \ + fi; ) +endif + -touch $(TARGETPFX)pkg/RECORD + cd $(TARGETPFX)pkg ; zip -9 ../NH$(NHV)DOS.ZIP * ; cd ../../.. + @echo msdos package zip file $(TARGETPFX)NH$(NHV)DOS.ZIP + +$(LUABIN): + ( cd .. && make luabin && cd src) +dodata: + ( cd .. && make dlb && cd src) +ifdef dosbox +# make CROSS_TO_MSDOS=1 dosbox=~/dosbox deploy-to-dosbox +ifdef MAKEFILE_TOP +deploy-to-dosbox: + ( cd src; make $(DEPLOY); cd .. ) +endif +.PHONY: deploytodosbox + +deploytodosbox: $(TARGETPFX)NH$(NHV)DOS.ZIP $(dosboxnhfolder) $(dosboxnhsrc) \ + $(dosboxnhsrc)/src $(dosboxnhsrc)/include \ + $(dosboxnhsrc)/sys/msdos $(dosboxnhsrc)/sys/share \ + $(dosboxnhsrc)/win/share $(dosboxnhsrc)/win/curses \ + $(dosboxnhsrc)/win/tty $(dosboxnhsrc)/util \ + $(dosboxnhfolder)/NETHACK.EXE + @echo DOS NetHack deployed to dosbox at $(dosboxnhfolder) +$(TARGETPFX)NH$(NHV)DOS.ZIP: dospkg +$(dosboxnhfolder): + mkdir -p $@ +$(dosboxnhsrc): $(dosboxnhfolder) + mkdir -p $@ +$(dosboxnhsrc)/src: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)src/*.c $(dosboxnhsrc)/src +$(dosboxnhsrc)/include: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)include/*.h $(dosboxnhsrc)/include +$(dosboxnhsrc)/sys/msdos: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)sys/msdos/*.c $(dosboxnhsrc)/sys/msdos + cp --preserve=timestamps $(FLDR)sys/msdos/*.h $(dosboxnhsrc)/sys/msdos +$(dosboxnhsrc)/sys/share: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)sys/share/*.c $(dosboxnhsrc)/sys/share +$(dosboxnhsrc)/win/share: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)win/share/*.c $(dosboxnhsrc)/win/share +$(dosboxnhsrc)/win/curses: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)win/curses/*.c $(dosboxnhsrc)/win/curses + cp --preserve=timestamps $(FLDR)win/curses/*.h $(dosboxnhsrc)/win/curses +$(dosboxnhsrc)/win/tty: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)win/tty/*.c $(dosboxnhsrc)/win/tty +$(dosboxnhsrc)/util: $(dosboxnhsrc) + mkdir -p $@ + cp --preserve=timestamps $(FLDR)util/*.c $(dosboxnhsrc)/util + cp --preserve=timestamps $(FLDR)util/*.h $(dosboxnhsrc)/util +$(dosboxnhfolder)/NETHACK.EXE: $(TARGETPFX)NH$(NHV)DOS.ZIP + unzip -o $(TARGETPFX)NH$(NHV)DOS.ZIP -d $(dosboxnhfolder) + find $(dosboxnhfolder) -type f -name "$(dosboxconfigfile)" \ + | xargs sed -i 's/#OPTIONS=video:autodetect/OPTIONS=video:autodetect/g' +endif # dosbox +endif # CROSS_TO_MSDOS + +ifdef CROSS_TO_WASM +$(WASM_TARGET): pregame $(TARGET_HACKLIB) $(TARGETPFX)date.o $(HOSTOBJ) $(HOBJ) $(LUACROSSLIB) $(WASM_DATA_DIR) + -rm $@ + $(TARGET_CC) $(TARGET_LFLAGS) $(TARGET_CFLAGS) -o $@ \ + $(HOBJ) $(TARGETPFX)date.o $(TARGET_HACKLIB) $(TARGET_LIBS) + +$(WASM_DATA_DIR): $(WASM_DATA_DIR)/nhdat + touch $(WASM_DATA_DIR)/perm + touch $(WASM_DATA_DIR)/record + touch $(WASM_DATA_DIR)/logfile + touch $(WASM_DATA_DIR)/xlogfile + touch $(WASM_DATA_DIR)/livelog + cp ../sys/libnh/sysconf $(WASM_DATA_DIR)/sysconf + +$(WASM_DATA_DIR)/nhdat: + ( cd ..; $(MAKE) INSTDIR='$(WASM_DATA_DIR)' $(WASMDEP) dofiles-dlb ) + +# +$(TARGETPFX)unixmain.o : ../sys/unix/unixmain.c $(HACK_H) +$(TARGETPFX)unixres.o : ../sys/unix/unixres.c $(HACK_H) +$(TARGETPFX)unixunix.o : ../sys/unix/unixunix.c $(HACK_H) +$(TARGETPFX)ioctl.o : ../sys/share/ioctl.c $(HACK_H) +$(TARGETPFX)unixtty.o : ../sys/share/unixtty.c $(HACK_H) +$(TARGETPFX)winshim.o : ../win/shim/winshim.c $(HACK_H) +$(TARGETPFX)libnhmain.o : ../sys/libnh/libnhmain.c $(HACK_H) +endif # CROSS_TO_WASM + +# +ifdef CROSS_TO_MIPS +$(MIPS_TARGET): pregame $(TARGETPFX)date.o $(HOSTOBJ) $(HOBJ) $(LUACROSSLIB) \ + $(TARGETPFX)ncurses/lib/libncurses.a \ + $(MIPS_DATA_DIR) + -rm $@ + $(TARGET_LINK) $(TARGET_LFLAGS) -o $@ \ + $(HOBJ) $(TARGETPFX)date.o $(TARGETPFX)$(HACKLIB) \ + $(TARGETPFX)ncurses/lib/libncurses.a \ + $(TARGET_LIBS) + +$(MIPS_DATA_DIR): $(MIPS_DATA_DIR)/nhdat + touch $(MIPS_DATA_DIR)/perm + touch $(MIPS_DATA_DIR)/record + touch $(MIPS_DATA_DIR)/logfile + touch $(MIPS_DATA_DIR)/xlogfile + touch $(MIPS_DATA_DIR)/livelog + cp ../sys/unix/sysconf $(MIPS_DATA_DIR)/sysconf + +$(MIPS_DATA_DIR)/nhdat: + ( cd ..; $(MAKE) INSTDIR='$(MIPS_DATA_DIR)' $(MIPSDEP) dofiles-dlb ) + +# +$(TARGETPFX)unixmain.o : ../sys/unix/unixmain.c $(HACK_H) +$(TARGETPFX)unixres.o : ../sys/unix/unixres.c $(HACK_H) +$(TARGETPFX)unixunix.o : ../sys/unix/unixunix.c $(HACK_H) +$(TARGETPFX)ioctl.o : ../sys/share/ioctl.c $(HACK_H) +$(TARGETPFX)unixtty.o : ../sys/share/unixtty.c $(HACK_H) + +$(LUABIN): + ( cd .. && make luabin && cd src) +dodata: + ( cd .. && make dlb && cd src) + +mipsrecover: $(TARGETPFX)recover +.PHONY: mipspkg +mipspkg: dodata $(GAMEBIN) $(TARGETPFX)recover + mkdir -p $(TARGETPFX)pkg + cp $(GAMEBIN) $(TARGETPFX)pkg/nethack + cp $(TARGETPFX)recover $(TARGETPFX)pkg/recover + cp ../dat/nhdat $(TARGETPFX)pkg/nhdat + cp ../dat/license $(TARGETPFX)pkg/license + cp ../dat/symbols $(TARGETPFX)pkg/symbols + cp ../sys/share/NetHack.cnf $(TARGETPFX)pkg/.nethackrc + cp ../sys/msdos/sysconf $(TARGETPFX)pkg/sysconf + cp ../doc/nethack.txt $(TARGETPFX)pkg/nethack.txt + -touch $(TARGETPFX)pkg/record + cd $(TARGETPFX)pkg ; zip -9 ../nh$(NHV)mips.zip * ; cd ../../.. + @echo MIPS package zip file $(TARGETPFX)nh$(NHV)mips.zip +endif # CROSS_TO_MIPS + + +ifdef CROSS_TO_AMIGA +$(TARGETPFX)amidos.o : ../sys/amiga/amidos.c $(HACK_H) +$(TARGETPFX)amigst.o : ../sys/amiga/amigst.c $(HACK_H) +$(TARGETPFX)amirip.o : ../sys/amiga/amirip.c $(HACK_H) +$(TARGETPFX)amistack.o : ../sys/amiga/amistack.c $(HACK_H) +$(TARGETPFX)amitty.o : ../sys/amiga/amitty.c $(HACK_H) +$(TARGETPFX)amiwind.o : ../sys/amiga/amiwind.c \ + ../sys/amiga/amimenu.c $(HACK_H) +$(TARGETPFX)winami.o : ../sys/amiga/winami.c $(HACK_H) +$(TARGETPFX)winchar.o : ../sys/amiga/winchar.c tile.c $(HACK_H) +$(TARGETPFX)winfuncs.o : ../sys/amiga/winfuncs.c $(HACK_H) +$(TARGETPFX)winkey.o : ../sys/amiga/winkey.c $(HACK_H) +$(TARGETPFX)winamenu.o : ../sys/amiga/winamenu.c $(HACK_H) +$(TARGETPFX)winreq.o : ../sys/amiga/winreq.c \ + ../sys/amiga/colorwin.c \ + ../sys/amiga/clipwin.c $(HACK_H) +$(TARGETPFX)winstr.o : ../sys/amiga/winstr.c $(HACK_H) +$(GAMEBIN) : $(HOBJ) $(LUACROSSLIB) + $(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \ + $(HOBJ) $(WINLIB) $(TARGET_LIBS) +# +# Host-side IFF tile conversion tools (run on Linux, produce Amiga IFF files) +# +AMISRC = ../sys/amiga + +$(TARGETPFX)xpm2iff_host: $(AMISRC)/xpm2iff_host.c + $(CC) $(CFLAGS) -o $@ $< +$(TARGETPFX)tomb.iff: $(AMISRC)/grave16.xpm $(TARGETPFX)xpm2iff_host + $(TARGETPFX)xpm2iff_host $(AMISRC)/grave16.xpm $@ + +$(TARGETPFX)bmp2iff_host: $(AMISRC)/bmp2iff_host.c + $(CC) $(CFLAGS) -o $@ $< +$(TARGETPFX)tiles16.iff: ../dat/nhtiles.bmp $(TARGETPFX)bmp2iff_host + $(TARGETPFX)bmp2iff_host -planes 4 ../dat/nhtiles.bmp $@ +$(TARGETPFX)tiles32.iff: ../dat/nhtiles.bmp $(TARGETPFX)bmp2iff_host + $(TARGETPFX)bmp2iff_host -planes 5 ../dat/nhtiles.bmp $@ + +AMITILES = $(TARGETPFX)tiles16.iff $(TARGETPFX)tiles32.iff $(TARGETPFX)tomb.iff + +AMIREGEX_URL = https://github.com/garyhouston/regex.git +AMIREGEX_SRCDIR = $(AMISRC)/regex + +.PHONY: fetch-regex amigapkg amitiles + +fetch-regex: + @DSTDIR=sys/amiga/regex; \ + if [ ! -d src ]; then DSTDIR=../$$DSTDIR; fi; \ + if [ -f $$DSTDIR/regcomp.c ]; then \ + echo "BSD regex already present"; \ + else \ + echo "Fetching BSD regex from $(AMIREGEX_URL)"; \ + tmpdir=$$(mktemp -d) && \ + git clone --depth 1 $(AMIREGEX_URL) $$tmpdir && \ + cd $$tmpdir && \ + sh ./mkh -p regcomp.c > regcomp.ih && \ + sh ./mkh -p engine.c > engine.ih && \ + sh ./mkh -p regexec.c > regexec.ih && \ + sh ./mkh -p regerror.c > regerror.ih && \ + sh ./mkh -i _REGEX_H_ regex2.h regcomp.c \ + regexec.c regerror.c regfree.c > regex.h && \ + cd - > /dev/null && \ + mkdir -p $$DSTDIR && \ + for f in regcomp.c regexec.c regerror.c regfree.c \ + engine.c regex.h regex2.h cclass.h cname.h \ + utils.h regcomp.ih engine.ih regexec.ih \ + regerror.ih \ + COPYRIGHT; do \ + cp $$tmpdir/$$f $$DSTDIR/; \ + done && \ + rm -rf $$tmpdir && \ + echo "BSD regex installed in $$DSTDIR"; \ + fi +amitiles: $(AMITILES) + +UUDECODE = ../util/uudecode + +../util/uudecode: ../sys/share/uudecode.c + $(CC) $(CFLAGS) -o $@ $< + +amigapkg: $(AMITILES) ../util/uudecode + mkdir -p $(TARGETPFX)pkg/NetHack/tiles $(TARGETPFX)pkg/NetHack/hack + cp $(GAMEBIN) $(TARGETPFX)pkg/NetHack/nethack + cp ../dat/nhdat $(TARGETPFX)pkg/NetHack/nhdat + cp ../dat/license $(TARGETPFX)pkg/NetHack/license + cp ../dat/symbols $(TARGETPFX)pkg/NetHack/symbols + cp $(TARGETPFX)tiles16.iff $(TARGETPFX)pkg/NetHack/tiles/tiles16.iff + cp $(TARGETPFX)tiles32.iff $(TARGETPFX)pkg/NetHack/tiles/tiles32.iff + cp $(TARGETPFX)tomb.iff $(TARGETPFX)pkg/NetHack/tomb.iff + cp ../doc/nethack.txt $(TARGETPFX)pkg/NetHack/nethack.txt + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/amifont8.uu && mv 8 hack/8 ) + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/amifont.uu ) + cp $(AMISRC)/nethack.cnf $(TARGETPFX)pkg/NetHack/nethack.cnf + cp $(AMISRC)/README.amiga $(TARGETPFX)pkg/NetHack/README.amiga + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/NHinfo.uu ) + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/cnf-info.uu ) + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/license-info.uu ) + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/txt-info.uu ) + ( cd $(TARGETPFX)pkg/NetHack && ../../../../util/uudecode ../../../../sys/amiga/readme-info.uu ) + ( cd $(TARGETPFX)pkg && ../../../util/uudecode ../../../sys/amiga/drawer-info.uu ) + touch $(TARGETPFX)pkg/NetHack/record + ( cd $(TARGETPFX)pkg && zip -9r ../NH$(NHV)AMI.ZIP NetHack NetHack.info ) + @echo amiga package zip file $(TARGETPFX)NH$(NHV)AMI.ZIP +endif # CROSS_TO_AMIGA + +ifdef CROSS_SHARED +# shared file dependencies +$(TARGETPFX)pcmain.o : ../sys/share/pcmain.c $(HACK_H) +$(TARGETPFX)pcsys.o : ../sys/share/pcsys.c $(HACK_H) +$(TARGETPFX)pctty.o : ../sys/share/pctty.c $(HACK_H) +$(TARGETPFX)pcunix.o : ../sys/share/pcunix.c $(HACK_H) +$(TARGETPFX)tileset.o : ../win/share/tileset.c +$(TARGETPFX)bmptiles.o : ../win/share/bmptiles.c +$(TARGETPFX)giftiles.o : ../win/share/giftiles.c +endif # CROSS_SHARED +# +ifdef CROSS +$(TARGETPFX)hacklib.a: $(TARGETPFX)hacklib.o + $(TARGET_AR) $(TARGET_ARFLAGS) $@ $(TARGETPFX)hacklib.o +ifdef MAKEFILE_UTL +$(TARGETPFX)recover.o: recover.c $(CONFIG_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(CSTD) -c recover.c -o $@ +ifdef CROSS_TO_MSDOS +$(TARGETPFX)recover.exe : $(TARGETPFX)recover.o $(TARGETPFX)rversion.o $(TARGETPFX)hacklib.a + $(TARGET_LINK) $(TARGET_LFLAGS) \ + $(TARGETPFX)recover.o $(TARGETPFX)rversion.o $(TARGETPFX)hacklib.a -o $@ +else +$(TARGETPFX)recover : $(TARGETPFX)recover.o $(TARGETPFX)rversion.o $(TARGETPFX)hacklib.a + $(TARGET_LINK) $(TARGET_LFLAGS) \ + $(TARGETPFX)recover.o $(TARGETPFX)rversion.o $(TARGETPFX)hacklib.a -o $@ +endif +$(TARGETPFX)rversion.o: ../src/version.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) -DMINIMAL_FOR_RECOVER $(CSTD) -c ../src/version.c -o $@ +endif # MAKEFILE_UTL +endif # CROSS + +ifdef BUILD_TARGET_LUA +# Lua lib +$(LUACROSSLIB): $(LUALIBOBJS) + if [ -f $@ ]; then rm $@; fi; + $(TARGET_AR) rcS $@ $(LUAOBJFILES1) + $(TARGET_AR) rcS $@ $(LUAOBJFILES2) + $(TARGET_AR) rcS $@ $(LUAOBJFILES3) + $(TARGET_AR) rcs $@ $(LUAOBJFILES4) + +# $(TARGET_AR) rcs $@ $(LUALIBOBJS) + +# Lua src +$(TARGETPFX)lapi.o : $(LUATOP)/src/lapi.c +$(TARGETPFX)lauxlib.o : $(LUATOP)/src/lauxlib.c +$(TARGETPFX)lbaselib.o : $(LUATOP)/src/lbaselib.c +$(TARGETPFX)lbitlib.o : $(LUATOP)/src/lbitlib.c +$(TARGETPFX)lcode.o : $(LUATOP)/src/lcode.c +$(TARGETPFX)lcorolib.o : $(LUATOP)/src/lcorolib.c +$(TARGETPFX)lctype.o : $(LUATOP)/src/lctype.c +$(TARGETPFX)ldblib.o : $(LUATOP)/src/ldblib.c +$(TARGETPFX)ldebug.o : $(LUATOP)/src/ldebug.c +$(TARGETPFX)ldo.o : $(LUATOP)/src/ldo.c +$(TARGETPFX)ldump.o : $(LUATOP)/src/ldump.c +$(TARGETPFX)lfunc.o : $(LUATOP)/src/lfunc.c +$(TARGETPFX)lgc.o : $(LUATOP)/src/lgc.c +$(TARGETPFX)linit.o : $(LUATOP)/src/linit.c +$(TARGETPFX)liolib.o : $(LUATOP)/src/liolib.c +$(TARGETPFX)llex.o : $(LUATOP)/src/llex.c +$(TARGETPFX)lmathlib.o : $(LUATOP)/src/lmathlib.c +$(TARGETPFX)lmem.o : $(LUATOP)/src/lmem.c +$(TARGETPFX)loadlib.o : $(LUATOP)/src/loadlib.c +$(TARGETPFX)lobject.o : $(LUATOP)/src/lobject.c +$(TARGETPFX)lopcodes.o : $(LUATOP)/src/lopcodes.c +$(TARGETPFX)loslib.o : $(LUATOP)/src/loslib.c +$(TARGETPFX)lparser.o : $(LUATOP)/src/lparser.c +$(TARGETPFX)lstate.o : $(LUATOP)/src/lstate.c +$(TARGETPFX)lstring.o : $(LUATOP)/src/lstring.c +$(TARGETPFX)lstrlib.o : $(LUATOP)/src/lstrlib.c +$(TARGETPFX)ltable.o : $(LUATOP)/src/ltable.c +$(TARGETPFX)ltablib.o : $(LUATOP)/src/ltablib.c +$(TARGETPFX)ltm.o : $(LUATOP)/src/ltm.c +$(TARGETPFX)lundump.o : $(LUATOP)/src/lundump.c +$(TARGETPFX)lutf8lib.o : $(LUATOP)/src/lutf8lib.c +$(TARGETPFX)lvm.o : $(LUATOP)/src/lvm.c +$(TARGETPFX)lzio.o : $(LUATOP)/src/lzio.c +endif # BUILD_TARGET_LUA + +ifdef BUILD_TARGET_NCURSES +.PHONY: build-ncurses +ifdef MAKEFILE_SRC +../lib/ncurses.tar.gz: + @echo "You will need to successfully execute 'make CROSS_TO_$(NCURSES_PLATFORM)=1 fetch-ncurses' first" + @false +$(TARGETPFX)ncurses/lib/libncurses.a: ../lib/ncurses.tar.gz + (cd $(TARGETDIR) ; mkdir -p ncurses ; cd ncurses ; tar -xf ../../../lib/ncurses.tar.gz --strip-components=1 ; \ + ./configure --build $(NCURSES_CONFIGURE_BUILD) --host $(NCURSES_CONFIGURE_HOST) ; \ + make ; \ + cd ../../../src) +endif #MAKEFILE_SRC +ifdef MAKEFILE_TOP +.PHONY: fetch-ncurses +fetch-ncurses: + (cd lib ; curl https://invisible-island.net/datafiles/release/ncurses.tar.gz --output ncurses.tar.gz ; cd ..) +endif +endif #BUILD_TARGET_NCURSES + +ifdef BUILD_PDCURSES +ifdef WANT_WIN_CURSES +$(TARGETPFX)pdclib.a : $(PDCLIBOBJS) $(PDCOBJS) + if [ -f $@ ]; then rm $@; fi; + $(TARGET_AR) rcs $@ $(PDCLIBOBJS) $(PDCOBJS) +endif #WANT_WIN_CURSES +# PDCurses src +$(TARGETPFX)addch.o : $(PDCTOP)/pdcurses/addch.c +$(TARGETPFX)addchstr.o : $(PDCTOP)/pdcurses/addchstr.c +$(TARGETPFX)addstr.o : $(PDCTOP)/pdcurses/addstr.c +$(TARGETPFX)attr.o : $(PDCTOP)/pdcurses/attr.c +$(TARGETPFX)beep.o : $(PDCTOP)/pdcurses/beep.c +$(TARGETPFX)bkgd.o : $(PDCTOP)/pdcurses/bkgd.c +$(TARGETPFX)border.o : $(PDCTOP)/pdcurses/border.c +$(TARGETPFX)clear.o : $(PDCTOP)/pdcurses/clear.c +$(TARGETPFX)color.o : $(PDCTOP)/pdcurses/color.c +$(TARGETPFX)delch.o : $(PDCTOP)/pdcurses/delch.c +$(TARGETPFX)deleteln.o : $(PDCTOP)/pdcurses/deleteln.c +$(TARGETPFX)getch.o : $(PDCTOP)/pdcurses/getch.c +$(TARGETPFX)getstr.o : $(PDCTOP)/pdcurses/getstr.c +$(TARGETPFX)getyx.o : $(PDCTOP)/pdcurses/getyx.c +$(TARGETPFX)inch.o : $(PDCTOP)/pdcurses/inch.c +$(TARGETPFX)inchstr.o : $(PDCTOP)/pdcurses/inchstr.c +$(TARGETPFX)initscr.o : $(PDCTOP)/pdcurses/initscr.c +$(TARGETPFX)inopts.o : $(PDCTOP)/pdcurses/inopts.c +$(TARGETPFX)insch.o : $(PDCTOP)/pdcurses/insch.c +$(TARGETPFX)insstr.o : $(PDCTOP)/pdcurses/insstr.c +$(TARGETPFX)instr.o : $(PDCTOP)/pdcurses/instr.c +$(TARGETPFX)kernel.o : $(PDCTOP)/pdcurses/kernel.c +$(TARGETPFX)keyname.o : $(PDCTOP)/pdcurses/keyname.c +$(TARGETPFX)mouse.o : $(PDCTOP)/pdcurses/mouse.c +$(TARGETPFX)move.o : $(PDCTOP)/pdcurses/move.c +$(TARGETPFX)outopts.o : $(PDCTOP)/pdcurses/outopts.c +$(TARGETPFX)overlay.o : $(PDCTOP)/pdcurses/overlay.c +$(TARGETPFX)pad.o : $(PDCTOP)/pdcurses/pad.c +$(TARGETPFX)panel.o : $(PDCTOP)/pdcurses/panel.c +$(TARGETPFX)printw.o : $(PDCTOP)/pdcurses/printw.c +$(TARGETPFX)refresh.o : $(PDCTOP)/pdcurses/refresh.c +$(TARGETPFX)scanw.o : $(PDCTOP)/pdcurses/scanw.c +$(TARGETPFX)scr_dump.o : $(PDCTOP)/pdcurses/scr_dump.c +$(TARGETPFX)scroll.o : $(PDCTOP)/pdcurses/scroll.c +$(TARGETPFX)slk.o : $(PDCTOP)/pdcurses/slk.c +$(TARGETPFX)termattr.o : $(PDCTOP)/pdcurses/termattr.c +$(TARGETPFX)touch.o : $(PDCTOP)/pdcurses/touch.c +$(TARGETPFX)util.o : $(PDCTOP)/pdcurses/util.c +$(TARGETPFX)window.o : $(PDCTOP)/pdcurses/window.c +$(TARGETPFX)debug.o : $(PDCTOP)/pdcurses/debug.c +$(TARGETPFX)pdcclip.o : $(PDCPORT)/pdcclip.c +$(TARGETPFX)pdcdisp.o : $(PDCPORT)/pdcdisp.c +$(TARGETPFX)pdcgetsc.o : $(PDCPORT)/pdcgetsc.c +$(TARGETPFX)pdckbd.o : $(PDCPORT)/pdckbd.c +$(TARGETPFX)pdcscrn.o : $(PDCPORT)/pdcscrn.c +$(TARGETPFX)pdcsetsc.o : $(PDCPORT)/pdcsetsc.c +$(TARGETPFX)pdcutil.o : $(PDCPORT)/pdcutil.c + $(TARGET_CC) $(PDCINCL) $(PDC_TARGET_CFLAGS) \ + -Wno-sign-compare -o$@ $(PDCPORT)/pdcutil.c +# -Wno-sign-compare +endif # BUILD_PDCURSES +# +# End of cross-compiling -POST section +#===============-================================================= diff --git a/sys/unix/hints/include/cross-pre1.500 b/sys/unix/hints/include/cross-pre1.500 new file mode 100644 index 000000000..9c8c0a24c --- /dev/null +++ b/sys/unix/hints/include/cross-pre1.500 @@ -0,0 +1,60 @@ +#===============-================================================= +# NetHack 5.0 include/cross-pre1. $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ +# +# Cross-compiling -PRE section 1 +# + +ifdef CROSS_TO_MSDOS +CROSS=1 +BUILD_TARGET_LUA=1 +BUILD_PDCURSES=1 +CROSS_SHARED=1 +override TARGET = msdos +override TARGETDIR=../targets/$(TARGET) +override TARGETPFX = $(TARGETDIR)/ +override TARGET_LIBS= +endif + +ifdef CROSS_TO_WASM +CROSS=1 +BUILD_TARGET_LUA=1 +HACKDIR=/ +PREFIX= +override TARGET = wasm +override TARGETDIR=../targets/$(TARGET) +override TARGETPFX = $(TARGETDIR)/ +override TARGET_LIBS= +endif + +ifdef CROSS_TO_MIPS +CROSS=1 +BUILD_TARGET_LUA=1 +BUILD_TARGET_NCURSES=1 +HACKDIR=/ +PREFIX= +override TARGET = mips +override TARGETDIR=../targets/$(TARGET) +override TARGETPFX = $(TARGETDIR)/ +override TARGET_LIBS= +endif + +ifdef CROSS_TO_AMIGA +CROSS=1 +BUILD_TARGET_LUA=1 +CROSS_SHARED=1 +HACKDIR=NetHack: +override TARGET = amiga +override TARGETDIR=../targets/$(TARGET) +override TARGETPFX = $(TARGETDIR)/ +override TARGET_LIBS= +endif + +ifdef CROSS +override PREGAME= +override BUILDMORE= +override CLEANMORE= +override PACKAGE= +endif +# End of cross-compiling -PRE section 1 +#===============-================================================= + diff --git a/sys/unix/hints/include/cross-pre2.500 b/sys/unix/hints/include/cross-pre2.500 new file mode 100644 index 000000000..6a1331c6a --- /dev/null +++ b/sys/unix/hints/include/cross-pre2.500 @@ -0,0 +1,580 @@ +#===============-================================================= +# NetHack 5.0 include/cross-pre2 $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ +# +# Cross-compiling -PRE section 2 +# + +ifdef BUILD_TARGET_LUA +#===============-================================================= +# LUA library +# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz +#================================================================= +LUA_VERSION ?=5.4.8 +LUATOP ?= ../lib/lua-$(LUA_VERSION) +LUASRCDIR ?= $(LUATOP)/src +LUAOBJFILES1 = $(TARGETPFX)lapi.o $(TARGETPFX)lauxlib.o \ + $(TARGETPFX)lbaselib.o $(TARGETPFX)lcode.o \ + $(TARGETPFX)lcorolib.o $(TARGETPFX)lctype.o \ + $(TARGETPFX)ldblib.o +ifeq "$(LUA_VERSION)" "5.3.5" +LUAOBJFILES1 += $(TARGETPFX)lbitlib.o +endif +LUAOBJFILES2 = $(TARGETPFX)ldebug.o $(TARGETPFX)ldo.o $(TARGETPFX)ldump.o \ + $(TARGETPFX)lfunc.o $(TARGETPFX)lgc.o $(TARGETPFX)linit.o \ + $(TARGETPFX)liolib.o $(TARGETPFX)llex.o +LUAOBJFILES3 = $(TARGETPFX)lmathlib.o $(TARGETPFX)lmem.o \ + $(TARGETPFX)loadlib.o $(TARGETPFX)lobject.o \ + $(TARGETPFX)lopcodes.o $(TARGETPFX)loslib.o \ + $(TARGETPFX)lparser.o $(TARGETPFX)lstate.o +LUAOBJFILES4 = $(TARGETPFX)lstring.o $(TARGETPFX)lstrlib.o \ + $(TARGETPFX)ltable.o $(TARGETPFX)ltablib.o \ + $(TARGETPFX)ltm.o $(TARGETPFX)lundump.o \ + $(TARGETPFX)lutf8lib.o $(TARGETPFX)lvm.o $(TARGETPFX)lzio.o +LUALIBOBJS = $(LUAOBJFILES1) $(LUAOBJFILES2) $(LUAOBJFILES3) $(LUAOBJFILES4) +LUACROSSLIB = $(TARGETPFX)lua$(subst .,,$(LUA_VERSION)).a +LUAINCL = -I$(LUASRCDIR) +override BUILDMORE += $(LUACROSSLIB) +override CLEANMORE += rm -f $(LUACROSSLIB) ; +override TARGET_LIBS += $(LUACROSSLIB) +LIBLM = -lm +else +LUAINCL= +endif # BUILD_TARGET_LUA + +ifdef BUILD_PDCURSES +#===============-================================================= +# PD Curses library +#===============-================================================= +ifdef WANT_WIN_CURSES +PDCTOP = ../lib/pdcursesmod +ifdef WANT_DOSVGA +PDCPORT = $(PDCTOP)/dosvga +PDCURSESDEF= -I$(PDCTOP) -I$(PDCPORT) \ + -D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" \ + -D"PDC_WIDE" -D"PDC_RGB" -D"CURSES_UNICODE" +else +PDCPORT = $(PDCTOP)/dos +PDCURSESDEF= -I$(PDCTOP) -I$(PDCPORT) \ + -D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" +endif # WANT_DOSVGA +PDCLIBOBJ1= $(TARGETPFX)addch.o $(TARGETPFX)addchstr.o \ + $(TARGETPFX)addstr.o $(TARGETPFX)attr.o \ + $(TARGETPFX)beep.o $(TARGETPFX)bkgd.o \ + $(TARGETPFX)border.o $(TARGETPFX)clear.o \ + $(TARGETPFX)color.o $(TARGETPFX)delch.o \ + $(TARGETPFX)deleteln.o $(TARGETPFX)getch.o \ + $(TARGETPFX)getstr.o $(TARGETPFX)getyx.o \ + $(TARGETPFX)inch.o +PDCLIBOBJ2= $(TARGETPFX)inchstr.o $(TARGETPFX)initscr.o \ + $(TARGETPFX)inopts.o $(TARGETPFX)insch.o \ + $(TARGETPFX)insstr.o $(TARGETPFX)instr.o \ + $(TARGETPFX)kernel.o $(TARGETPFX)keyname.o \ + $(TARGETPFX)mouse.o $(TARGETPFX)move.o \ + $(TARGETPFX)outopts.o $(TARGETPFX)overlay.o +PDCLIBOBJ3= $(TARGETPFX)pad.o $(TARGETPFX)panel.o $(TARGETPFX)printw.o \ + $(TARGETPFX)refresh.o $(TARGETPFX)scanw.o \ + $(TARGETPFX)scr_dump.o $(TARGETPFX)scroll.o \ + $(TARGETPFX)slk.o $(TARGETPFX)termattr.o +PDCLIBOBJ4= $(TARGETPFX)touch.o $(TARGETPFX)util.o $(TARGETPFX)window.o \ + $(TARGETPFX)debug.o +PDCLIBOBJS = $(PDCLIBOBJ1) $(PDCLIBOBJ2) $(PDCLIBOBJ3) $(PDCLIBOBJ4) +PDCLIB = $(TARGETPFX)pdclib.a +PDCINCL = -I$(PDCTOP) -I$(PDCTOP)/pdcurses +PDCOBJS = $(TARGETPFX)pdcclip.o $(TARGETPFX)pdcdisp.o \ + $(TARGETPFX)pdcgetsc.o $(TARGETPFX)pdckbd.o \ + $(TARGETPFX)pdcscrn.o $(TARGETPFX)pdcsetsc.o \ + $(TARGETPFX)pdcutil.o +override TARGET_LIBS += $(PDCLIB) +override BUILDMORE += $(PDCLIB) +override CLEANMORE += rm -f $(PDCLIB) ; +else #WANT_WIN_CURSES +PDCURSESDEF= +PDCLIBOBJS= +PDCOBJS= +PDCLIB= +PDCINCL= +endif # WANT_WIN_CURSES +endif # BUILD_PDCURSES + +ifdef BUILD_TARGET_NCURSES +#================================================================= +# ncurses +# Source from https://invisible-island.net/datafiles/release/ncurses.tar.gz +# +#================================================================= +NCURSESLIBDIR ?= $(TARGETPFX)ncurses/lib +NCURSESLIB ?= $(NCURSESLIBDIR)/libncurses.a +#override TARGET_LIBS += $(NCURSESLIB) +override BUILDMORE += $(NCURSESLIB) +endif # BUILD_TARGET_NCURSES + +ifdef CROSS_TO_MSDOS +#================================================================= +# MSDOS cross-compile recipe +#================================================================= +# Uses an MSDOS djgpp cross-compiler on linux or macos. +# +# 1. You can obtain the cross-compiler for your system via: +# sys/msdos/fetch-cross.sh +# 2. Then +# make CROSS_TO_MSDOS=1 WANT_WIN_TTY=1 WANT_WIN_CURSES=1 all +# +# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz +#================================================================= + +CFLAGS += -DCROSSCOMPILE + +# +# Override the build tools and some obj files to +# reflect the msdos djgpp cross-compiler. +# +TOOLTOP1 = ../lib/djgpp/bin +TOOLTOP2 = ../lib/djgpp/i586-pc-msdosdjgpp/bin +override TARGET_CC = $(TOOLTOP1)/i586-pc-msdosdjgpp-gcc +override TARGET_CXX = $(TOOLTOP1)/i586-pc-msdosdjgpp-g++ +override TARGET_AR = $(TOOLTOP1)/i586-pc-msdosdjgpp-gcc-ar +override TARGET_STUBEDIT = ../lib/djgpp/i586-pc-msdosdjgpp/bin/stubedit +ifdef MAKEFILE_SRC +FLDR=../ +endif +ifdef MAKEFILE_TOP +FLDR= +endif +dostargetexes=$(FLDR)lib/djgpp/target/bin/ +# +ifdef DOSBOX +dosbox=$(DOSBOX) +endif +ifdef dosbox +dosboxgameid=NH$(NHV) +dosboxtop=$(dosbox) +dosboxnhfolder=$(dosboxtop)/$(dosboxgameid) +dosboxnhsrc=$(dosboxnhfolder)/NHSRC +dosboxconfigfile=NETHACK.CNF +dosgdburl=http://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2gnu/gdb801b.zip +WANT_DEBUG=1 +DEPLOY=deploytodosbox +endif # dosbox +# +ifeq "$(WANT_DEBUG)" "1" +DBGFLAGS = -g +else +DBGFLAGS = +endif +MSDOS_GCC_CFLAGS = -Wall -Wextra -Wreturn-type -Wunused -Wformat \ + -Wswitch -Wshadow -Wwrite-strings -Wmissing-declarations \ + -Wunreachable-code \ + -Wimplicit -Wimplicit-function-declaration \ + -Wimplicit-int -Wmissing-prototypes -Wold-style-definition \ + -Wstrict-prototypes -Wnonnull -Wformat-overflow \ + -Wmissing-parameter-type -Wimplicit-fallthrough +#-Wno-missing-field-initializers -Wno-cast-function-type +#-Wno-format +MSDOS_PEDANTIC = -pedantic +MSDOS_GPP_CFLAGS = -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type \ + -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -pedantic \ + -Wmissing-declarations -Wformat-nonliteral -Wunreachable-code \ + -Wno-maybe-uninitialized +MSDOS_TARGET_CFLAGS = -c -O $(DBGFLAGS) -I../include -I../sys/msdos -I../win/share \ + $(LUAINCL) -DDLB $(PDCURSESDEF) -DTILES_IN_GLYPHMAP \ + -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_MSDOS \ + -D_NAIVE_DOS_REGS \ + $(MSDOS_GCC_CFLAGS) $(SNDCFLAGS) +MSDOS_TARGET_CXXFLAGS = -c -O $(DBGFLAGS) -I../include -I../sys/msdos -I../win/share \ + $(LUAINCL) -DDLB $(PDCURSESDEF) \ + -DUSE_TILES -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_MSDOS \ + -D_NAIVE_DOS_REGS \ + $(MSDOS_GPP_CFLAGS) $(SNDCFLAGS) +PDCINCL += -I$(PDCPORT) +PDC_TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) -Wno-unused-parameter \ + -Wno-missing-prototypes +ifndef SKIP_FONTS_IN_CI +FONTVER = terminus-font-4.49.1 +FONTTOP = ../lib/$(FONTVER) +DOSFONT = ../sys/msdos/fonts +FONTTARGETS = $(DOSFONT)/ter-u16b.psf $(DOSFONT)/ter-u16v.psf \ + $(DOSFONT)/ter-u18b.psf $(DOSFONT)/ter-u20b.psf \ + $(DOSFONT)/ter-u22b.psf $(DOSFONT)/ter-u24b.psf \ + $(DOSFONT)/ter-u28b.psf $(DOSFONT)/ter-u32b.psf +else +FONTTARGETS= +endif +LUABIN = ../lib/lua-$(LUA_VERSION)/src/lua +LUA_TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) +override TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) $(MSDOS_PEDANTIC) +override TARGET_CXXFLAGS = $(MSDOS_TARGET_CXXFLAGS) +ifdef CPLUSPLUS_NEEDED +override TARGET_LINK = $(TOOLTOP1)/i586-pc-msdosdjgpp-g++ +else +override TARGET_LINK = $(TOOLTOP1)/i586-pc-msdosdjgpp-gcc +endif +override TARGET_LFLAGS= +override TARGET_LIBS += -lpc $(LIBLM) +override SYSSRC = ../sys/share/pcmain.c ../sys/msdos/msdos.c \ + ../sys/share/pcsys.c ../sys/share/pctty.c \ + ../sys/share/pcunix.c ../sys/msdos/video.c \ + ../sys/msdos/vidtxt.c ../sys/msdos/pckeys.c \ + ../sys/msdos/vidvga.c ../sys/msdos/vidvesa.c \ + ../sys/msdos/font.c \ + ../win/share/bmptiles.c ../win/share/giftiles.c \ + ../win/share/tileset.c +override SYSOBJ= $(TARGETPFX)pcmain.o $(TARGETPFX)msdos.o \ + $(TARGETPFX)pcsys.o $(TARGETPFX)pctty.o \ + $(TARGETPFX)pcunix.o $(TARGETPFX)video.o \ + $(TARGETPFX)vidtxt.o $(TARGETPFX)pckeys.o \ + $(TARGETPFX)vidvga.o $(TARGETPFX)vidvesa.o \ + $(TARGETPFX)font.o \ + $(TARGETPFX)bmptiles.o $(TARGETPFX)giftiles.o \ + $(TARGETPFX)tileset.o $(TARGETPFX)tile.o +override WINLIB= +override LUALIB= +override LUALIBS= +override TOPLUALIB= +override GAMEBIN = $(TARGETPFX)nethack.exe +override RECOVERBIN = $(TARGETPFX)recover.exe +override SFCTOOLBIN = $(TARGETPFX)sfctool.exe +override PACKAGE = dospkg +override PREGAME += mkdir -p $(TARGETDIR) ; make $(TARGETPFX)exceptn.o ; +override CLEANMORE += rm -f -r $(TARGETDIR) ; rm -f -r $(FONTTARGETS) ; +ifeq "$(WANT_DEBUG)" "1" +GDBEXE=$(dostargetexes)gdb.exe +GDBBAT=NHGDB.BAT +GDBCMDLINE=directory nhsrc/src nhsrc/include nhsrc/sys/msdos \ + nhsrc/sys/share nhsrc/win/curses \ + nhsrc/win/tty +else +GDBEXE= +GDBBAT= +GDBCMDLINE= +endif +VARDATND += nhtiles.bmp +# +ifdef WANT_WIN_CURSES +# rules for pdcurses dos-specific files +$(TARGETPFX)%.o : $(PDCPORT)/%.c + $(TARGET_CC) $(PDCINCL) $(PDC_TARGET_CFLAGS) -o$@ $< +endif # WANT_WIN_CURSES +# +# Rule for files in sys/msdos +$(TARGETPFX)%.o : ../sys/msdos/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -o$@ $< +endif # CROSS_TO_MSDOS +#================================================================= + + +ifdef CROSS_TO_WASM +#===============-================================================= +# WASM +# originally from https://github.com/NetHack/NetHack/pull/385 +#===============-================================================= +# +#WASM_DEBUG = 1 +WASM_DATA_DIR = $(TARGETPFX)wasm-data +WASM_TARGET = $(TARGETPFX)nethack.js +EMCC_LFLAGS = +#EMCC_LFLAGS += -s SINGLE_FILE=1 +EMCC_LFLAGS += -DHACKDIR=\"$(HACKDIR)\" +EMCC_LFLAGS += -s WASM=1 +EMCC_LFLAGS += -s ALLOW_TABLE_GROWTH +EMCC_LFLAGS += -s ASYNCIFY -s ASYNCIFY_IMPORTS='["local_callback"]' +EMCC_LFLAGS += -O3 +EMCC_LFLAGS += -s MODULARIZE +EMCC_LFLAGS += -s EXPORTED_FUNCTIONS='["_main", "_shim_graphics_set_callback", "_repopulate_perminvent", "_malloc"]' +EMCC_LFLAGS += -s EXPORTED_RUNTIME_METHODS='["cwrap", "ccall", "addFunction", \ + "removeFunction", "UTF8ToString", "stringToUTF8", "getValue", \ + "setValue", "ENV", "FS", "IDBFS"]' +EMCC_LFLAGS += -s ERROR_ON_UNDEFINED_SYMBOLS=0 +EMCC_LFLAGS += -s EXPORT_ES6=1 +EMCC_LFLAGS += -lidbfs.js +# XXX: the "@/" at the end of "--embed-file" tells emscripten to embed the files +# in the root directory, otherwise they will end up in the $(WASM_DATA_DIR) path +EMCC_LFLAGS += --embed-file $(WASM_DATA_DIR)@/ +# For a list of EMCC settings: +# https://github.com/emscripten-core/emscripten/blob/master/src/settings.js +# +# WASM C flags +EMCC_CFLAGS = +EMCC_CFLAGS += -Wall +EMCC_CFLAGS += -Werror +EMCC_CFLAGS += -DNO_SIGNAL +#EMCC_CFLAGS += -s DISABLE_EXCEPTION_CATCHING=0 +EMCC_DEBUG_LFLAGS += -s ASSERTIONS=1 +EMCC_DEBUG_LFLAGS += -s ASSERTIONS=2 +EMCC_DEBUG_LFLAGS += -s STACK_OVERFLOW_CHECK=2 +EMCC_DEBUG_LFLAGS += -s SAFE_HEAP=1 +EMCC_DEBUG_LFLAGS += -s LLD_REPORT_UNDEFINED=1 +EMCC_DEBUG_LFLAGS += -s EXCEPTION_DEBUG=1 +#EMCC_DEBUG_CFLAGS += -fsanitize=undefined -fsanitize=address -fsanitize=leak +EMCC_DEBUG_LFLAGS += -s NO_EXIT_RUNTIME +# XXX: if --profiling isn't included then any error dumps 10MB of WASM to the screen rather than a useful message +EMCC_DEBUG_LFLAGS += --profiling +EMCC_PROD_CFLAGS += -O3 +ifdef WASM_DEBUG +EMCC_CFLAGS += $(EMCC_DEBUG_CFLAGS) +EMCC_LFLAGS += $(EMCC_DEBUG_LFLAGS) +else +EMCC_CFLAGS += $(EMCC_PROD_CFLAGS) +EMCC_LFLAGS += $(EMCC_PROD_LFLAGS) +endif +# +# Override the build tools and some obj files to +# reflect emscripten +override TARGET_CC = emcc +override TARGET_CXX = emcc +override TARGET_AR = emar +WASM_CFLAGS = -Wall -Wextra -Wno-missing-field-initializers +WASM_CFLAGS += -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch +WASM_CFLAGS += -Wshadow +# WASM_CFLAGS += -Wwrite-strings +# WASM_CFLAGS += -Werror +# Nethack C flags +WASM_CFLAGS += $(WINCFLAGS) #WINCFLAGS set from multiw-2.500 +WASM_CFLAGS += -DSYSCF -DSYSCF_FILE=\"/sysconf\" -DSECURE -DNHUUID +#WASM_CFLAGS += -g -I../include -DNOTPARMDECL +WASM_CFLAGS += -I../include -DNOTPARMDECL +# NetHack sources control +WASM_CFLAGS += -DDLB +WASM_CFLAGS += -DHACKDIR=\"$(HACKDIR)\" +WASM_CFLAGS += -DDEFAULT_WINDOW_SYS=\"shim\" \ +#override TARGET_CFLAGS += -DGREPPATH=\"/usr/bin/grep\" +WASM_CFLAGS += -DNOMAIL +WASM_CFLAGS += $(LUAINCL) +WASM_CFLAGS += -DNOTTYGRAPHICS -DSHIM_GRAPHICS -DLIBNH +WASM_CFLAGS += -DCROSSCOMPILE +WASM_TARGET_CFLAGS = -DCROSSCOMPILE_TARGET -DCROSS_TO_WASM +# For src Makefile +override CFLAGS = $(WASM_CFLAGS) +override TARGET_CFLAGS = $(EMCC_CFLAGS) $(WASM_CFLAGS) $(WASM_TARGET_CFLAGS) +# +LUA_TARGET_CFLAGS = $(TARGET_CFLAGS) +override TARGET_CXXFLAGS = $(TARGET_CFLAGS) +override TARGET_LINK = $(TARGET_CC) +override TARGET_LFLAGS= $(EMCC_LFLAGS) +override SYSSRC = ../sys/libnh/libnhmain.c \ + ../sys/share/ioctl.c ../sys/share/unixtty.c \ + ../sys/unix/unixunix.c ../sys/unix/unixres.c \ + ../win/shim/winshim.c +override SYSOBJ= $(TARGETPFX)libnhmain.o \ + $(TARGETPFX)ioctl.o $(TARGETPFX)unixtty.o \ + $(TARGETPFX)unixunix.o $(TARGETPFX)unixres.o \ + $(TARGETPFX)winshim.o +override WINLIB = emranlib +override LUALIB= +override TOPLUALIB= +override REGEXOBJ = $(TARGETPFX)posixregex.o +override WINOBJ= +override UUIDOBJ= +# don't bother Making regular NetHack executable +override GAME= +# the real VARDAT hasn't been defined yet for use in ALLDEP override +WASM_DAT = bogusmon data engrave epitaph oracles quest.lua rumors +WASMDEP = include/nhlua.h $(WASM_DAT) spec_levs check-dlb +override ALLDEP = $(WASMDEP) wasm +override PREGAME += mkdir -p $(TARGETDIR)/wasm-data ; +override CLEANMORE += rm -rf $(TARGETDIR) ; +RANLIB=$(EMRANLIB) +#VARDATND += nhtiles.bmp +# Rule for file in sys/unix +$(TARGETPFX)%.o : ../sys/unix/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +# Rule for file in sys/libnh +$(TARGETPFX)%.o : ../sys/libnh/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +# Rule for files in win/shim +$(TARGETPFX)%.o : ../win/shim/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +endif # CROSS_TO_WASM + + +ifdef CROSS_TO_MIPS +#================================================================ +# MIPS cross-compile recipe +#================================================================ +# Uses an MIPS linux cross-compiler on linux or macos. +# +# 1. You can obtain the cross-compiler for ubuntu via: +# sudo apt -y install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu +# For macOS, perhaps check for a mips cross-compiler on +# home-brew or macports. +# +# 2. Then +# make CROSS_TO_MIPS=1 WANT_WIN_TTY=1 WANT_WIN_CURSES=1 all +# +#================================================================= + +CFLAGS += -DCROSSCOMPILE + +# +# Override the build tools and some obj files to +# reflect the mips cross-compiler. +# +override TARGET_CC = mipsel-linux-gnu-gcc +override TARGET_CXX = CXX=mipsel-linux-gnu-g++ +override TARGET_AR = mipsel-linux-gnu-ar +MIPS_TARGET = $(TARGETPFX)nethack +#override TARGET_LINK = mipsel-linux-gnu-ld +MIPS_TARGET_CFLAGS = -c -O -I../include -I../sys/unix -I../win/share \ + $(LUAINCL) -DDLB \ + -DCROSSCOMPILE -DCROSSCOMPILE_TARGET \ + -DCROSS_TO_MIPS \ + -DCURSES_GENL_PUTMIXED \ + -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type -Wunused \ + -Wformat -Wswitch -Wshadow -Wwrite-strings \ + -Wimplicit -Wimplicit-function-declaration -Wimplicit-int \ + -Wmissing-parameter-type -Wold-style-definition -Wstrict-prototypes \ + -Wno-unused-result +MIPS_TARGET_CXXFLAGS = -c -O -I../include -I../sys/unix -I../win/share \ + $(LUAINCL) -DDLB \ + -DUSE_TILES -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_MIPS \ + -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type -Wunused \ + -Wformat -Wswitch -Wshadow -Wwrite-strings -Wno-maybe-uninitialized +override TARGET_CFLAGS = $(MIPS_TARGET_CFLAGS) -Wmissing-declarations \ + -Wmissing-prototypes -pedantic -Wmissing-declarations \ + -Wformat-nonliteral +override TARGET_CXXFLAGS = $(MIPS_TARGET_CXXFLAGS) +ifdef CPLUSPLUS_NEEDED +override TARGET_LINK = mipsel-linux-gnu-gcc +else +override TARGET_LINK = mipsel-linux-gnu-g++ +endif +override TARGET_LFLAGS= +override SYSOBJ = $(TARGETPFX)ioctl.o $(TARGETPFX)unixmain.o $(TARGETPFX)unixtty.o \ + $(TARGETPFX)unixunix.o $(TARGETPFX)unixres.o +override WINLIB = $(NCURSESLIB) +override LUALIB= +override LUALIBS= +override TOPLUALIB= +override GAMEBIN=$(MIPS_TARGET) +override RECOVERBIN = $(TARGETPFX)recover +override PACKAGE = mipspkg +override PREGAME += mkdir -p $(TARGETDIR) ; +override CLEANMORE += rm -f -r $(TARGETDIR) ; +NCURSES_CONFIGURE_BUILD=i686-pc-linux-gnu +NCURSES_CONFIGURE_HOST=mipsel-linux-gnu +NCURSES_PLATFORM=MIPS +# Rule for file in sys/unix +#$(TARGETPFX)%.o : ../sys/unix/%.c +# $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +# Rule for file in sys/share +#$(TARGETPFX)%.o : ../sys/share/%.c +# $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +endif # CROSS_TO_MIPS +#================================================================= + +#================================================================= + +ifdef CROSS_TO_AMIGA +#===============-================================================= +# AmigaOS m68k cross-compile recipe +#===============-================================================= +# Uses an Amiga M68K cross-compiler on linux or macOS. +# +# Cross-compiler: https://franke.ms/git/bebbo/amiga-gcc +# Install to /opt/amiga, then: +# sys/unix/setup.sh sys/unix/hints/linux.500 +# make fetch-lua +# make CROSS_TO_AMIGA=1 fetch-regex +# make CROSS_TO_AMIGA=1 all +# make CROSS_TO_AMIGA=1 package +#================================================================= + +CFLAGS += -DCROSSCOMPILE + +# +# Override the build tools and some obj files to +# reflect the amiga-gcc cross-compiler. +# +TOOLTOP = /opt/amiga/bin +TOOLARCH = -m68000 +override REGEXOBJ = $(TARGETPFX)posixregex.o +AMIREGEXOBJ = $(TARGETPFX)regcomp.o $(TARGETPFX)regexec.o \ + $(TARGETPFX)regerror.o $(TARGETPFX)regfree.o +override TARGET_CC = $(TOOLTOP)/m68k-amigaos-gcc +override TARGET_CXX = $(TOOLTOP)/m68k-amigaos-c++ +override TARGET_AR = $(TOOLTOP)/m68k-amigaos-ar +override TARGET_STUBEDIT= +override TARGET_CFLAGS = -c -O2 -noixemul $(TOOLARCH) \ + -include sys/types.h \ + -I../include \ + -I../sys/amiga -I../win/share \ + $(LUAINCL) -DAMIGA -DNOTTYGRAPHICS -DNO_TERMS -DNO_SIGNAL \ + -DTILES_IN_GLYPHMAP $(PDCURSESDEF) \ + -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_AMIGA \ + -DAMIGA_VERSION_STRING=\""VER: NetHack 5.0.0"\" +override TARGET_CXXFLAGS = $(TARGET_CFLAGS) +LUA_TARGET_CFLAGS = $(TARGET_CFLAGS) +ifeq "$(REGEXOBJ)" "$(TARGETPFX)cppregex.o" +override TARGET_LINK = $(TARGET_CXX) +else +override TARGET_LINK = $(TARGET_CC) +endif +override TARGET_LFLAGS= $(TOOLARCH) -noixemul -Wl,--allow-multiple-definition +override TARGET_LIBS += $(LIBLM) +VARDATND += nhtiles.bmp +override SYSSRC = ../sys/amiga/amidos.c ../sys/amiga/amigst.c \ + ../sys/amiga/amimenu.c ../sys/amiga/amirip.c \ + ../sys/amiga/amistack.c ../sys/amiga/amitty.c \ + ../sys/amiga/amiwind.c ../sys/amiga/clipwin.c \ + ../sys/amiga/colorwin.c \ + ../sys/amiga/winami.c ../sys/amiga/winchar.c \ + ../sys/amiga/winfuncs.c ../sys/amiga/winkey.c \ + ../sys/amiga/winamenu.c ../sys/amiga/winreq.c \ + ../sys/amiga/winstr.c ../sys/share/pcmain.c \ + ../win/share/bmptiles.c ../win/share/giftiles.c \ + ../win/share/tileset.c +override SYSOBJ = $(TARGETPFX)amidos.o $(TARGETPFX)amigst.o \ + $(TARGETPFX)amirip.o $(TARGETPFX)amistack.o \ + $(TARGETPFX)amitty.o $(TARGETPFX)amiwind.o \ + $(TARGETPFX)winami.o $(TARGETPFX)winchar.o \ + $(TARGETPFX)winfuncs.o $(TARGETPFX)winkey.o \ + $(TARGETPFX)winamenu.o $(TARGETPFX)winreq.o \ + $(TARGETPFX)winstr.o $(TARGETPFX)pcmain.o \ + $(TARGETPFX)bmptiles.o $(TARGETPFX)giftiles.o \ + $(TARGETPFX)tileset.o \ + $(AMIREGEXOBJ) +override WINLIB= +override LUALIB= +override LUALIBS= +override TOPLUALIB= +override DLLIB= +override WINOBJ= +override GAMEBIN = $(TARGETPFX)nethack +override PACKAGE = amigapkg +override PREGAME += mkdir -p $(TARGETDIR) ; +override CLEANMORE += rm -r $(TARGETDIR) ; +# +# Rule for files in sys/amiga +$(TARGETPFX)%.o : ../sys/amiga/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -o$@ $< +# Rule for BSD regex in sys/amiga/regex +$(TARGETPFX)%.o : ../sys/amiga/regex/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -I../sys/amiga/regex -o$@ $< +endif # CROSS_TO_AMIGA +#================================================================= + +ifdef WANT_WIN_CURSES +ifdef BUILD_PDCURSES +# Rules for PDCurses files +$(TARGETPFX)%.o : $(PDCTOP)/pdcurses/%.c + $(TARGET_CC) $(PDCINCL) $(PDC_TARGET_CFLAGS) -c -o$@ $< +endif # BUILD_PDCURSES +endif # WANT_WIN_CURSES + +ifdef CROSS_SHARED +# Rules for win/share files +$(TARGETPFX)%.o : ../win/share/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +# Rules for util files heading for target +$(TARGETPFX)%.o : ../util/%.c + $(TARGET_CC) $(TARGET_CFLAGS) -c -o$@ $< +endif # CROSS_SHARED + +ifdef BUILD_TARGET_LUA +# Rule for LUA files +$(TARGETPFX)%.o : $(LUATOP)/src/%.c + $(TARGET_CC) $(LUA_TARGET_CFLAGS) -c $(LUA_FLAGS) -o$@ $< +endif # BUILD_TARGET_LUA +# +# End of cross-compiling -PRE section +#===============-================================================= + diff --git a/sys/unix/hints/include/gbdates-post.500 b/sys/unix/hints/include/gbdates-post.500 new file mode 100755 index 000000000..f16070c64 --- /dev/null +++ b/sys/unix/hints/include/gbdates-post.500 @@ -0,0 +1,14 @@ +# NetHack 5.0 gbdates-post.500 $NHDT-Date: 1599687610 2020/09/09 21:40:10 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.11 $ +ifdef MAKEFILE_DOC +ifdef GB_DATESTAMP +Guidebook.dated.mn: $(GUIDEBOOK_MN_SRC) + @awk 'f{$$0=".ds f2 $(GB_DATESTAMP)";f=0}/NH_DATESUB/{f=1} 1' < $(GUIDEBOOK_MN_SRC) > $@ +Guidebook.dated.tex: $(GUIDEBOOK_TEX_SRC) + @awk 'f{$$0="\\date{$(GB_DATESTAMP)}";f=0}/NH_DATESUB/{f=1} 1' < $(GUIDEBOOK_TEX_SRC) > $@ +endif # GB_DATESTAMP + +Guidebook.pdf: Guidebook.dated.tex + pdflatex -interaction=nonstopmode -jobname=Guidebook Guidebook.dated.tex + pdflatex -interaction=nonstopmode -jobname=Guidebook Guidebook.dated.tex +endif # MAKEFILE_DOC +# diff --git a/sys/unix/hints/include/gbdates-pre.500 b/sys/unix/hints/include/gbdates-pre.500 new file mode 100755 index 000000000..2c62af079 --- /dev/null +++ b/sys/unix/hints/include/gbdates-pre.500 @@ -0,0 +1,18 @@ +# NetHack 5.0 gbdates-pre.500 $NHDT-Date: 1599687610 2020/09/09 21:40:10 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.11 $ + +ifdef MAKEFILE_DOC +ifneq "$(GIT)" "0" +#Get the hash of the last update to Guidebook.mn +GB_LAST_COMMIT := $(shell git log -n 1 --pretty=format:%H -- Guidebook.mn) +ifneq "$(GB_LAST_COMMIT)" "" +GB_DATESTAMP := $(shell git show -s --format=%cd --date=format:'%B %d, %Y' $(GB_LAST_COMMIT)) +endif # GB_LAST_COMMIT +ifneq "$(GB_DATESTAMP)" "" +DOC_EXTRAS += Guidebook.dated.mn Guidebook.dated.tex +override GUIDEBOOK_MN = Guidebook.dated.mn +override GUIDEBOOK_TEX = Guidebook.dated.tex +DOC_SPOTLESS_EXTRAS += Guidebook.pdf +endif # GB_DATESTAMP +endif # GIT=0 explicitly +endif # MAKEFILE_DOC +# diff --git a/sys/unix/hints/include/misc.500 b/sys/unix/hints/include/misc.500 new file mode 100644 index 000000000..ae7c282a0 --- /dev/null +++ b/sys/unix/hints/include/misc.500 @@ -0,0 +1,110 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 misc.500 $NHDT-Date: 1668359836 2022/11/13 17:17:16 $ $NHDT-Branch: NetHack-5.0 $ +# +# Further set-up for miscellaneous odds and ends (after compiler.500) +# +# Included from: +# hints/linux.500 +# hints/macOS.500 +# + +# This ensures that .moc files are compatible with the version of Qt chosen. +# +ifdef MAKEFILE_SRC +ifdef WANT_WIN_QT +# when switching from Qt5 to Qt6 or vice versa, any old .moc files will be +# incompatible; get rid of them in case user hasn't run 'make spotless'; +# object files are incompatible with Qt library, so get rid of them too; +# Qt*.h-t are empty timestamp files and at most one should exist +QTany_H = Qt*.h-t +ifdef WANT_WIN_QT6 +# Qt 6 builds and runs (with a couple of warnings) but needs more testing +QTn_H = Qt6.h-t +else +# Qt 5 is currently the default version for nethack NetHack 5.0.x's Qt interface +QTn_H = Qt5.h-t +endif +$(QTn_H) :: + @if test ! -f $@; then ( rm -f $(QTany_H) *.moc qt_*.o; touch $@ ); fi; +endif #WANT_WIN_QT +endif #MAKFILE_SRC + +ifdef WANT_WIN_TTY +USE_CURSESLIB=1 +endif + +ifdef WANT_WIN_CURSES +ifneq "$(USE_CURSESLIB)" "1" +USE_CURSESLIB=1 +endif +endif + +ifeq "$(GIT)" "1" +ifndef GITSUBMODULES +GITSUBMODULES=1 +endif +endif + +ifeq "$(git)" "1" +ifndef GITSUBMODULES +GITSUBMODULES=1 +endif +endif + +ifeq "$(CPPREGEX)" "1" +REGEXOBJ=$(TARGETPFX)cppregex.o +ifndef CPLUSPLUS_NEEDED +CPLUSPLUS_NEEDED = 1 +endif +endif + +ifeq "$(cppregex)" "1" +REGEXOBJ=$(TARGETPFX)cppregex.o +ifndef CPLUSPLUS_NEEDED +CPLUSPLUS_NEEDED = 1 +endif +endif + +ifdef USE_MANDOC +NROFF = mandoc +MAN2TXTPRE = -T ascii +MAN2TXTPOST= | col -b +else +# +# Detect groff. +NROFFISGROFF := $(shell echo `nroff --version | grep -c 'GNU.*groff.*version'`) +#$(info NROFFISGROFF=$(NROFFISGROFF)) +ifneq "$(NROFFISGROFF)" "0" +# Gather groff's minor version number (register `.y`). +GROFFMINORVERSION := $(shell printf '.tm \\n[.y]\n' | nroff 2>&1) +#$(info GROFFMINORVERSION=$(GROFFMINORVERSION)) +# Silence warnings produced by tmac.n, which NetHack does not modify. +NROFF_FLAGS := -wall -Wrange -Wscale -Wtab +# groff <= 1.23 also supported an "el" warning category that was buggy. +GROFFLE123 := $(shell expr $(GROFFMINORVERSION) \<= 23) +#$(info GROFFLE123=$(GROFFLE123)) +ifeq "$(GROFFLE123)" "1" +NROFF_FLAGS += -Wel +endif # end groff less than 1.23 +endif # end NROFFISGROFF +# $(info NROFF_FLAGS=$(NROFF_FLAGS)) + +ifneq "$(NROFFISGROFF)" "" # It's groff +# add the -Tascii flag used by groff +MAN2TXTPRE += -Tascii +# nroff in groff 1.23 supports the -P option to pass arguments to the +# output driver. -cbou are flags to grotty(1). +GROFFGE123 := $(shell expr $(GROFFMINORVERSION) \>= 23) +#$(info GROFFGE123=$(GROFFGE123)) +ifeq "$(GROFFGE123)" "1" +MAN2TXTPRE += -P -cbou +MAN2TXTPOST= +else +MAN2TXTPRE += -c +endif # end groff less than 1.23 +endif # end groff-specific +endif # not USE_MANDOC + +#end of hints/include/misc.500 +#------------------------------------------------------------------------------ + diff --git a/sys/unix/hints/include/multisnd-post.500 b/sys/unix/hints/include/multisnd-post.500 new file mode 100644 index 000000000..c524db078 --- /dev/null +++ b/sys/unix/hints/include/multisnd-post.500 @@ -0,0 +1,26 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 multisnd-post.500 $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ + +ifeq "$(HAVE_SNDLIB)" "1" +# note: one possible value for $(SNDLIBSRC) is 'macsound.m' which is written +# in Objective-C; this relies on $(CC) recognizing the filename suffix +# and knowing how to handle that; clang on MacOS does, both when +# masquerading as gcc and when invoked as itself +$(TARGETPFX)$(SNDLIBOBJ): $(SNDLIBSRC) $(HACK_H) + $(CC) $(CFLAGS) -c -o $@ $(SNDLIBSRC) + +ifeq "$(NEEDS_WAV)" "1" + +$(WAVDIR)/%.wav: ../util/uudecode $(WAVDIR)/%.uu + $^ + mv $(notdir $@) $@ + +../util/uudecode: ../sys/share/uudecode.c + ( cd ../util ; $(MAKE) uudecode ) + +endif # NEEDS_WAV +endif # HAVE_SNDLIB + +# end of multisnd-post.500 +#------------------------------------------------------------------------------ + diff --git a/sys/unix/hints/include/multisnd1-pre.500 b/sys/unix/hints/include/multisnd1-pre.500 new file mode 100644 index 000000000..6c04f01b9 --- /dev/null +++ b/sys/unix/hints/include/multisnd1-pre.500 @@ -0,0 +1,45 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 multisnd1-pre.500 $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ +# +# If it's cross-platform it belongs in this file. +# If it's macOS-only, it belongs in macOS.500. +# If it's linux-only, it belongs in linux.500. +# + +#ifdef WANT_TESTSOUND +#HAVE_SNDLIB = 1 +#SNDCFLAGS+= -DSND_LIB_TESTSOUND +## NEEDS_SND_USERSOUNDS +## NEEDS_SND_SEAUTOMAP +## NEEDS_WAV +#SNDLIBSRC = ../sound/testsound/testsound.c +#SNDLIBOBJ = testsound.o +#LFLAGS += -lm +#endif # WANT_TESTSOUND + +ifeq "$(HAVE_SNDLIB)" "1" +ifeq "$(WANT_SPEECH)" "1" +SNDCFLAGS+= -DSND_SPEECH +endif # WANT_SPEECH +endif # HAVE_SNDLIB + +# HAVE_SNDLIB or NEEDS_SND_USERSOUNDS or NEEDS_SND_SEAUTOMAP +# would have to be set prior to this. Any of them could have +# been set just above, or they could have been set in +# multiw-2 for Qt, or they could have been set in macOS.500 +# or linux.500 for something platform-specific. +# Regardless, if one of those is set, the related preprocessor +# defines need to be added to SNDCFLAGS here. +# +ifeq "$(HAVE_SNDLIB)" "1" +ifeq "$(NEEDS_SND_USERSOUNDS)" "1" +SNDCFLAGS+= -DUSER_SOUNDS +endif # NEEDS_SND_USERSOUNDS +ifeq "$(NEEDS_SND_SEAUTOMAP)" "1" +SNDCFLAGS+= -DSND_SOUNDEFFECTS_AUTOMAP +endif # NEEDS_SND_SEAUTOMAP +endif # HAVE_SNDLIB + +# +#------------------------------------------------------------------------------ + diff --git a/sys/unix/hints/include/multisnd2-pre.500 b/sys/unix/hints/include/multisnd2-pre.500 new file mode 100644 index 000000000..77d993333 --- /dev/null +++ b/sys/unix/hints/include/multisnd2-pre.500 @@ -0,0 +1,32 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 multisnd2-pre.500 $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ +# + +ifdef NEEDS_WAV +WAVDIR = ../sound/wav +SNDWAVS = se_squeak_A se_squeak_B se_squeak_B_flat se_squeak_C se_squeak_D \ + se_squeak_D_flat se_squeak_E se_squeak_E_flat se_squeak_F \ + se_squeak_F_sharp se_squeak_G se_squeak_G_sharp sound_Bell \ + sound_Bugle_A sound_Bugle_B sound_Bugle_C sound_Bugle_D \ + sound_Bugle_E sound_Bugle_F sound_Bugle_G \ + sound_Drum_Of_Earthquake sound_Fire_Horn sound_Frost_Horn \ + sound_Leather_Drum sound_Magic_Harp_A sound_Magic_Harp_B \ + sound_Magic_Harp_C sound_Magic_Harp_D sound_Magic_Harp_E \ + sound_Magic_Harp_F sound_Magic_Harp_G sound_Tooled_Horn_A \ + sound_Tooled_Horn_B sound_Tooled_Horn_C sound_Tooled_Horn_D \ + sound_Tooled_Horn_E sound_Tooled_Horn_F sound_Tooled_Horn_G \ + sound_Wooden_Flute_A sound_Wooden_Flute_B sound_Wooden_Flute_C \ + sound_Wooden_Flute_D sound_Wooden_Flute_E sound_Wooden_Flute_F \ + sound_Wooden_Flute_G sound_Wooden_Harp_A sound_Wooden_Harp_B \ + sound_Wooden_Harp_C sound_Wooden_Harp_D sound_Wooden_Harp_E \ + sound_Wooden_Harp_F sound_Wooden_Harp_G sound_Magic_Flute_A \ + sound_Magic_Flute_B sound_Magic_Flute_C sound_Magic_Flute_D \ + sound_Magic_Flute_E sound_Magic_Flute_F sound_Magic_Flute_G \ + sa2_xpleveldown sa2_xplevelup + +WAVS = $(addprefix $(WAVDIR)/, $(addsuffix .wav, $(SNDWAVS))) +endif # NEEDS_WAV + +# end of multisnd2-pre.500 +#------------------------------------------------------------------------------ + diff --git a/sys/unix/hints/include/multiw-1.500 b/sys/unix/hints/include/multiw-1.500 new file mode 100644 index 000000000..96f9173e6 --- /dev/null +++ b/sys/unix/hints/include/multiw-1.500 @@ -0,0 +1,27 @@ + +#------------------------------------------------------------------------------ +# NetHack 5.0 multiw-1.500 $NHDT-Date: 1597332785 2020/08/13 15:33:05 $ $NHDT-Branch: NetHack-5.0 $ + +# 1. Which windowing interface(s) should be included in this binary? +# One or more of these can be manually uncommented and/or can be specified +# on the 'make' command line. If none are enabled, tty will be used. +#WANT_WIN_TTY=1 +#WANT_WIN_CURSES=1 +#WANT_WIN_X11=1 +#WANT_WIN_QT=1 + +# 2. What is the default window system? +# Exactly one of these can be manually uncommented and/or can be specified +# on the 'make' command line. If none is enabled, the first among +# WANT_WIN_{tty,curses,X11,Qt} that is enabled will become default. +#WANT_DEFAULT=tty +#WANT_DEFAULT=curses +#WANT_DEFAULT=Qt +#WANT_DEFAULT=X11 + +# Based on the NetHack version 5.0.0 +# Used to build some filenames subsequently in other include files +NHV=500 + +#end of multiw-1.500 +#------------------------------------------------------------------------------ diff --git a/sys/unix/hints/include/multiw-2.500 b/sys/unix/hints/include/multiw-2.500 new file mode 100644 index 000000000..01f1fb6c1 --- /dev/null +++ b/sys/unix/hints/include/multiw-2.500 @@ -0,0 +1,218 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 multiw-2.500 $NHDT-Date: 1599337709 2020/09/05 20:28:29 $ $NHDT-Branch: NetHack-5.0 $ +# +# Sorts out support for multiple window ports (interfaces) to included in the build. +# +# Included from: +# hints/linux.500 +# hints/macOS.500 +# +# The following will be set appropriately following this: +# - WANT_WIN_XXX (at least one will be set; default is TTY) +# - WANT_DEFAULT (set to match one of the enabled WANT_WIN_XXX) +# - WINCFLAGS +# - WINSRC +# - WINOBJ0 +#--- +# User selections could be specified as combinations of any of the following: +# WANT_WIN_TTY=1, WANT_WIN_CURSES=1, WANT_WIN_QT=1, WANT_WIN_X11=1 +# The selections will all be linked into the same binary. +# +# Assuming you have the prerequisite packages mentioned above, you can +# specify, right on the make command line, which window ports (or interfaces) +# to include in your build. Doing it via the make command line means that won't +# have to edit the Makefile. +# +# make WANT_WIN_QT=1 WANT_WIN_X11=1 WANT_WIN_CURSES=1 WANT_WIN_TTY=1 install +# +# Add WANT_DEFAULT=Qt (or other interface) if you want nethack to use +# something other than tty as the default interface. +# + +ifdef WANT_WIN_ALL +WANT_WIN_TTY=1 +WANT_WIN_CURSES=1 +WANT_WIN_X11=1 +WANT_WIN_QT=1 +else +# Make sure that at least one interface is enabled. +ifndef WANT_WIN_TTY +ifndef WANT_WIN_CURSES +ifndef WANT_WIN_X11 +ifndef WANT_WIN_QT +WANT_WIN_TTY=1 +endif +endif +endif +endif +endif + +ifdef WANT_LIBNH +WANT_DEFAULT=shim +endif + +# Make sure that a default interface is specified; this doesn't guarantee +# sanity for something like 'make WANT_WIN_CURSES=1 WANT_DEFAULT=X11' but +# 'makedefs -v' would notice, complain, and quit causing 'make' to quit. +ifndef WANT_DEFAULT +# pick the first one enabled among { tty, curses, X11, Qt } +ifdef WANT_WIN_TTY +WANT_DEFAULT=tty +else +ifdef WANT_WIN_CURSES +WANT_DEFAULT=curses +else +ifdef WANT_WIN_X11 +WANT_DEFAULT=X11 +else +ifdef WANT_WIN_QT +WANT_DEFAULT=Qt +else +# ? shouldn't be able to get here... +endif +endif +endif +endif +endif + +WINCFLAGS= +WINSRC = +WINOBJ0 = +SND_CFLAGS= +XTRASRC = +XTRAOBJ = + +ifdef WANT_WIN_TTY +WINSRC += $(WINTTYSRC) +WINOBJ0 += $(WINTTYOBJ) +else +WINCFLAGS += -DNOTTYGRAPHICS +endif + +ifdef WANT_WIN_CURSES +WINCFLAGS += -DCURSES_GRAPHICS +ifeq "$(USE_GENL_PUTMIXED)" "1" +WINCFLAGS += -DUSE_GENL_PUTMIXED +else +WINCFLAGS += -D_XOPEN_SOURCE_EXTENDED=1 +endif +WINSRC += $(WINCURSESSRC) +WINOBJ0 += $(WINCURSESOBJ) +endif + +ifdef WANT_WIN_X11 +WINCFLAGS += -DX11_GRAPHICS +WINSRC += $(WIINX11SRC) +WINOBJ0 += $(WINX11OBJ) +XTRASRC += tile.c +XTRAOBJ += $(TARGETPFX)tile.o +endif + +ifndef WANT_WIN_QT +ifdef WANT_WIN_ALL +WANT_WIN_QT=1 +endif +ifdef WANT_WIN_QT4 +ifndef WANT_WIN_QT +WANT_WIN_QT=1 +endif # not WANT_WIN_QT +endif # WANT_WIN_QT4 +ifdef WANT_WIN_QT5 +ifndef WANT_WIN_QT +WANT_WIN_QT=1 +endif # not WANT_WIN_QT +endif # WANT_WIN_QT5 +ifdef WANT_WIN_QT6 +ifndef WANT_WIN_QT +WANT_WIN_QT=1 +endif # not WANT_WIN_QT +endif # WANT_WIN_QT6 +endif # not def WANT_WIN_QT + +ifdef WANT_WIN_QT +# WANT_WIN_QT5 is the default +ifndef WANT_WIN_QT4 +ifndef WANT_WIN_QT5 +ifndef WANT_WIN_QT6 +WANT_WIN_QT5=1 +endif # not WANT_WIN_QT6 +endif # not WANT_WIN_QT5 +endif # not WANT_WIN_QT4 +ifdef WANT_WIN_QT4 +#Slackware 14.2 puts Qt4 here +#if your Qt4 is elsewhere, change this to match +QT4DIR=/usr/lib64/qt +QTDIR=$(QT4DIR) +endif # WANT_WIN_QT4 +endif # WANT_WIN_QT + +ifdef WANT_WIN_QT +WINCFLAGS += -DQT_GRAPHICS +WINSRC += $(WINQTSRC) +WINOBJ0 += $(WINQTOBJ) +ifndef WANT_WIN_QT4 +SNDCFLAGS += -DSND_LIB_QTSOUND +endif #! WANT_WIN_QT4 +HAVE_SNDLIB = 1 +NEEDS_SND_USERSOUNDS = 1 +NEEDS_SND_SEAUTOMAP = 1 +XTRASRC += tile.c +XTRAOBJ += $(TARGETPFX)tile.o +# +ifndef CPLUSPLUS_NEEDED +CPLUSPLUS_NEEDED = 1 +endif # CPLUSPLUS_NEEDED +ifdef WANT_WIN_QT6 +CPLUSPLUS_NEED20 = 1 +CPLUSPLUS_NEED_DEPSUPPRESS = 1 +endif # WANT_WIN_QT6 +endif # WANT_WIN_QT + +ifeq "$(GIT)" "1" +ifndef GITSUBMODULES +GITSUBMODULES=1 +endif +endif + +ifeq "$(git)" "1" +ifndef GITSUBMODULES +GITSUBMODULES=1 +endif +endif + +ifeq "$(CPPREGEX)" "1" +REGEXOBJ=$(TARGETPFX)cppregex.o +ifndef CPLUSPLUS_NEEDED +CPLUSPLUS_NEEDED = 1 +endif +endif + +ifeq "$(cppregex)" "1" +REGEXOBJ=$(TARGETPFX)cppregex.o +ifndef CPLUSPLUS_NEEDED +CPLUSPLUS_NEEDED = 1 +endif +endif + +ifeq "$(musl)" "1" +MUSL=1 +endif +ifeq "$(MUSL)" "1" +ifneq "$(NOCRASHREPORT)" "1" +NOCRASHREPORT=1 +endif +WINCFLAGS += -DMUSL_LIBC +# use this instead of col -bx +COLCMD=../util/stripbs +STRIPBS=../util/stripbs +else +WINCFLAGS += -DGNU_LIBC +endif + +ifeq "$(NOCRASHREPORT)" "1" +WINCFLAGS += -DNOCRASHREPORT +endif + +#end of hints/include/multiw-2.500 +#------------------------------------------------------------------------------ + diff --git a/sys/unix/hints/include/response.500 b/sys/unix/hints/include/response.500 new file mode 100644 index 000000000..0781323e0 --- /dev/null +++ b/sys/unix/hints/include/response.500 @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------ +# NetHack 5.0 response.500 $NHDT-Date: 1668359835 2022/11/13 17:17:15 $ $NHDT-Branch: NetHack-5.0 $ + +ifeq "$(RESP)" "1" +USE_RESPONSEFILE=1 +endif +ifeq "$(resp)" "1" +USE_RESPONSEFILE=1 +endif +ifeq "$(RESPONSE)" "1" +USE_RESPONSEFILE=1 +endif +ifeq "$(response)" "1" +USE_RESPONSEFILE=1 +endif + +ifeq "$(USE_RESPONSEFILE)" "1" +RESPONSEFILES=create_responsefiles +CXXFLAGS = $(CCXXFLAGS) -I. -I$(QTDIR)/include $(QTCXXFLAGS) +CC_COMPILER_SWITCHES := $(subst \,\\,$(CFLAGS)) +CC_COMPILER_SWITCHES := $(subst ",\",$(CC_COMPILER_SWITCHES)) +CXX_COMPILER_SWITCHES := $(subst \,\\,$(CXXFLAGS)) +CXX_COMPILER_SWITCHES := $(subst ",\",$(CXX_COMPILER_SWITCHES)) +CC_RESPONSEFILE=../src/nethack_cc.rsp +CXX_RESPONSEFILE=../src/nethack_cxx.rsp +CFLAGS=@$(CC_RESPONSEFILE) +CXXFLAGS=@$(CXX_RESPONSEFILE) +CLEAN_CC_RESPONSEFILE=rm -f $(CC_RESPONSEFILE); +CLEAN_CXX_RESPONSEFILE=rm -f $(CXX_RESPONSEFILE); +endif + +#end of response.500 +#------------------------------------------------------------------------------ diff --git a/sys/unix/hints/linux b/sys/unix/hints/linux deleted file mode 100644 index 38a2438fe..000000000 --- a/sys/unix/hints/linux +++ /dev/null @@ -1,57 +0,0 @@ -# -# NetHack 3.6 linux $NHDT-Date: 1432512814 2015/05/25 00:13:34 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Linux hints file -# This hints file provides a single-user tty build for Linux, specifically -# for Ubuntu dapper. - - -#PREFIX=/usr -PREFIX=$(wildcard ~)/nh/install -HACKDIR=$(PREFIX)/games/lib/$(GAME)dir -SHELLDIR = $(PREFIX)/games -INSTDIR=$(HACKDIR) -VARDIR = $(HACKDIR) - - - -POSTINSTALL=cp -n sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; - -CFLAGS=-g -O -I../include -DNOTPARMDECL -CFLAGS+=-DDLB -CFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -CFLAGS+=-DTIMED_DELAY -CFLAGS+=-DHACKDIR=\"$(HACKDIR)\" -CFLAGS+=-DDUMPLOG -CFLAGS+=-DCONFIG_ERROR_SECURE=FALSE -CFLAGS+=-DCURSES_GRAPHICS -#CFLAGS+=-DEXTRA_SANITY_CHECKS -#CFLAGS+=-DEDIT_GETLIN -#CFLAGS+=-DSCORE_ON_BOTL -#CFLAGS+=-DMSGHANDLER -#CFLAGS+=-DTTY_TILES_ESCCODES - -LINK=$(CC) -# Only needed for GLIBC stack trace: -LFLAGS=-rdynamic - -WINSRC = $(WINTTYSRC) $(WINCURSESSRC) -WINOBJ = $(WINTTYOBJ) $(WINCURSESOBJ) -WINLIB = $(WINTTYLIB) $(WINCURSESLIB) - -# if TTY_TILES_ESCCODES -#WINSRC += tile.c -#WINOBJ += tile.o - -WINTTYLIB=-lncurses -ltinfo - -CHOWN=true -CHGRP=true - -VARDIRPERM = 0755 -VARFILEPERM = 0600 -GAMEPERM = 0755 diff --git a/sys/unix/hints/linux-chroot b/sys/unix/hints/linux-chroot deleted file mode 100644 index e5bb767fb..000000000 --- a/sys/unix/hints/linux-chroot +++ /dev/null @@ -1,49 +0,0 @@ -# -# NetHack 3.5 linux $NHDT-Date: 1524684267 2018/04/25 19:24:27 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.1 $ -# NetHack 3.5 linux $Date: 2010/01/15 19:54:37 $ $Revision: 1.8 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Linux hints file -# This hints file provides a chrooted build for Linux, specifically -# for Ubuntu dapper. -# Does not copy required libraries or termcap files into the chroot. - -COMPILEREVISION?=1 - -# this is the chroot dir -PREFIX=$(wildcard ~)/nh/install - -# this is the dir where NetHack is inside the chroot -HACKDIR=/nh.$(shell date +%Y%m%d)-$(COMPILEREVISION) -INSTDIR=$(PREFIX)$(HACKDIR) -SHELLDIR=$(PREFIX)/games -VARDIR=$(INSTDIR)/var - - -POSTINSTALL=cp -n sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; - -CFLAGS1=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" -CFLAGS=-g -O -I../include -DNOTPARMDECL $(CFLAGS1) -DDLB -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -CFLAGS+=-DTIMED_DELAY -CFLAGS+=-DHACKDIR=\"$(HACKDIR)\" -CFLAGS+=-DVAR_PLAYGROUND=\"$(HACKDIR)/var\" - -LINK=$(CC) -# Only needed for GLIBC stack trace: -LFLAGS=-rdynamic - -WINSRC = $(WINTTYSRC) -WINOBJ = $(WINTTYOBJ) -WINLIB = $(WINTTYLIB) - -WINTTYLIB=-lncurses -ltinfo - -CHOWN=true -CHGRP=true - -VARDIRPERM = 0755 -VARFILEPERM = 0600 -GAMEPERM = 0755 diff --git a/sys/unix/hints/linux-minimal b/sys/unix/hints/linux-minimal index 256332cc7..0d4b569b1 100644 --- a/sys/unix/hints/linux-minimal +++ b/sys/unix/hints/linux-minimal @@ -1,5 +1,5 @@ # -# NetHack 3.6 linux $NHDT-Date: 1432512814 2018/11/23 16:00:00 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ +# NetHack 5.0 linux $NHDT-Date: 1596498416 2020/08/03 23:46:56 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.2 $ # Copyright (c) Patric Mueller # NetHack may be freely redistributed. See license for details. # @@ -15,6 +15,11 @@ VARDIR=$(HACKDIR) CFLAGS=-g -I../include +# when building liblua.a, avoid warning that use of tmpnam() should be +# replaced by mkstemp(); the lua code doesn't use nethack's config.h so +# this needs to be passed via make rather than defined in unixconf.h +SYSCFLAGS=-DLUA_USE_POSIX + LINK=$(CC) WINSRC = $(WINTTYSRC) diff --git a/sys/unix/hints/linux-qt4 b/sys/unix/hints/linux-qt4 deleted file mode 100644 index 910345ed1..000000000 --- a/sys/unix/hints/linux-qt4 +++ /dev/null @@ -1,51 +0,0 @@ -# -# NetHack 3.6 linux-qt4 $NHDT-Date: 1566346592 2019/08/21 00:16:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.27 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Linux hints file -# This hints file provides a single-user Qt4 build for Linux, specifically -# for Ubuntu dapper. - - -#PREFIX=/usr -PREFIX=$(wildcard ~)/nh/install -HACKDIR=$(PREFIX)/games/lib/$(GAME)dir -SHELLDIR = $(PREFIX)/games -INSTDIR=$(HACKDIR) -VARDIR = $(HACKDIR) - - -POSTINSTALL= cp -n sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; ( cd $(INSTDIR); mkfontdir -x .lev ); - -CFLAGS=-g -O -I../include -DNOTPARMDECL -CFLAGS+=-DHACKDIR=\"$(HACKDIR)\" -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -CFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" -CFLAGS+=-DTIMED_DELAY -CFLAGS+=-DDUMPLOG -CFLAGS+=-DCONFIG_ERROR_SECURE=FALSE -CFLAGS+=-DQT_GRAPHICS -DDEFAULT_WINDOW_SYS=\"Qt\" -DNOTTYGRAPHICS -CFLAGS+=`pkg-config QtGui --cflags` - -LINK=g++ -CXX=g++ -std=gnu++11 - -WINSRC = $(WINQT4SRC) -WINOBJ = $(WINQT4OBJ) -WINLIB = $(WINQT4LIB) -MOC = moc-qt4 - -VARDATND = nhtiles.bmp rip.xpm nhsplash.xpm pet_mark.xbm pilemark.xbm - -QTDIR=/usr - -CHOWN=true -CHGRP=true -VARDIRPERM = 0755 -VARFILEPERM = 0600 -GAMEPERM = 0755 - -# note: needs libxt-dev libxaw7-dev libx11-dev bdftopcf diff --git a/sys/unix/hints/linux-qt5 b/sys/unix/hints/linux-qt5 deleted file mode 100644 index c1b13d890..000000000 --- a/sys/unix/hints/linux-qt5 +++ /dev/null @@ -1,52 +0,0 @@ -# -# NetHack 3.6 linux-qt5 $NHDT-Date: 1566346602 2019/08/21 00:16:42 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.27 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Linux hints file -# This hints file provides a single-user Qt5 build for Linux, specifically -# for Fedora 26. - - -#PREFIX=/usr -PREFIX=$(wildcard ~)/nh/install -HACKDIR=$(PREFIX)/games/lib/$(GAME)dir -SHELLDIR = $(PREFIX)/games -INSTDIR=$(HACKDIR) -VARDIR = $(HACKDIR) - - -POSTINSTALL= cp -n sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; ( cd $(INSTDIR); mkfontdir -x .lev ); - -CFLAGS=-g -O -I../include -DNOTPARMDECL -CFLAGS+=-DHACKDIR=\"$(HACKDIR)\" -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -CFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" -CFLAGS+=-DTIMED_DELAY -CFLAGS+=-DDUMPLOG -CFLAGS+=-DCONFIG_ERROR_SECURE=FALSE -CFLAGS+=-DQT_GRAPHICS -DDEFAULT_WINDOW_SYS=\"Qt\" -DNOTTYGRAPHICS -CFLAGS+=`pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --cflags` -fPIC - -LINK=g++ -CXX=g++ -std=gnu++11 - -WINSRC = $(WINQT4SRC) -WINOBJ = $(WINQT4OBJ) -WINLIB = $(WINQT5LIB) -#MOC = moc -MOC = moc-qt5 - -VARDATND = nhtiles.bmp rip.xpm nhsplash.xpm pet_mark.xbm pilemark.xbm - -QTDIR=/usr - -CHOWN=true -CHGRP=true -VARDIRPERM = 0755 -VARFILEPERM = 0600 -GAMEPERM = 0755 - -# note: needs libxt-dev libxaw7-dev libx11-dev bdftopcf diff --git a/sys/unix/hints/linux-x11 b/sys/unix/hints/linux-x11 deleted file mode 100644 index 2f340e981..000000000 --- a/sys/unix/hints/linux-x11 +++ /dev/null @@ -1,51 +0,0 @@ -# -# NetHack 3.6 linux-x11 $NHDT-Date: 1566346602 2019/08/21 00:16:42 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.24 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Linux hints file -# This hints file provides a single-user x11 build for Linux, specifically -# for Ubuntu dapper. - - -#PREFIX=/usr -PREFIX=$(wildcard ~)/nh/install -HACKDIR=$(PREFIX)/games/lib/$(GAME)dir -SHELLDIR = $(PREFIX)/games -INSTDIR=$(HACKDIR) -VARDIR = $(HACKDIR) - - -POSTINSTALL= cp -n sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; ( cd $(INSTDIR); mkfontdir -x .lev ); - -CFLAGS=-g -O -I../include -DNOTPARMDECL -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -CFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" -CFLAGS+=-DX11_GRAPHICS -DDEFAULT_WINDOW_SYS=\"X11\" -DNOTTYGRAPHICS -CFLAGS+=-DDUMPLOG -CFLAGS+=-DCONFIG_ERROR_SECURE=FALSE - -LINK=$(CC) - -WINSRC = $(WINX11SRC) -WINOBJ = $(WINX11OBJ) -WINLIB = $(WINX11LIB) - -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm - -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 - -CHOWN=true -CHGRP=true -VARDIRPERM = 0755 -VARFILEPERM = 0600 -GAMEPERM = 0755 - -# Use XPM format tile file -CFLAGS+=-DUSE_XPM -WINX11LIB+=-lXpm -VARDATND+=rip.xpm - -# note: needs libxt-dev libxaw7-dev libx11-dev bdftopcf diff --git a/sys/unix/hints/linux.500 b/sys/unix/hints/linux.500 new file mode 100755 index 000000000..b822b6e50 --- /dev/null +++ b/sys/unix/hints/linux.500 @@ -0,0 +1,528 @@ +# NetHack 5.0 linux.500 $NHDT-Date: 1693519390 2023/08/31 22:03:10 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.61 $ +# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. +# NetHack may be freely redistributed. See license for details. +# +#--------------------------------------------------------------------- +# Linux hints file with support for multiple window ports (interfaces) +# Tested on: +# - Ubuntu focal +# +# If this doesn't work for your distribution, consider making a new +# hints file for it, rather than changing this one. +# And let us know about it. +# + +#-PRE +# linux.500 hints file provides a single-user build for Linux (such +# as Ubuntu focal). + +# note: '#-INCLUDE' is not just a comment +# multiw-1.500 contains sections 1 to 2 +#-INCLUDE multiw-1.500 + +HINTSVERSION := 500 + +ifdef MAKEFILE_TOP +ifeq ($(MAKELEVEL),0) +PRECHECK+=checkmakefiles +# all files included from this hints file get listed +# in HINTSINCLNAMES (without suffix and without a path) +HINTSINCLNAMES := compiler cross-pre1 cross-pre2 cross-post \ + gbdates-pre gbdates-post \ + multiw-1 multiw-2 misc \ + multisnd1-pre multisnd2-pre multisnd-post +HINTSINCLFILES := $(addsuffix .$(HINTSVERSION), $(HINTSINCLNAMES)) +endif +endif + +ifndef LIBXPM +LIBXPM= -L/opt/X11/lib -lXpm +endif + +#4. Other +GAMEUID = $(USER) +GAMEGRP = games + +# This gives better backtraces by making all core functions global; this +# works around a limitation in glibc's backtrace(3) function. +# This will be turned on automatically with CRASHREPROT. +# 1 to enable, 0 to disable +USE_NOSTATICFN = 1 +# If you want CRASHREPORT but absolutely don't want NOSTATICFN, define this: +#USE_NONOSTATICFN = 1 + +#----------------------------------------------------------------------------- +#-INCLUDE cross-pre1.500 + + +#----------------------------------------------------------------------------- +# You shouldn't need to change anything below here (in the hints file; if +# you're reading this in Makefile augmented by hints, that may not be true). +# + +#-INCLUDE multiw-2.500 + +# compiler.500 contains compiler detection and adjustments common +# to both linux and macOS + +#-INCLUDE compiler.500 + +ifdef WANT_WIN_QT +ifdef WANT_WIN_QT5 +QTDIR=/usr +endif # WANT_WIN_QT5 +ifdef WANT_WIN_QT6 +#if your Qt6 is elsewhere, change this to match +QTDIR=/usr/local/qt6 +ifeq "$(GPPGTEQ14)" "1" +CCXXFLAGS += -Wno-template-id-cdtor +endif # g++ greater than or equal to 14 +endif # WANT_WIN_QT6 +endif # WANT_WIN_QT + +# misc.500 must come after compiler.500 +# and after QTDIR is defined. +# +#-INCLUDE misc.500 + +ifeq "$(USE_ASAN)" "1" +CFLAGS+=-fsanitize=address +LFLAGS+=-fsanitize=address +endif + +ifeq "$(USE_UBSAN)" "1" +CFLAGS+=-fsanitize=undefined +LFLAGS+=-fsanitize=undefined +endif + +ifeq "$(USE_CURSESLIB)" "1" +# default +CURSESLIB = -lncurses -ltinfo +# If CURSES_UNICODE is defined, we need ncursesw. +# Without CURSES_UNICODE the following simpler setting works. +# CURSESLIB = -lncurses -ltinfo +ifdef MAKEFILE_SRC +comma:=, +NCURSES_LFLAGS = $(shell pkg-config ncursesw --libs) +NCURSES_CFLAGS = $(shell pkg-config ncursesw --cflags) +ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS))) +ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS))) +#this indicates that pkg-config itself was unavailable +NCURSES_LFLAGS = -lncursesw -ltinfo +endif +endif +#$(info $(NCURSES_LFLAGS)) +ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS))) +HAVE_NCURSESW=0 +else +HAVE_NCURSESW=1 +endif +#$(info $(NCURSES_LFLAGS)) +#$(info HAVE_NCURSESW=$(HAVE_NCURSESW)) +ifeq "$(HAVE_NCURSESW)" "1" +# remove unnecessary -Wl,-Bsymbolic-functions if present +ifneq (,$(findstring -Wl$(comma)-Bsymbolic-functions, $(NCURSES_LFLAGS))) +CURSESLIB = $(subst -Wl$(comma)-Bsymbolic-functions,,$(NCURSES_LFLAGS)) +else +CURSESLIB = $(NCURSES_LFLAGS) +endif +endif #HAVE_NCURSESW +#$(info $(CURSESLIB)) +ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS))) +ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS))) +#this indicates that pkg-config itself was unavailable +NOPKGCONFIG = 1 +endif #ncurses not in NCURSES_LFLAGS? +endif #ncursesw not in NCURSES_LFLAGS? +# +ifeq "$(NOPKGCONFIG)" "1" +NCURSES_CFLAGS = -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 +ifeq "$(HAVE_NCURSESW)" "1" +ifeq (,$(wildcard /usr/include/ncursesw/curses.h)) +NCURSES_CFLAGS += -I/usr/include +else +NCURSES_CFLAGS += -I/usr/include/ncursesw +endif +NCURSES_LFLAGS = -lncursesw -ltinfo +else #HAVE_NCURSESW +ifeq (,$(wildcard /usr/include/ncurses/curses.h)) +NCURSES_CFLAGS += -I/usr/include +else +NCURSES_CFLAGS += -I/usr/include/ncurses +endif +NCURSES_LFLAGS = -lncurses -ltinfo +endif #HAVE_NCURSESW +endif #NOPKGCONFIG +endif #MAKEFILE_SRC +endif #USE_CURSESLIB + +# NetHack sources control +NHCFLAGS+=-DDLB +NHCFLAGS+=-DHACKDIR=\"$(HACKDIR)\" +NHCFLAGS+=-DDEFAULT_WINDOW_SYS=\"$(WANT_DEFAULT)\" +NHCFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE +NHCFLAGS+=-DTIMED_DELAY +NHCFLAGS+=-DDUMPLOG +NHCFLAGS+=-DCONFIG_ERROR_SECURE=FALSE +#NHCFLAGS+=-DGREPPATH=\"/usr/bin/grep\" +NHCFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" +#NHCFLAGS+=-DNOMAIL +#NHCFLAGS+=-DEXTRA_SANITY_CHECKS +#NHCFLAGS+=-DEDIT_GETLIN +#NHCFLAGS+=-DSCORE_ON_BOTL +#NHCFLAGS+=-DMSGHANDLER +#NHCFLAGS+=-DTTY_TILES_ESCCODES +#NHCFLAGS+=-DTTY_SOUND_ESCCODES +#NHCFLAGS+=-DNO_CHRONICLE +#NHCFLAGS+=-DLIVELOG +#NHCFLAGS+=-DCHANGE_COLOR +NHCFLAGS+=-DSELF_RECOVER +ifdef WANT_WIN_CURSES +NHCFLAGS+=$(NCURSES_CFLAGS) +ifeq "$(HAVE_NCURSESW)" "1" +NHCFLAGS+=-DCURSES_UNICODE +else +ifdef MAKEFILE_SRC +$(info Attention: CURSES_UNICODE is not being defined without ncursesw) +endif #MAKEFILE_SRC +endif #HAVE_NCURSESW +endif #WANT_WIN_CURSES + +# +#-INCLUDE multisnd1-pre.500 +# + +ifeq "$(CCISCLANG)" "1" +# clang-specific starts +# clang-specific ends +else +# gcc-specific starts +LIBCFLAGS+=-DSIG_RET_TYPE=__sighandler_t +# gcc-specific ends +endif + +# WINCFLAGS set from multiw-2.500 +# SNDCFLAGS set from multisnd-pre.500 +CFLAGS+= $(WINCFLAGS) +CFLAGS+= $(SNDCFLAGS) +CFLAGS+= $(NHCFLAGS) +CFLAGS+= $(LIBCFLAGS) + +# WINCFLAGS set from multiw-2.500 +# SNDCFLAGS set from multisnd-pre.500 +CCXXFLAGS+= $(WINCFLAGS) +CCXXFLAGS+= $(SNDCFLAGS) +CCXXFLAGS+= $(NHCFLAGS) +CCXXFLAGS+= $(LIBCFLAGS) + +VARDATND = +VARDATND0 = + +#ifdef WANT_WIN_CHAIN +#HINTSRC=$(CHAINSRC) +#HINTOBJ=$(CHAINOBJ) +#endif # WANT_WIN_CHAIN + +ifdef MAKEFILE_SRC +ifdef CURSESLIB +WINLIB += $(CURSESLIB) +endif #CURSESLIB + +ifneq "$(NO_NHUUID)" "1" +UUID_LIB_CHECK := $(shell echo `/sbin/ldconfig -p | grep libuuid`) +#$(info UUID_LIB_CHECK=$(UUID_LIB_CHECK)) +ifneq "$(UUID_LIB_CHECK)" "" +UUID_LIB=1 +else +UUID_LIB=0 +endif +#$(info UUID_LIB=$(UUID_LIB)) +# +# check for uuid development headers +UUID_HEADERS_CHECK := $(wildcard /usr/include/uuid/uuid.h) +#$(info UUID_HEADERS_CHECK=$(UUID_HEADERS_CHECK)) +ifneq "$(UUID_HEADERS_CHECK)" "" +UUID_HEADERS = 1 +else +UUID_HEADERS = 0 +endif +#$(info UUID_HEADERS=$(UUID_HEADERS)) + +ifeq "$(UUID_LIB)" "1" +ifeq "$(UUID_HEADERS)" "1" +ifndef WANT_NHUUID +WANT_NHUUID=1 +endif +endif +endif +else # NO_NHUUID +WANT_NHUUID=0 +endif # NO_NHUUID + +ifeq "$(WANT_NHUUID)" "1" +#$(info NHUUID support will be included) +CFLAGS+= -DNHUUID +LIBS+=-luuid +else # WANT_NHUUID +$(info Attention - No NHUUID support will be included) +endif # WANT_NHUUID +endif # MAKEFILE_SRC + +ifdef WANT_WIN_X11 +USE_XPM=1 +WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 +VARDATND0 += x11tiles NetHack.ad pet_mark.xbm pilemark.xbm +# -x: if built without dlb, some versions of mkfontdir think *.lev are fonts +POSTINSTALL += bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; ( cd $(HACKDIR); mkfontdir -x .lev ); +# separate from CFLAGS so that we don't pass it to every file +X11CFLAGS = -I/opt/X11/include +# avoid repeated complaints about _X_NONNULL(args...) in +X11CFLAGS += -Wno-variadic-macros +ifdef USE_XPM +CFLAGS += -DUSE_XPM +WINX11LIB += -lXpm +VARDATND0 += rip.xpm +endif +WINLIB += $(WINX11LIB) +LFLAGS+=-L/opt/X11/lib +endif # WANT_WIN_X11 + +ifdef WANT_WIN_QT +LINK = $(CXX) +ifdef WANT_WIN_QT4 +QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config QtGui --cflags)) -DQT_NO_SOUND=1 +WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config QtGui --libs) +endif # WANT_WIN_QT4 +ifdef WANT_WIN_QT5 +QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --cflags)) +WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --libs) +endif # WANT_WIN_QT5 +ifdef WANT_WIN_QT6 +ifdef QT6MANUAL +# Try some likely spots for a self-built Qt6. +# You'll have to change these manually before using the hints file +# if they don't match the installed location on your system. +ifneq "$(HOSTTYPE)" "" +QTHOST=$(HOSTTYPE) +else +QTHOST=x86_64 +endif +QTTOP=/usr/include/$(HOSTTYPE)-linux-gnu/qt6 +ifneq ($(wildcard $(QTTOP)/*),) +#we don't set QTLOCATED=1 for this +QTINCDIR=/usr/include/$(QTHOST)-linux-gnu/qt6 +QTLIBDIR=/usr/lib/$(QTHOST)-linux.gnu +QTCXXFLAGS += -DQT_WIDGETS_LIB -DQT_MULTIMEDIA_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB +QTCXXFLAGS += -I$(QTINCDIR)/QtWidgets -I$(QTINCDIR) -I$(QTINCDIR)/QtMultimedia +QTCXXFLAGS += -I$(QTINCDIR)/QtNetwork -I$(QTINCDIR)/QtGui -I$(QTINCDIR)/QtCore +WINLIB += -L$(QTLIBDIR) -lQt6Widgets -lQt6Multimedia -lQt6Network -lQt6Gui -lQt6Core +MOCPATH = /usr/lib/qt6/libexec/moc +#/usr/lib/x86_64-linux-gnu/libQt6EglFSDeviceIntegration.so +endif # QTTOP/* +ifndef QTINCDIR +ifneq ($(wildcard /usr/local/Qt6/*),) +QTDIR=/usr/local/Qt6 +QTLOCATED=1 +endif # wildcard /usr/local/Qt6 +ifneq ($(wildcard /usr/local/qt6/*),) +QTDIR=/usr/local/qt6 +QTLOCATED=1 +endif # wildcard /usr/local/qt6 +endif # !QTINCDIR +ifdef QTLOCATED +QTCXXFLAGS += -I$(QTDIR)/include/QtCore +QTCXXFLAGS += -I$(QTDIR)/include/QtGui +QTCXXFLAGS += -I$(QTDIR)/include/QtMultimedia +QTCXXFLAGS += -I$(QTDIR)/include/QtWidgets +MOCPATH = $(QTDIR)/libexec/moc +WINLIB += -L$(QTDIR)/lib -lQt6Widgets -lQt6Multimedia -lQt6Network -lQt6Gui -lQt6Core +endif # QTLOCATED +else # !QT6MANUAL +MOCDIR = $(shell pkg-config Qt6Gui --variable=libexecdir) +ifneq ($(wildcard $(MOCDIR)/*),) +MOCPATH = $(MOCDIR)/moc +else +MOCPATH = /usr/lib/qt6/libexec/moc +endif # MOCDIR +QTCXXFLAGS += $(sort $(shell pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --cflags)) +WINLIB += $(shell pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --libs) +endif # QT6MANUAL +endif # WANT_WIN_QT6 +ifndef QTDIR +$(error QTDIR not defined in the environment or Makefile) +endif # QTDIR +# XXX if /Developer/qt exists and QTDIR not set, use that +# XXX make sure QTDIR points to something reasonable +QTCXXFLAGS += -fPIC +POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; \ + ( cd $(INSTDIR); mkfontdir -x .lev ); +VARDATND0 += nhtiles.bmp rip.xpm nhsplash.xpm +else # WANT_WIN_QT +LINK = $(CC) +endif # !WANT_WIN_QT + +# prevent duplicate tile.o in WINOBJ +WINOBJ = $(WINOBJ0) $(sort $(XTRAOBJ)) +# prevent duplicates in VARDATND if both X11 and Qt are being supported +VARDATND += $(sort $(VARDATND0)) + +GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) +GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) +GIT_PREFIX := $(shell echo `git config nethack.substprefix` 2>&1) + +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif +ifdef GIT_PREFIX +GITPREFIX = -DNETHACK_GIT_PREFIX=\"$(GIT_PREFIX)\" +endif + +ifdef WANT_LIBNH +CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH -fpic +LIBNHSYSSRC = ../sys/libnh/libnhmain.c \ + ../sys/share/ioctl.c ../sys/share/unixtty.c \ + ../sys/unix/unixunix.c ../sys/unix/unixres.c \ + ../win/shim/winshim.c +LIBNHSYSOBJ = $(TARGETPFX)libnhmain.o $(TARGETPFX)ioctl.o \ + $(TARGETPFX)unixtty.o $(TARGETPFX)unixunix.o \ + $(TARGETPFX)unixres.o $(TARGETPFX)winshim.o \ + $(TARGETPFX)date.o +#don't bother building the game executable as it will fail +#without winshim +override GAME= +MOREALL += ( cd src ; $(MAKE) pregame ; $(MAKE) $(TARGETPFX)libnh.a ) +endif # WANT_LIBNH + +SYSCONFCREATE = cp sys/unix/sysconf $(INSTDIR)/sysconf +SYSCONFINSTALL = $(SYSCONFCREATE) && \ + $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \ + $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \ + chmod $(VARFILEPERM) $(INSTDIR)/sysconf; +SYSCONFENSURE = (if ! test -f $(INSTDIR)/sysconf ; then \ + $(SYSCONFCREATE) && \ + $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \ + $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \ + chmod $(VARFILEPERM) $(INSTDIR)/sysconf; fi ); + +ifdef WANT_SOURCE_INSTALL +PREFIX=$(abspath $(NHSROOT)) +#SHELLDIR= +HACKDIR=$(PREFIX)/playground +GAMEPERM = 0700 +VARFILEPERM = 0600 +VARDIRPERM = 0700 +CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE +MOREALL=$(MAKE) install +else #!WANT_SOURCE_INSTALL +#PREFIX=/usr +PREFIX=$(wildcard ~)/nh/install +HACKDIR=$(PREFIX)/games/lib/nethackdir +SHELLDIR = $(PREFIX)/games +VARDIRPERM = 0755 +VARFILEPERM = 0600 +GAMEPERM = 0755 +endif #?WANT_SOURCE_INSTALL + +INSTDIR=$(HACKDIR) +VARDIR = $(HACKDIR) + +ifdef MAKEFILE_TOP +TESTGDBPATH=/usr/bin/gdb +POSTINSTALL+= test -f $(TESTGDBPATH) || \ + sed -i -e 's;^GDBPATH=/usr/bin/gdb;\#GDBPATH=/usr/bin/gdb;' \ + -e 's;PANICTRACE_GDB=1;PANICTRACE_GDB=0;' $(INSTDIR)/sysconf; +POSTUPDATE+= test -f $(TESTGDBPATH) || \ + sed -i -e 's;^GDBPATH=/usr/bin/gdb;\#GDBPATH=/usr/bin/gdb;' \ + -e 's;PANICTRACE_GDB=1;PANICTRACE_GDB=0;' $(INSTDIR)/sysconf; +endif #MAKEFILE_TOP + +ifeq '$(USE_NONOSTATICFN)' '1' +CFLAGS += -DNONOSTATICFN +else +ifeq '$(USE_NOSTATICFN)' '1' +CFLAGS += -DNOSTATICFN +endif +endif + +# Lua +# when building liblua.a, avoid warning that use of tmpnam() should be +# replaced by mkstemp(); the lua code doesn't use nethack's config.h so +# this needs to be passed via make rather than defined in unixconf.h +SYSCFLAGS=-DLUA_USE_LINUX +ifdef GITSUBMODULES +LUAFLAGS=CC='$(CC)' SYSCFLAGS='$(SYSCFLAGS)' +ifeq "$(CCISCLANG)" "1" +# clang +LUAFLAGS +=CWARNGCC='' +endif # clang +override LUAHEADERS = submodules/lua +override LUA2NHTOP = ../.. +override LUAMAKEFLAGS=$(LUAFLAGS) +endif # GITSUBMODULES +DLLIB = -ldl + +# Only needed for GLIBC stack trace: +LFLAGS+=-rdynamic + +# if TTY_TILES_ESCCODES +#WINSRC += tile.c +#WINOBJ += tile.o +# endif + +CHOWN=true +CHGRP=true + +# manpages directory +MANDIR=/usr/share/man/man6 +# +#-INCLUDE cross-pre2.500 +# + +# +#-INCLUDE gbdates-pre.500 +# + +# +#-INCLUDE multisnd2-pre.500 +# + +# +#-INCLUDE response.500 +# + +#-POST + +# +#-INCLUDE gbdates-post.500 +# +# +#-INCLUDE multisnd-post.500 +# + +ifdef MAKEFILE_TOP +ifeq ($(MAKELEVEL),0) +.PHONY: checkmakefiles +checkmakefiles: + @$(MAKE) -f sys/unix/Makefile.check \ + HINTSFILE="$(HINTSFILE)" HINTSINCLFILES="$(HINTSINCLFILES)" +endif +endif + +ifdef WANT_LIBNH +$(TARGETPFX)libnh.a: $(HOBJ) $(LIBNHSYSOBJ) ../lib/lua/liblua-$(LUA_VERSION).a + $(AR) rcs $@ $(HOBJ) $(LIBNHSYSOBJ) ../lib/lua/liblua-$(LUA_VERSION).a + @echo "$@ built." +$(TARGETPFX)libnhmain.o : ../sys/libnh/libnhmain.c $(HACK_H) + $(CC) $(CFLAGS) -c -o$@ $< +#dependency tool added this to Makefile.src +#$(TARGETPFX)winshim.o : ../win/shim/winshim.c $(HACK_H) +# $(CC) $(CFLAGS) -c -o$@ $< +endif # WANT_LIBNH + +# +#-INCLUDE cross-post.500 +# + diff --git a/sys/unix/hints/macOS.500 b/sys/unix/hints/macOS.500 new file mode 100755 index 000000000..93af6954d --- /dev/null +++ b/sys/unix/hints/macOS.500 @@ -0,0 +1,915 @@ +# NetHack 5.0 macOS.500 $NHDT-Date: 1693359574 2023/08/30 01:39:34 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.138 $ +# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. +# NetHack may be freely redistributed. See license for details. +# +#--------------------------------------------------------------------- +# MacOS hints file with support for multiple window ports (interfaces) +# Tested on: +# - MacOS Catalina 10.15 +# - MacOS Ventura 13 (Intel processor) +# +# If this doesn't work for some other version of macOS, consider +# making a new hints file it, rather than changing this one. +# And let us know about it. +# Useful info: http://www.opensource.apple.com/darwinsource/index.html + +#-PRE xxxx +# macOS hints file +# + +# note: '#-INCLUDE' is not just a comment; multiw-1 contains sections 1 to 2 +#-INCLUDE multiw-1.500 + +HINTSVERSION := 500 + +ifdef MAKEFILE_TOP +ifeq ($(MAKELEVEL),0) +PRECHECK+=checkmakefiles +# all files included from this hints file get listed +# in HINTSINCLNAMES (without suffix and without a path) +HINTSINCLNAMES := compiler cross-pre1 cross-pre2 cross-post \ + gbdates-pre gbdates-post \ + multiw-1 multiw-2 misc \ + multisnd1-pre multisnd2-pre multisnd-post +HINTSINCLFILES := $(addsuffix .$(HINTSVERSION), $(HINTSINCLNAMES)) +endif +endif + +ifneq "$(USEMACPORTS)" "1" +HAVE_HOMEBREW := $(shell expr `which -s brew; echo $$?` = 0) +endif +ifneq "$(USEHOMEBREW)" "1" +HAVE_MACPORTS := $(shell expr `which -s port; echo $$?` = 0) +endif + +ifndef LIBXPM +LIBXPM= -L/opt/X11/lib -lXpm +endif + +#WANT_WIN_CHAIN=1 + +# 4. Other + +#----------------------------------------------------------------------------- +# You shouldn't need to change anything below here (in the hints file; if +# you're reading this in Makefile augmented by hints, that may not be true). +# + +#-INCLUDE cross-pre1.500 + +#-INCLUDE multiw-2.500 + +# compiler.500 contains compiler detection and adjustments common +# to both linux and macOS + +#-INCLUDE compiler.500 + +ifdef WANT_WIN_QT +ifeq "$(HAVE_HOMEBREW)" "1" +ifdef WANT_WIN_QT5 +# Qt5 installed via homebrew +QTDIR :=$(shell brew --prefix)/opt/qt@5 +endif # WANT_WIN_QT5 +ifdef WANT_WIN_QT6 +QTDIR :=$(shell brew --prefix)/opt/qt@6 +endif # WANT_WIN_QT6 +endif # HAVE_HOMEBREW +ifndef QTDIR +ifeq "$(HAVE_MACPORTS)" "1" +# Qt installed via macports +ifdef WANT_WIN_QT5 +QTDIR=/opt/local/libexec/qt5 +endif # WANT_WIN_QT5 +ifdef WANT_WIN_QT6 +QTDIR=/opt/local/libexec/qt6 +endif # WANT_WIN_QT6 +endif # HAVE_MACPORTS +endif # QTDIR +endif # WANT_WIN_QT + +ifdef WANT_WIN_QT +ifeq "$(CLANGPPGTEQ16)" "1" +CXX=clang++ --std=c++17 +CCXXFLAGS +=-Wno-c++20-attribute-extensions +endif +endif + +# misc.500 must come after compiler.500 +# and after QTDIR is defined + +#-INCLUDE misc.500 + +# manpages directory +MANDIR=/usr/local/share/man/man6 +PREMANPAGES = checkmandir + +ifeq "$(USE_ASAN)" "1" +CFLAGS +=-fsanitize=address +LFLAGS +=-fsanitize=address +endif + +# NetHack sources control +NHCFLAGS+=-DDLB +NHCFLAGS+=-DHACKDIR=\"$(HACKDIR)\" +NHCFLAGS+=-DDEFAULT_WINDOW_SYS=\"$(WANT_DEFAULT)\" +NHCFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE +#NHCFLAGS+=-DTIMED_DELAY +#NHCFLAGS+=-DDUMPLOG +#NHCFLAGS+=-DCONFIG_ERROR_SECURE=FALSE +NHCFLAGS+=-DGREPPATH=\"/usr/bin/grep\" +#NHCFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\" +NHCFLAGS+=-DNOMAIL +#NHCFLAGS+=-DEXTRA_SANITY_CHECKS +#NHCFLAGS+=-DEDIT_GETLIN +#NHCFLAGS+=-DSCORE_ON_BOTL +#NHCFLAGS+=-DMSGHANDLER +#NHCFLAGS+=-DTTY_TILES_ESCCODES +#NHCFLAGS+=-DTTY_SOUND_ESCCODES +#NHCFLAGS+=-DNO_CHRONICLE +#NHCFLAGS+=-DLIVELOG +# not NHCFLAGS - needed for makedefs +CFLAGS+=-DCRASHREPORT=\"/usr/bin/open\" + +ifdef MAKEFILE_SRC +# default +CURSESLIB = -lncurses +ifeq "$(CURSES_UNICODE)" "sys" +NHCFLAGS+=-DCURSES_UNICODE +WINLIB += $(CURSESLIB) +else +ifeq "$(CURSES_UNICODE)" "0" +WINLIB += $(CURSESLIB) +else +ifeq "$(USE_CURSESLIB)" "1" +NHCFLAGS+=-DCURSES_UNICODE +else +# If CURSES_UNICODE is defined, we need ncursesw. +# Without CURSES_UNICODE the following simpler setting works. +# CURSESLIB = -lncurses -ltinfo +comma:=, +NCURSES_LFLAGS = $(shell pkg-config ncursesw --libs) +ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS))) +ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS))) +#this indicates that pkg-config itself was unavailable +CURSESLIB = $(NCURSES_LFLAGS) +NHCFLAGS+=-DCURSES_UNICODE +endif +endif +#$(info $(NCURSES_LFLAGS)) +ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS))) +HAVE_NCURSESW=0 +else +HAVE_NCURSESW=1 +endif +ifeq "$(HAVE_NCURSESW)" "1" +CURSESLIB = $(NCURSES_LFLAGS) +NHCFLAGS+=-DCURSES_UNICODE +else +$(info Attention: CURSES_UNICODE is not being defined without ncursesw) +endif #HAVE_NCURSESW +endif #USE_CURSESLIB +ifdef CURSESLIB +PKGCFLAGS= +ifeq "$(HAVE_HOMEBREW)" "1" +HAVE_HOMEBREW_NCURSES := $(shell expr `brew ls --versions ncurses > /dev/null; echo $$?` = 0) +#$(info HAVE_HOMEBREW_NCURSES=$(HAVE_HOMEBREW_NCURSES)) +ifeq "$(HAVE_HOMEBREW_NCURSES)" "1" +# Newer versions of ncurses are commonly installed via homebrew, but intentionally unlinked. +HOMEBREW_LFLAGS := -L$(shell brew --prefix)/opt/ncurses/lib +HOMEBREW_WINLIB := +HOMEBREW_CFLAGS = -I$(shell brew --prefix)/opt/ncurses/include +endif #HAVE_HOMEBREW_NCURSES +endif #HAVE_HOMEBREW +ifeq "$(HAVE_MACPORTS)" "1" +MACPORTS_CFLAGS = -I/opt/local/include +MACPORTS_LFLAGS = -L/opt/local/lib +CURSESLIB= +ifneq ($(wildcard /opt/local/lib/libncursesw*),) +MACPORTS_WINLIB = -lncursesw +else +MACPORTS_WINLIB = -lncurses +endif +endif #HAVE_MACPORTS +LFLAGS += $(HOMEBREW_LFLAGS) $(MACPORTS_LFLAGS) +WINLIB += $(HOMEBREW_WINLIB) $(MACPORTS_WINLIB) $(CURSESLIB) +PKGCFLAGS += $(HOMEBREW_CFLAGS) $(MACPORTS_CFLAGS) +endif #CURSESLIB +WINLIB += $(CURSESLIB) +#$(info WINLIB=$(WINLIB)) +#$(info CURSESLIB=$(CURSESLIB)) +endif #CURSES_UNICODE=0 +endif #CURSES_UNIODE=sys +endif #MAKEFILE_SRC + +ifdef WANT_MACSOUND +HAVE_SNDLIB = 1 +NEEDS_SND_USERSOUNDS = 1 +NEEDS_SND_SEAUTOMAP = 1 +NEEDS_WAV = 1 +SNDCFLAGS+= -DSND_LIB_MACSOUND +SNDLIBSRC = ../sound/macsound/macsound.m +SNDLIBOBJ = macsound.o +LFLAGS += -framework AppKit +#ifdef WANT_SPEECH +LFLAGS += -framework AVFoundation +#endif +endif + +ifdef MAKEFILE_SRC +ifndef NO_NHUUID +# macOS doesn't need any extra prerequisite libraries +# so do this unconditionally, unless NO_NHUUID=1 is +# passed on the Make command line. +WANT_NHUUID=1 +endif #NO_NHUUID + +ifdef WANT_NHUUID +CFLAGS += -DNHUUID +UUIDOBJ = macuuid.o +LFLAGS += -framework Foundation +endif +endif #MAKEFILE_SRC + +# +#-INCLUDE multisnd1-pre.500 +# + +# although not currently doing anything for macOS, this is +# kept in for consistency with layout of linux.500 +ifeq "$(CCISCLANG)" "1" +# clang-specific starts +# clang-specific ends +else +# gcc-specific starts +# LIBCFLAGS+= +# gcc-specific ends +endif + +# WINCFLAGS set from multiw-2.500 +# SNDCFLAGS set from multisnd-pre.500 +CFLAGS+= $(PKGCFLAGS) $(WINCFLAGS) +CFLAGS+= $(SNDCFLAGS) +CFLAGS+= $(NHCFLAGS) +CFLAGS+= $(LIBCFLAGS) + +# WINCFLAGS set from multiw-2.500 +# SNDCFLAGS set from multisnd-pre.500 +CCXXFLAGS+= $(WINCFLAGS) +CCXXFLAGS+= $(SNDCFLAGS) +CCXXFLAGS+= $(NHCFLAGS) +CCXXFLAGS+= $(LIBCFLAGS) + +VARDATND = +VARDATND0 = + +ifdef WANT_WIN_CHAIN +HINTSRC=$(CHAINSRC) +HINTOBJ=$(CHAINOBJ) +endif # WANT_WIN_CHAIN + +ifdef WANT_WIN_X11 +USE_XPM=1 +WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 +VARDATND0 += x11tiles NetHack.ad pet_mark.xbm pilemark.xbm +# -x: if built without dodlb, some versions of mkfontdir think *.lev are fonts +POSTINSTALL += bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; ( cd $(HACKDIR); mkfontdir -x .lev ); +# separate from CFLAGS so that we don't pass it to every file +X11CFLAGS = -I/opt/X11/include +# avoid repeated complaints about _X_NONNULL(args...) in +X11CFLAGS += -Wno-variadic-macros +ifdef USE_XPM +CFLAGS += -DUSE_XPM +WINX11LIB += -lXpm +VARDATND0 += rip.xpm +endif +WINLIB += $(WINX11LIB) +LFLAGS += -L/opt/X11/lib +endif # WANT_WIN_X11 + +ifdef WANT_WIN_QT +LINK = $(CXX) +ifdef WANT_WIN_QT5 +# Qt5 requires C++11 +QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \ + pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --cflags)) +WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \ + pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --libs) +endif # WANT_WIN_QT5 +ifdef WANT_WIN_QT6 +QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \ + pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --cflags)) +MOC = moc +MOCPATH = $(QTDIR)/share/qt/libexec/moc +WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \ + pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --libs) +endif # WANT_WIN_QT6 +VARDATND0 += nhtiles.bmp rip.xpm nhsplash.xpm +# 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 + +# prevent duplicate tile.o in WINOBJ +WINOBJ = $(WINOBJ0) $(sort $(XTRAOBJ)) +# prevent duplicates in VARDATND if both X11 and Qt are being supported +VARDATND += $(sort $(VARDATND0)) + +GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) +GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) +GIT_PREFIX := $(shell echo `git config nethack.substprefix` 2>&1) + +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif +ifdef GIT_PREFIX +GITPREFIX = -DNETHACK_GIT_PREFIX=\"$(GIT_PREFIX)\" +endif + +ifdef WANT_LIBNH +CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH +LIBNHSYSSRC = ../sys/libnh/libnhmain.c \ + ../sys/share/ioctl.c ../sys/share/unixtty.c \ + ../sys/unix/unixunix.c ../sys/unix/unixres.c \ + ../win/shim/winshim.c +LIBNHSYSOBJ = $(TARGETPFX)libnhmain.o $(TARGETPFX)ioctl.o \ + $(TARGETPFX)unixtty.o $(TARGETPFX)unixunix.o \ + $(TARGETPFX)unixres.o $(TARGETPFX)winshim.o +#don't bother building the game executable as it will fail +#without winshim +override GAME= +MOREALL += ( cd src ; $(MAKE) pregame ; $(MAKE) $(TARGETPFX)libnh.a ) +# With $(GAME) empty, the regular `recover: $(GAME)` chain no longer +# triggers lua_support, but recover.c still pulls in hack.h -> nhlua.h +# transitively. Make recover depend on lua_support explicitly. +ifdef MAKEFILE_TOP +recover: lua_support +endif +endif # WANT_LIBNH + +# Lua +# when building liblua.a, avoid warning that use of tmpnam() should be +# replaced by mkstemp(); the lua code doesn't use nethack's config.h so +# this needs to be passed via make rather than defined in unixconf.h +ifdef GITSUBMODULES +LUAFLAGS=CC='$(CC)' MYCFLAGS=' -DLUA_USE_MACOSX' +ifeq "$(CCISCLANG)" "1" +# clang +LUAFLAGS +=CWARNGCC='' +endif # clang +override LUAHEADERS = submodules/lua +override LUA2NHTOP = ../.. +override LUAMAKEFLAGS=$(LUAFLAGS) +endif # GITSUBMODULES + +ifdef WANT_SHARE_INSTALL + +#ifdef MAKEFILE_SRC +#$(info WANT_SOURCE_INSTALL = $(WANT_SOURCE_INSTALL), WANT_SHARE_INSTALL = $(WANT_SHARE_INSTALL)) +#endif +# 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) || true); chown $(GAMEUID) $(SHELLDIR) +#======= XXX can this go away? +#POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; \ +# $(CHOWN) $(GAMEUID) $(HACKDIR)/sysconf; \ +# $(CHGRP) $(GAMEGRP) $(HACKDIR)/sysconf; \ +# chmod $(VARFILEPERM) $(HACKDIR)/sysconf; +#>>>>>>> keni-wincw2 + +else ifdef WANT_SOURCE_INSTALL + +#ifdef MAKEFILE_SRC +#$(info WANT_SOURCE_INSTALL = $(WANT_SOURCE_INSTALL), WANT_SHARE_INSTALL = $(WANT_SHARE_INSTALL)) +#endif +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 + +#ifdef MAKEFILE_SRC +#$(info WANT_SOURCE_INSTALL = $(WANT_SOURCE_INSTALL), WANT_SHARE_INSTALL = $(WANT_SHARE_INSTALL)) +#endif +PREFIX:=$(wildcard ~) +SHELLDIR=$(PREFIX)/bin +HACKDIR=$(PREFIX)/nethackdir +CHOWN=/usr/bin/true +CHGRP=/usr/bin/true +GAMEPERM = 0700 +VARFILEPERM = 0600 +VARDIRPERM = 0700 + +ifdef ($(WANT_DEFAULT),X11) +# install nethack.rc as ~/.nethackrc if no ~/.nethackrc exists +PREINSTALL+= cp -n win/X11/nethack.rc ~/.nethackrc || true; +endif # WANT_DEFAULT X11 + +PREINSTALL+= (mkdir $(SHELLDIR) || true); +POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; \ + $(CHOWN) $(GAMEUID) $(HACKDIR)/sysconf; \ + $(CHGRP) $(GAMEGRP) $(HACKDIR)/sysconf; \ + chmod $(VARFILEPERM) $(HACKDIR)/sysconf; + +endif # !WANT_SHARE_INSTALL + +INSTDIR=$(HACKDIR) +VARDIR=$(HACKDIR) + +SYSCONFCREATE = sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf +SYSCONFINSTALL = $(SYSCONFCREATE) && \ + $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \ + $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \ + chmod $(VARFILEPERM) $(INSTDIR)/sysconf; +SYSCONFENSURE = (if ! test -f $(INSTDIR)/sysconf ; then \ + $(SYSCONFCREATE) && \ + $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \ + $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \ + chmod $(VARFILEPERM) $(INSTDIR)/sysconf; fi ); + +# ~/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). +# +#-INCLUDE cross-pre2.500 +# +# +#-INCLUDE gbdates-pre.500 +# +# +#-INCLUDE multisnd2-pre.500 +# +# +#-INCLUDE response.500 +# + +ifdef MAKEFILE_TOP +.PHONY: bundle +NHTOP= +endif +ifdef MAKEFILE_SRC +.PHONY: buildbundle bundledir updatescript +NHTOP=../ +abspath := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) +ABSBUNDLEPATH := $(dir $(abspath)) +$(info ABSBUNDLEPATH=$(ABSBUNDLEPATH)) + +ifdef WANT_BUNDLE +# +# bundle +# +# $(HACKDIR)/$(GAME).app/ +# Contents/ +# Frameworks/ +# Info.plist +# MacOS/ +# $(GAME) +# PkgInfo/ +# PlugIns/ +# Resources/ +# SharedFrameWorks/ +# +BUNDLE_NAME = NetHackTerm +BUNDLE_GAMENAME = NetHack +BUNDLE_PARENTDIR = $(ABSBUNDLEPATH)bundle +BUNDLE_TOP = $(BUNDLE_PARENTDIR)/$(BUNDLE_NAME).app +BUNDLE_CONTENTSDIR = $(BUNDLE_TOP)/Contents +BUNDLE_FRAMEWORKSDIR = $(BUNDLE_CONTENTSDIR)/Frameworks +BUNDLE_MACOSDIR = $(BUNDLE_CONTENTSDIR)/MacOS +BUNDLE_PKGINFODIR = $(BUNDLE_CONTENTSDIR)/PkgInfo +BUNDLE_PLUGINSDIR = $(BUNDLE_CONTENTSDIR)/PlugIns +BUNDLE_RESOURCESDIR = $(BUNDLE_CONTENTSDIR)/Resources +BUNDLE_SHAREDFRAMEWORKSDIR = $(BUNDLE_CONTENTSDIR)/SharedFrameworks +BUNDLE_INFOPLIST = $(BUNDLE_CONTENTSDIR)/Info.plist +BUNDLE_GAME = $(BUNDLE_MACOSDIR)/$(BUNDLE_GAMENAME) +BUNDLE_LAUNCHER = $(BUNDLE_MACOSDIR)/$(BUNDLE_NAME) +ifdef NEEDS_WAV +BUNDLEWAVS = $(addsuffix .wav, $(SNDWAVS)) +endif + +IMAGESLIST = $(BUNDLE_NAME).icns + +RESOURCES_LIST = $(BUNDLEWAVS) $(IMAGESLIST) + +BUNDLE_ADD_TO_RESOURCES = $(addprefix $(BUNDLE_RESOURCESDIR)/, $(RESOURCES_LIST)) + +MACOS_LIST = $(BUNDLE_GAMENAME) +# NetHackGuidebook.applescript NetHackRecover.applescript NetHackTerm.applescript + +BUNDLE_ADD_TO_MACOS = $(addprefix $(BUNDLE_MACOSDIR)/, $(MACOS_LIST)) + +endif # WANT_BUNDLE +# +# We include the bundle outside of a WANT_BUNDLE block because +# it is unlikely that anyone will use 'make WANT_BUNDLE=1 clean' +# +CLEANMORE += rm -rf ../bundle ; +endif # MAKEFILE_SRC + +# +#-POST + +# +#-INCLUDE gbdates-post.500 +# +# +#-INCLUDE multisnd-post.500 +# + +ifdef MAKEFILE_TOP +ifeq ($(MAKELEVEL),0) +.PHONY: checkmakefiles +checkmakefiles: + @$(MAKE) -f sys/unix/Makefile.check \ + HINTSFILE="$(HINTSFILE)" HINTSINCLFILES="$(HINTSINCLFILES)" +endif +endif + +ifdef WANT_NHUUID +$(TARGETPFX)macuuid.o: ../sys/unix/macuuid.m + $(CC) $(CFLAGS) -c -o$@ $< +endif + +ifdef WANT_LIBNH +# Build libnh.a by merging the engine objects, the shim windowport, +# date.o (separate from $(HOBJ) per Makefile.src), hacklib.a, and Lua's +# static archive. Use libtool -static rather than ar so hacklib.a and +# liblua-$(LUA_VERSION).a have their members merged in -- ar would archive +# them as opaque .a members and macOS ld can't dereference those. +# Depending on $(LUALIB) triggers the lua_support build (which generates +# include/nhlua.h); without it, $(HOBJ) won't compile. +# filter-out drops $(SYSOBJ) (which carries unixmain.o) and $(WINOBJ) (the +# tty windowport) from $(HOBJ); $(LIBNHSYSOBJ) supplies libnhmain.o and +# winshim.o in their place. +$(TARGETPFX)libnh.a: $(LUALIB) $(HOBJ) $(LIBNHSYSOBJ) $(DATE_O) $(TARGET_HACKLIB) + libtool -static -o $@ \ + $(filter-out $(SYSOBJ) $(WINOBJ),$(HOBJ)) \ + $(LIBNHSYSOBJ) $(DATE_O) $(TARGET_HACKLIB) $(LUALIB) + @echo "$@ built." +$(TARGETPFX)libnhmain.o : ../sys/libnh/libnhmain.c $(HACK_H) + $(CC) $(CFLAGS) -c -o$@ $< +# dependency tool added this to Makefile.src +#$(TARGETPFX)winshim.o : ../win/shim/winshim.c $(HACK_H) +# $(CC) $(CFLAGS) -c -o$@ $< +endif # WANT_LIBNH + +ifdef MAKEFILE_DOC +checkmandir: + @( if test -d $(MANDIR) ; then true ; else mkdir -p $(MANDIR) ; fi ) +endif # MAKEFILE_DOC + +# -- bundle --- +# +ifdef MAKEFILE_TOP +bundle: update uudecode + ( cd src ; $(MAKE) WANT_BUNDLE=1 buildbundle ) + +uudecode: + (cd util ; $(MAKE) WANT_BUNDLE=1 uudecode ) +endif # MAKEFILE_TOP +ifdef WANT_BUNDLE +ifdef MAKEFILE_SRC + +BUNDLEDIRS = $(BUNDLE_PARENTDIR) $(BUNDLE_TOP) $(BUNDLE_CONTENTSDIR) $(BUNDLE_FRAMEWORKSDIR) \ + $(BUNDLE_MACOSDIR) $(BUNDLE_PKGINFODIR) $(BUNDLE_PLUGINSDIR) \ + $(BUNDLE_RESOURCESDIR) $(BUNDLE_SHAREDFRAMEWORKSDIR) + +BUNDLELIST = $(BUNDLE_INFOPLIST) $(BUNDLE_LAUNCHER) $(BUNDLE_ADD_TO_MACOS) $(BUNDLE_ADD_TO_RESOURCES) + +buildbundle: bundledir $(BUNDLEDIRS) $(BUNDLELIST) updatescript + @echo $(GAME) bundle : $(BUNDLE_TOP) + @echo $(GAME) game : $(BUNDLE_GAME) + +$(BUNDLE_RESOURCESDIR)/%: $(NHTOP)sound/wav/% | $(BUNDLE_RESOURCESDIR) + cp $< $@ + +#$(BUNDLE_MACOSDIR)/%: $(NHTOP)win/macosx/% | $(BUNDLE_MACOSDIR) +# cp $< $@ + +$(BUNDLE_MACOSDIR)/%: $(dir $(GAMEBIN))/% | $(BUNDLE_MACOSDIR) + cp $< $@ + +$(BUNDLE_PARENTDIR): + mkdir -p $@ + +$(BUNDLE_TOP): $(BUNDLE_PARENTDIR) + mkdir -p $@ + +$(BUNDLE_CONTENTSDIR): $(BUNDLE_TOP) + mkdir -p $@ + +$(BUNDLE_FRAMEWORKSDIR): $(BUNDLE_CONTENTSDIR) + mkdir -p $@ + +$(BUNDLE_MACOSDIR): $(BUNDLE_CONTENTSDIR) + mkdir -p $@ + +$(BUNDLE_PKGINFODIR): $(BUNDLE_CONTENTSDIR) + mkdir -p $@ + +$(BUNDLE_PLUGINSDIR): $(BUNDLE_CONTENTSDIR) + mkdir -p $@ + +$(BUNDLE_RESOURCESDIR): $(BUNDLE_CONTENTSDIR) + mkdir -p $@ + +$(BUNDLE_SHAREDFRAMEWORKSDIR): $(BUNDLE_CONTENTSDIR) + mkdir -p $@ + +$(BUNDLE_GAME): nethack + cp nethack $@ + +#FIXME: replace hardcoded information with actual values derived from NetHack build +$(BUNDLE_INFOPLIST): + @echo '' >$@ + @echo '' >>$@ + @echo '' >>$@ + @echo '' >>$@ + @echo 'CFBundleInfoDictionaryVersion' >>$@ + @echo '6.0' >>$@ + @echo 'CFBundleDevelopmentRegion' >>$@ + @echo 'en' >>$@ + @echo 'CFBundlePackageType' >>$@ + @echo 'APPL' >>$@ + @echo 'CFBundleGetInfoString' >>$@ + @echo '$(BUNDLE_GAMENAME) 5.0 for MacOS' >>$@ + @echo 'CFBundleIdentifier' >>$@ + @echo 'org.nethack.macos' >>$@ + @echo 'CFBundleExecutable' >>$@ + @echo '$(BUNDLE_NAME)' >>$@ + @echo 'CFBundleIconFile' >>$@ + @echo '$(BUNDLE_NAME)' >>$@ + @echo 'CFBundleDisplayName' >>$@ + @echo '$(BUNDLE_NAME)' >>$@ + @echo 'CFBundleName' >>$@ + @echo '$(BUNDLE_NAME)' >>$@ + @echo 'CFBundleVersion' >>$@ + @echo 'NetHack 5.0.0b73' >>$@ + @echo 'CFBundleShortVersionString' >>$@ + @echo 'NetHack 5.0.0' >>$@ + @echo 'NSHumanReadableCopyright' >>$@ + @echo '©By Stichting Mathematisch Centrum and M. Stephenson 1985-2026' >>$@ + @echo 'LSApplicationCategoryType' >>$@ + @echo 'public.app-category.adventure-games' >>$@ + @echo '' >>$@ + @echo '' >>$@ +# $(NHTOP)sys/unix/hints/macosx.sh infoplist >$@ + +$(BUNDLE_LAUNCHER): + @echo '#!/bin/sh' >$@ + @echo 'dir=$$(dirname $$0)' >>$@ + @echo 'open -a Terminal file://$${dir}/$(BUNDLE_GAMENAME)' >>$@ + chmod +x $@ + +updatescript: +ifneq "$(SHELLDIR)" "" + if test -f $(SHELLDIR)/$(GAME); then \ + cp $(SHELLDIR)/$(GAME) $(GAME).tmp; \ + sed -i '' 's;\$$HACKDIR/$(GAME);$(BUNDLE_GAME);' $(SHELLDIR)/$(GAME) ; \ + diff -u $(GAME).tmp $(SHELLDIR)/$(GAME) | grep "="; \ + rm -f $(GAME).tmp; \ + fi; +endif + +# We can't use a general rule because the file name of the .uu does not match the +# uudecode target file name inside the .uu file, in this case (nhicns.uu to nethack.icns) +$(BUNDLE_RESOURCESDIR)/$(BUNDLE_NAME).icns: $(BUNDLE_RESOURCESDIR) $(NHTOP)util/uudecode \ + $(NHTOP)win/share/nhicns.uu + $(NHTOP)util/uudecode $(NHTOP)win/share/nhicns.uu + mv nethack.icns $@ + +endif # MAKEFILE_SRC +endif # WANT_BUNDLE + +# +# --- end of bundle --- +# +# +#-INCLUDE cross-post.500 +# + +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. +# +# Packages that are being distributed must be signed by a Developer ID +# Installer certificate. Set DEVELOPER_CERT to the name of the certificate +# if you wish for your package to be signed for distribution. +# +# If building a package for signing, you must use sudo appropriately. +# the binaries and package using sudo but you DO NOT use sudo to sign the +# package. If you use sudo to sign the package, it will fail. +# +# sudo make all +# sudo make build_tty_pkg +# make sign_tty_pkg +# + +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) + +#DEVELOPER_CERT = Developer ID Installer: Bart House +DEVELOPER_CERT = NONE + +spotless:: + rm -rf RESOURCES + rm -rf PKG + rm -rf PKGSCRIPTS + rm -rf PKGROOT + rm -f Info.plist + rm -f Distribution.xml + rm -f NetHack-*-mac-Term* + +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-unsigned.pkg +ifeq ($(DEVELOPER_CERT),NONE) + cp NetHack-$(SVS)-mac-Term-unsigned.pkg NetHack-$(SVS)-mac-Term.pkg + hdiutil create -verbose -srcfolder NetHack-$(SVS)-mac-Term-unsigned.pkg NetHack-$(SVS)-mac-Term-unsigned.dmg + @echo ------------------------------------------- + @echo PACKAGE IS NOT SIGNED FOR DISTRIBUTION!!!!! + @echo =========================================== +else + @echo "run 'make sign_tty_pkg' to complete package" +endif + +sign_tty_pkg: + productsign --timestamp=none --sign "$(DEVELOPER_CERT)" NetHack-$(SVS)-mac-Term-unsigned.pkg NetHack-$(SVS)-mac-Term.pkg || (echo "Package signing failed"; exit 1) + spctl -a -v --type install NetHack-$(SVS)-mac-Term.pkg || (echo "Package not signed properly"; exit 1) + 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 $(PKGROOT_UGLN)/livelog + 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) $(GAMEUID) $(HACKDIR) >> PKGSCRIPTS/postinstall + echo $(CHOWN) $(GAMEUID) $(HACKDIR)/* >> PKGSCRIPTS/postinstall + echo $(CHGRP) $(GAMEGRP) $(HACKDIR) >> PKGSCRIPTS/postinstall + echo $(CHGRP) $(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)/livelog >> 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 +# diff --git a/sys/unix/hints/macosx.sh b/sys/unix/hints/macosx.sh index c6cf10c31..4c306e85e 100755 --- a/sys/unix/hints/macosx.sh +++ b/sys/unix/hints/macosx.sh @@ -1,5 +1,5 @@ #!/bin/sh -# NetHack 3.6 macosx.sh $NHDT-Date: 1517231957 2018/01/29 13:19:17 $ $NHDT-Branch: githash $:$NHDT-Revision: 1.20 $ +# NetHack 5.0 macosx.sh $NHDT-Date: 1597332920 2020/08/13 15:35:20 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.24 $ # Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. # NetHack may be freely redistributed. See license for details. # @@ -151,7 +151,7 @@ xdescplist) SVSDOT=`util/makedefs --svs .` IFPkgDescriptionDeleteWarning IFPkgDescriptionDescription - NetHack $SVSDOT for the MacOS X Terminal + NetHack $SVSDOT for MacOS IFPkgDescriptionTitle NetHack @@ -169,9 +169,9 @@ xinfoplist) SVSDOT=`util/makedefs --svs .` CFBundleGetInfoString - NetHack $SVSDOT for the MacOS X Terminal + NetHack $SVSDOT for MacOS CFBundleIdentifier - org.nethack.term + org.nethack.macos CFBundleName NetHack CFBundleShortVersionString diff --git a/sys/unix/hints/macosx10.10 b/sys/unix/hints/macosx10.10 deleted file mode 100644 index 279a15ec3..000000000 --- a/sys/unix/hints/macosx10.10 +++ /dev/null @@ -1,364 +0,0 @@ -# -# NetHack 3.6 macosx10.11 $NHDT-Date: 1566346603 2019/08/21 00:16:43 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.53 $ -# 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 through 10.13, and has been tested on 10.11 -# (El Capitan) and 10.13. 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 -Wno-long-long -# 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 -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm -# -x: if built without dlb, some versions of mkfontdir think *.lev are fonts -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; ( cd $(HACKDIR); mkfontdir -x .lev ); -# separate from CFLAGS so that we don't pass it to every file -X11CFLAGS = -I/opt/X11/include -CFLAGS += -DX11_GRAPHICS -# avoid repeated complaints about _X_NONNULL(args...) in -X11CFLAGS += -Wno-variadic-macros -ifdef USE_XPM -CFLAGS += -DUSE_XPM -WINX11LIB += -lXpm -VARDATND += rip.xpm -endif -WINSRC += $(WINX11SRC) -WINOBJ += $(WINX11OBJ) -WINLIB += $(WINX11LIB) -LFLAGS=-L/opt/X11/lib -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 || true -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 diff --git a/sys/unix/hints/macosx10.10-qt b/sys/unix/hints/macosx10.10-qt deleted file mode 100644 index 865c2d20a..000000000 --- a/sys/unix/hints/macosx10.10-qt +++ /dev/null @@ -1,343 +0,0 @@ -# -# NetHack 3.6 macosx10.11 $NHDT-Date: 1566346604 2019/08/21 00:16:44 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.51 $ -# 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 the Qt interface on Mac OS X 10.10 through 10.13, 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 - -# 1a. What is the default window system? -#WANT_DEFAULT=tty -#WANT_DEFAULT=x11 -WANT_DEFAULT=Qt - -# 1b. If you set WANT_WIN_QT, you need to -# A) set QTDIR either here or in the environment to point to the Qt5 -# library installation root. (Qt2 or Qt3 will not work.) -ifdef WANT_WIN_QT -QTDIR=$(shell brew --prefix)/opt/qt -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=clang -CXX=clang++ -std=gnu++11 - -# 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 -# 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 - -WINSRC = -WINOBJ0 = -WINLIB = -LINK = $(CC) -VARDATND = - -ifdef WANT_WIN_TTY -WINSRC += $(WINTTYSRC) -WINOBJ0 += $(WINTTYOBJ) -WINLIB += $(WINTTYLIB) -WINTTYLIB=-lncurses -else # !WANT_WIN_TTY -CFLAGS += -DNOTTYGRAPHICS -endif # !WANT_WIN_TTY - -ifdef WANT_WIN_X11 -WINSRC += $(WINX11SRC) -WINOBJ0 += $(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 -x .lev ); -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 += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --cflags) -WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --libs) -LINK=$(CXX) -WINSRC += $(WINQT4SRC) -WINOBJ0 += $(WINQT4OBJ) -VARDATND += rip.xpm -MOC = moc - -# 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 -endif # WANT_WIN_QT - -# prevent duplicate tile.o in WINOBJ -WINOBJ = $(sort $(WINOBJ0)) - -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 || true -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 diff --git a/sys/unix/hints/macosx10.14 b/sys/unix/hints/macosx10.14 deleted file mode 100644 index e43b5f19d..000000000 --- a/sys/unix/hints/macosx10.14 +++ /dev/null @@ -1,405 +0,0 @@ -# -# NetHack 3.6 macosx10.14 $NHDT-Date: 1573841535 2019/11/15 18:12:15 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.60 $ -# 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.14 or later. -# 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 -Wno-long-long -# 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 -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; ( cd $(HACKDIR); mkfontdir -x .lev ); -# separate from CFLAGS so that we don't pass it to every file -X11CFLAGS = -I/opt/X11/include -CFLAGS += -DX11_GRAPHICS -# avoid repeated complaints about _X_NONNULL(args...) in -X11CFLAGS += -Wno-variadic-macros -ifdef USE_XPM -CFLAGS += -DUSE_XPM -WINX11LIB += -lXpm -VARDATND += rip.xpm -endif -WINSRC += $(WINX11SRC) -WINOBJ += $(WINX11OBJ) -WINLIB += $(WINX11LIB) -LFLAGS=-L/opt/X11/lib -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 || true -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. -# -# Packages that are being distributed must be signed by a Developer ID -# Installer certificate. Set DEVELOPER_CERT to the name of the certificate -# if you wish for your package to be signed for distribution. -# -# If building a package for signing, you must use sudo approriately. -# the binaries and package using sudo but you DO NOT use sudo to sign the -# package. If you use sudo to sign the package, it will fail. -# -# sudo make all -# sudo make build_tty_pkg -# make sign_tty_pkg -# - - -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) - -#DEVELOPER_CERT = Developer ID Installer: Bart House -DEVELOPER_CERT = NONE - -spotless:: - rm -rf RESOURCES - rm -rf PKG - rm -rf PKGSCRIPTS - rm -rf PKGROOT - rm -f Info.plist - rm -f Distribution.xml - rm -f NetHack-*-mac-Term* - -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-unsigned.pkg -ifeq ($(DEVELOPER_CERT),NONE) - cp NetHack-$(SVS)-mac-Term-unsigned.pkg NetHack-$(SVS)-mac-Term.pkg - hdiutil create -verbose -srcfolder NetHack-$(SVS)-mac-Term-unsigned.pkg NetHack-$(SVS)-mac-Term-unsigned.dmg - @echo ------------------------------------------- - @echo PACKAGE IS NOT SIGNED FOR DISTRIBUTION!!!!! - @echo =========================================== -else - @echo "run 'make sign_tty_pkg' to complete package" -endif - -sign_tty_pkg: - productsign --timestamp=none --sign "$(DEVELOPER_CERT)" NetHack-$(SVS)-mac-Term-unsigned.pkg NetHack-$(SVS)-mac-Term.pkg || (echo "Package signing failed"; exit 1) - spctl -a -v --type install NetHack-$(SVS)-mac-Term.pkg || (echo "Package not signed properly"; exit 1) - 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) $(GAMEUID) $(HACKDIR) >> PKGSCRIPTS/postinstall - echo $(CHOWN) $(GAMEUID) $(HACKDIR)/* >> PKGSCRIPTS/postinstall - echo $(CHGRP) $(GAMEGRP) $(HACKDIR) >> PKGSCRIPTS/postinstall - echo $(CHGRP) $(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 diff --git a/sys/unix/hints/macosx10.5 b/sys/unix/hints/macosx10.5 deleted file mode 100644 index 3cbe335be..000000000 --- a/sys/unix/hints/macosx10.5 +++ /dev/null @@ -1,306 +0,0 @@ -# -# NetHack 3.6 macosx10.5 $NHDT-Date: 1566346606 2019/08/21 00:16:46 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.32 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2009. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Mac OS X (Darwin) hints file -# This is for Mac OS X 10.5 (Darwin 9.3) and also 10.6. -# If this doesn't work for some -# other version of either Darwin or 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 - -# 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 - -# 1a. What is the default window system? -WANT_DEFAULT=tty -#WANT_DEFAULT=x11 -#WANT_DEFAULT=qt - -# 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/Developer/SDKs/MacOSX10.3.9.sdk/usr/X11R6/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 -W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN -CC=gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic -Wno-long-long - -# -# You shouldn't need to change anything below here. -# - -# XXX -g vs -O should go here, -I../include goes in the makefile -CFLAGS=-g -I../include -CFLAGS+=-DNOCLIPPING -DNOMAIL -DNOTPARMDECL -DHACKDIR=\"$(HACKDIR)\" -CFLAGS+= -DDEFAULT_WINDOW_SYS=\"$(WANT_DEFAULT)\" -DDLB - -CFLAGS+= -DGREPPATH=\"/usr/bin/grep\" - -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_X11 -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; ( cd $(INSTDIR); mkfontdir -x .lev ); -CFLAGS += -DX11_GRAPHICS -ifdef USE_XPM -CFLAGS += -DUSE_XPM -WINX11LIB += -lXpm -VARDATND += rip.xpm -endif -WINSRC += $(WINX11SRC) -WINOBJ += $(WINX11OBJ) -WINLIB += $(WINX11LIB) -LFLAGS=-L/usr/X11R6/lib -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 -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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)/nethackdir -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -CHOWN=touch -CHGRP=touch -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 $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -else ifdef WANT_SOURCE_INSTALL -PREFIX=$(abspath $(NHSROOT)) -# suppress nethack.sh" -#SHELLDIR= -HACKDIR=$(PREFIX)/playground -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -CHOWN=touch -CHGRP=touch -GAMEPERM = 0700 -VARFILEPERM = 0600 -VARDIRPERM = 0700 -# We can use "make all" to build the whole thing - but it misses some things: -MOREALL=$(MAKE) install -else # !WANT_SOURCE_INSTALL -PREFIX:=$(wildcard ~) -SHELLDIR=$(PREFIX)/bin -HACKDIR=$(PREFIX)/nethackdir -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -CHOWN=true -CHGRP=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 || true -endif # WANT_WIN_X11 -POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -endif # !WANT_SOURCE_INSTALL - - -# ~/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 -PKGR=$(DEVUTIL)/PackageMaker.app/Contents/MacOS/PackageMaker -SVS=$(shell $(NHSROOT)/util/makedefs --svs) -SVSDOT=$(shell $(NHSROOT)/util/makedefs --svs .) - -PKGROOT_UG = PKGROOT/usr/games -PKGROOT_UGLN = PKGROOT/usr/games/lib/nethackdir -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 |ps2pdf - > Guidebook.pdf) - cp doc/Guidebook.pdf $(PKGROOT_UG)/doc/NetHackGuidebook.pdf - - osacompile -o PKGROOT/Applications/NetHackGuidebook.app \ - win/macosx/NetHackGuidebook.applescript - - $(PKGR) --root PKGROOT --info Info.plist -e RESOURCES -v -o 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_UG)/bin $(PKGROOT_UG)/man/man6 $(PKGROOT_UG)/doc $(PKGROOT_UGLN) - install -p src/nethack $(PKGROOT_UG)/bin - # XXX should this be called nethackrecover? - install -p util/recover $(PKGROOT_UG)/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) - 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 -# XXX may need postinstall script to get perms right for sgid, etc. - mkdir $(PKGROOT_UGLN)/save -# XXX what about a news file? -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 diff --git a/sys/unix/hints/macosx10.7 b/sys/unix/hints/macosx10.7 deleted file mode 100644 index 4937c64dc..000000000 --- a/sys/unix/hints/macosx10.7 +++ /dev/null @@ -1,324 +0,0 @@ -# -# NetHack 3.6 macosx10.7 $NHDT-Date: 1566346606 2019/08/21 00:16:46 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.36 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2009. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Mac OS X (Darwin) hints file -# This is for Mac OS X 10.7. -# 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 - -# 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 - -# 1a. What is the default window system? -WANT_DEFAULT=tty -#WANT_DEFAULT=x11 -#WANT_DEFAULT=qt - -# 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/Developer/SDKs/MacOSX10.3.9.sdk/usr/X11R6/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 -Wno-long-long -# 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_X11 -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; ( cd $(INSTDIR); mkfontdir -x .lev ); -CFLAGS += -DX11_GRAPHICS -ifdef USE_XPM -CFLAGS += -DUSE_XPM -WINX11LIB += -lXpm -VARDATND += rip.xpm -endif -WINSRC += $(WINX11SRC) -WINOBJ += $(WINX11OBJ) -WINLIB += $(WINX11LIB) -LFLAGS=-L/usr/X11R6/lib -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 -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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)/nethackdir -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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 $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -else ifdef WANT_SOURCE_INSTALL -PREFIX=$(abspath $(NHSROOT)) -# suppress nethack.sh -#SHELLDIR= -HACKDIR=$(PREFIX)/playground -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -CHOWN=/usr/bin/true -CHGRP=/usr/bin/true -GAMEPERM = 0700 -VARFILEPERM = 0600 -VARDIRPERM = 0700 -# 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 -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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 || true -endif # WANT_WIN_X11 -POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -endif # !WANT_SOURCE_INSTALL - - -# ~/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 -PKGR=$(DEVUTIL)/PackageMaker.app/Contents/MacOS/PackageMaker -SVS=$(shell $(NHSROOT)/util/makedefs --svs) -SVSDOT=$(shell $(NHSROOT)/util/makedefs --svs .) - -PKGROOT_UG = PKGROOT/usr/games -PKGROOT_UGLN = PKGROOT/usr/games/lib/nethackdir -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 |ps2pdf - > Guidebook.pdf) - cp doc/Guidebook.pdf $(PKGROOT_UG)/doc/NetHackGuidebook.pdf - - osacompile -o PKGROOT/Applications/NetHackGuidebook.app \ - win/macosx/NetHackGuidebook.applescript - - $(PKGR) --root PKGROOT --info Info.plist -e RESOURCES -v -o 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_UG)/bin $(PKGROOT_UG)/man/man6 $(PKGROOT_UG)/doc $(PKGROOT_UGLN) - install -p src/nethack $(PKGROOT_UG)/bin - # XXX should this be called nethackrecover? - install -p util/recover $(PKGROOT_UG)/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) - 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 -# XXX may need postinstall script to get perms right for sgid, etc. - mkdir $(PKGROOT_UGLN)/save -# XXX what about a news file? -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 diff --git a/sys/unix/hints/macosx10.8 b/sys/unix/hints/macosx10.8 deleted file mode 100644 index a6e9c4d3c..000000000 --- a/sys/unix/hints/macosx10.8 +++ /dev/null @@ -1,335 +0,0 @@ -# -# NetHack 3.6 macosx10.8 $NHDT-Date: 1566346607 2019/08/21 00:16:47 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.38 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2009. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Mac OS X (Darwin) hints file -# This is for Mac OS X 10.8, Mountain Lion, and also 10.9. -# -# X11 is no longer included with OSX. -# To regain X11, download and install XQuartz. (Attempting to run X11.app -# will describe how.) Xcode (not related to X11) has also changed since -# earlier versions and some tools are no longer in their previous locations. -# -# 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 - -# 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 - -# 1a. What is the default window system? -WANT_DEFAULT=tty -#WANT_DEFAULT=x11 -#WANT_DEFAULT=qt - -# 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 -Wno-long-long -# 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\" -CFLAGS+= -DGDBPATH=\"/Developer/usr/bin/gdb\" - -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_X11 -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; ( cd $(INSTDIR); mkfontdir -x .lev ); -# separate from CFLAGS so that we don't pass it to every file -X11CFLAGS = -I/opt/X11/include -CFLAGS += -DX11_GRAPHICS -# avoid repeated complaints about _X_NONNULL(args...) in -X11CFLAGS += -Wno-variadic-macros -ifdef USE_XPM -CFLAGS += -DUSE_XPM -WINX11LIB += -lXpm -VARDATND += rip.xpm -endif -WINSRC += $(WINX11SRC) -WINOBJ += $(WINX11OBJ) -WINLIB += $(WINX11LIB) -LFLAGS=-L/opt/X11/lib -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 -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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)/nethackdir -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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 $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -else ifdef WANT_SOURCE_INSTALL -PREFIX=$(abspath $(NHSROOT)) -# suppress nethack.sh -#SHELLDIR= -HACKDIR=$(PREFIX)/playground -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -CHOWN=/usr/bin/true -CHGRP=/usr/bin/true -GAMEPERM = 0700 -VARFILEPERM = 0600 -VARDIRPERM = 0700 -# 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 -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) -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 || true -endif # WANT_WIN_X11 -POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(INSTDIR)/sysconf; $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf; chmod $(VARFILEPERM) $(INSTDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -endif # !WANT_SOURCE_INSTALL - - -# ~/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 -PKGR=$(DEVUTIL)/PackageMaker.app/Contents/MacOS/PackageMaker -SVS=$(shell $(NHSROOT)/util/makedefs --svs) -SVSDOT=$(shell $(NHSROOT)/util/makedefs --svs .) - -PKGROOT_UG = PKGROOT/usr/games -PKGROOT_UGLN = PKGROOT/usr/games/lib/nethackdir -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 |ps2pdf - > Guidebook.pdf) - cp doc/Guidebook.pdf $(PKGROOT_UG)/doc/NetHackGuidebook.pdf - - osacompile -o PKGROOT/Applications/NetHackGuidebook.app \ - win/macosx/NetHackGuidebook.applescript - - $(PKGR) --root PKGROOT --info Info.plist -e RESOURCES -v -o 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_UG)/bin $(PKGROOT_UG)/man/man6 $(PKGROOT_UG)/doc $(PKGROOT_UGLN) - install -p src/nethack $(PKGROOT_UG)/bin - # XXX should this be called nethackrecover? - install -p util/recover $(PKGROOT_UG)/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) - 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 -# XXX may need postinstall script to get perms right for sgid, etc. - mkdir $(PKGROOT_UGLN)/save -# XXX what about a news file? -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 diff --git a/sys/unix/hints/solaris b/sys/unix/hints/solaris index 2140330dd..6c80e5e3d 100644 --- a/sys/unix/hints/solaris +++ b/sys/unix/hints/solaris @@ -1,5 +1,5 @@ # -# NetHack 3.6 unix $NHDT-Date: 1554411633 2019/04/04 21:00:33 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.0 $ +# NetHack 5.0 unix $NHDT-Date: 1596498426 2020/08/03 23:47:06 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.0 $ # Copyright (c) Kevin Smolkowski "Snivik", Elgin Oregon 2019. # NetHack may be freely redistributed. See license for details. # @@ -8,7 +8,7 @@ # This hints file provides a single-user x11 build for Solaris, specifically # for Solaris 10 and 11, but should work just fine on older versions -# Build using using included gcc and gmake, optional flex and bison come from csw for solaris 10 and included +# Build using included gcc and gmake, optional flex and bison come from csw for solaris 10 and included # with Solaris 11 # Build NetHack off your home directory diff --git a/sys/unix/hints/solaris-playground b/sys/unix/hints/solaris-playground index 5e51df6f2..080639f50 100644 --- a/sys/unix/hints/solaris-playground +++ b/sys/unix/hints/solaris-playground @@ -1,5 +1,5 @@ # -# NetHack 3.6 unix $NHDT-Date: 1554411633 2019/04/04 21:00:33 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.0 $ +# NetHack 5.0 unix $NHDT-Date: 1596498427 2020/08/03 23:47:07 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.0 $ # Copyright (c) Kevin Smolkowski "Snivik", Elgin Oregon 2019. # NetHack may be freely redistributed. See license for details. # @@ -9,9 +9,9 @@ # Nethack will install suid games, and will expect to read a users .nethackrc file from # their home directory which may be a problem on secure systems with read restricted home -# directories, not that you would problably run NetHack on such a system anyway. :) +# directories, not that you would probably run NetHack on such a system anyway. :) -# Build using using included gcc and gmake, optional flex and bison come from csw for solaris 10 +# Build using included gcc and gmake, optional flex and bison come from csw for solaris 10 # and included on Solaris 11 diff --git a/sys/unix/hints/unix b/sys/unix/hints/unix index bd2ef8684..e6d9da942 100644 --- a/sys/unix/hints/unix +++ b/sys/unix/hints/unix @@ -1,5 +1,5 @@ # -# NetHack 3.6 unix $NHDT-Date: 1432512813 2015/05/25 00:13:33 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ +# NetHack 5.0 unix $NHDT-Date: 1596498428 2020/08/03 23:47:08 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.14 $ # Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. # NetHack may be freely redistributed. See license for details. # @@ -11,7 +11,7 @@ PREFIX=/usr -HACKDIR=$(PREFIX)/games/lib/$(GAME)dir +HACKDIR=$(PREFIX)/games/lib/nethackdir INSTDIR=$(HACKDIR) VARDIR=$(HACKDIR) SHELLDIR=$(PREFIX)/games diff --git a/sys/unix/macuuid.m b/sys/unix/macuuid.m new file mode 100644 index 000000000..26b86e3b6 --- /dev/null +++ b/sys/unix/macuuid.m @@ -0,0 +1,36 @@ +/* macuuid.m */ +/* Copyright Michael Allison, 2023 */ +/* NetHack may be freely redistributed. See license for details. */ + +#include "hack.h" + +void get_macos_uuid(char *); + +#ifdef DEBUG +#undef DEBUG +#endif + +/* #import */ +#import + +void +get_macos_uuid(char *target) +{ + NSString *uuidString = [[NSUUID UUID] UUIDString]; + const char *str_uuid; + int i; + + /* str_uuid = [uuidString cStringUsingEncoding:NSUTF8StringEncoding]; */ + str_uuid = [uuidString cStringUsingEncoding:NSASCIIStringEncoding]; + + if (str_uuid && target) { + for (i = 0; i < (NHUUIDSZ -1 ); ++i) { + target[i] = str_uuid[i]; + } + target[(NHUUIDSZ - 1)] = '\0'; + } + return; +} + + +/* end of macuuid.m */ diff --git a/sys/unix/mkmkfile.sh b/sys/unix/mkmkfile.sh index 4c003d639..01cdb9b72 100755 --- a/sys/unix/mkmkfile.sh +++ b/sys/unix/mkmkfile.sh @@ -1,5 +1,5 @@ #!/bin/sh -# NetHack 3.6 mkmkfile.sh $NHDT-Date: 1432512788 2015/05/25 00:13:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ +# NetHack 5.0 mkmkfile.sh $NHDT-Date: 1597332770 2020/08/13 15:32:50 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.15 $ # Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. # NetHack may be freely redistributed. See license for details. @@ -17,13 +17,16 @@ echo "# Your changes will be lost. See sys/unix/NewInstall.unx." >> $3 echo "# Identify this file:" >> $3 echo "MAKEFILE_$2=1" >> $3 echo "" >> $3 +echo "HINTSFILE=$5" >> $3 +echo "" >> $3 echo "###" >> $3 echo "### Start $5 PRE" >> $3 echo "###" >> $3 awk '/^#-PRE/,/^#-POST/{ \ if(index($0, "#-PRE") == 1) print "# (new segment at source line",NR,")"; \ - if(index($0, "#-P") != 1) print}' $4 >> $3 + if(index($0, "#-INCLUDE") == 1) system("cat hints/include/"$2); \ + else if(index($0, "#-P") != 1) print}' $4 >> $3 echo "### End $5 PRE" >> $3 echo "" >> $3 @@ -39,5 +42,6 @@ echo "### Start $5 POST" >> $3 echo "###" >> $3 awk '/^#-POST/,/^#-PRE/{ \ if(index($0, "#-POST") == 1) print "# (new segment at source line",NR,")"; \ - if(index($0, "#-P") != 1) print}' $4 >> $3 + if(index($0, "#-INCLUDE") == 1) system("cat hints/include/"$2); \ + else if(index($0, "#-P") != 1) print}' $4 >> $3 echo "### End $5 POST" >> $3 diff --git a/sys/unix/nethack.sh b/sys/unix/nethack.sh index 2c2b62cdf..6e49a1da0 100755 --- a/sys/unix/nethack.sh +++ b/sys/unix/nethack.sh @@ -1,5 +1,5 @@ #!/bin/sh -# NetHack 3.6 nethack.sh $NHDT-Date: 1552425075 2019/03/12 21:11:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.20 $ +# NetHack 5.0 nethack.sh $NHDT-Date: 1596498294 2020/08/03 23:44:54 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.21 $ # Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland # NetHack may be freely redistributed. See license for details. diff --git a/sys/unix/setup.sh b/sys/unix/setup.sh index 043bf90d4..7f5b504e1 100755 --- a/sys/unix/setup.sh +++ b/sys/unix/setup.sh @@ -1,5 +1,5 @@ #!/bin/sh -# NetHack 3.6 setup.sh $NHDT-Date: 1432512789 2015/05/25 00:13:09 $ $NHDT-Branch: master $:$NHDT-Revision: 1.14 $ +# NetHack 5.0 setup.sh $NHDT-Date: 1596498296 2020/08/03 23:44:56 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.17 $ # Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007. # NetHack may be freely redistributed. See license for details. # diff --git a/sys/unix/snd86unx.shr b/sys/unix/snd86unx.shr deleted file mode 100644 index bfbae3fd2..000000000 --- a/sys/unix/snd86unx.shr +++ /dev/null @@ -1,1064 +0,0 @@ -# This is a shell archive. Save it in a file, remove anything before -# this line, and then unpack it by entering "sh file". Note, it may -# create directories; files and directories will be owned by you and -# have default permissions. -# -# This archive contains: -# -# READ.ME -# install.bsd -# spkr.7 -# Makefile -# spkr.c -# spkr.h -# interp.c -# Files -# Install -# Master -# Name -# Node -# Remove -# Size -# System -# playtest -# -echo x - READ.ME -sed 's/^X//' >READ.ME << 'END-of-READ.ME' -X Console Speaker Driver Package (v1.1) -X -X by Eric S. Raymond (esr@snark.thyrsus.com) -X -XThis package gives 80386 machines running SVr3.2 or later the ability to play -Xtunes on the console speaker. It has been extended to 386BSD (and possibly -XBSDI) by Andrew A. Chernov, and to SCO UNIX 3.2.4 (and possibly other VPIX -Xsystems) by Andreas Arens. -X -XThe following files are contained in the kit: -X -XDocumentation and examples: -XREAD.ME -- this file -Xspeaker.7 -- man page for the driver -Xplaytest -- test script exercising familiar tunes -X -XInstallable driver kit parts, for SVr3.2 or later: -XFiles -- list of driver package file locations -XInstall -- installation script for driver kit -XMaster -- mdevice entry for speaker driver -XName -- name entry foe speaker driver -XNode -- /dev node specification file -XRemove -- Driver removal script -XSize -- installation size data -XSystem -- sdevice entry for speaker driver -X -XDriver source code, for SVr3.2 or later and 386BSD: -XMakefile -- Makefile for driver code -Xspkr.c -- the driver source -Xspeaker.h -- ioctl interface file -X -XCommon source code: -Xinterp.c -- play string interpretation code -X -XFor SVr3.2 or later, simply type `make' and wait. Then type ./Install -Xand follow its instructions. You will have to install the man pages by hand. -XBe aware that the speaker.7 man page uses tbl(1) constructs. -X -XFor 386BSD, follow the installation instructions in install.bsd. -X -XFor SCO UNIX 3.2.4, no new kernel drivers are needed, and you need only -Xcopy interp.c to your src directory and proceed with making NetHack, with -XVPIX_MUSIC set in unixconf.h. -X -XInteresting tunes mailed to the author will be periodically posted in batches -Xand added to the test script for future versions. -X -X Revision notes -X -X1.1 -- fixed minor bug in M[LSN] interpretation, added octave-tracking. -X Tweaked the playtest examples. -END-of-READ.ME -echo x - install.bsd -sed 's/^X//' >install.bsd << 'END-of-install.bsd' -XCopy spkr.c and interp.c to /sys/i386/isa -XCopy spkr.h to /sys/sys -X -X----------------------------------------------------------------------------- -X -XFile /sys/i386/conf/YOUR_MACHINE_NAME -Xadd following line: -X -Xpseudo-device speaker -X -X----------------------------------------------------------------------------- -X -XFile /sys/i386/conf/files.i386 -Xadd following line: -X -Xi386/isa/spkr.c optional speaker -X -X----------------------------------------------------------------------------- -X -XFile /sys/i386/i386/conf.c -X[major number 20 (hex) is registered for spkr driver, don't change it] -Xadd following code: -X -X#include "speaker.h" -X#if NSPEAKER > 0 -Xint spkropen(),spkrclose(),spkrwrite(),spkrioctl(); -X#else -X#define spkropen enxio -X#define spkrclose enxio -X#define spkrwrite enxio -X#define spkrioctl enxio -X#endif -X ... -X -Xstruct cdevsw cdevsw[] = -X{ -X ... -X -X { spkropen, spkrclose, enxio, spkrwrite, /*20*/ -X spkrioctl, enxio, enxio, NULL, -X enxio, enxio, enxio }, -X ... -X -X----------------------------------------------------------------------------- -X -XMake corresponding device: -X -X mknod /dev/speaker c 32 0 -X -X[major number 32 (20 hex) is registered for spkr driver, don't change it] -X -X----------------------------------------------------------------------------- -X -XGo to /sys/i386/conf and type -X config YOUR_MACHINE_NAME -Xthen go to /sys/compile/YOUR_MACHINE_NAME and type -X make depend -X make -X -END-of-install.bsd -echo x - spkr.7 -sed 's/^X//' >spkr.7 << 'END-of-spkr.7' -X.TH SPKR 7 -X.SH NAME -Xspkr \- console speaker device driver -X.SH DESCRIPTION -XThe speaker device driver allows applications to control the PC console -Xspeaker on an IBM-PC-compatible machine running UNIX. -X.PP -XOnly one process may have this device open at any given time; open() and -Xclose() are used to lock and relinquish it. An attempt to open() when -Xanother process has the device locked will return -1 with an EBUSY error -Xindication. Writes to the device are interpreted as 'play strings' in a -Xsimple ASCII melody notation. An ioctl() for tone generation at arbitrary -Xfrequencies is also supported. -X.PP -XSound-generation does \fInot\fR monopolize the processor; in fact, the driver -Xspends most of its time sleeping while the PC hardware is emitting -Xtones. Other processes may emit beeps while the driver is running. -X.PP -XApplications may call ioctl() on a speaker file descriptor to control the -Xspeaker driver directly; definitions for the ioctl() interface are in -Xsys/spkr.h. The tone_t structure used in these calls has two fields, -Xspecifying a frequency (in hz) and a duration (in 1/100ths of a second). -XA frequency of zero is interpreted as a rest. -X.PP -XAt present there are two such ioctls. SPKRTONE accepts a pointer to a -Xsingle tone structure as third argument and plays it. SPKRTUNE accepts a -Xpointer to the first of an array of tone structures and plays them in -Xcontinuous sequence; this array must be terminated by a final member with -Xa zero duration. -X.PP -XThe play-string language is modelled on the PLAY statement conventions of -XIBM BASIC 2.0. The MB, MF and X primitives of PLAY are not useful in a UNIX -Xenvironment and are omitted. The `octave-tracking' feature is also new. -X.PP -XThere are 84 accessible notes numbered 1-83 in 7 octaves, each running from -XC to B, numbered 0-6; the scale is equal-tempered A440 and octave 3 starts -Xwith middle C. By default, the play function emits half-second notes with the -Xlast 1/16th second being `rest time'. -X.PP -XPlay strings are interpreted left to right as a series of play command groups; -Xletter case is ignored. Play command groups are as follows: -X.PP -XCDEFGAB -- letters A through G cause the corresponding note to be played in the -Xcurrent octave. A note letter may optionally be followed by an \fIaccidental -Xsign\fR, one of # + or -; the first two of these cause it to be sharped one -Xhalf-tone, the last causes it to be flatted one half-tone. It may also be -Xfollowed by a time value number and by sustain dots (see below). Time values -Xare interpreted as for the L command below;. -X.PP -XO -- if is numeric, this sets the current octave. may also be one -Xof 'L' or 'N' to enable or disable octave-tracking (it is disabled by default). -XWhen octave-tracking is on, interpretation of a pair of letter notes will -Xchange octaves if necessary in order to make the smallest possible jump between -Xnotes. Thus "olbc" will be played as "olb>c", and "olcb" as "olc, < and O[0123456]. -X.PP -X> -- bump the current octave up one. -X.PP -X< -- drop the current octave down one. -X.PP -XN -- play note n, n being 1 to 84 or 0 for a rest of current time value. -XMay be followedv by sustain dots. -X.PP -XL -- sets the current time value for notes. The default is L4, quarter -Xnotes. The lowest possible value is 1; values up to 64 are accepted. L1 sets -Xwhole notes, L2 sets half notes, L4 sets quarter notes, etc.. -X.PP -XP -- pause (rest), with interpreted as for L. May be followed by -Xsustain dots. May also be written '~'. -X.PP -XT -- Sets the number of quarter notes per minute; default is 120. Musical -Xnames for common tempi are: -X -X.TS -Xa a a. -X Tempo Beats Per Minute -Xvery slow Larghissimo -X Largo 40-60 -X Larghetto 60-66 -X Grave -X Lento -X Adagio 66-76 -Xslow Adagietto -X Andante 76-108 -Xmedium Andantino -X Moderato 108-120 -Xfast Allegretto -X Allegro 120-168 -X Vivace -X Veloce -X Presto 168-208 -Xvery fast Prestissimo -X.TE -X.PP -XM[LNS] -- set articulation. MN (N for normal) is the default; the last 1/8th of -Xthe note's value is rest time. You can set ML for legato (no rest space) or -XMS (staccato) 1/4 rest space. -X.PP -XNotes (that is, CDEFGAB or N command character groups) may be followed by -Xsustain dots. Each dot causes the note's value to be lengthened by one-half -Xfor each one. Thus, a note dotted once is held for 3/2 of its undotted value; -Xdotted twice, it is held 9/4, and three times would give 27/8. -X.PP -XWhitespace in play strings is simply skipped and may be used to separate -Xmelody sections. -X.SH BUGS -XDue to roundoff in the pitch tables and slop in the tone-generation and timer -Xhardware (neither of which was designed for precision), neither pitch accuracy -Xnor timings will be mathematically exact. There is no volume control. -X.PP -XIn play strings which are very long (longer than your system's physical I/O -Xblocks) note suffixes or numbers may occasionally be parsed incorrectly due -Xto crossing a block boundary. -X.SH FILES -X/dev/speaker -- speaker device file -X.SH AUTHOR -XEric S. Raymond (esr@snark.thyrsus.com) Feb 1990 -END-of-spkr.7 -echo x - Makefile -sed 's/^X//' >Makefile << 'END-of-Makefile' -X# -X# Speaker driver package makefile -X# -XCFLAGS = -I. -O # -DDEBUG -XLDFLAGS = -s -X -Xall: Driver.o -X -Xinstall: -X ./Install -X -XDriver.o: spkr.c -X $(CC) $(CFLAGS) -c spkr.c -X mv spkr.o Driver.o -X -Xclean: -X rm -f Driver.o *~ speaker.shar -X -XDSP = Files Install Master Name Node Remove Size System -Xshar: -X shar READ.ME install.bsd spkr.7 Makefile spkr.[ch] \ -X interp.c $(DSP) playtest >speaker.shar -END-of-Makefile -echo x - spkr.c -sed 's/^X//' >spkr.c << 'END-of-spkr.c' -X/* -X * spkr.c -- device driver for console speaker on 80386 -X * -X * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 -X * modified for 386bsd by Andrew A. Chernov -X */ -X -X#ifdef __386BSD__ -X#include "speaker.h" -X#endif -X#if !defined(__386BSD__) || (NSPEAKER > 0) -X -X#ifdef __386BSD__ -X#include "types.h" -X#include "param.h" -X#include "errno.h" -X#include "buf.h" -X#include "uio.h" -X -X#define CADDR caddr_t -X#define err_ret(x) return(x) -X#else /* SYSV */ -X#include -X#include -X#include -X#include -X#include -X#include -X#include -X#include -X#include -X -X#define CADDR char * -X#define err_ret(x) u.u_error = (x) -X#endif -X -X#include "spkr.h" -X -X/**************** MACHINE DEPENDENT PART STARTS HERE ************************* -X * -X * This section defines a function tone() which causes a tone of given -X * frequency and duration from the 80x86's console speaker. -X * Another function endtone() is defined to force sound off, and there is -X * also a rest() entry point to do pauses. -X * -X * Audible sound is generated using the Programmable Interval Timer (PIT) and -X * Programmable Peripheral Interface (PPI) attached to the 80x86's speaker. The -X * PPI controls whether sound is passed through at all; the PIT's channel 2 is -X * used to generate clicks (a square wave) of whatever frequency is desired. -X * -X * The non-BSD code requires SVr3.2-compatible inb(), outb(), timeout(), -X * sleep(), and wakeup(). -X */ -X -X/* -X * PIT and PPI port addresses and control values -X * -X * Most of the magic is hidden in the TIMER_PREP value, which selects PIT -X * channel 2, frequency LSB first, square-wave mode and binary encoding. -X * The encoding is as follows: -X * -X * +----------+----------+---------------+-----+ -X * | 1 0 | 1 1 | 0 1 1 | 0 | -X * | SC1 SC0 | RW1 RW0 | M2 M1 M0 | BCD | -X * +----------+----------+---------------+-----+ -X * Counter Write Mode 3 Binary -X * Channel 2 LSB first, (Square Wave) Encoding -X * MSB second -X */ -X#define PPI 0x61 /* port of Programmable Peripheral Interface */ -X#define PPI_SPKR 0x03 /* turn these PPI bits on to pass sound */ -X#define PIT_CTRL 0x43 /* PIT control address */ -X#define PIT_COUNT 0x42 /* PIT count address */ -X#define PIT_MODE 0xB6 /* set timer mode for sound generation */ -X -X/* -X * Magic numbers for timer control. -X */ -X#define TIMER_CLK 1193180L /* corresponds to 18.2 MHz tick rate */ -X -Xstatic int endtone() -X/* turn off the speaker, ending current tone */ -X{ -X wakeup((CADDR)endtone); -X outb(PPI, inb(PPI) & ~PPI_SPKR); -X} -X -Xstatic void tone(hz, ticks) -X/* emit tone of frequency hz for given number of ticks */ -Xunsigned int hz, ticks; -X{ -X unsigned int divisor = TIMER_CLK / hz; -X int sps; -X -X#ifdef DEBUG -X printf("tone: hz=%d ticks=%d\n", hz, ticks); -X#endif /* DEBUG */ -X -X /* set timer to generate clicks at given frequency in Hertz */ -X#ifdef __386BSD__ -X sps = spltty(); -X#else -X sps = spl5(); -X#endif -X outb(PIT_CTRL, PIT_MODE); /* prepare timer */ -X outb(PIT_COUNT, (unsigned char) divisor); /* send lo byte */ -X outb(PIT_COUNT, (divisor >> 8)); /* send hi byte */ -X splx(sps); -X -X /* turn the speaker on */ -X outb(PPI, inb(PPI) | PPI_SPKR); -X -X /* -X * Set timeout to endtone function, then give up the timeslice. -X * This is so other processes can execute while the tone is being -X * emitted. -X */ -X timeout((CADDR)endtone, (CADDR)NULL, ticks); -X sleep((CADDR)endtone, PZERO - 1); -X} -X -Xstatic int endrest() -X/* end a rest */ -X{ -X wakeup((CADDR)endrest); -X} -X -Xstatic void rest(ticks) -X/* rest for given number of ticks */ -Xint ticks; -X{ -X /* -X * Set timeout to endrest function, then give up the timeslice. -X * This is so other processes can execute while the rest is being -X * waited out. -X */ -X#ifdef DEBUG -X printf("rest: %d\n", ticks); -X#endif /* DEBUG */ -X timeout((CADDR)endrest, (CADDR)NULL, ticks); -X sleep((CADDR)endrest, PZERO - 1); -X} -X -X#include "interp.c" /* playinit() and playstring() */ -X -X/******************* UNIX DRIVER HOOKS BEGIN HERE ************************** -X * -X * This section implements driver hooks to run playstring() and the tone(), -X * endtone(), and rest() functions defined above. For non-BSD systems, -X * SVr3.2-compatible copyin() is also required. -X */ -X -Xstatic int spkr_active; /* exclusion flag */ -X#ifdef __386BSD__ -Xstatic struct buf *spkr_inbuf; /* incoming buf */ -X#endif -X -Xint spkropen(dev) -Xdev_t dev; -X{ -X#ifdef DEBUG -X printf("spkropen: entering with dev = %x\n", dev); -X#endif /* DEBUG */ -X -X if (minor(dev) != 0) -X err_ret(ENXIO); -X else if (spkr_active) -X err_ret(EBUSY); -X else -X { -X playinit(); -X#ifdef __386BSD__ -X spkr_inbuf = geteblk(DEV_BSIZE); -X#endif -X spkr_active = 1; -X } -X#ifdef __386BSD__ -X return(0); -X#endif -X} -X -X#ifdef __386BSD__ -Xint spkrwrite(dev, uio) -Xstruct uio *uio; -X#else -Xint spkrwrite(dev) -X#endif -Xdev_t dev; -X{ -X#ifdef __386BSD__ -X register unsigned n; -X char *cp; -X int error; -X#endif -X#ifdef DEBUG -X#ifdef __386BSD__ -X printf("spkrwrite: entering with dev = %x, count = %d\n", -X dev, uio->uio_resid); -X#else -X printf("spkrwrite: entering with dev = %x, u.u_count = %d\n", -X dev, u.u_count); -X#endif -X#endif /* DEBUG */ -X -X if (minor(dev) != 0) -X err_ret(ENXIO); -X else -X { -X#ifdef __386BSD__ -X n = MIN(DEV_BSIZE, uio->uio_resid); -X cp = spkr_inbuf->b_un.b_addr; -X error = uiomove(cp, n, uio); -X if (!error) -X playstring(cp, n); -X return(error); -X#else -X char bfr[STD_BLK]; -X -X copyin(u.u_base, bfr, u.u_count); -X playstring(bfr, u.u_count); -X u.u_base += u.u_count; -X u.u_count = 0; -X#endif -X } -X} -X -Xint spkrclose(dev) -Xdev_t dev; -X{ -X#ifdef DEBUG -X printf("spkrclose: entering with dev = %x\n", dev); -X#endif /* DEBUG */ -X -X if (minor(dev) != 0) -X err_ret(ENXIO); -X else -X { -X endtone(); -X#ifdef __386BSD__ -X brelse(spkr_inbuf); -X#endif -X spkr_active = 0; -X } -X#ifdef __386BSD__ -X return(0); -X#endif -X} -X -Xint spkrioctl(dev, cmd, cmdarg) -Xdev_t dev; -Xint cmd; -XCADDR cmdarg; -X{ -X#ifdef DEBUG -X printf("spkrioctl: entering with dev = %x, cmd = %x\n", dev, cmd); -X#endif /* DEBUG */ -X -X if (minor(dev) != 0) -X err_ret(ENXIO); -X else if (cmd == SPKRTONE) -X { -X tone_t *tp = (tone_t *)cmdarg; -X -X if (tp->frequency == 0) -X rest(tp->duration); -X else -X tone(tp->frequency, tp->duration); -X } -X else if (cmd == SPKRTUNE) -X { -X#ifdef __386BSD__ -X tone_t *tp = (tone_t *)(*(caddr_t *)cmdarg); -X tone_t ttp; -X int error; -X -X for (; ; tp++) { -X error = copyin(tp, &ttp, sizeof(tone_t)); -X if (error) -X return(error); -X if (ttp.duration == 0) -X break; -X if (ttp.frequency == 0) -X rest(ttp.duration); -X else -X tone(ttp.frequency, ttp.duration); -X } -X#else -X tone_t *tp = (tone_t *)cmdarg; -X -X for (; tp->duration; tp++) -X if (tp->frequency == 0) -X rest(tp->duration); -X else -X tone(tp->frequency, tp->duration); -X#endif -X } -X else -X err_ret(EINVAL); -X#ifdef __386BSD__ -X return(0); -X#endif -X} -X -X#endif /* !defined(__386BSD__) || (NSPEAKER > 0) */ -X/* spkr.c ends here */ -END-of-spkr.c -echo x - spkr.h -sed 's/^X//' >spkr.h << 'END-of-spkr.h' -X/* -X * spkr.h -- interface definitions for speaker ioctl() -X * -X * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 -X * modified for 386bsd by Andrew A. Chernov -X */ -X -X#ifndef _SPKR_H_ -X#define _SPKR_H_ -X -X#ifdef __386BSD__ -X#ifndef KERNEL -X#include -X#else -X#include "ioctl.h" -X#endif -X -X#define SPKRTONE _IOW('S', 1, tone_t) /* emit tone */ -X#define SPKRTUNE _IO('S', 2) /* emit tone sequence*/ -X#else /* SYSV */ -X#define SPKRIOC ('S'<<8) -X#define SPKRTONE (SPKRIOC|1) /* emit tone */ -X#define SPKRTUNE (SPKRIOC|2) /* emit tone sequence*/ -X#endif -X -Xtypedef struct -X{ -X int frequency; /* in hertz */ -X int duration; /* in 1/100ths of a second */ -X} -Xtone_t; -X -X#endif /* _SPKR_H_ */ -X/* spkr.h ends here */ -END-of-spkr.h -echo x - interp.c -sed 's/^X//' >interp.c << 'END-of-interp.c' -X/* -X * interp.c -- device driver for console speaker on 80386 -X * -X * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 -X * -X * this is the part of the code common to all 386 UNIX OSes -X * -X * playinit() and playstring() are called from the appropriate driver -X */ -X -X#ifdef __386BSD__ -X#include "param.h" -X#else -X#include -X#endif -X -X#ifndef HZ -X#define HZ 60 -X#endif -X -X -X/**************** PLAY STRING INTERPRETER BEGINS HERE ********************** -X * -X * Play string interpretation is modelled on IBM BASIC 2.0's PLAY statement; -X * M[LNS] are missing and the ~ synonym and octave-tracking facility is added. -X * Requires tone(), rest(), and endtone(). String play is not interruptible -X * except possibly at physical block boundaries. -X */ -X -Xtypedef int bool; -X#ifndef TRUE -X#define TRUE 1 -X#endif -X#ifndef FALSE -X#define FALSE 0 -X#endif -X -X#define toupper(c) ((c) - ' ' * (((c) >= 'a') && ((c) <= 'z'))) -X#define isdigit(c) (((c) >= '0') && ((c) <= '9')) -X#define dtoi(c) ((c) - '0') -X -Xstatic int octave; /* currently selected octave */ -Xstatic int whole; /* whole-note time at current tempo, in ticks */ -Xstatic int value; /* whole divisor for note time, quarter note = 1 */ -Xstatic int fill; /* controls spacing of notes */ -Xstatic bool octtrack; /* octave-tracking on? */ -Xstatic bool octprefix; /* override current octave-tracking state? */ -X -X/* -X * Magic number avoidance... -X */ -X#define SECS_PER_MIN 60 /* seconds per minute */ -X#define WHOLE_NOTE 4 /* quarter notes per whole note */ -X#define MIN_VALUE 64 /* the most we can divide a note by */ -X#define DFLT_VALUE 4 /* default value (quarter-note) */ -X#define FILLTIME 8 /* for articulation, break note in parts */ -X#define STACCATO 6 /* 6/8 = 3/4 of note is filled */ -X#define NORMAL 7 /* 7/8ths of note interval is filled */ -X#define LEGATO 8 /* all of note interval is filled */ -X#define DFLT_OCTAVE 4 /* default octave */ -X#define MIN_TEMPO 32 /* minimum tempo */ -X#define DFLT_TEMPO 120 /* default tempo */ -X#define MAX_TEMPO 255 /* max tempo */ -X#define NUM_MULT 3 /* numerator of dot multiplier */ -X#define DENOM_MULT 2 /* denominator of dot multiplier */ -X -X/* letter to half-tone: A B C D E F G */ -Xstatic int notetab[8] = {9, 11, 0, 2, 4, 5, 7}; -X -X/* -X * This is the American Standard A440 Equal-Tempered scale with frequencies -X * rounded to nearest integer. Thank Goddess for the good ol' CRC Handbook... -X * our octave 0 is standard octave 2. -X */ -X#define OCTAVE_NOTES 12 /* semitones per octave */ -Xstatic int pitchtab[] = -X{ -X/* C C# D D# E F F# G G# A A# B*/ -X/* 0 */ 65, 69, 73, 78, 82, 87, 93, 98, 103, 110, 117, 123, -X/* 1 */ 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, -X/* 2 */ 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, -X/* 3 */ 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, -X/* 4 */ 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975, -X/* 5 */ 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951, -X/* 6 */ 4186, 4435, 4698, 4978, 5274, 5588, 5920, 6272, 6644, 7040, 7459, 7902, -X}; -X -Xstatic void playinit() -X{ -X octave = DFLT_OCTAVE; -X whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / DFLT_TEMPO; -X fill = NORMAL; -X value = DFLT_VALUE; -X octtrack = FALSE; -X octprefix = TRUE; /* act as though there was an initial O(n) */ -X} -X -Xstatic void playtone(pitch, value, sustain) -X/* play tone of proper duration for current rhythm signature */ -Xint pitch, value, sustain; -X{ -X register int sound, silence, snum = 1, sdenom = 1; -X -X /* this weirdness avoids floating-point arithmetic */ -X for (; sustain; sustain--) -X { -X snum *= NUM_MULT; -X sdenom *= DENOM_MULT; -X } -X -X if (pitch == -1) -X rest(whole * snum / (value * sdenom)); -X else -X { -X sound = (whole * snum) / (value * sdenom) -X - (whole * (FILLTIME - fill)) / (value * FILLTIME); -X silence = whole * (FILLTIME-fill) * snum / (FILLTIME * value * sdenom); -X -X#ifdef DEBUG -X printf("playtone: pitch %d for %d ticks, rest for %d ticks\n", -X pitch, sound, silence); -X#endif /* DEBUG */ -X -X tone(pitchtab[pitch], sound); -X if (fill != LEGATO) -X rest(silence); -X } -X} -X -Xstatic int abs(n) -Xint n; -X{ -X if (n < 0) -X return(-n); -X else -X return(n); -X} -X -Xstatic void playstring(cp, slen) -X/* interpret and play an item from a notation string */ -Xchar *cp; -Xsize_t slen; -X{ -X int pitch, lastpitch = OCTAVE_NOTES * DFLT_OCTAVE; -X -X#define GETNUM(cp, v) for(v=0; isdigit(cp[1]) && slen > 0; ) \ -X {v = v * 10 + (*++cp - '0'); slen--;} -X for (; slen--; cp++) -X { -X int sustain, timeval, tempo; -X register char c = toupper(*cp); -X -X#ifdef DEBUG -X printf("playstring: %c (%x)\n", c, c); -X#endif /* DEBUG */ -X -X switch (c) -X { -X case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': -X -X /* compute pitch */ -X pitch = notetab[c - 'A'] + octave * OCTAVE_NOTES; -X -X /* this may be followed by an accidental sign */ -X if (cp[1] == '#' || cp[1] == '+') -X { -X ++pitch; -X ++cp; -X slen--; -X } -X else if (cp[1] == '-') -X { -X --pitch; -X ++cp; -X slen--; -X } -X -X /* -X * If octave-tracking mode is on, and there has been no octave- -X * setting prefix, find the version of the current letter note -X * closest to the last regardless of octave. -X */ -X if (octtrack && !octprefix) -X { -X if (abs(pitch-lastpitch) > abs(pitch+OCTAVE_NOTES-lastpitch)) -X { -X ++octave; -X pitch += OCTAVE_NOTES; -X } -X -X if (abs(pitch-lastpitch) > abs((pitch-OCTAVE_NOTES)-lastpitch)) -X { -X --octave; -X pitch -= OCTAVE_NOTES; -X } -X } -X octprefix = FALSE; -X lastpitch = pitch; -X -X /* ...which may in turn be followed by an override time value */ -X GETNUM(cp, timeval); -X if (timeval <= 0 || timeval > MIN_VALUE) -X timeval = value; -X -X /* ...and/or sustain dots */ -X for (sustain = 0; cp[1] == '.'; cp++) -X { -X slen--; -X sustain++; -X } -X -X /* time to emit the actual tone */ -X playtone(pitch, timeval, sustain); -X break; -X -X case 'O': -X if (cp[1] == 'N' || cp[1] == 'n') -X { -X octprefix = octtrack = FALSE; -X ++cp; -X slen--; -X } -X else if (cp[1] == 'L' || cp[1] == 'l') -X { -X octtrack = TRUE; -X ++cp; -X slen--; -X } -X else -X { -X GETNUM(cp, octave); -X if (octave >= sizeof(pitchtab) / OCTAVE_NOTES) -X octave = DFLT_OCTAVE; -X octprefix = TRUE; -X } -X break; -X -X case '>': -X if (octave < sizeof(pitchtab) / OCTAVE_NOTES - 1) -X octave++; -X octprefix = TRUE; -X break; -X -X case '<': -X if (octave > 0) -X octave--; -X octprefix = TRUE; -X break; -X -X case 'N': -X GETNUM(cp, pitch); -X for (sustain = 0; cp[1] == '.'; cp++) -X { -X slen--; -X sustain++; -X } -X playtone(pitch - 1, value, sustain); -X break; -X -X case 'L': -X GETNUM(cp, value); -X if (value <= 0 || value > MIN_VALUE) -X value = DFLT_VALUE; -X break; -X -X case 'P': -X case '~': -X /* this may be followed by an override time value */ -X GETNUM(cp, timeval); -X if (timeval <= 0 || timeval > MIN_VALUE) -X timeval = value; -X for (sustain = 0; cp[1] == '.'; cp++) -X { -X slen--; -X sustain++; -X } -X playtone(-1, timeval, sustain); -X break; -X -X case 'T': -X GETNUM(cp, tempo); -X if (tempo < MIN_TEMPO || tempo > MAX_TEMPO) -X tempo = DFLT_TEMPO; -X whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / tempo; -X break; -X -X case 'M': -X if (cp[1] == 'N' || cp[1] == 'n') -X { -X fill = NORMAL; -X ++cp; -X slen--; -X } -X else if (cp[1] == 'L' || cp[1] == 'l') -X { -X fill = LEGATO; -X ++cp; -X slen--; -X } -X else if (cp[1] == 'S' || cp[1] == 's') -X { -X fill = STACCATO; -X ++cp; -X slen--; -X } -X break; -X } -X } -X} -END-of-interp.c -echo x - Files -sed 's/^X//' >Files << 'END-of-Files' -X/usr/include/sys/spkr.h -END-of-Files -echo x - Install -sed 's/^X//' >Install << 'END-of-Install' -X# -X# Speaker driver installation script -X# -XTMP=/tmp/speaker.err -XERR1=" Errors have been written to the file $TMP." -XERR2=" The Speaker Driver software was not installed." -X -Xecho "Installing Speaker Driver Software Package" -X -X/etc/conf/bin/idcheck -p speaker 2>$TMP -Xif [ $? != 0 ] -Xthen -X echo "The speaker package is already at least partly installed. -X Removing the old version now..." -X /etc/conf/bin/idinstall -d speaker -Xfi -X -X/etc/conf/bin/idinstall -a -k speaker 2>>$TMP -Xif [ $? != 0 ] -Xthen -X message "There was an error during package installation. $ERR1 $ERR2" -X exit 1 -Xfi -X -X/etc/conf/bin/idbuild 2>>$TMP -Xif [ $? != 0 ] -Xthen -X message "There was an error during kernel reconfiguration. $ERR1 $ERR2" -X exit 1 -Xfi -X -Xrm -f $TMP -X -Xcp spkr.h /usr/include/sys/spkr.h -X -Xecho "Performing shutdown..." -Xcd /; exec /etc/shutdown -g0 -y -END-of-Install -echo x - Master -sed 's/^X//' >Master << 'END-of-Master' -Xspeaker ocwi iocH spkr 0 0 1 1 -1 -END-of-Master -echo x - Name -sed 's/^X//' >Name << 'END-of-Name' -X386 UNIX Speaker Device Driver Package -END-of-Name -echo x - Node -sed 's/^X//' >Node << 'END-of-Node' -Xspeaker speaker c 0 -END-of-Node -echo x - Remove -sed 's/^X//' >Remove << 'END-of-Remove' -X# -X# Speaker driver remove script -X# -XTMP=/tmp/speaker.err -XRERR="Errors have been written to the file $TMP." -X -Xecho "Removing Speaker Driver Software Package" -X -X/etc/conf/bin/idinstall -d speaker 2>$TMP -Xif [ $? != 0 ] -Xthen -X message "There was an error during package removal. $RERR" -X exit 1 -Xfi -X -X/etc/conf/bin/idbuild 2>>$TMP -Xif [ $? != 0 ] -Xthen -X message "There was an error during kernel reconfiguration. $RERR" -X exit 1 -Xfi -X -Xrm -f /dev/speaker $TMP /usr/include/sys/spkr.h -X -Xexit 0 -END-of-Remove -echo x - Size -sed 's/^X//' >Size << 'END-of-Size' -XROOT=1400 -XUSR=100 -END-of-Size -echo x - System -sed 's/^X//' >System << 'END-of-System' -Xspeaker Y 1 0 0 0 0 0 0 0 -END-of-System -echo x - playtest -sed 's/^X//' >playtest << 'END-of-playtest' -X: -X# Test script for the speaker driver -X# -X# v1.0 by Eric S. Raymond (Feb 1990) -X# modified for 386bsd by Andrew A. Chernov -X# -Xreveille="t255l8c.f.afc~c.f.afc~c.f.afc.f.a..f.~c.f.afc~c.f.afc~c.f.afc~c.f.." -Xcontact="f" -Xdance="t240dcdc/dev/speaker;; -Xcontact) echo $contact >/dev/speaker;; -Xdance) echo $dance >/dev/speaker;; -Xloony) echo $loony >/dev/speaker;; -X*) -X echo "No such tune. Available tunes are:" -X echo -X echo "reveille -- Reveille" -X echo "contact -- Contact theme from Close Encounters" -X echo "dance -- Lord of the Dance (aka Simple Gifts)" -X echo "loony -- Loony Toons theme" -X ;; -Xesac -END-of-playtest -exit diff --git a/sys/unix/sysconf b/sys/unix/sysconf index 2f7fcf00b..29a9c3ca3 100644 --- a/sys/unix/sysconf +++ b/sys/unix/sysconf @@ -1,6 +1,5 @@ -# NetHack 3.6 sysconf $NHDT-Date: 1575245127 2019/12/02 00:05:27 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.32 $ +# NetHack 5.0 sysconf $NHDT-Date: 1777240863 2026/04/26 22:01:03 $ $NHDT-Branch: to500 $:$NHDT-Revision: 1.47 $ # Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland -# Copyright (c) Facebook, Inc. and its affiliates. # NetHack may be freely redistributed. See license for details. # # Sample sysconf file. @@ -33,10 +32,15 @@ EXPLORERS=* # Uses the same syntax as the WIZARDS and EXPLORERS options above. #SHELLERS= +# Execute this program whenever a new message-window message is shown. +# The program will get the message text as the only parameter. +#MSGHANDLER=/usr/bin/espeak + # If the user name is found in this list, prompt for username instead. # Uses the same syntax as the WIZARDS option above. # A public server should probably disable this. -GENERICUSERS=play player game games nethack nethacker +# ["ec2-user" is the default user name on Amazon Linux] +GENERICUSERS=play player game games nethack nethacker ec2-user # Use the player name for matching WIZARDS, EXPLORERS and SHELLERS, # instead of the user's login name. @@ -83,9 +87,39 @@ MAXPLAYERS=10 # numeric (1) user id. #PERS_IS_UID=1 +# Help menu control; 0 - include "command line usage" entry in help menu; +# 1 - suppress it from the menu. Does not affect 'nethack --usage' when +# player has access to the command line. +#HIDEUSAGE=0 + # Maximum number of score file entries to use for random statue names #MAX_STATUENAME_RANK=10 +# Use "Live logging" for important events (achievements, wishes, etc) +# Only available if NetHack was compiled with LIVELOG. +# Only really meaningful for public servers or debugging. +# See the log in-game with #chronicle -command. +# Bitmask for kinds of things you want to log - combine the following values +# as desired. +# 0x0000 - No live logging (default) +# 0x0001 - Wishes +# 0x0002 - Significant achievements (complete sokoban, perform invocation, etc) +# 0x0004 - Kill, destroy or bribe a unique monster. +# 0x0008 - Significant religious events (sacrifice gifts, crowning) +# 0x0010 - Life-saving +# 0x0020 - Break conduct - see also LLC_TURNS below. +# 0x0040 - Artifact obtained (#name Sting, dip for Excalibur) +# 0x0080 - Genocides +# 0x0100 - Murder of tame pet +# 0x0200 - Changed alignment temporarily or permanently +# 0x0400 - Log URL for dumplog if ascended +# 0x0800 - Log dumplog url for all games +# 0x1000 - Log 'minor' achievements - can be spammy +# 0x2000 - Spoiler event; can include in livelog but hidden from #chronicle +# 0x4000 - Include as 'major' event in dumplog; can be hidden from livelog +# 0x8000 - Livelog debug msgs +#LIVELOG=0x1FFF + # Show debugging information originating from these source files. # Use '*' for all, or list source files separated by spaces. # Only available if game has been compiled with DEBUG, and can be @@ -96,7 +130,7 @@ MAXPLAYERS=10 # Only available if NetHack was compiled with DUMPLOG # Allows following placeholders: # %% literal '%' -# %v version (eg. "3.6.6-0") +# %v version (eg. "NetHack 5.0.0-0") # %u game UID # %t game start time, UNIX timestamp format # %T current time, UNIX timestamp format @@ -129,10 +163,25 @@ GREPPATH=/bin/grep PANICTRACE_GDB=1 PANICTRACE_LIBC=2 +# URL loaded for creating reports to the NetHack DevTeam +#CRASHREPORTURL=https://nethack.org/links/cr-5.0.0.html + +# 'portable_device_paths' is only supported for Windows. Starting with +# 3.6.3, nethack on Windows treats the folder containing nethack.exe and +# nethackW.exe as read-only and puts data files which are generated or +# modified during play or by the user in assorted folders derived from +# user name. 3.6.4 added PORTABLE_DEVICE_PATHS to allow reverting to +# the old behavior of having the run-time configuration file and other +# data in the same directory as the executable so that the whole thing +# can be moved from one machine to another (flash drive or perhaps cloud) +# without updating folder paths. +#PORTABLE_DEVICE_PATHS=0 + # Ordinary run-time options can be set here to override the builtin-in -# default values. Unlike the SYSCF values above, individual users can -# still choose their own option settings via NETHACKOPTIONS in their -# environment or via ~/.nethackrc run-time configuration file. +# default values. Unlike all the SYSCF values above, individual users +# can override the overridden options set here by choosing their own +# option settings via NETHACKOPTIONS in their environment or via +# ~/.nethackrc run-time configuration file. #OPTIONS=!autopickup,fruit:tomato,symset:DECgraphics #eof diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 658c329e2..0a7ef21df 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 unixmain.c $NHDT-Date: 1570408210 2019/10/07 00:30:10 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.70 $ */ +/* NetHack 5.0 unixmain.c $NHDT-Date: 1711213891 2024/03/23 17:11:31 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.127 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -8,7 +8,6 @@ #include "hack.h" #include "dlb.h" -#include #include #include #include @@ -16,49 +15,56 @@ #include #endif +#ifdef NHUUID +/* for uuid */ +#ifdef LINUX +#include +#endif +#endif /* NHUUID */ + #if !defined(_BULL_SOURCE) && !defined(__sgi) && !defined(_M_UNIX) #if !defined(SUNOS4) && !(defined(ULTRIX) && defined(__GNUC__)) #if defined(POSIX_TYPES) || defined(SVR4) || defined(HPUX) -extern struct passwd *FDECL(getpwuid, (uid_t)); +extern struct passwd *getpwuid(uid_t); #else -extern struct passwd *FDECL(getpwuid, (int)); +extern struct passwd *getpwuid(int); #endif #endif #endif -extern struct passwd *FDECL(getpwnam, (const char *)); +extern struct passwd *getpwnam(const char *); #ifdef CHDIR -static void FDECL(chdirx, (const char *, BOOLEAN_P)); +void chdirx(const char *, boolean); #endif /* CHDIR */ -static boolean NDECL(whoami); -static void FDECL(process_options, (int, char **)); +boolean whoami(void); +static void process_options(int, char **); + +#ifdef SND_LIB_INTEGRATED +uint32_t soundlibchoice = soundlib_nosound; +#endif #ifdef _M_UNIX -extern void NDECL(check_sco_console); -extern void NDECL(init_sco_cons); +extern void check_sco_console(void); +extern void init_sco_cons(void); #endif #ifdef __linux__ -extern void NDECL(check_linux_console); -extern void NDECL(init_linux_cons); +extern void check_linux_console(void); +extern void init_linux_cons(void); #endif -static void NDECL(wd_message); -static boolean wiz_error_flag = FALSE; -static struct passwd *NDECL(get_unix_pw); +static void wd_message(void); +static struct passwd *get_unix_pw(void); +/* NLE: change from main() to unixmain() */ int -unixmain(argc, argv) -int argc; -char *argv[]; +unixmain(int argc, char *argv[]) { - register int fd; -#ifdef CHDIR - register char *dir; -#endif + char *dir = NULL; + NHFILE *nhfp; boolean exact_username; boolean resuming = FALSE; /* assume new game */ boolean plsel_once = FALSE; - sys_early_init(); + early_init(argc, argv); #if defined(__APPLE__) { @@ -92,12 +98,27 @@ char *argv[]; } #endif - hname = argv[0]; - hackpid = getpid(); + gh.hname = argv[0]; + svh.hackpid = getpid(); + /* NLE: disable umask */ /* (void) umask(0777 & ~FCMASK); */ choose_windows(DEFAULT_WINDOW_SYS); +#ifdef SND_LIB_INTEGRATED + /* One of the soundlib interfaces was integrated on build. + * We can leave a hint here for activate_chosen_soundlib later. + * assign_soundlib() just sets an indicator, it doesn't initialize + * any soundlib, and the indicator could be overturned before + * activate_chosen_soundlib() gets called. Qt will place its own + * hint if qt_init_nhwindow() is invoked. + */ +#if defined(SND_LIB_MACSOUND) + soundlibchoice = soundlib_macsound; + assign_soundlib(soundlibchoice); +#endif +#endif + #ifdef CHDIR /* otherwise no chdir() */ /* * See if we must change directory to the playground. @@ -109,87 +130,28 @@ char *argv[]; dir = nh_getenv("NETHACKDIR"); if (!dir) dir = nh_getenv("HACKDIR"); - - if (argc > 1) { - if (argcheck(argc, argv, ARG_VERSION) == 2) - exit(EXIT_SUCCESS); - - if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { -#ifdef CHDIR - chdirx((char *) 0, 0); -#endif - iflags.initoptions_noterminate = TRUE; - initoptions(); - iflags.initoptions_noterminate = FALSE; - reveal_paths(); - exit(EXIT_SUCCESS); - } - if (argcheck(argc, argv, ARG_DEBUG) == 1) { - argc--; - argv++; - } - if (argc > 1 && !strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { - /* avoid matching "-dec" for DECgraphics; since the man page - * says -d directory, hope nobody's using -desomething_else - */ - argc--; - argv++; - dir = argv[0] + 2; - if (*dir == '=' || *dir == ':') - dir++; - if (!*dir && argc > 1) { - argc--; - argv++; - dir = argv[0]; - } - if (!*dir) - error("Flag -d must be followed by a directory name."); - } - } #endif /* CHDIR */ - - if (argc > 1) { - /* - * Now we know the directory containing 'record' and - * may do a prscore(). Exclude `-style' - it's a Qt option. - */ - if (!strncmp(argv[1], "-s", 2) && strncmp(argv[1], "-style", 6)) { + program_state.early_options = 1; + /* handle -dalthackdir, -s , --version, --showpaths */ + early_options(&argc, &argv, &dir); #ifdef CHDIR - chdirx(dir, 0); -#endif -#ifdef SYSCF - initoptions(); -#endif -#ifdef PANICTRACE - ARGV0 = hname; /* save for possible stack trace */ -#ifndef NO_SIGNAL - panictrace_setsignals(TRUE); -#endif -#endif - prscore(argc, argv); - /* FIXME: shouldn't this be using nh_terminate() to free - up any memory allocated by initoptions() */ - exit(EXIT_SUCCESS); - } - } /* argc > 1 */ - -/* - * Change directories before we initialize the window system so - * we can find the tile file. - */ -#ifdef CHDIR - chdirx(dir, 1); + /* + * Change directories before we initialize the window system so + * we can find the tile file. + */ + chdirx(dir, TRUE); #endif - #ifdef _M_UNIX check_sco_console(); #endif #ifdef __linux__ check_linux_console(); #endif + program_state.early_options = 0; + initoptions(); #ifdef PANICTRACE - ARGV0 = hname; /* save for possible stack trace */ + ARGV0 = gh.hname; /* save for possible stack trace */ #ifndef NO_SIGNAL panictrace_setsignals(TRUE); #endif @@ -200,9 +162,11 @@ char *argv[]; * It seems you really want to play. */ u.uhp = 1; /* prevent RIP on early quits */ +#if defined(HANGUPHANDLING) program_state.preserve_locks = 1; #ifndef NO_SIGNAL sethanguphandler((SIG_RET_TYPE) hangup); +#endif #endif process_options(argc, argv); /* command line options */ @@ -218,9 +182,10 @@ char *argv[]; #endif #ifdef DEF_PAGER - if (!(catmore = nh_getenv("HACKPAGER")) - && !(catmore = nh_getenv("PAGER"))) - catmore = DEF_PAGER; + if (!(gc.catmore = nh_getenv("NETHACKPAGER")) + && !(gc.catmore = nh_getenv("HACKPAGER")) + && !(gc.catmore = nh_getenv("PAGER"))) + gc.catmore = DEF_PAGER; #endif #ifdef MAIL getmailstatus(); @@ -228,29 +193,15 @@ char *argv[]; /* wizard mode access is deferred until here */ set_playmode(); /* sets plname to "wizard" for wizard mode */ - if (exact_username) { - /* - * FIXME: this no longer works, ever since 3.3.0 - * when plnamesuffix() was changed to find - * Name-Role-Race-Gender-Alignment. It removes - * all dashes rather than just the last one, - * regardless of whether whatever follows each - * dash matches role, race, gender, or alignment. - */ - /* guard against user names with hyphens in them */ - int len = (int) strlen(plname); - /* append the current role, if any, so that last dash is ours */ - if (++len < (int) sizeof plname) - (void) strncat(strcat(plname, "-"), pl_character, - sizeof plname - len - 1); - } + /* hide any hyphens from plnamesuffix() */ + gp.plnamelen = exact_username ? (int) strlen(svp.plname) : 0; /* strip role,race,&c suffix; calls askname() if plname[] is empty or holds a generic user name like "player" or "games" */ plnamesuffix(); if (wizard) { /* use character name rather than lock letter for file names */ - locknum = 0; + gl.locknum = 0; } else { /* suppress interrupts while processing lock file */ #ifndef NO_SIGNAL @@ -268,7 +219,7 @@ char *argv[]; */ vision_init(); - display_gamewindows(); + init_sound_disp_gamewindows(); /* * First, try to find and restore a save file for specified character. @@ -278,22 +229,24 @@ char *argv[]; /* * getlock() complains and quits if there is already a game - * in progress for current character name (when locknum == 0) - * or if there are too many active games (when locknum > 0). + * in progress for current character name (when gl.locknum == 0) + * or if there are too many active games (when gl.locknum > 0). * When proceeding, it creates an empty .0 file to * designate the current game. * getlock() constructs based on the character - * name (for !locknum) or on first available of alock, block, + * name (for !gl.locknum) or on first available of alock, block, * clock, &c not currently in use in the playground directory - * (for locknum > 0). + * (for gl.locknum > 0). */ - if (*plname) { + if (*svp.plname) { getlock(); +#if defined(HANGUPHANDLING) program_state.preserve_locks = 0; /* after getlock() */ +#endif } - if (*plname && (fd = restore_saved_game()) >= 0) { - const char *fq_save = fqname(SAVEF, SAVEPREFIX, 1); + if (*svp.plname && (nhfp = restore_saved_game()) != 0) { + const char *fq_save = fqname(gs.SAVEF, SAVEPREFIX, 1); (void) chmod(fq_save, 0); /* disallow parallel restores */ #ifndef NO_SIGNAL @@ -305,14 +258,19 @@ char *argv[]; iflags.news = FALSE; /* in case dorecover() fails */ } #endif - pline("Restoring save file..."); + /* if there are early trouble-messages issued, let's + * not go overtop of them with a pline just yet */ + if (ge.early_raw_messages) + raw_print("Restoring save file..."); + else + pline("Restoring save file..."); mark_synch(); /* flush output */ - if (dorecover(fd)) { + if (dorecover(nhfp)) { resuming = TRUE; /* not starting new game */ wd_message(); if (discover || wizard) { /* this seems like a candidate for paranoid_confirmation... */ - if (yn("Do you want to keep the save file?") == 'n') { + if (y_n("Do you want to keep the save file?") == 'n') { (void) delete_savefile(); } else { (void) chmod(fq_save, FCMASK); /* back to readable */ @@ -320,10 +278,13 @@ char *argv[]; } } } + if (program_state.in_self_recover) { + program_state.in_self_recover = FALSE; + } } if (!resuming) { - boolean neednewlock = (!*plname); + boolean neednewlock = (!*svp.plname); /* new game: start by choosing role, race, etc; player might change the hero's name while doing that, in which case we try to restore under the new name @@ -332,20 +293,30 @@ char *argv[]; if (!plsel_once) player_selection(); plsel_once = TRUE; - if (neednewlock && *plname) + if (neednewlock && *svp.plname) goto attempt_restore; if (iflags.renameinprogress) { /* player has renamed the hero while selecting role; if locking alphabetically, the existing lock file can still be used; otherwise, discard current one and create another for the new character name */ - if (!locknum) { + if (!gl.locknum) { delete_levelfile(0); /* remove empty lock file */ getlock(); } goto attempt_restore; } } + +#ifdef CHECK_PANIC_SAVE + /* no save file; check for a panic save; if the check finds one, + ask the player whether to proceed with a new game; it will + quit instead of returning if the answer isn't yes */ + if (check_panic_save()) + ask_about_panic_save(); +#endif + + /* no save file; start a new game */ newgame(); wd_message(); } @@ -358,70 +329,98 @@ char *argv[]; return 0; } -/* caveat: argv elements might be arbitrary long */ +/* caveat: argv elements might be arbitrarily long */ static void -process_options(argc, argv) -int argc; -char *argv[]; +process_options(int argc, char *argv[]) { + char *arg, *origarg; int i, l; + config_error_init(FALSE, "command line", FALSE); /* * Process options. + * + * We don't support "-xyz" as shortcut for "-x -y -z" and we only + * simulate longopts by allowing "--foo" for "-foo" when the user + * specifies at least 2 characters of leading substring for "foo". + * If "foo" takes a value, both "--foo=value" and "--foo value" work. */ while (argc > 1 && argv[1][0] == '-') { argv++; argc--; - l = (int) strlen(*argv); - /* must supply at least 4 chars to match "-XXXgraphics" */ - if (l < 4) - l = 4; - - switch (argv[0][1]) { + arg = origarg = argv[0]; + /* allow second dash if arg is longer than one character */ + if (arg[0] == '-' && arg[1] == '-' && arg[2] != '\0' + /* "--a=b" violates the "--" ok when at least 2 chars long rule */ + && (arg[3] != '\0' && arg[3] != '=' && arg[3] != ':')) + ++arg; + l = (int) strlen(arg); + if (l < 6 && !strncmp(arg, "-no-", 4)) + l = 6; + else if (l < 4) + l = 4; /* must supply at least 4 chars to match "-XXXgraphics" */ + + switch (arg[1]) { case 'D': case 'd': - if ((argv[0][1] == 'D' && !argv[0][2]) - || !strcmpi(*argv, "-debug")) { + if ((arg[1] == 'D' && !arg[2]) || !strcmpi(arg, "-debug")) { wizard = TRUE, discover = FALSE; - } else if (!strncmpi(*argv, "-DECgraphics", l)) { - load_symset("DECGraphics", PRIMARY); + } else if (!strncmpi(arg, "-DECgraphics", l)) { + load_symset("DECGraphics", PRIMARYSET); switch_symbols(TRUE); } else { - raw_printf("Unknown option: %.60s", *argv); + config_error_add("Unknown option: %.60s", origarg); } break; case 'X': discover = TRUE, wizard = FALSE; break; -#ifdef NEWS case 'n': - iflags.news = FALSE; - break; +#ifdef NEWS + if (!arg[2] || !strcmp(arg, "-no-news")) { + iflags.news = FALSE; + break; + } else if (!strcmp(arg, "-news")) { + /* in case RC has !news, allow 'nethack -news' to override */ + iflags.news = TRUE; + break; + } #endif + break; case 'u': - if (argv[0][2]) { - (void) strncpy(plname, argv[0] + 2, sizeof plname - 1); + if (arg[2]) { + (void) strncpy(svp.plname, arg + 2, sizeof svp.plname - 1); + gp.plnamelen = 0; /* plname[] might have -role-race attached */ } else if (argc > 1) { argc--; argv++; - (void) strncpy(plname, argv[0], sizeof plname - 1); + (void) strncpy(svp.plname, argv[0], sizeof svp.plname - 1); + gp.plnamelen = 0; } else { - raw_print("Player name expected after -u"); + config_error_add("Character name expected after -u"); } break; case 'I': case 'i': - if (!strncmpi(*argv, "-IBMgraphics", l)) { - load_symset("IBMGraphics", PRIMARY); + if (!strncmpi(arg, "-IBMgraphics", l)) { + load_symset("IBMGraphics", PRIMARYSET); load_symset("RogueIBM", ROGUESET); switch_symbols(TRUE); } else { - raw_printf("Unknown option: %.60s", *argv); + config_error_add("Unknown option: %.60s", origarg); } break; + case 'l': +#ifdef LIVELOG + if(!strncmp(arg, "-loglua", 7)){ + gl.loglua = 1; + } else +#endif + config_error_add("Unknown option: %.60s", origarg); + break; case 'p': /* profession (role) */ - if (argv[0][2]) { - if ((i = str2role(&argv[0][2])) >= 0) + if (arg[2]) { + if ((i = str2role(&arg[2])) >= 0) flags.initrole = i; } else if (argc > 1) { argc--; @@ -431,8 +430,8 @@ char *argv[]; } break; case 'r': /* race */ - if (argv[0][2]) { - if ((i = str2race(&argv[0][2])) >= 0) + if (arg[2]) { + if ((i = str2race(&arg[2])) >= 0) flags.initrace = i; } else if (argc > 1) { argc--; @@ -441,48 +440,59 @@ char *argv[]; flags.initrace = i; } break; - case 'w': /* windowtype */ - config_error_init(FALSE, "command line", FALSE); - choose_windows(&argv[0][2]); - config_error_done(); - break; case '@': flags.randomall = 1; break; + case '-': + /* "--" or "--x" or "--x=y"; need at least 2 chars after the + dashes in order to accept "--x" as an alternative to "-x"; + don't just silently ignore it */ + config_error_add("Unknown option: %.60s", origarg); + break; default: + /* default for "-x" is to play as the role that starts with "x" */ if ((i = str2role(&argv[0][1])) >= 0) { flags.initrole = i; break; } - /* else raw_printf("Unknown option: %.60s", *argv); */ + /* else config_error_add("Unknown option: %.60s", origarg); */ } } + if (argc > 1) { + int mxplyrs = atoi(argv[1]); + boolean mx_ok = (mxplyrs > 0); #ifdef SYSCF - if (argc > 1) - raw_printf("MAXPLAYERS are set in sysconf file.\n"); + config_error_add("%s%s%s", + mx_ok ? "MAXPLAYERS are set in sysconf file" + : "Expected MAXPLAYERS, found \"", + mx_ok ? "" : argv[1], mx_ok ? "" : "\""); #else - /* XXX This is deprecated in favor of SYSCF with MAXPLAYERS */ - if (argc > 1) - locknum = atoi(argv[1]); + /* XXX This is deprecated in favor of SYSCF with MAXPLAYERS */ + if (mx_ok) + gl.locknum = mxplyrs; + else + config_error_add("Invalid MAXPLAYERS \"%s\"", argv[1]); #endif + } #ifdef MAX_NR_OF_PLAYERS /* limit to compile-time limit */ - if (!locknum || locknum > MAX_NR_OF_PLAYERS) - locknum = MAX_NR_OF_PLAYERS; + if (!gl.locknum || gl.locknum > MAX_NR_OF_PLAYERS) + gl.locknum = MAX_NR_OF_PLAYERS; #endif #ifdef SYSCF /* let syscf override compile-time limit */ - if (!locknum || (sysopt.maxplayers && locknum > sysopt.maxplayers)) - locknum = sysopt.maxplayers; + if (!gl.locknum || (sysopt.maxplayers && gl.locknum > sysopt.maxplayers)) + gl.locknum = sysopt.maxplayers; #endif + /* empty or "N errors on command line" */ + config_error_done(); + return; } #ifdef CHDIR -static void -chdirx(dir, wr) -const char *dir; -boolean wr; +void +chdirx(const char *dir, boolean wr) { if (dir /* User specified directory? */ #ifdef HACKDIR @@ -501,23 +511,26 @@ boolean wr; #ifdef VAR_PLAYGROUND int len = strlen(VAR_PLAYGROUND); - fqn_prefix[SCOREPREFIX] = (char *) alloc(len + 2); - Strcpy(fqn_prefix[SCOREPREFIX], VAR_PLAYGROUND); - if (fqn_prefix[SCOREPREFIX][len - 1] != '/') { - fqn_prefix[SCOREPREFIX][len] = '/'; - fqn_prefix[SCOREPREFIX][len + 1] = '\0'; + /* FIXME: this allocation never gets freed. + */ + gf.fqn_prefix[SCOREPREFIX] = (char *) alloc(len + 2); + Strcpy(gf.fqn_prefix[SCOREPREFIX], VAR_PLAYGROUND); + if (gf.fqn_prefix[SCOREPREFIX][len - 1] != '/') { + gf.fqn_prefix[SCOREPREFIX][len] = '/'; + gf.fqn_prefix[SCOREPREFIX][len + 1] = '\0'; } #endif } #ifdef HACKDIR - if (dir == (const char *) 0) + if (!dir) dir = HACKDIR; #endif if (dir && chdir(dir) < 0) { perror(dir); error("Cannot chdir to %s.", dir); + /*NOTREACHED*/ } /* warn the player if we can't write the record file @@ -526,20 +539,27 @@ boolean wr; */ if (wr) { #ifdef VAR_PLAYGROUND - fqn_prefix[LEVELPREFIX] = fqn_prefix[SCOREPREFIX]; - fqn_prefix[SAVEPREFIX] = fqn_prefix[SCOREPREFIX]; - fqn_prefix[BONESPREFIX] = fqn_prefix[SCOREPREFIX]; - fqn_prefix[LOCKPREFIX] = fqn_prefix[SCOREPREFIX]; - fqn_prefix[TROUBLEPREFIX] = fqn_prefix[SCOREPREFIX]; + /* FIXME: if termination cleanup ever frees fqn_prefix[0..N-1], + * these will need to use dupstr() so that they have distinct + * values that can be freed separately. Or perhaps freeing + * fqn_prefix[j] can check [j+1] through [N-1] for duplicated + * pointer and just set the value to Null. + */ + gf.fqn_prefix[LEVELPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[SAVEPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[BONESPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[LOCKPREFIX] = gf.fqn_prefix[SCOREPREFIX]; + gf.fqn_prefix[TROUBLEPREFIX] = gf.fqn_prefix[SCOREPREFIX]; #endif check_recordfile(dir); } + return; } #endif /* CHDIR */ /* returns True iff we set plname[] to username which contains a hyphen */ -static boolean -whoami() +boolean +whoami(void) { /* * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS @@ -552,7 +572,7 @@ whoami() * Note that we trust the user here; it is possible to play under * somebody else's name. */ - if (!*plname) { + if (!*svp.plname) { register const char *s; s = nh_getenv("USER"); @@ -562,8 +582,8 @@ whoami() s = getlogin(); if (s && *s) { - (void) strncpy(plname, s, sizeof plname - 1); - if (index(plname, '-')) + (void) strncpy(svp.plname, s, sizeof svp.plname - 1); + if (strchr(svp.plname, '-')) return TRUE; } } @@ -571,8 +591,7 @@ whoami() } void -sethanguphandler(handler) -void FDECL((*handler), (int)); +sethanguphandler(void (*handler)(int)) { #ifdef SA_RESTART /* don't want reads to restart. If SA_RESTART is defined, we know @@ -599,7 +618,7 @@ void FDECL((*handler), (int)); #ifdef PORT_HELP void -port_help() +port_help(void) { /* * Display unix-specific help. Just show contents of the helpfile @@ -611,30 +630,50 @@ port_help() /* validate wizard mode if player has requested access to it */ boolean -authorize_wizard_mode() +authorize_wizard_mode(void) { - struct passwd *pw = get_unix_pw(); - - if (pw && sysopt.wizards && sysopt.wizards[0]) { + if (sysopt.wizards && sysopt.wizards[0]) { if (check_user_string(sysopt.wizards)) return TRUE; } - wiz_error_flag = TRUE; /* not being allowed into wizard mode */ + iflags.wiz_error_flag = TRUE; /* not being allowed into wizard mode */ + return FALSE; +} + +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ +#ifdef SYSCF + if (sysopt.explorers && sysopt.explorers[0]) { + if (check_user_string(sysopt.explorers)) + return TRUE; + } + iflags.explore_error_flag = TRUE; /* not allowed into explore mode */ return FALSE; +#else + return TRUE; /* if sysconf disabled, no restrictions on explore mode */ +#endif } static void -wd_message() +wd_message(void) { - if (wiz_error_flag) { + if (iflags.wiz_error_flag) { if (sysopt.wizards && sysopt.wizards[0]) { char *tmp = build_english_list(sysopt.wizards); pline("Only user%s %s may access debug (wizard) mode.", - index(sysopt.wizards, ' ') ? "s" : "", tmp); + strchr(sysopt.wizards, ' ') ? "s" : "", tmp); free(tmp); - } else + } else { + You("cannot access debug (wizard) mode."); + } + wizard = FALSE; /* (paranoia) */ + if (!iflags.explore_error_flag) pline("Entering explore/discovery mode instead."); - wizard = 0, discover = 1; /* (paranoia) */ + } else if (iflags.explore_error_flag) { + You("cannot access explore mode."); /* same as enter_explore_mode */ + discover = iflags.deferred_X = FALSE; /* (more paranoia) */ } else if (discover) You("are in non-scoring explore/discovery mode."); } @@ -644,8 +683,7 @@ wd_message() * be room for the / */ void -append_slash(name) -char *name; +append_slash(char *name) { char *ptr; @@ -660,24 +698,23 @@ char *name; } boolean -check_user_string(optstr) -char *optstr; +check_user_string(const char *optstr) { struct passwd *pw; int pwlen; - char *eop, *w; + const char *eop, *w; char *pwname = 0; if (optstr[0] == '*') return TRUE; /* allow any user */ if (sysopt.check_plname) - pwname = plname; + pwname = svp.plname; else if ((pw = get_unix_pw()) != 0) pwname = pw->pw_name; if (!pwname || !*pwname) return FALSE; pwlen = (int) strlen(pwname); - eop = eos(optstr); + eop = eos((char *) optstr); /* temporarily cast away 'const' */ w = optstr; while (w + pwlen <= eop) { if (!*w) @@ -697,7 +734,7 @@ char *optstr; } static struct passwd * -get_unix_pw() +get_unix_pw(void) { char *user; unsigned uid; @@ -728,7 +765,7 @@ get_unix_pw() } char * -get_login_name() +get_login_name(void) { static char buf[BUFSZ]; struct passwd *pw = get_unix_pw(); @@ -744,42 +781,41 @@ get_login_name() extern int errno; void -port_insert_pastebuf(buf) -char *buf; +port_insert_pastebuf(char *buf) { /* This should be replaced when there is a Cocoa port. */ - const char *errfmt; + const char *errarg; size_t len; FILE *PB = popen("/usr/bin/pbcopy", "w"); if (!PB) { - errfmt = "Unable to start pbcopy (%d)\n"; + errarg = "Unable to start pbcopy"; goto error; } len = strlen(buf); /* Remove the trailing \n, carefully. */ - if (buf[len - 1] == '\n') + if (len > 0 && buf[len - 1] == '\n') len--; /* XXX Sorry, I'm too lazy to write a loop for output this short. */ if (len != fwrite(buf, 1, len, PB)) { - errfmt = "Error sending data to pbcopy (%d)\n"; + errarg = "Error sending data to pbcopy"; goto error; } if (pclose(PB) != -1) { return; } - errfmt = "Error finishing pbcopy (%d)\n"; + errarg = "Error finishing pbcopy"; error: - raw_printf(errfmt, strerror(errno)); + raw_printf("%s: %s (%d)\n", errarg, strerror(errno), errno); } #endif /* __APPLE__ */ unsigned long -sys_random_seed() +sys_random_seed(void) { unsigned long seed = 0L; unsigned long pid = (unsigned long) getpid(); @@ -810,4 +846,42 @@ sys_random_seed() return seed; } +#if defined(MACOS) && defined(NHUUID) +extern void get_macos_uuid(char *); /* sys/unix/macuuid.m */ +#endif + +void +get_nhuuid(void) +{ +#if defined(NHUUID) + char struuid[NHUUIDSZ] = { 0 }; +#if defined(LINUX) && defined(NHUUID) + uuid_t binuuid; +#endif + + if (svn.nhuuid[0]) + return; + +#if defined(MACOS) + get_macos_uuid(&struuid[0]); +#elif defined(LINUX) + uuid_generate_random(binuuid); + uuid_unparse(binuuid, struuid); +#endif /* MACOS || LINUX */ + + if (struuid[0]) + Snprintf(svn.nhuuid, sizeof svn.nhuuid, "%s", struuid); + +#endif /* NHUUID */ +} + +void +free_nhuuid(void) +{ + int i; + + for (i = 0; i < SIZE(svn.nhuuid); i++) { + svn.nhuuid[i] = 0; + } +} /*unixmain.c*/ diff --git a/sys/unix/unixres.c b/sys/unix/unixres.c index cd0954a1f..e5a376fae 100644 --- a/sys/unix/unixres.c +++ b/sys/unix/unixres.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 unixres.c $NHDT-Date: 1432512788 2015/05/25 00:13:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */ +/* NetHack 5.0 unixres.c $NHDT-Date: 1596498298 2020/08/03 23:44:58 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.14 $ */ /* Copyright (c) Slash'EM development team, 2001. */ /* NetHack may be freely redistributed. See license for details. */ @@ -6,8 +6,8 @@ * will hide privileges from the caller if so desired. * * Currently supported UNIX variants: - * Linux version 2.1.44 and above - * FreeBSD (versions unknown) + * Linux version 2.1.44 and above + * FreeBSD (versions unknown) * * Note: SunOS and Solaris have no mechanism for retrieving the saved id, * so temporarily dropping privileges on these systems is sufficient to @@ -24,8 +24,7 @@ #include static int -real_getresuid(ruid, euid, suid) -uid_t *ruid, *euid, *suid; +real_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) { int (*f)(uid_t *, uid_t *, uid_t *); /* getresuid signature */ @@ -37,8 +36,7 @@ uid_t *ruid, *euid, *suid; } static int -real_getresgid(rgid, egid, sgid) -gid_t *rgid, *egid, *sgid; +real_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) { int (*f)(gid_t *, gid_t *, gid_t *); /* getresgid signature */ @@ -55,8 +53,7 @@ gid_t *rgid, *egid, *sgid; #ifdef SYS_getresuid static int -real_getresuid(ruid, euid, suid) -uid_t *ruid, *euid, *suid; +real_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) { return syscall(SYS_getresuid, ruid, euid, suid); } @@ -68,8 +65,7 @@ uid_t *ruid, *euid, *suid; #endif /* SVR4 */ static int -real_getresuid(ruid, euid, suid) -uid_t *ruid, *euid, *suid; +real_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) { int retval; int pfd[2]; @@ -93,8 +89,7 @@ uid_t *ruid, *euid, *suid; #ifdef SYS_getresgid static int -real_getresgid(rgid, egid, sgid) -gid_t *rgid, *egid, *sgid; +real_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) { return syscall(SYS_getresgid, rgid, egid, sgid); } @@ -102,8 +97,7 @@ gid_t *rgid, *egid, *sgid; #else /* SYS_getresgid */ static int -real_getresgid(rgid, egid, sgid) -gid_t *rgid, *egid, *sgid; +real_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) { int retval; int pfd[2]; @@ -133,8 +127,7 @@ static unsigned int hiding_privileges = 0; */ int -hide_privileges(flag) -boolean flag; +hide_privileges(boolean flag) { if (flag) hiding_privileges++; @@ -144,8 +137,7 @@ boolean flag; } int -nh_getresuid(ruid, euid, suid) -uid_t *ruid, *euid, *suid; +nh_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) { int retval = real_getresuid(ruid, euid, suid); @@ -155,7 +147,7 @@ uid_t *ruid, *euid, *suid; } uid_t -nh_getuid() +nh_getuid(void) { uid_t ruid, euid, suid; @@ -164,7 +156,7 @@ nh_getuid() } uid_t -nh_geteuid() +nh_geteuid(void) { uid_t ruid, euid, suid; @@ -175,8 +167,7 @@ nh_geteuid() } int -nh_getresgid(rgid, egid, sgid) -gid_t *rgid, *egid, *sgid; +nh_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) { int retval = real_getresgid(rgid, egid, sgid); @@ -186,7 +177,7 @@ gid_t *rgid, *egid, *sgid; } gid_t -nh_getgid() +nh_getgid(void) { gid_t rgid, egid, sgid; @@ -195,7 +186,7 @@ nh_getgid() } gid_t -nh_getegid() +nh_getegid(void) { gid_t rgid, egid, sgid; @@ -209,8 +200,7 @@ nh_getegid() #ifdef GNOME_GRAPHICS int -hide_privileges(flag) -boolean flag; +hide_privileges(boolean flag) { return 0; } diff --git a/sys/unix/unixunix.c b/sys/unix/unixunix.c index 3da3befbc..d11fbedac 100644 --- a/sys/unix/unixunix.c +++ b/sys/unix/unixunix.c @@ -1,11 +1,11 @@ -/* NetHack 3.6 unixunix.c $NHDT-Date: 1432512788 2015/05/25 00:13:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.22 $ */ +/* NetHack 5.0 unixunix.c $NHDT-Date: 1711213894 2024/03/23 17:11:34 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.43 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */ /* NetHack may be freely redistributed. See license for details. */ /* This file collects some Unix dependencies */ -#include "hack.h" /* mainly for index() which depends on BSD */ +#include "hack.h" /* mainly for strchr() which depends on BSD */ #include #include @@ -14,13 +14,16 @@ #endif #include +static int veryold(int); +static int eraseoldlocks(void); + #ifdef _M_UNIX -extern void NDECL(sco_mapon); -extern void NDECL(sco_mapoff); +extern void sco_mapon(void); +extern void sco_mapoff(void); #endif #ifdef __linux__ -extern void NDECL(linux_mapon); -extern void NDECL(linux_mapoff); +extern void linux_mapon(void); +extern void linux_mapoff(void); #endif #ifndef NHSTDC @@ -32,8 +35,7 @@ static struct stat buf; /* see whether we should throw away this xlock file; if yes, close it, otherwise leave it open */ static int -veryold(fd) -int fd; +veryold(int fd) { time_t date; @@ -66,39 +68,49 @@ int fd; #endif return 0; } - (void) close(fd); + /* this used to close the file upon success, leave it open upon failure; + that was supposed to simplify the caller's usage but ended up making + that be more complicated; always leave the file open so that caller + can close it unconditionally */ + /*(void) close(fd);*/ return 1; } static int -eraseoldlocks() +eraseoldlocks(void) { - register int i; + int i; +#if defined(HANGUPHANDLING) program_state.preserve_locks = 0; /* not required but shows intent */ /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization * that sets astral_level, needed for maxledgerno()) up */ +#endif for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) { /* try to remove all */ - set_levelfile_name(lock, i); - (void) unlink(fqname(lock, LEVELPREFIX, 0)); + set_levelfile_name(gl.lock, i); + (void) unlink(fqname(gl.lock, LEVELPREFIX, 0)); } - set_levelfile_name(lock, 0); - if (unlink(fqname(lock, LEVELPREFIX, 0))) + set_levelfile_name(gl.lock, 0); + if (unlink(fqname(gl.lock, LEVELPREFIX, 0))) return 0; /* cannot remove it */ return 1; /* success! */ } void -getlock() +getlock(void) { +#ifndef SELF_RECOVER + static const char destroy_old_game_prompt[] = + "There is already a game in progress under your name. Destroy old game?"; +#endif #ifndef RL_GRAPHICS - register int i = 0, fd, c; + int i = 0, fd, c, too_old; const char *fq_lock; -#ifdef NLE_UNDFINED +#ifdef NLE_UNDFINED [TODO: is this a correct NLE change here?] /* idea from rpick%ucqais@uccba.uc.edu * prevent automated rerolling of characters * test input (fd0) so that tee'ing output to get a screen dump still @@ -117,22 +129,22 @@ getlock() error("%s", ""); } - /* default value of lock[] is "1lock" where '1' gets changed to + /* default value of gl.lock[] is "1lock" where '1' gets changed to 'a','b',&c below; override the default and use if we aren't restricting the number of simultaneous games */ - if (!locknum) - Sprintf(lock, "%u%s", (unsigned) getuid(), plname); + if (!gl.locknum) + Sprintf(gl.lock, "%u%s", (unsigned) getuid(), svp.plname); - regularize(lock); - set_levelfile_name(lock, 0); + regularize(gl.lock); + set_levelfile_name(gl.lock, 0); - if (locknum) { - if (locknum > 25) - locknum = 25; + if (gl.locknum) { + if (gl.locknum > 25) + gl.locknum = 25; do { - lock[0] = 'a' + i++; - fq_lock = fqname(lock, LEVELPREFIX, 0); + gl.lock[0] = 'a' + i++; + fq_lock = fqname(gl.lock, LEVELPREFIX, 0); if ((fd = open(fq_lock, 0)) == -1) { if (errno == ENOENT) @@ -142,16 +154,17 @@ getlock() error("Cannot open %s", fq_lock); } - /* veryold() closes fd if true */ - if (veryold(fd) && eraseoldlocks()) - goto gotlock; + /* veryold() no longer conditionally closes fd */ + too_old = veryold(fd); (void) close(fd); - } while (i < locknum); + if (too_old && eraseoldlocks()) + goto gotlock; + } while (i < gl.locknum); unlock_file(HLOCK); error("Too many hacks running now."); } else { - fq_lock = fqname(lock, LEVELPREFIX, 0); + fq_lock = fqname(gl.lock, LEVELPREFIX, 0); if ((fd = open(fq_lock, 0)) == -1) { if (errno == ENOENT) goto gotlock; /* no such file */ @@ -160,20 +173,37 @@ getlock() error("Cannot open %s", fq_lock); } - /* veryold() closes fd if true */ - if (veryold(fd) && eraseoldlocks()) - goto gotlock; + /* veryold() no longer conditionally closes fd */ + too_old = veryold(fd); (void) close(fd); + if (too_old && eraseoldlocks()) + goto gotlock; - { - const char destroy_old_game_prompt[] = - "There is already a game in progress under your name. Destroy old game?"; - + /* drop the "perm" lock while the user decides */ + unlock_file(HLOCK); if (iflags.window_inited) { +#ifdef SELF_RECOVER + c = yn_function( + "Old game in progress. Destroy [y], Recover [r], or Cancel [n]?", + "ynr", 'n', FALSE); +#else /* this is a candidate for paranoid_confirmation */ - c = yn(destroy_old_game_prompt); + c = y_n(destroy_old_game_prompt); +#endif } else { - (void) printf("\n%s [yn] ", destroy_old_game_prompt); +#ifdef SELF_RECOVER + (void) raw_printf( + "\nThere is already a game in progress under your name. Do what?\n"); + (void) raw_printf("\n y - Destroy old game"); + (void) raw_printf("\n r - Try to recover it"); + (void) raw_printf("\n n - Cancel"); + (void) raw_printf("\n\n => "); + (void) fflush(stdout); + do { + c = getchar(); + } while (!strchr("rRyYnN", c) && c != -1); +#else + (void) raw_printf("\n%s [yn] ", destroy_old_game_prompt); (void) fflush(stdout); if ((c = getchar()) != EOF) { int tmp; @@ -183,8 +213,20 @@ getlock() while ((tmp = getchar()) != '\n' && tmp != EOF) ; /* eat rest of line and newline */ } +#endif } - } +#ifdef SELF_RECOVER + if (c == 'r' || c == 'R') { + if (recover_savefile() && program_state.in_self_recover) { + set_levelfile_name(gl.lock, 0); + fq_lock = fqname(gl.lock, LEVELPREFIX, 0); + goto gotlock; + } else { + unlock_file(HLOCK); + error("Couldn't recover old game."); + } + } else +#endif if (c == 'y' || c == 'Y') { if (eraseoldlocks()) { goto gotlock; @@ -198,32 +240,68 @@ getlock() } } -gotlock: + gotlock: fd = creat(fq_lock, FCMASK); unlock_file(HLOCK); if (fd == -1) { error("cannot creat lock file (%s).", fq_lock); + /*NOTREACHED*/ } else { - if (write(fd, (genericptr_t) &hackpid, sizeof hackpid) - != sizeof hackpid) { + if (write(fd, (genericptr_t) &svh.hackpid, sizeof svh.hackpid) + != sizeof svh.hackpid) { error("cannot write lock (%s)", fq_lock); + /*NOTREACHED*/ } if (close(fd) == -1) { error("cannot close lock (%s)", fq_lock); + /*NOTREACHED*/ } } #endif /* RL_GRAPHICS */ } +/* caller couldn't find a regular save file but did find a panic one */ +void +ask_about_panic_save(void) +{ +#ifdef CHECK_PANIC_SAVE + static const char Instead_prompt[] = "Start a new game instead?"; + int c = '\0'; + + pline("There is no regular save file but there is a panic one."); + pline("It might be recoverable with demi-divine intervention."); + if (iflags.window_inited) { + c = yn_function(Instead_prompt, "yn\033q", 'n', FALSE); + } else { + raw_printf("%s [yn] (n) ", Instead_prompt); + (void) fflush(stdout); + do { + c = getchar(); + if (c == EOF || c == '\033' || c == '\0') + break; + c = lowc(c); + } while (!strchr("ynq\n", c)); + } + if (c != 'y') { + /* caller successfully called getlock() and made .0 */ + delete_levelfile(0); + unlock_file(HLOCK); /* just in case, release 'perm' */ + if (iflags.window_inited) + exit_nhwindows((char *) 0); + nh_terminate(EXIT_SUCCESS); + } +#endif + return; /* proceed with new game */ +} + /* normalize file name - we don't like .'s, /'s, spaces */ void -regularize(s) -register char *s; +regularize(char *s) { - register char *lp; + char *lp; - while ((lp = index(s, '.')) != 0 || (lp = index(s, '/')) != 0 - || (lp = index(s, ' ')) != 0) + while ((lp = strchr(s, '.')) != 0 || (lp = strchr(s, '/')) != 0 + || (lp = strchr(s, ' ')) != 0) *lp = '_'; #if defined(SYSV) && !defined(AIX_31) && !defined(SVR4) && !defined(LINUX) \ && !defined(__APPLE__) @@ -252,8 +330,7 @@ register char *s; #include void -msleep(msec) -unsigned msec; /* milliseconds */ +msleep(unsigned msec) /* milliseconds */ { struct pollfd unused; int msecs = msec; /* poll API is signed */ @@ -266,16 +343,15 @@ unsigned msec; /* milliseconds */ #ifdef SHELL int -dosh() +dosh(void) { char *str; #ifdef SYSCF if (!sysopt.shellers || !sysopt.shellers[0] || !check_user_string(sysopt.shellers)) { - /* FIXME: should no longer assume a particular command keystroke, - and perhaps ought to say "unavailable" rather than "unknown" */ - Norep("Unknown command '!'."); + /* FIXME: should no longer assume a particular command keystroke */ + Norep("Unavailable command '!'."); return 0; } #endif @@ -293,10 +369,9 @@ dosh() #if defined(SHELL) || defined(DEF_PAGER) || defined(DEF_MAILREADER) int -child(wt) -int wt; +child(int wt) { - register int f; + int f; suspend_nhwindows((char *) 0); /* also calls end_screen() */ #ifdef _M_UNIX @@ -345,44 +420,42 @@ int wt; #ifdef GETRES_SUPPORT -extern int FDECL(nh_getresuid, (uid_t *, uid_t *, uid_t *)); -extern uid_t NDECL(nh_getuid); -extern uid_t NDECL(nh_geteuid); -extern int FDECL(nh_getresgid, (gid_t *, gid_t *, gid_t *)); -extern gid_t NDECL(nh_getgid); -extern gid_t NDECL(nh_getegid); +extern int nh_getresuid(uid_t *, uid_t *, uid_t *); +extern uid_t nh_getuid(void); +extern uid_t nh_geteuid(void); +extern int nh_getresgid(gid_t *, gid_t *, gid_t *); +extern gid_t nh_getgid(void); +extern gid_t nh_getegid(void); /* the following several functions assume __STDC__ where parentheses around the name of a function-like macro prevent macro expansion */ -int (getresuid)(ruid, euid, suid) -uid_t *ruid, *euid, *suid; +int (getresuid)(uid_t *ruid, *euid, *suid) { return nh_getresuid(ruid, euid, suid); } -uid_t (getuid)() +uid_t (getuid)(void) { return nh_getuid(); } -uid_t (geteuid)() +uid_t (geteuid)(void) { return nh_geteuid(); } -int (getresgid)(rgid, egid, sgid) -gid_t *rgid, *egid, *sgid; +int (getresgid)(gid_t *rgid, *egid, *sgid) { return nh_getresgid(rgid, egid, sgid); } -gid_t (getgid)() +gid_t (getgid)(void) { return nh_getgid(); } -gid_t (getegid)() +gid_t (getegid)(void) { return nh_getegid(); } @@ -392,8 +465,7 @@ gid_t (getegid)() /* XXX should be ifdef PANICTRACE_GDB, but there's no such symbol yet */ #ifdef PANICTRACE boolean -file_exists(path) -const char *path; +file_exists(const char *path) { struct stat sb; @@ -407,3 +479,5 @@ const char *path; return TRUE; } #endif + +/*unixunix.c*/ diff --git a/sys/vms/Install.vms b/sys/vms/Install.vms index 4dd9b37c2..6f73e6739 100644 --- a/sys/vms/Install.vms +++ b/sys/vms/Install.vms @@ -1,14 +1,14 @@ - Instructions for Building and Installing NetHack 3.6 + Instructions for Building and Installing NetHack 5.0.0 on a VMS (aka OpenVMS) system ========================================= 0. Please read this entire file before trying to build or install NetHack, then read it again! -1. NetHack 3.6 was built and tested on OpenVMS on both the Integrity +1. NetHack 5.0 was built and tested on OpenVMS on both the Integrity and Alpha platform using the HP C V7.3 for OpenVMS compiler. While not tested, older versions of DEC C will most likely work as compatibility - with older systems is a goal of the VMS porting team. Unfortunatly, + with older systems is a goal of the VMS porting team. Unfortunately, ancient VAX C probably will no longer work. The set of Makefiles provided are known to be out of date; use vmsbuild.com instead. @@ -16,40 +16,41 @@ structure. You should set up a directory--referred to as "top" below and in some of the assorted files, but which may be a subdirectory-- that has these subdirectories - [.dat] -- data files - [.doc] -- documentation files - [.include] -- C header files - [.src] -- primary source files - [.sys] -- parent for [.sys.*] - [.sys .share] -- files shared by several ports, including VMS - [.sys .vms] -- VMS-specific source and support files - [.util] -- sources for essential utility programs - [.win] -- parent for [.win.*] - [.win .tty] -- "window" routines for ordinary terminals + [.dat] -- data files + [.doc] -- documentation files + [.include] -- C header files + [.lib .lua535] -- Lua distribution from https://www.lua.org/ + [.src] -- primary source files + [.sys] -- parent for [.sys.*] + [.sys .share] -- files shared by several ports, including VMS + [.sys .vms] -- VMS-specific source and support files + [.util] -- sources for essential utility programs + [.win] -- parent for [.win.*] + [.win .tty] -- "window" routines for ordinary terminals (including terminal windows on workstations) The following subdirectories may be present, but are not useful for building NetHack on VMS and are not required: - [.sys .amiga] -- AmigaDOS - [.sys .atari] -- Atari TOS - [.sys .be] -- BeBox BeOS - [.sys .mac] -- Macintosh - [.sys .msdos] -- MSDOS for IBM PCs and compatibles - [.sys .os2] -- OS/2 + [.sys .amiga] -- AmigaDOS + [.sys .atari] -- Atari TOS + [.sys .be] -- BeBox BeOS + [.sys .mac] -- Macintosh + [.sys .msdos] -- MSDOS for IBM PCs and compatibles + [.sys .os2] -- OS/2 [.sys .share .sounds] -- AIFF format audio files - [.sys .unix] -- guess :-) + [.sys .unix] -- guess :-) [.sys .unix .hints] -- configuration data for setup.sh - [.sys .wince] -- Windows CE + [.sys .wince] -- Windows CE [.sys .wince .ceinc] -- more WinCE [.sys .wince .ceinc .sys] -- ditto - [.sys .winnt] -- Windows NT + [.sys .windows] -- MS Windows [.win .curses] - window routines for curses interface - [.win .gem] -- window routines for Atari/GEM - [.win .gnome] -- window routines for Unix/GNOME - [.win .Qt] -- window routines for Qt - [.win .share] -- "tile" graphic support - [.win .win32] -- Windows NT and Windows CE - [.win .X11] -- window routines for X-Windows; requires X11R4 - or later and MIT's Athena Widget set + [.win .gem] -- window routines for Atari/GEM + [.win .gnome] -- window routines for Unix/GNOME + [.win .Qt] -- window routines for Qt + [.win .share] -- "tile" graphic support + [.win .win32] -- Windows NT and Windows CE + [.win .X11] -- window routines for X-Windows; requires X11R4 + or later and MIT's Athena Widget set You must arrange things in this structure or the supplied procedures and instructions in this file will not work properly. Several DCL command files are present in the [.sys.vms] subdirectory and will not @@ -60,10 +61,7 @@ 3. Prior to beginning compilation, go to the [.include] subdirectory and edit vmsconf.h according to its comments. You should set Local_WIZARD - and Local_HACKDIR to appropriate values, and you might want to define - TEXTCOLOR if you have any color VAXstations or color terminals which - handle ANSI-format escape sequences to set foreground and background - color for text characters. (VT241/VT340 color graphics won't work.) + and Local_HACKDIR to appropriate values. Other things which may be of interest are SECURE if you intend to set up NetHack as an installed image which is granted privileges, and SHELL which should be disabled if you intend to allow captive accounts @@ -78,7 +76,7 @@ used if symbols are set up to run them. Or if you have them but do not have symbols set up, you may edit spec_lev.com to have it run them. If neither of those situations applies, spec_lev.com will default to - copying pre-genearated versions of the appropriate files (dgn_lex.c, + copying pre-generated versions of the appropriate files (dgn_lex.c, lev_lex.c, dgn_yacc.c, lev_yacc.c, dgn_comp.h, and lev_comp.h) from [.sys.share] into [.util]*.c and [.include]*.h. @@ -146,16 +144,11 @@ Notes: 0. Version 3.5.x was never publicly released. -1. Save files and bones files from 3.4.x and earlier versions - will not work with 3.6.6, but save files and bones file from 3.6.0, - through 3.6.5 should work. The scoreboard file (RECORD) from 3.6.x - or 3.4.x or 3.3.x will work. +1. Save files and bones files from 3.6.x and earlier versions will not + work with 5.0.0. The scoreboard file (RECORD) from 3.6.x or 3.4.x or + 3.3.x will work. -2. If pline.c fails to compile, edit vmsconf.h and uncomment - #define NO_VSNPRINTF - to avoid calling a C library routine that wasn't available on older - versions of VMS. (Note: in the distributed sources, this has already - been uncommented.) +2. Ancient C libs will not work; vsnprintf is required. 3. To specify user-preference options in your environment, define the logical name NETHACKOPTIONS to have the value of a quoted string @@ -517,6 +510,6 @@ minimally updated 9-NOV-2015... and again 5-MAY-2019... and yet again 26-JAN-2020... -# NetHack 3.6 Install.vms $NHDT-Date: 1575245132 2019/12/02 00:05:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.16 $ +# NetHack 5.0 Install.vms $NHDT-Date: 1575245132 2019/12/02 00:05:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.16 $ # Copyright (c) 2003 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. diff --git a/sys/vms/Install370.vms b/sys/vms/Install370.vms new file mode 100644 index 000000000..b6c406e68 --- /dev/null +++ b/sys/vms/Install370.vms @@ -0,0 +1,364 @@ + Instructions for Building and Installing NetHack 5.0.0 + on a VSI openVMS 9.2 system + ========================================= + +This contains a description of how to build NetHack-5.0.0 on VSI OpenVMS 9.2. +This process uses Gnu Make 4.1 (minimum) for VMS to carry out the build. +Last tested with VSI C x86-64 V7.5-009 (GEM 50XBR) on OpenVMS x86_64 V9.2-2. + +0. Please read this entire file before trying to build or install + NetHack, then read it again! + +1. Make sure all the NetHack files are in the appropriate directory + structure. You should set up a directory--referred to as "top" below + and in some of the assorted files, but which may be a subdirectory-- + that has these subdirectories + [.dat] -- data files + [.doc] -- documentation files + [.include] -- C header files + [.lib.lua548] -- Lua distribution from https://www.lua.org/ + [.src] -- primary source files + [.sys] -- parent for [.sys.*] + [.sys.share] -- files shared by several ports, including VMS + [.sys.vms] -- VMS-specific source and support files + [.util] -- sources for essential utility programs + [.win] -- parent for [.win.*] + [.win.tty] -- "window" routines for ordinary terminals + (including terminal windows on workstations) + +2. From the top of the NetHack 5.0 distribution, issue the following + pair of commands to distribute the GNU make Makefile.vms files to their + working locations for building NetHack: + $ set def [.sys.vms] + $ @vmssetup.com + $ set def [-.-] + That will place renamed copies of the following files like so, + relative to the top of the NetHack source tree: + [.sys.vms]Makefile_top.vms -> Makefile.vms + [.sys.vms]Makefile_dat.vms -> [.dat]Makefile.vms + [.sys.vms]Makefile_doc.vms -> [.doc]Makefile.vms + [.sys.vms]Makefile_src.vms -> [.src]Makefile.vms + [.sys.vms]Makefile_utl.vms -> [.util]Makefile.vms + +3. Prior to beginning compilation, go to the [.include] subdirectory and + edit vmsconf.h according to its comments. You should set Local_WIZARD + and Local_HACKDIR to appropriate values. + Other things which may be of interest are SECURE if you intend to + set up NetHack as an installed image which is granted privileges, and + SHELL which should be disabled if you intend to allow captive accounts + to run NetHack. You may also want to edit file config.h, but that's + only necessary if you want or need to disable some of the game options. + The distributed copy of config.h will work successfully on VMS; + vmsconf.h has conditional code to deal with the UNIX-specific items. + +4. After the above steps, issue the following command from the top of the + NetHack source tree to build the game from sources: + make + +5. [ FIXME: this step is not in the Makefile_top.vms yet 2024/03/08 ] + After compilation, it's time to perform installation. Issue the + following command from the top of the NetHack source tree: + make install + +6. To clean files left over from the build, issue the following command + from the top of the Nethack source tree: + make clean + +7. The file nethack.com which is copied to the playground directory can + be used to invoke NetHack, or nethack.exe can be run directly. Most + of the command-line options specified in the Unix man-page (file + [.doc]nethack.txt) are also applicable to VMS. Some comments at the + beginning of nethack.com illustrate several of the options. New + players should read the file "Guidebook.txt" which will be copied + into the playground directory as "Guidebook.doc". + + +Notes: + +1. Save files and bones files from 3.6.x and earlier versions will not + work with 5.0.0. The scoreboard file (RECORD) from 3.6.x or 3.4.x or + 3.3.x should work. + +2. To specify user-preference options in your environment, define the + logical name NETHACKOPTIONS to have the value of a quoted string + containing a comma separated list of option values. The option names + are case-insensitive. + $ define nethackoptions "noAutoPickup,Dog:Rover,Cat:Felix,DECgraphics" + One value you'll probably want to specify is "noLegacy" to turn off + the initial introductory passage. The "checkpoint" option controls + whether or not enough data is saved to disk so that the set of level + files left behind after a crash contains sufficient information for + recover.exe to be able to construct a save file after the fact. The + tradeoff for enabling checkpoint is that using it makes level changes + do more I/O and take longer. The "menustyle" option controls some + aspects of the user interface, and can be set to "menustyle:traditional" + to make nethack behave more like older versions. + + If logical name or DCL symbol NETHACKOPTIONS is not defined, NetHack + will try HACKOPTIONS instead. Regardless of whether or not either + is defined, it will also try to find a configuration file containing + additional option settings. If the value of the translation of + NETHACKOPTIONS--or HACKOPTIONS--begins with an "@" character then the + rest of the translation is assumed to be the name of the configuration + file. Otherwise, the following are tried: file specified by logical + name NETHACKINI, file SYS$LOGIN:NETHACK.INI, and file HOME:NETHACK.CNF + (note that the C run-time library sets up the value of HOME to match + sys$login). Syntax for the configuration file is similar to + NETHACKOPTIONS, but multiple lines can be used, each must start with + OPTIONS=, and comments can be included by placing '#' in the first + column. Several options which take more complex values (graphics + representation) can also be present; see the "Guidebook" for details. + (Guidebook.txt can be found in the [.doc] subdirectory; a copy gets + placed in the playground directory by install.com. Also, an example + configuration file can be found in [.win.X11]nethack.rc.) + +3. termcap is an ASCII data file containing descriptions of terminal + capabilities and the escape sequences that software must use to take + advantage of them. If you do not already have a termcap file in use + on your system there is a small one in file [.SYS.SHARE]TERMCAP. It + contains definitions for common Digital terminals, also suitable for + most clones and emulators. This file is copied into the playground + by install.com, and NetHack will use it if it can't find any other + one. NetHack uses the following sequence to attempt to locate the + termcap file: translation of the logical name TERMCAP (used as-is), + file NETHACKDIR:TERMCAP, similar file HACKDIR:TERMCAP, GNU-Emacs file + EMACS_LIBRARY:[ETC]TERMCAP.DAT, file []TERMCAP, and lastly file + $TERMCAP (which most likely would be a logical name). If NetHack + can't find the termcap file, or if the above search sequence finds a + different one than you'd prefer, then use the DCL ASSIGN or DEFINE + command to define a value for logical name TERMCAP. + + NetHack also tries fairly hard to figure out what kind of terminal + you're using. It checks for logical names (or symbols) NETHACK_TERM, + HACK_TERM, EMACS_TERM, and lastly TERM. The last is set up by the + C run-time library and you cannot use a logical name or symbol for + it. If all those fail, or if whichever one succeeds has a value of + "undefined" or "unknown" (which can happen under VMS V5.4-* and + V5.5-* for VT420 terminals), NetHack will query the VMS TERMTABLE + database used by the SMG library routines. Whatever value NetHack + eventually comes up with needs to be the name of an entry in the + termcap file, otherwise a message about "Unknown terminal type" will + be printed and NetHack will exit. + +4. Both vmsbuild.com and Makefile.src have provisions to build NetHack's + There is currently no working version of the 'curses' interface for + OpenVMS. The NetHack source code for it won't compile using + the implementation of curses which is supplied with VMS (either the + VMS-specific variant or the BSD-derived one). If someone manages + to port 'ncurses' or 'PDcurses' to OpenVMS, it may be possible to + use either of those, as ncurses works on Unix and PDcurses works + on Windows and MS-DOS. + +5. NetHack contains code which attempts to make it secure in case it's + installed with privileges (to allow the playground to be protected + against world write access). This has only undergone limited testing, + so install NetHack with privileges at your own risk. If you discover + any potential security holes, please let us know so that we can take + steps to correct the problem(s). NetHack always includes filename + punctuation when accessing files, so that it should never be affected + by inadvertent or malicious logical name definitions, and it always + deactivates installed privileges prior to spawning a subprocess. + + Note to end users: "installing with privileges" is an option for + system managers who set up system-wide access to the game. Since + CMKRNL privilege and modification of the system boot routines are + both required, it is not an option for ordinary users. There are + no explicit instructions on how to do such an installation, because + only system managers who are already familiar with the process and + its potential security ramifications should even consider it. + + The default setup by install.com assumes no privileges and uses + world-writable files to allow arbitrary users to play. This is + NOT secure and not advisable in any environment where there are + untrustworthy users, but works fine for many sites. If you allow + users to run NetHack from captive accounts (VMS 5.1-* or earlier) + or from restricted accounts (5.2 and later), you should either make + sure that they do not have TMPMBX privilege or else disable NetHack's + ability to spawn an interactive subprocess. To disable subprocesses, + disable the "!" (shell escape) command by commenting out the definition + of SHELL in vmsconf.h prior to building the program. This necessity + may be removed in some future release, where NetHack will check for + captive accounts instead of spawning unconditionally. Note that + disabling the SHELL command also prevents spawning MAIL when scrolls + of new mail are received. + + In order for installed privileges to be used at all, the value of + HACKDIR (via Local_HACKDIR in vmsconf.h) compiled into the program + must correspond to the actual playground directory. If logical name + HACKDIR (or NETHACKDIR) is used to override that value, installed + privileges will be deactivated unless its value corresponds to the + same device and directory as the internal value. If that internal + value contains a logical name, only an executive-mode translation + will be honored; if there is no such translation, installed privs + will be deactivated. + + To be able to install nethack.exe with privileges (SYSPRV or GRPPRV, + perhaps EXQUOTA, depending on site usage and needs), you'll need to + link it with debugging and tracebacks both disabled. You can do this + by specifying an argument to vmsbuild.com when performing step #6 + above; pass it "/noTrace/noDebug" as the 4th parameter. + $ @[.SYS.VMS]VMSBUILD "" "" "" "/noTrace/noDebug" + /Trace/noDebug is the linker's normal default. If you've already + built NetHack, you can relink with tracebacks disabled by doing + $ @[.SYS.VMS]VMSBUILD "LINK" "" "" "/noTrace/noDebug" + +6. If you can't or won't install nethack.exe with privileges and if you + don't have access to a privileged account yourself, then if you intend + to allow other users to access your copy of NetHack you should probably + place an ACL on the playground directory and its save subdirectory. + The access control list should contain a default protection ACE which + grants delete+control access to the playground owner (ie, your own + account if there's no special games account involved). install.com + does not attempt to do this automatically at the present time. After + executing install.com to create the playground directory, perform a + pair of commands similar to the following + $ SET ACL/ACL=(IDENT=your_id, OPTIONS=DEFAULT, ACCESS=R+W+E+D+C) - + $_ device:[playground's.parent.directory]playground.DIR + $ SET ACL/ACL=(IDENT=your_id, OPTIONS=DEFAULT, ACCESS=R+W+E+D+C) - + $_ device:[playground.directory]SAVE.DIR + The two commands use the same options, but SET ACL won't accept a + list of files to modify. (For recent versions of VMS, SET ACL was + made obsolete in favor of SET FILE/ACL, which in turn has been made + obsolete in favor of SET SECURITY/CLASS=FILE/ACL; however, the older + forms will still work.) 'your_id' should be the rights identifier + which corresponds to the account which should retain access to those + files; 'device:[playground's.parent.directory]' is the name of the + parent directory for the playground (ie, if your playground directory + is disk$foo:[me.games.nethack.play], then you want to specify + disk$foo:[me.games.nethack]play.dir on the SET ACL command), and + 'device:[playground.directory]' is the playground itself. Those ACLs + establish a default protection scheme such that every newly created + file in those directories will have an ACL attached to it, and the + attached ACL will grant 'your_id' full access to the corresponding + file. That should allow you to clear away level files from aborted + games, and to delete old save files if necessary. It will not enable + you to run recover.exe on behalf of other users, because you won't be + able to create files owned by them unless you have elevated privileges. + +7. Many NetHack commands can be aborted by sending it the + character when it wants input. This is displayed as ESC inside the + game. Digital VK201 keyboards (used by VT2xx and VT3xx and older + VAXstations) and VK401 keyboards (used by VT4xx, newer VAXstations, + and DEC's X Terminals) do not have an key. They may + transmit for the key if the terminal or emulator + window is set to operate in VT100 mode, or there may be a setup-type + option for making the <` | ~> key behave as . If your + terminal does not have that, or if it's set to a mode where that + won't work, then just use instead. (Press the "[" key while + holding down the "Ctrl" key, then release both; and + have the same ASCII code and are indistinguishable once they reach + the computer; note that VAXstations and X Terminals _can_ tell the + difference, but that won't matter for NetHack.) + + VMS NetHack is configured to use the SYS$QIOW system service for + reading characters from the keyboard. This allows ^C and ^Y (as well + as ^X and ^O for wizard mode debugging) to be used as commands without + being intercepted or interpreted by the terminal driver. The code + which parses arrow and function keys is not perfect, and it's possible + to get strange results if you hold such keys down or just type too + quickly, particularly on slow multiplexor lines. Those keys are + never needed in actual play, and most function keys are just treated + as for use in aborting partial commands. + + VMS NetHack also still has code to use SMG$READ_KEYSTROKE instead. + That can be activated by modifying vmsconf.h and recompiling, but + it should never be necessary. If you use it, you'll need to press + either or twice to abort partial commands, or else + press an arbitrary function key, such as , once. + + If SUSPEND is defined in vmsconf.h, is used for that command. + Since Unix-style job control is not available, it's used for connecting + to the parent process if NetHack is running in a subprocess. When not + in a subprocess, it doesn't do anything except give a message to the + effect that it's not doing anything.... The suspend command does not + save the current game; if you use ^Z to attach to your parent process, + be sure to remember to eventually reattach to the NetHack subprocess; + otherwise the game in progress won't get saved when you logout. + +8. NetHack optionally maintains a logfile which receives one line appended + to it whenever a game ends. This can be disabled entirely by adding + an "#undef LOGFILE" directive to vmsconf.h prior to building the + program, or it can be disabled later by removing the file(s) LOGFILE.;* + from the playground directory. If not disabled prior to compilation, + the logfile can be reinitialized by simply creating an empty file + named LOGFILE in the playground, but make sure that users are able + to write into it, or new entries will not be appended. A somewhat + more elaborate log file named XLOGFILE containing more information is + handled similarly. + +9. Some attempt at support for VMS versions earlier than V4.6 has been + included, but no such obsolete system was available for testing it. + vmsbuild.com detects the need for the extra support routines and + arranges automatically for them to be compiled. The reason that + special support is needed is that the C Run-Time Library (VAXCRTL) + underwent a major revision for VMS V4.6 and several routines which + NetHack utilizes were not available prior to that upgrade. + + [That was written many years ago and the chance of it still working + is very small.] + +10. To access "wizard mode"--intended for debugging purposes, not to + spoil the game with unlimited wishes--you must be running from the + username compiled into the game via Local_WIZARD in vmsconf.h, and + you must specify "-D" on the command line when invoking NetHack. + Note that -D must be uppercase, and it must be in quotes to prevent + the C run-time library's program startup code from converting it into + lowercase. + $ @hackdir:nethack "-D" + Any character name you specify will be ignored in favor of "wizard". + + [More out of date information. Rather than compile-time Local_WIZARD, + users(s) allowed to run in wizard mode are now controlled by the entry + WIZARDS in the file SYSCONF.] + +11. At program startup time, NetHack uses the empty file PERM to prevent + two different processes from using the same character name (under the + same UIC ownership) at the same time. It does this by temporarily + giving that file a second directory entry named PERM.LOCK, then + removing the alternate entry once started. If the PERM file is + missing or inaccessible, NetHack will give a message and then quit. + Several possible messages and their usual causes are: + Can't find file perm;1 to lock! + PERM.;1 is missing from the playground directory. Fix: reinstall + the playground directory using install.com, or use CREATE or an editor + to make an empty file named PERM. Version number must be 1. + Can't lock perm;1 due to directory protection. + The playground directory is not allowing write access. Fix: players + need to be able to write files for dungeon levels and "bones" into + the playground directory. Set the protection or ACL on the xxx.DIR;1 + file in the playground's parent directory to allow write access. + Can't unlink perm.lock;1. + The empty file PERM.;1 is protected against delete access; only matters + under some versions of VMS. Fix: set the protection or ACL on PERM.;1 + to allow delete access to players. Under VMS V5.5-2, delete access is + not necessary. PERM does not have to remain writable. + Waiting for access to perm;1. (# retries left). + If some other process is also starting up NetHack at about the same + time, you may have to wait a short period. NetHack will retry once + per second, counting down to 0. If 0 is reached, the message + Perhaps there is an old perm.lock;1 around? + will be displayed and then NetHack will give up. Fix: to forcibly + remove a stale PERM.LOCK entry, issue the following command + $ SET FILE/REMOVE PERM.LOCK;1 + from the playground directory. The file PERM should remain intact. + Do not use that command for real files, only alternate directory + entries. If output from a DIRECTORY command on the playground reports + PERM.LOCK;1 no such file + then someone has deleted PERM.;1 while the synonym entry was still + in place, and PERM.LOCK was left as a dangling name which no longer + points at any file. The SET FILE/REMOVE command above will fix the + dangling name; a new PERM.;1 will need to be created as mentioned above. + + In similar fashion, synchronized access to the scoreboard file RECORD + is accomplished using temporary entry RECORD.LOCK and LOGFILE using + entry LOGFILE.LOCK. + +12. If necessary, send problem reports via e-mail to + + Always include version information for NetHack, the operating system + version, and the C compiler and version used, and the version of GNU + make utility used. + +8-March-2024 +# NetHack 5.0 Install370.vms $NHDT-Date: 1575245132 2019/12/02 00:05:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.16 $ +# NetHack may be freely redistributed. See license for details. diff --git a/sys/vms/Makefile.dat b/sys/vms/Makefile.dat index e74eb95be..e1787896b 100644 --- a/sys/vms/Makefile.dat +++ b/sys/vms/Makefile.dat @@ -1,5 +1,5 @@ # NetHack Makefile (VMS) - data files: special levels and other data. -# NetHack 3.6 Makefile.dat $NHDT-Date: 1542388601 2018/11/16 17:16:41 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.10 $ +# NetHack 5.0 Makefile.dat $NHDT-Date: 1596498300 2020/08/03 23:45:00 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.12 $ # Copyright (c) 2015 by Mike Stephenson # NetHack may be freely redistributed. See license for details. @@ -18,35 +18,36 @@ WINSHR = [-.win.share] WINX11 = [-.win.X11] # utilities; must match Makefile.utl in spelling and punctuation MAKEDEFS = $(UTL)makedefs.exe; -LEVCOMP = $(UTL)lev_comp.exe; -DGNCOMP = $(UTL)dgn_comp.exe; +#LEVCOMP = $(UTL)lev_comp.exe; +#DGNCOMP = $(UTL)dgn_comp.exe; DLB = $(UTL)dlb.exe; TILE2X11 = $(UTL)tile2x11.exe; UTILMARKER = $(UTL)util.timestamp; # note: filespecs have enough punctuation to satisfy DELETE -MARKERS = spec_levs.timestamp;,quest_levs.timestamp; +#MARKERS = spec_levs.timestamp;,quest_levs.timestamp; VARDAT = data.;,rumors.;,quest.dat;,oracles.;,options.;,\ engrave.;,epitaph.;,bogusmon.; -DUNGEON = dungeon.; +#DUNGEON = dungeon.; X11TILES= x11tiles.; # note: the level lists need to be space separated for use as-is by $(LEVCOMP) -QUESTLEVS = Arch.des Barb.des Caveman.des Healer.des Knight.des \ - Monk.des Priest.des Ranger.des Rogue.des Samurai.des Tourist.des \ - Valkyrie.des Wizard.des -SPECLEVS = bigroom.des castle.des endgame.des gehennom.des knox.des \ - medusa.des mines.des oracle.des sokoban.des tower.des yendor.des - -all : $(VARDAT) $(DUNGEON) $(MARKERS) $(DLB) +#QUESTLEVS = Arch.des Barb.des Caveman.des Healer.des Knight.des \ +# Monk.des Priest.des Ranger.des Rogue.des Samurai.des Tourist.des \ +# Valkyrie.des Wizard.des +#SPECLEVS = bigroom.des castle.des endgame.des gehennom.des knox.des \ +# medusa.des mines.des oracle.des sokoban.des tower.des yendor.des + +#all : $(VARDAT) $(DUNGEON) $(MARKERS) $(DLB) +all : $(VARDAT) $(DLB) @ $(ECHO) "data files are up to date." # these are convenience targets for "manual" interactive use -spec_levs : spev_levs.timestamp - @ $(ECHO) "special levels are up to date." -quest_levs : quest_levs.timestamp - @ $(ECHO) "quest levels are up to date." -dungeon : $(DUNGEON) - @ $(ECHO) "dungeon is up to date." +#spec_levs : spev_levs.timestamp +# @ $(ECHO) "special levels are up to date." +#quest_levs : quest_levs.timestamp +# @ $(ECHO) "quest levels are up to date." +#dungeon : $(DUNGEON) +# @ $(ECHO) "dungeon is up to date." data : data.; @ $(NOOP) rumors : rumors.; @@ -71,15 +72,15 @@ $(MAKEDEFS) : $(UTILMARKER) $(MAKE)$(MAKEFLAGS) $(MAKEDEFS) @ $(CD) $(DAT) -$(DGNCOMP) : $(UTILMARKER) - $(CD) $(UTL) - $(MAKE)$(MAKEFLAGS) $(DGNCOMP) - @ $(CD) $(DAT) +#$(DGNCOMP) : $(UTILMARKER) +# $(CD) $(UTL) +# $(MAKE)$(MAKEFLAGS) $(DGNCOMP) +# @ $(CD) $(DAT) -$(LEVCOMP) : $(UTILMARKER) - $(CD) $(UTL) - $(MAKE)$(MAKEFLAGS) $(LEVCOMP) - @ $(CD) $(DAT) +#$(LEVCOMP) : $(UTILMARKER) +# $(CD) $(UTL) +# $(MAKE)$(MAKEFLAGS) $(LEVCOMP) +# @ $(CD) $(DAT) $(DLB) : $(UTILMARKER) $(CD) $(UTL) @@ -122,27 +123,27 @@ oracles.; : oracles.txt $(MAKEDEFS) options.; : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -v -spec_levs.timestamp; : $(SPECLEVS) $(LEVCOMP) - $(RUN) $(LEVCOMP) $(SPECLEVS) - $(TOUCH) spec_levs.timestamp; +#spec_levs.timestamp; : $(SPECLEVS) $(LEVCOMP) +# $(RUN) $(LEVCOMP) $(SPECLEVS) +# $(TOUCH) spec_levs.timestamp; -quest_levs.timestamp; : $(QUESTLEVS) $(LEVCOMP) - $(RUN) $(LEVCOMP) $(QUESTLEVS) - $(TOUCH) quest_levs.timestamp; +#quest_levs.timestamp; : $(QUESTLEVS) $(LEVCOMP) +# $(RUN) $(LEVCOMP) $(QUESTLEVS) +# $(TOUCH) quest_levs.timestamp; -$(DUNGEON) : dungeon.def $(MAKEDEFS) $(DGNCOMP) - $(RUN) $(MAKEDEFS) -e !dungeon.def -> dungeon.pdf - $(RUN) $(DGNCOMP) dungeon.pdf !dungeon.pdr -> dungeon +#$(DUNGEON) : dungeon.def $(MAKEDEFS) $(DGNCOMP) +# $(RUN) $(MAKEDEFS) -e !dungeon.def -> dungeon.pdf +# $(RUN) $(DGNCOMP) dungeon.pdf !dungeon.pdr -> dungeon clean : - if f$search("*.*;-1").nes."" then purge - - if f$search("dungeon.pdf").nes."" then delete dungeon.pdf; - - if f$search("*.timestamp").nes."" then delete $(MARKERS) +# - if f$search("dungeon.pdf").nes."" then delete dungeon.pdf; +# - if f$search("*.timestamp").nes."" then delete $(MARKERS) spotless : clean - delete $(VARDAT) - - if f$search("$(DUNGEON)").nes."" then delete $(DUNGEON) - - if f$search("*.lev").nes."" then delete *.lev; +# - if f$search("$(DUNGEON)").nes."" then delete $(DUNGEON) +# - if f$search("*.lev").nes."" then delete *.lev; - if f$search("$(X11TILES)").nes."" then delete $(X11TILES) - if f$search("*.x%m").nes."" then delete *.x%m; !*.xbm,*.xpm - if f$search("nh*.dlb").nes."" then delete nh*.dlb; diff --git a/sys/vms/Makefile.doc b/sys/vms/Makefile.doc index 624f5ea0a..cb54314de 100644 --- a/sys/vms/Makefile.doc +++ b/sys/vms/Makefile.doc @@ -1,5 +1,5 @@ # NetHack Makefile (VMS) - for the [Unix] documentation. -# NetHack 3.6 Makefile.doc $NHDT-Date: 1524689428 2018/04/25 20:50:28 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.9 $ +# NetHack 5.0 Makefile.doc $NHDT-Date: 1596498301 2020/08/03 23:45:01 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.10 $ # Copyright (c) 2011 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. diff --git a/sys/vms/Makefile.src b/sys/vms/Makefile.src index c15d10f60..4cdef1436 100644 --- a/sys/vms/Makefile.src +++ b/sys/vms/Makefile.src @@ -1,5 +1,5 @@ # NetHack Makefile (VMS) - for building nethack itself. -# NetHack 3.6 Makefile.src $NHDT-Date: 1557701517 2019/05/12 22:51:57 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.36 $ +# NetHack 5.0 Makefile.src $NHDT-Date: 1683748060 2023/05/10 19:47:40 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.60 $ # Copyright (c) 2011 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. @@ -28,7 +28,8 @@ UTL = [-.util] VMS = [-.sys.vms] WINSHR = [-.win.share] X11 = [-.win.X11] - +#LUA source tree parallel to NetHack tree in lua535 directory +LUA = [-.-.lua540.src] MAKEFILE= $(SRC)Makefile. # if you are using gcc as your compiler: @@ -37,8 +38,8 @@ MAKEFILE= $(SRC)Makefile. # set option flags for C compiler and linker # -CFLAGS = /Prefix=All/Incl=$(INC)/noList # DECC in native mode -#CFLAGS = /Include=$(INC)/noList # VAXC or GNUC +CFLAGS = /Prefix=All/Incl=$(INC),$(LUA)/noList # DECC in native mode +#CFLAGS = /Include=$(INC),$(LUA)/noList # VAXC or GNUC #LFLAGS = /Debug/Map/Cross_Ref # for development #LFLAGS = /noTraceback/noMap # for installing w/ privs LFLAGS = /noMap @@ -76,6 +77,7 @@ WINTTYSRC = $(TTY)getline.c $(TTY)termcap.c $(TTY)topl.c $(TTY)wintty.c \ WINTTYOBJ = getline.obj,termcap.obj,topl.obj,wintty.obj $(TERMCAPOBJ) # # curses; doesn't use termcap; may or may not support TERMTABLE for non-DEC tty +# [native curses is incompatible with ncurses and PDcurses; it won't work] WINCURSESSRC = $(CURSES)cursdial.c $(CURSES)cursmesg.c $(CURSES)cursinit.c \ $(CURSES)cursmisc.c $(CURSES)cursinvt.c $(CURSES)cursstat.c \ $(CURSES)cursmain.c $(CURSES)curswins.c @@ -103,11 +105,12 @@ WANT_WIN_TTY=1 .endif .if WANT_WIN_TTY +.if WANT_WIN_CURSES +WINSRC = $(WINTTYSRC) $(WINCURSESSRC) +WINOBJ = $(WINTTYOBJ),$(WINCURSESOBJ) +.else WINSRC = $(WINTTYSRC) WINOBJ = $(WINTTYOBJ) -.if WANT_WIN_CURSES -WINSRC +=,$(WINCURSESSRC) -WINOBJ += $(WINCURSESOBJ) .endif .else .if WANT_WIN_CURSES @@ -133,7 +136,7 @@ RANDOBJ = isaac64.obj,random.obj # Other things that have to be reconfigured are in vmsconf.h, # and config.h -VERSION = 3.6.7 +VERSION = 5.0.0 MAKEDEFS = $(UTL)makedefs.exe; @@ -144,72 +147,108 @@ HACK_H = $(SRC)hack.h-t # all .c that are part of the main NetHack program and are not operating- or # windowing-system specific HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ - botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ - do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ - dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \ - files.c fountain.c hack.c hacklib.c invent.c light.c lock.c \ - mail.c makemon.c mapglyph.c mcastu.c mhitm.c mhitu.c minion.c \ - mklev.c mkmap.c \ - mkmaze.c mkobj.c mkroom.c mon.c mondata.c monmove.c monst.c \ - mplayer.c mthrowu.c muse.c music.c o_init.c objects.c objnam.c \ - options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \ - priest.c quest.c questpgr.c read.c rect.c region.c restore.c \ - rip.c rnd.c role.c \ - rumors.c save.c shk.c shknam.c sit.c sounds.c sp_lev.c spell.c \ - steal.c steed.c sys.c teleport.c timeout.c topten.c track.c \ - trap.c u_init.c \ - uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \ - windows.c wizard.c worm.c worn.c write.c zap.c - -# generated source files (tile.c is handled separately via WINxxxSRC) -GENCSRC = vis_tab.c #tile.c + botl.c calendar.c cfgfiles.c cmd.c coloratt.c dbridge.c decl.c detect.c \ + dig.c display.c dlb.c do.c do_name.c do_wear.c dog.c dogmove.c dokick.c \ + dothrow.c drawing.c dungeon.c earlyarg.c eat.c end.c engrave.c exper.c \ + explode.c extralev.c files.c fountain.c getpos.c glyphs.c hack.c \ + hacklib.c iactions.c insight.c invent.c light.c lock.c \ + mail.c makemon.c mcastu.c mhitm.c mhitu.c minion.c \ + mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c mondata.c \ + monmove.c monst.c mplayer.c mthrowu.c muse.c music.c o_init.c \ + objects.c objnam.c options.c pager.c pickup.c pline.c polyself.c \ + potion.c pray.c priest.c quest.c questpgr.c read.c rect.c \ + region.c report.c restore.c rip.c rnd.c role.c rumors.c save.c \ + selvar.c sfstruct.c shk.c shknam.c sit.c sounds.c sp_lev.c \ + spell.c stairs.c steal.c steed.c strutil.c sys.c teleport.c \ + timeout.c topten.c track.c trap.c u_init.c uhitm.c vault.c \ + version.c vision.c weapon.c were.c wield.c windows.c wizard.c \ + wizcmds.c worm.c worn.c write.c zap.c + +#-# generated source files (vis_tab.c is gone; tile.c is handled separately +#-# via WINxxxSRC) +#-GENCSRC = #tile.c # .c files for this version (for date.h) VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(RANDSRC) $(GENCSRC) -# all .h files except date.h, onames.h, pm.h, and vis_tab.h which would +# all .h files except date.h which would # cause dependency loops if run through "make depend" -# and dgn_comp.h, dgn_file.h, lev_comp.h, special level & dungeon files. # -HACKINCL = align.h amiconf.h artifact.h artilist.h attrib.h beconf.h color.h \ - config.h config1.h context.h coord.h decl.h def_os2.h display.h \ - dlb.h dungeon.h engrave.h extern.h flag.h func_tab.h global.h \ - hack.h lev.h macconf.h mextra.h mfndpos.h micro.h mkroom.h \ - monattk.h mondata.h monflag.h monst.h monsym.h obj.h objclass.h \ - os2conf.h patchlevel.h pcconf.h permonst.h prop.h rect.h \ - region.h rm.h sp_lev.h spell.h sys.h system.h tcap.h timeout.h \ - tosconf.h tradstdc.h trampoli.h trap.h unixconf.h vision.h \ - vmsconf.h wintty.h winX.h winprocs.h wintype.h you.h youprop.h - -#HSOURCES = $(HACKINCL) date.h onames.h pm.h vis_tab.h\ -# lev_comp.h dgn_comp.h dgn_file.h +HACKINCL = align.h artifact.h artilist.h attrib.h botl.h \ + color.h config.h config1.h context.h coord.h cstd.h decl.h \ + defsym.h display.h dlb.h dungeon.h engrave.h extern.h flag.h \ + fnamesiz.h func_tab.h global.h warnings.h hack.h lint.h mextra.h \ + micro.h mkroom.h monattk.h mondata.h monflag.h monst.h monsters.h \ + mfndpos.h nhmd4.h obj.h objects.h objclass.h optlist.h patchlevel.h \ + pcconf.h permonst.h prop.h rect.h region.h savefile.h selvar.h sym.h \ + rm.h sp_lev.h spell.h sndprocs.h seffects.h stairs.h sys.h \ + tcap.h timeout.h tradstdc.h trap.h unixconf.h vision.h vmsconf.h \ + wintty.h wincurs.h winX.h winprocs.h wintype.h you.h youprop.h \ + weight.h + + +#HSOURCES = $(HACKINCL) date.h onames.h pm.h # the following .obj's should be made before any others (for makedefs) FIRSTOBJ = vmsmisc.obj,vmsfiles.obj,monst.obj,objects.obj # split up long list so that we can write pieces of it into nethack.opt HOBJ1 = allmain.obj,alloc.obj,apply.obj,artifact.obj,attrib.obj, \ - ball.obj,bones.obj,botl.obj,cmd.obj,dbridge.obj,decl.obj, \ - detect.obj,dig.obj,display.obj,dlb.obj,do.obj,do_name.obj,do_wear.obj + ball.obj,bones.obj,botl.obj,calendar.obj,cfgfiles.obj,cmd.obj, \ + coloratt.obj,dbridge.obj,decl.obj,detect.obj,dig.obj,display.obj, \ + dlb.obj,do.obj,do_name.obj,do_wear.obj HOBJ2 = dog.obj,dogmove.obj,dokick.obj,dothrow.obj,drawing.obj, \ - dungeon.obj,eat.obj,end.obj,engrave.obj,exper.obj,explode.obj, \ - extralev.obj,files.obj,fountain.obj,hack.obj,hacklib.obj,invent.obj -HOBJ3 = light.obj,lock.obj,mail.obj,makemon.obj,mapglyph.obj,mcastu.obj, \ + dungeon.obj,earlyarg.obj,eat.obj,end.obj,engrave.obj,exper.obj,explode.obj, \ + extralev.obj,files.obj,fountain.obj,getpos.obj,glyphs.obj,hack.obj, \ + hacklib.obj,iactions.obj,insight.obj,invent.obj +HOBJ3 = light.obj,lock.obj,mail.obj,makemon.obj,mcastu.obj, \ mhitm.obj,mhitu.obj,minion.obj,mklev.obj,mkmap.obj,mkmaze.obj, \ mkobj.obj,mkroom.obj,mon.obj,mondata.obj,monmove.obj HOBJ4 = mplayer.obj,mthrowu.obj,muse.obj,music.obj,o_init.obj,objnam.obj, \ options.obj,pager.obj,pickup.obj,pline.obj,polyself.obj, \ potion.obj,pray.obj,priest.obj,quest.obj,questpgr.obj,read.obj HOBJ5 = rect.obj,region.obj,restore.obj,rip.obj,rnd.obj,role.obj, \ - rumors.obj,save.obj,shk.obj,shknam.obj,sit.obj,sounds.obj,sp_lev.obj, \ - spell.obj,steal.obj,steed.obj,sys.obj,teleport.obj,timeout.obj, \ - topten.obj, track.obj,trap.obj -HOBJ6 = u_init.obj,uhitm.obj,vault.obj,vision.obj,vis_tab.obj,weapon.obj, \ - were.obj,wield.obj,windows.obj,wizard.obj,worm.obj,worn.obj, \ + rumors.obj,save.obj,selvar.obj,sfstruct.obj,shk.obj,shknam.obj,sit.obj, \ + sounds.obj,sp_lev.obj,spell.obj,stairs.obj,steal.obj,steed.obj,sys.obj, \ + teleport.obj,timeout.obj,topten.obj, track.obj,trap.obj +HOBJ6 = u_init.obj,uhitm.obj,utf8map.obj,vault.obj,vision.obj,weapon.obj, \ + were.obj,wield.obj,windows.obj,wizard.obj,wizcmds.obj,worm.obj,worn.obj, \ write.obj,zap.obj,version.obj HOBJ = $(FIRSTOBJ) $(SYSOBJ) $(WINOBJ) $(RANDOBJ) \ $(HOBJ1) $(HOBJ2) $(HOBJ3) $(HOBJ4) $(HOBJ5) $(HOBJ6) +LUAOBJ = nhlua.o,nhlsel.o + +# 5.4.0 added header files ljumptab.h and lopnames.h and removes lbitlib.c +# so comment top two and uncomment bottom two for the previous version (5.3.5) +LUA535SRCFILES = +LUA535OBJFILES = +#LUA535SRCFILES = $(LUA)lbitlib.c +#LUA535OBJFILES = lbitlib.o, +endif + +LUALIBSRC = $(LUA)lapi.c $(LUA)lauxlib.c $(LUA)lbaselib.c \ + $(LUA535SRCFILES) $(LUA)lcode.c $(LUA)lcorolib.c \ + $(LUA)lctype.c $(LUA)ldblib.c $(LUA)ldebug.c \ + $(LUA)ldo.c $(LUA)ldump.c $(LUA)lfunc.c $(LUA)lgc.c \ + $(LUA)linit.c $(LUA)liolib.c $(LUA)llex.c \ + $(LUA)lmathlib.c $(LUA)lmem.c $(LUA)loadlib.c \ + $(LUA)lobject.c $(LUA)lopcodes.c $(LUA)loslib.c \ + $(LUA)lparser.c $(LUA)lstate.c $(LUA)lstring.c \ + $(LUA)lstrlib.c $(LUA)ltable.c $(LUA)ltablib.c \ + $(LUA)ltm.c $(LUA)lundump.c $(LUA)lutf8lib.c \ + $(LUA)lvm.c $(LUA)lzio.c + +LUALIBOBJ1 = lapi.obj,lauxlib.obj,lbaselib.obj, $(LUA535OBJFILES) \ + lcode.obj,lcorolib.obj,lctype.obj,ldblib.obj +LUALIBOBJ2 = ldebug.obj,ldo.obj,ldump.obj,lfunc.obj, \ + lgc.obj,linit.obj,liolib.obj,llex.obj +LUALIBOBJ3 = lmathlib.obj,lmem.obj,loadlib.obj,lobject.obj, \ + lopcodes.obj,loslib.obj,lparser.obj,lstate.obj +LUALIBOBJ4 = lstring.obj,lstrlib.obj,ltable.obj,ltablib.obj, \ + ltm.obj,lundump.obj,lutf8lib.obj,lvm.obj,lzio.obj +LUALIBOBJ = $(LUALIBOBJ1) $(LUALIBOBJ2) $(LUALIBOBJ3) $(LUALIBOBJ4) + # simpler target name nethack : $(GAME) @ $(ECHO) "nethack is up to date." @@ -217,7 +256,7 @@ nethack : $(GAME) $(GAME) : $(SYSTEM) @ $(NOOP) -$(SYSTEM) : $(LIBOPT) $(ID_OPT) $(HOBJ) nethack.opt +$(SYSTEM) : $(LIBOPT) $(ID_OPT) $(HOBJ) $(LUAOBJ) $(LUALIBOBJ) nethack.opt @ $(ECHO) "Linking ..." $(LINK)/Exe=$(GAME) $(LFLAGS) nethack.opt/Opt,$(LIBOPT)/Opt,$(ID_OPT)/Opt $(TOUCH) $(SYSTEM) @@ -239,6 +278,11 @@ nethack.opt : $(MAKEFILE) # this file @ write f f$edit("$(HOBJ4)","COLLAPSE") @ write f f$edit("$(HOBJ5)","COLLAPSE") @ write f f$edit("$(HOBJ6)","COLLAPSE") + @ write f f$edit("$(LUAOBJ)","COLLAPSE") + @ write f f$edit("$(LUALIBOBJ1)","COLLAPSE") + @ write f f$edit("$(LUALIBOBJ2)","COLLAPSE") + @ write f f$edit("$(LUALIBOBJ3)","COLLAPSE") + @ write f f$edit("$(LUALIBOBJ4)","COLLAPSE") @ write f "sys$library:starlet.olb/Include=(lib$initialize) @ write f "! psect_attributes Usr, noPic, and Long removed" @ write f "psect_attr=lib$initialize, Con,Rel,Gbl,noShr,noExe,Rd,noWrt" @@ -282,9 +326,9 @@ objects.obj : $(MAKEDEFS) : $(FIRSTOBJ) $(UTL)makedefs.c \ $(CONFIG_H) $(INC)permonst.h $(INC)objclass.h \ - $(INC)monsym.h $(INC)artilist.h $(INC)dungeon.h \ - $(INC)obj.h $(INC)monst.h $(INC)you.h $(INC)flag.h \ - $(INC)dlb.h $(INC)patchlevel.h $(INC)qtext.h \ + $(INC)sym.h $(INC)defsym.h $(INC)artilist.h \ + $(INC)dungeon.h $(INC)obj.h $(INC)monst.h $(INC)you.h \ + $(INC)flag.h $(INC)dlb.h $(INC)patchlevel.h \ $(LIBOPT) $(ID_OPT) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(MAKEDEFS) @@ -297,13 +341,7 @@ $(INC)pm.h : $(MAKEDEFS) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(INC)pm.h @ $(CD) $(SRC) -# both vis_tab.h and vis_tab.c are made at the same time by makedefs -$(INC)vis_tab.h : vis_tab.c - $(TOUCH) $(INC)vis_tab.h -vis_tab.c : $(MAKEDEFS) - $(CD) $(UTL) - $(MAKE)$(MAKEFLAGS) $(SRC)vis_tab.c - @ $(CD) $(SRC) + $(SRC)tile.c : $(WINSHR)tilemap.c $(HACK_H) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(SRC)tile.c @@ -323,12 +361,16 @@ $(INC)date.h : $(VERSOURCES) $(HACK_H) $(MAKE)$(MAKEFLAGS) $(INC)date.h @ $(CD) $(SRC) -# special targets (monstr.c is an obsolete generated source file) +# special targets (monstr.c, vis_tab.{c,h} are obsolete generated files; +# pm.h, onames.h, date.h, and tile.c are current generated files) clean : - if f$search("*.*;-2").nes."" then purge/Keep=2 - - if f$search("$(INC)*.*;-2").nes."" then purge/Keep=2 $(INC) /Exclude=*conf*.h + - if f$search("$(INC)*.*;-2").nes."" then \ + purge/Keep=2 $(INC) /Exclude=*conf*.h - if f$search("*.obj").nes."" then delete *.obj;* - if f$search("*.h-t").nes."" then delete *.h-t;* !$(HACK_H),$(CONFIG_H) + - if f$search("$(INC)vis_tab.h").nes."" then delete $(INC)vis_tab.h;* + - if f$search("vis_tab.c").nes."" then delete vis_tab.c;* - if f$search("monstr.c").nes."" then delete monstr.c;* spotless : clean @@ -336,8 +378,7 @@ spotless : clean - if f$search("$(INC)*.*;-1").nes."" then purge $(INC) - if f$search("$(SYSTEM)").nes."" then delete $(SYSTEM) - if f$search("$(GAME)").nes."" then delete $(GAME) - - delete vis_tab.c;,$(INC)vis_tab.h;,\ - $(INC)pm.h;,$(INC)onames.h;,$(INC)date.h; + - delete $(INC)pm.h;,$(INC)onames.h;,$(INC)date.h; - if f$search("tile.c").nes."" then delete tile.c; - if f$search("tclib.c").nes."" then delete tclib.c; - if f$search("random.c").nes."" then delete random.c; @@ -347,15 +388,12 @@ spotless : clean # dependencies (mostly cloned from sys/unix/Makefile.src) # config.h timestamp $(CONFIG_H) : $(INC)config.h $(INC)config1.h $(INC)tradstdc.h $(INC)global.h \ - $(INC)coord.h $(INC)vmsconf.h $(INC)system.h \ - $(INC)unixconf.h $(INC)os2conf.h $(INC)micro.h \ - $(INC)pcconf.h $(INC)tosconf.h $(INC)amiconf.h \ - $(INC)macconf.h $(INC)beconf.h $(INC)wceconf.h \ - $(INC)ntconf.h + $(INC)coord.h $(INC)vmsconf.h $(INC)system.h $(INC)unixconf.h \ + $(INC)micro.h $(INC)pcconf.h $(INC)windconf.h $(INC)objects.h $(TOUCH) $(CONFIG_H) # hack.h timestamp $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \ - $(INC)dungeon.h $(INC)monsym.h $(INC)mkroom.h \ + $(INC)dungeon.h $(INC)sym.h $(INC)defsym.h $(INC)mkroom.h \ $(INC)objclass.h $(INC)youprop.h $(INC)prop.h \ $(INC)permonst.h $(INC)monattk.h \ $(INC)monflag.h $(INC)mondata.h $(INC)pm.h \ @@ -363,10 +401,10 @@ $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \ $(INC)spell.h $(INC)color.h $(INC)obj.h \ $(INC)you.h $(INC)attrib.h $(INC)monst.h \ $(INC)mextra.h $(INC)skills.h \ - $(INC)onames.h $(INC)timeout.h $(INC)trap.h \ + $(INC)monsters.h $(INC)timeout.h $(INC)trap.h \ $(INC)flag.h $(INC)rm.h $(INC)vision.h \ $(INC)display.h $(INC)engrave.h $(INC)rect.h $(INC)region.h \ - $(INC)winprocs.h $(INC)wintty.h $(INC)trampoli.h $(INC)sys.h + $(INC)weight.h $(INC)winprocs.h $(INC)wintty.h $(INC)sys.h $(TOUCH) $(HACK_H) # VMS-specific code vmsmain.obj : $(VMS)vmsmain.c $(HACK_H) $(INC)dlb.h @@ -375,7 +413,7 @@ vmsunix.obj : $(VMS)vmsunix.c $(HACK_H) vmsmisc.obj : $(VMS)vmsmisc.c $(VMS)oldcrtl.c $(CONFIG_H) vmsfiles.obj : $(VMS)vmsfiles.c $(CONFIG_H) vmsmail.obj : $(VMS)vmsmail.c $(CONFIG_H) $(INC)mail.h \ - $(INC)wintype.h $(INC)winprocs.h + $(INC)wintype.h $(INC)winprocs.h $(INC)color.h # conditionally used code -- VMS always wants these isaac64.obj : isaac64.c $(CONFIG_H) $(INC)isaac64.h random.obj : random.c $(HACK_H) @@ -384,14 +422,13 @@ random.c : $(SYSSHR)random.c tclib.obj : tclib.c $(CONFIG_H) tclib.c : $(SYSSHR)tclib.c copy $(SYSSHR)tclib.c tclib.c -# user interface code -- VMS uses tty or curses or both, not X11 +# user interface code -- VMS uses tty, not curses or X11 getline.obj : $(TTY)getline.c $(HACK_H) $(INC)func_tab.h termcap.obj : $(TTY)termcap.c $(HACK_H) $(INC)tcap.h topl.obj : $(TTY)topl.c $(HACK_H) $(INC)tcap.h wintty.obj : $(TTY)wintty.c $(HACK_H) $(INC)dlb.h \ - $(INC)date.h $(INC)patchlevel.h $(INC)tcap.h -cursmain.obj : $(CURSES)cursmain.c $(HACK_H) $(INC)patchlevel.h \ - $(INC)wincurs.h + $(INC)date.h $(INC)tcap.h +cursmain.obj : $(CURSES)cursmain.c $(HACK_H) $(INC)wincurs.h curswins.obj : $(CURSES)curswins.c $(HACK_H) $(INC)wincurs.h \ $(CURSES)curswins.h cursmisc.obj : $(CURSES)cursmisc.c $(HACK_H) $(INC)wincurs.h \ @@ -409,7 +446,7 @@ cursinvt.obj : $(CURSES)cursinvt.c $(HACK_H) $(INC)wincurs.h \ Window.obj : $(X11)Window.c $(INC)xwindowp.h $(INC)xwindow.h $(CONFIG_H) dialogs.obj : $(X11)dialogs.c $(CONFIG_H) winX.obj : $(X11)winX.c $(HACK_H) $(INC)winX.h $(INC)dlb.h \ - $(INC)patchlevel.h $(X11)nh72icon $(X11)nh56icon $(X11)nh32icon + $(X11)nh72icon $(X11)nh56icon $(X11)nh32icon winmap.obj : $(X11)winmap.c $(INC)xwindow.h $(HACK_H) $(INC)dlb.h \ $(INC)winX.h $(INC)tile2x11.h winmenu.obj : $(X11)winmenu.c $(HACK_H) $(INC)winX.h @@ -419,7 +456,43 @@ winstat.obj : $(X11)winstat.c $(HACK_H) $(INC)winX.h wintext.obj : $(X11)wintext.c $(HACK_H) $(INC)winX.h $(INC)xwindow.h winval.obj : $(X11)winval.c $(HACK_H) $(INC)winX.h tile.obj : $(SRC)tile.c $(HACK_H) -vis_tab.obj : vis_tab.c $(CONFIG_H) $(INC)vis_tab.h + +# lua 5.4.0 code +lapi.obj : $(LUA)lapi.c +lauxlib.obj : $(LUA)lauxlib.c +lbaselib.obj : $(LUA)lbaselib.c +#uncomment this for 5.3.5 +#lbitlib.obj : $(LUA)lbitlib.c +lcode.obj : $(LUA)lcode.c +lcorolib.obj : $(LUA)lcorolib.c +lctype.obj : $(LUA)lctype.c +ldblib.obj : $(LUA)ldblib.c +ldebug.obj : $(LUA)ldebug. +ldo.obj : $(LUA)ldo.c +ldump.obj : $(LUA)ldump.c +lfunc.obj : $(LUA)lfunc.c +lgc.obj : $(LUA)lgc.c +linit.obj : $(LUA)linit.c +liolib.obj : $(LUA)liolib.c +llex.obj : $(LUA)llex.c +lmathlib.obj : $(LUA)lmathlib.c +lmem.obj : $(LUA)lmem.c +loadlib.obj : $(LUA)loadlib.c +lobject.obj : $(LUA)lobject.c +lopcodes.obj : $(LUA)lopcodes.c +loslib.obj : $(LUA)loslib.c +lparser.obj : $(LUA)lparser.c +lstate.obj : $(LUA)lstate.c +lstring.obj : $(LUA)lstring.c +lstrlib.obj : $(LUA)lstrlib.c +ltable.obj : $(LUA)ltable.c +ltablib.obj : $(LUA)ltablib.c +ltm.obj : $(LUA)ltm.c +lundump.obj : $(LUA)lundump.c +lutf8lib.obj : $(LUA)lutf8lib.c +lvm.obj : $(LUA)lvm.c +lzio.obj : $(LUA)lzio.c + # general code allmain.obj : allmain.c $(HACK_H) alloc.obj : alloc.c $(CONFIG_H) @@ -427,16 +500,17 @@ apply.obj : apply.c $(HACK_H) artifact.obj : artifact.c $(HACK_H) $(INC)artifact.h $(INC)artilist.h attrib.obj : attrib.c $(HACK_H) ball.obj : ball.c $(HACK_H) -bones.obj : bones.c $(HACK_H) $(INC)lev.h +bones.obj : bones.c $(HACK_H) botl.obj : botl.c $(HACK_H) -cmd.obj : cmd.c $(HACK_H) $(INC)lev.h $(INC)func_tab.h +cmd.obj : cmd.c $(HACK_H) $(INC)func_tab.h +cfgfiles.obj : cfgfiles.c $(HACK_H) dbridge.obj : dbridge.c $(HACK_H) decl.obj : decl.c $(HACK_H) detect.obj : detect.c $(HACK_H) $(INC)artifact.h dig.obj : dig.c $(HACK_H) display.obj : display.c $(HACK_H) dlb.obj : dlb.c $(CONFIG_H) $(INC)dlb.h -do.obj : do.c $(HACK_H) $(INC)lev.h +do.obj : do.c $(HACK_H) do_name.obj : do_name.c $(HACK_H) do_wear.obj : do_wear.c $(HACK_H) dog.obj : dog.c $(HACK_H) @@ -444,10 +518,11 @@ dogmove.obj : dogmove.c $(HACK_H) $(INC)mfndpos.h dokick.obj : dokick.c $(HACK_H) dothrow.obj : dothrow.c $(HACK_H) drawing.obj : drawing.c $(HACK_H) $(INC)tcap.h -dungeon.obj : dungeon.c $(HACK_H) $(INC)dgn_file.h $(INC)dlb.h $(INC)lev.h +dungeon.obj : dungeon.c $(HACK_H) $(INC)dgn_file.h $(INC)dlb.h +earlyarg.obj : earlyarg.c $(HACK_H) eat.obj : eat.c $(HACK_H) -end.obj : end.c $(HACK_H) $(INC)lev.h $(INC)dlb.h -engrave.obj : engrave.c $(HACK_H) $(INC)lev.h +end.obj : end.c $(HACK_H) $(INC)dlb.h +engrave.obj : engrave.c $(HACK_H) exper.obj : exper.c $(HACK_H) explode.obj : explode.c $(HACK_H) extralev.obj : extralev.c $(HACK_H) @@ -455,32 +530,33 @@ files.obj : files.c $(HACK_H) $(INC)dlb.h $(INC)wintty.h #zlib.h fountain.obj : fountain.c $(HACK_H) hack.obj : hack.c $(HACK_H) hacklib.obj : hacklib.c $(HACK_H) +iactions.obj : iactions.c $(HACK_H) +insight.obj : insight.c $(HACK_H) invent.obj : invent.c $(HACK_H) -light.obj : light.c $(HACK_H) $(INC)lev.h +light.obj : light.c $(HACK_H) lock.obj : lock.c $(HACK_H) mail.obj : mail.c $(HACK_H) $(INC)mail.h makemon.obj : makemon.c $(HACK_H) -mapglyph.obj : mapglyph.c $(HACK_H) $(INC)wintty.h $(INC)color.h mcastu.obj : mcastu.c $(HACK_H) mhitm.obj : mhitm.c $(HACK_H) $(INC)artifact.h mhitu.obj : mhitu.c $(HACK_H) $(INC)artifact.h minion.obj : minion.c $(HACK_H) mklev.obj : mklev.c $(HACK_H) mkmap.obj : mkmap.c $(HACK_H) $(INC)sp_lev.h -mkmaze.obj : mkmaze.c $(HACK_H) $(INC)sp_lev.h $(INC)lev.h +mkmaze.obj : mkmaze.c $(HACK_H) $(INC)sp_lev.h mkobj.obj : mkobj.c $(HACK_H) mkroom.obj : mkroom.c $(HACK_H) mon.obj : mon.c $(HACK_H) $(INC)mfndpos.h mondata.obj : mondata.c $(HACK_H) monmove.obj : monmove.c $(HACK_H) $(INC)mfndpos.h $(INC)artifact.h monst.obj : monst.c $(CONFIG_H) $(INC)permonst.h $(INC)align.h \ - $(INC)monattk.h $(INC)monflag.h $(INC)monsym.h \ - $(INC)color.h + $(INC)monattk.h $(INC)monflag.h $(INC)sym.h \ + $(INC)defsym.h $(INC)color.h mplayer.obj : mplayer.c $(HACK_H) mthrowu.obj : mthrowu.c $(HACK_H) muse.obj : muse.c $(HACK_H) music.obj : music.c $(HACK_H) #interp.c -o_init.obj : o_init.c $(HACK_H) $(INC)lev.h +o_init.obj : o_init.c $(HACK_H) objects.obj : objects.c $(CONFIG_H) $(INC)obj.h $(INC)objclass.h \ $(INC)prop.h $(INC)skills.h $(INC)color.h objnam.obj : objnam.c $(HACK_H) @@ -493,17 +569,18 @@ polyself.obj : polyself.c $(HACK_H) potion.obj : potion.c $(HACK_H) pray.obj : pray.c $(HACK_H) priest.obj : priest.c $(HACK_H) $(INC)mfndpos.h -quest.obj : quest.c $(HACK_H) $(INC)qtext.h -questpgr.obj : questpgr.c $(HACK_H) $(INC)dlb.h $(INC)qtext.h +quest.obj : quest.c $(HACK_H) +questpgr.obj : questpgr.c $(HACK_H) $(INC)dlb.h read.obj : read.c $(HACK_H) rect.obj : rect.c $(HACK_H) -region.obj : region.c $(HACK_H) $(INC)lev.h -restore.obj : restore.c $(HACK_H) $(INC)lev.h $(INC)tcap.h +region.obj : region.c $(HACK_H) +restore.obj : restore.c $(HACK_H) $(INC)tcap.h rip.obj : rip.c $(HACK_H) rnd.obj : rnd.c $(HACK_H) role.obj : role.c $(HACK_H) -rumors.obj : rumors.c $(HACK_H) $(INC)lev.h $(INC)dlb.h -save.obj : save.c $(HACK_H) $(INC)lev.h +rumors.obj : rumors.c $(HACK_H) $(INC)dlb.h +save.obj : save.c $(HACK_H) +sfstruct.obj : sfstruct.c $(HACK_H) shk.obj : shk.c $(HACK_H) shknam.obj : shknam.c $(HACK_H) sit.obj : sit.c $(HACK_H) $(INC)artifact.h @@ -514,21 +591,21 @@ steal.obj : steal.c $(HACK_H) steed.obj : steed.c $(HACK_H) sys.obj : sys.c $(HACK_H) teleport.obj : teleport.c $(HACK_H) -timeout.obj : timeout.c $(HACK_H) $(INC)lev.h -topten.obj : topten.c $(HACK_H) $(INC)dlb.h $(INC)patchlevel.h +timeout.obj : timeout.c $(HACK_H) +topten.obj : topten.c $(HACK_H) $(INC)dlb.h track.obj : track.c $(HACK_H) trap.obj : trap.c $(HACK_H) u_init.obj : u_init.c $(HACK_H) uhitm.obj : uhitm.c $(HACK_H) vault.obj : vault.c $(HACK_H) -version.obj : version.c $(HACK_H) $(INC)dlb.h $(INC)date.h $(INC)patchlevel.h -vision.obj : vision.c $(HACK_H) $(INC)vis_tab.h +version.obj : version.c $(HACK_H) $(INC)dlb.h $(INC)date.h +vision.obj : vision.c $(HACK_H) weapon.obj : weapon.c $(HACK_H) were.obj : were.c $(HACK_H) wield.obj : wield.c $(HACK_H) windows.obj : windows.c $(HACK_H) $(INC)wingem.h $(INC)winGnome.h -wizard.obj : wizard.c $(HACK_H) $(INC)qtext.h -worm.obj : worm.c $(HACK_H) $(INC)lev.h +wizard.obj : wizard.c $(HACK_H) +worm.obj : worm.c $(HACK_H) worn.obj : worn.c $(HACK_H) write.obj : write.c $(HACK_H) zap.obj : zap.c $(HACK_H) diff --git a/sys/vms/Makefile.top b/sys/vms/Makefile.top index 2bdb2c951..d02dd4016 100644 --- a/sys/vms/Makefile.top +++ b/sys/vms/Makefile.top @@ -1,5 +1,5 @@ # NetHack Makefile (VMS) - top level for making & installing everything. -# NetHack 3.6 Makefile.top $NHDT-Date: 1524689428 2018/04/25 20:50:28 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.10 $ +# NetHack 5.0 Makefile.top $NHDT-Date: 1596498303 2020/08/03 23:45:03 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.11 $ # Copyright (c) 2011 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. diff --git a/sys/vms/Makefile.utl b/sys/vms/Makefile.utl index 88ff37c29..a9105ef11 100644 --- a/sys/vms/Makefile.utl +++ b/sys/vms/Makefile.utl @@ -1,5 +1,5 @@ # NetHack Makefile (VMS) - for utility programs. -# NetHack 3.6 Makefile.utl $NHDT-Date: 1542388602 2018/11/16 17:16:42 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.16 $ +# NetHack 5.0 Makefile.utl $NHDT-Date: 1609347482 2020/12/30 16:58:02 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.20 $ # Copyright (c) 2011 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. @@ -27,8 +27,6 @@ WINSHR = [-.win.share] WINX11 = [-.win.X11] # targets, with enough punctuation to keep MCR and DELETE happy MAKEDEFS= $(UTL)makedefs.exe; -LEVCOMP = $(UTL)lev_comp.exe; -DGNCOMP = $(UTL)dgn_comp.exe; DLB = $(UTL)dlb.exe; RECOVER = $(UTL)recover.exe; # used by $(DAT)Makefile for synchronization @@ -44,39 +42,9 @@ LFLAGS = /noMap LIBS = $(SRC)crtl.opt/Options,$(SRC)ident.opt/Options # run-time library LINK = link -# If you don't have yacc, byacc, or bison or just don't want to run any of -# them, then make target "no_yacc" before trying to build lev_comp -# or dgn_comp. You won't be able to modify *_comp.y though. -# If you don't have lex or flex, then make target "no_lex" and leave -# *_comp.l alone. $(VMS)lev_lex.h will be used to work-around some -# suspect code included in the distributed copies of *_lex.c. -# If you do either of the above, the corresponding value of YACC and/or LEX -# below won't matter. # -# Note: VMS POSIX V1.1 lex and yacc generate code which contains an -# invalid #module directive; it order to prevent warnings for CC or -# choking by GCC, the SEARCH command is used in an attempt to strip -# then out. Otherwise MMS would quit when making the affected targets. -# Each "munged" copy should be identical to its original if no #module -# directives are present. -# -# yacc/lex programs to use to generate *_comp.c, *_comp.h, and *_lex.c. -# choose xxxOUT that matches xxx tool's output -YACC = bison /Define -LEX = flex -#YACC = yacc -d -#LEX = lex -#YACC = posix/Run posix$bin:yacc. "-d -#LEX = posix/Run posix$bin:lex. " -# blank means foo.y -> foo_tab.c & foo_tab.h -YACCOUT = # bison -#YACCOUT = ytab # VMS POSIX -#YACCOUT = y_tab # DEC/Shell -LEXOUT = lexyy # flex -#LEXOUT = lex_yy # VMS POSIX - - # Nothing below this line should have to be changed. +# # linker options files LIBOPT = $(SRC)crtl.opt; @@ -88,8 +56,6 @@ HACK_H = $(SRC)hack.h-t # utility .c files MAKESRC = makedefs.c -SPLEVSRC = lev_yacc.c lev_lex.c lev_main.c -DGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c RECOVSRC = recover.c DLBSRC = dlb_main.c UTILSRCS = $(MAKESRC) $(SPLEVSRC) $(DGNCOMPSRC) $(RECOVSRC) $(DLBSRC) panic.c @@ -104,13 +70,6 @@ NAMEOBJS = $(NAMEOBJ1),$(NAMEOBJ2) # object files for makedefs MAKEOBJS = makedefs.obj,$(NAMEOBJ1) -# object files for special levels compiler -SPLEVOBJS = lev_main.obj,lev_yacc.obj,lev_lex.obj,panic.obj,\ - $(SRC)alloc.obj,$(NAMEOBJS) - -# object files for dungeon compiler -DGNCOMPOBJS = dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,panic.obj,$(SRC)alloc.obj - # object files for recovery utility RECOVOBJS = recover.obj @@ -122,26 +81,12 @@ DLBOBJS = dlb_main.obj,panic.obj,$(SRC)alloc.obj,$(SRC)dlb.obj default : @ $(ECHO) "Oops! No target(s) specified...." -all : $(MAKEDEFS) $(LEVCOMP) $(DGNCOMP) $(RECOVER) $(DLB) + NetHack.ad.tmp + grep -v ^#define ../win/X11/NetHack.ad | \ + sed -f NetHack.ad.tmp > NetHack.ad + -rm -f NetHack.ad.tmp + +pet_mark.xbm: $(WINX11)pet_mark.xbm + copy $(WINX11)pet_mark.xbm pet_mark.xbm + +pilemark.xbm: $(WINX11)pilemark.xbm + copy $(WINX11)pilemark.xbm pilemark.xbm + +rip.xpm: $(WINX11)rip.xpm + copy $(WINX11)rip.xpm rip.xpm + +nhsplash.xpm: $(WINSHR)nhsplash.xpm + copy $(WINSHR)nhsplash.xpm nhsplash.xpm + +nethack.icns: $(WINSHR)nhicns.uu + mcr $(UUDECODE) $(WINSHR)nhicns.uu + +data: data.base $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -d + +rumors: rumors.tru rumors.fal $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -r + +oracles: oracles.txt $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -h + +engrave: engrave.txt $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -s + +epitaph: epitaph.txt $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -s + +bogusmon: bogusmon.txt $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -s + +# note: 'options' should have already been made when include/date.h was created +options: $(UTIL)makedefs.exe + mcr $(UTIL)makedefs.exe -v + +# these don't actually do anything useful now that levcomp and dngcomp are gone +spec_levs: + $(TOUCH) spec_levs +quest_levs: + $(TOUCH) quest_levs + +clean: + -delete/log spec_levs.;*,quest_levs.;*,gitinfo.txt;* + +spotless: clean + -delete/log nhdat,$(addsuffix ;*$(comma),$(VARDAT) \ + x11tiles, pet_mark.xbm, pilemark.xbm, rip.xpm, mapbg.xpm, \ + rip.img, GEM_RSC.RSC, title.img, nh16.img, NetHack.ad, \ + nhsplash.xpm, nhtiles.bmp) + +#eof# diff --git a/sys/vms/Makefile_doc.vms b/sys/vms/Makefile_doc.vms new file mode 100644 index 000000000..762df59d8 --- /dev/null +++ b/sys/vms/Makefile_doc.vms @@ -0,0 +1,202 @@ +# NetHack Documentation Makefile. +# NetHack 5.0 Makefile.doc $NHDT-Date: 1596498290 2020/08/03 23:44:50 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.21 $ +# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland +# NetHack may be freely redistributed. See license for details. + +# Root of source tree: +NHSROOT=[-] + +# relative directories from src +DOC=[-.doc] +DAT=[-.dat] +INCL=[-.include] +SRC=[-.src] +UTIL=[-.util] +SYSVMS=[-.sys.vms] +SYSSHR=[-.sys.share] +SYSUNIX=[-.sys.unix] +WINTTY=[-.win.tty] +WINSHR=[-.win.share] +WINTTY=[-.win.tty] +WINCURS=[-.win.curses] +WINX11=[-.win.X11] +WINQT=[-.win.Qt] +WINSHIM=[-.win.shim] +WINCHAIN=[-.win.chain] + +# Lua location relative to src +LUAVER=548 +LUADOTVER=5.4.8 +LUAUNDERVER=5_4_8 +LUAINC=[-.lib.lua.lua$(LUAVER).src] +LUALIB=[-.lib.lua]lua$(LUAVER).olb +LUASRCDIR =[-.lib.lua.lua$(LUAVER).src] +LUASRCINCDIR=$(LUASRCDIR) +#LUASRCINCDIR=SYS$COMMON:[LUA.INCLUDE] + +# +# If your compiler needs an appropriate switch to accept C99 code. +# VSI C defaults to /STANDARD=relaxed which allows several C +# dialects including C99. +# +# CSTD=/STANDARD=C99 +# + +# Compiler flags +CFLAGS :=/INCLUDE=($(INCL),$(LUAINC)) /NAMES=(AS_IS) $(CSTD) +CXXFLAGS = /INCLUDE_DIR=($(INCL),$(LUAINC)) /NAMES=(AS_IS) + +# Link flags +LFLAGS = + +# external programs +# MAKE = make +CC = CC +#touch :=SET FILE/TRUNCATE +touch = append/New _NLA0: +LINK = link +RM = delete +#TRUE uses an actual helper true.exe +TRUE = true +#FALSE uses an actual helper false.exe +FALSE = false +#ECHO uses an actual helper echo.exe +ECHO = echo +CXX ?= CXX +MOC ?= moc +MOCPATH ?= $(QTDIR)/bin/$(MOC) +# The default is for the TARGET_* variables to match the defaults. +# If we're cross-compiling these will get overridden elsewhere, likely via + +MAKEDEFS = $(UTIL)makedefs + +# Which version do we want to build? (XXX These are not used anywhere.) +GUIDEBOOK = Guidebook # regular ASCII file +#GUIDEBOOK = Guidebook.ps # PostScript file +#GUIDEBOOK = Guidebook.dvi # TeX device-independent file + +# Some versions of col need -x to keep them from converting spaces to tabs; +# some versions of col don't do the conversion by default and don't +# recognize the option. Sigh. +COLCMD = col -bx +#COLCMD = col -b + +# The command to use to generate a PostScript file +# PSCMD = ditroff | psdit +PSCMD = groff + +# Use the "cat" GUIDECMD if nroff and/or tbl and/or col are not installed +# Not appropriate for creating Guidebook.txt. +# GUIDECMD = cat Guidebook.txt +# +# Single page. Might need adjustment to .pl value +# GUIDECMD= $(GUIDE_PREFORMAT) | perl -pe 's/^(.mt)$$/.pl 4720v\n.in 0\n.po 8\n.ll 64m\n$$1/' | nroff -c -Tascii | $(COLCMD) +# +GUIDECMD = $(GUIDE_PREFORMAT) | nroff -c -Tascii | $(COLCMD) +ONEPAGECMD = $(ONEPAGE_PREFORMAT) | nroff -c -Tascii | $(COLCMD) \ + | sed -e '/EOF--EOF/,12345D' + +# Only generate output for the current configuration: +NHGREP = mcr $(MAKEDEFS) --grep --input - --output - +NEEDMAKEDEFS = $(MAKEDEFS) +# Generate output for all configurations: +#NHGREP = mcr $(MAKEDEFS) --grep --input - --output - --grep-define ALLDOCS +#NEEDMAKEDEFS = $(MAKEDEFS) +# Fallback: +#NHGREP = cat +#NEEDMAKEDEFS = + +GUIDEBOOK_MN_SRC = Guidebook.mn +GUIDEBOOK_MN = $(GUIDEBOOK_MN_SRC) +GUIDEBOOK_TEX_SRC = Guidebook.tex +GUIDEBOOK_TEX = $(GUIDEBOOK_TEX_SRC) + +GUIDE_PREFORMAT = cat $(GUIDEBOOK_MN) | $(NHGREP) | tbl tmac.n - +# for Guidebook.dat, unpaginated version of Guidebook.txt +ONEPAGE_PREFORMAT = cat Gbk-1pg-pfx.mn $(GUIDEBOOK_MN) Gbk-1pg-sfx.mn \ + | $(NHGREP) | tbl tmac.n - + +# the basic guidebook +Guidebook : $(GUIDEBOOK_MN) tmac.n tmac.nh $(NEEDMAKEDEFS) + @echo disabled $@ on vms +# $(GUIDECMD) > Guidebook + +# Fancier output for those with ditroff, psdit and a PostScript printer. +Guidebook.ps : $(GUIDEBOOK_MN) tmac.n tmac.nh $(NEEDMAKEDEFS) + @echo disabled $@ on vms +# $(GUIDE_PREFORMAT) | $(PSCMD) > Guidebook.ps + +# Guidebook.tex is the same as Guidebook.mn but formatted with LaTeX. +# - The invocation command for LaTeX may vary in different installations. +# - To print Guidebook.dvi you need to use a suitable dvi-driver. +# - LaTeX needs to be run twice; second pass uses Guidebook.aux made by first. +Guidebook.dvi : $(GUIDEBOOK_TEX) + @echo disabled $@ on vms +# latex $(GUIDEBOOK_TEX) +# latex $(GUIDEBOOK_TEX) + +# makedefs has more dependencies than these; this is mainly to cope with the +# case where it hasn't been built yet since it is usually needed for $(NHGREP) +# (note: 'make makedefs', not 'make $(MAKEDEFS)') +$(MAKEDEFS) : ../util/makedefs.c ../include/config.h ../src/mdlib.c \ + ../util/mdgrep.h + pipe set def $(UTIL) && make makedefs && set def [-.doc] + +GAME = nethack +MANDIR = /usr/man/man6 +MANEXT = 6 + +# manual installation for most BSD-style systems +GAMEMANCREATE = cat nethack.6 | $(NHGREP) > +RCVRMANCREATE = cat recover.6 | $(NHGREP) > +DLBMANCREATE = cat dlb.6 | $(NHGREP) > +MDMANCREATE = cat makedefs.6 | $(NHGREP) > +# manual installation for most SYSV-style systems +# GAMEMANCREATE = cat nethack.6 | $(NHGREP) | nroff -man - > +# RCVRMANCREATE = cat recover.6 | $(NHGREP) | nroff -man - > +# DLBMANCREATE = cat dlb.6 | $(NHGREP) | nroff -man - > +# MDMANCREATE = cat makedefs.6 | $(NHGREP) | nroff -man - > + +manpages: + echo $@ disabled on VMS +# -$(GAMEMANCREATE) $(MANDIR)/$(GAME).$(MANEXT) +# -$(RCVRMANCREATE) $(MANDIR)/recover.$(MANEXT) +# -$(DLBMANCREATE) $(MANDIR)/dlb.$(MANEXT) +# -$(MDMANCREATE) $(MANDIR)/makedefs.$(MANEXT) + +# manual creation for distribution +DISTRIB = Guidebook.txt nethack.txt recover.txt \ + dlb.txt makedefs.txt + +distrib: $(DISTRIB) + echo $@ disabled on VMS +# @echo "Plain text documentation is up to date." + +Guidebook.txt : $(GUIDEBOOK_MN) tmac.n tmac.nh $(NEEDMAKEDEFS) + echo $@ disabled on VMS +# $(GUIDECMD) > $@ +Guidebook.dat : Gbk-1pg-pfx.mn Gbk-1pg-sfx.mn $(GUIDEBOOK_MN) tmac.n tmac.nh \ + $(NEEDMAKEDEFS) + echo $@ disabled on VMS +# $(ONEPAGECMD) > $@ + +MAN2TXT = $(NHGREP) | nroff -man - | $(COLCMD) +nethack.txt : nethack.6 + echo $@ disabled on VMS +# cat nethack.6 | $(MAN2TXT) > nethack.txt +recover.txt : recover.6 + echo $@ disabled on VMS +# cat recover.6 | $(MAN2TXT) > recover.txt +dlb.txt : dlb.6 + echo $@ disabled on VMS +# cat dlb.6 | $(MAN2TXT) > dlb.txt +makedefs.txt : makedefs.6 + echo $@ disabled on VMS +# cat makedefs.6 | $(MAN2TXT) > makedefs.txt + +clean: + -delete/log Guidebook.aux;*, Guidebook.log;* + +spotless: clean + -delete/log Guidebook.;*, Guidebook.dat;*, Guidebook.ps;*, \ + Guidebook.dvi;* diff --git a/sys/vms/Makefile_src.vms b/sys/vms/Makefile_src.vms new file mode 100644 index 000000000..160ddb95d --- /dev/null +++ b/sys/vms/Makefile_src.vms @@ -0,0 +1,844 @@ +# NetHack 5.0 Makefile.src $NHDT-Date: 1654287121 2022/06/03 20:12:01 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.145 $ +# Copyright (c) 2024 by Michael Allison +# NetHack may be freely redistributed. See license for details. +# +# OpenVMS GNU Makefile for OpenVMS 9.x and VSI C +# with GNU Make V4.1 (or greater). +# +# Tested on x86_64 version of OpenVMS V9.2-1. +# + +# Root of source tree: +NHSROOT=.. + +# If we're cross-compiling, a hints file will override this +# to a unique target directory, but otherwise the obj files just go +# into [-.src] +TARGETPFX= + +# relative directories from src +DOC=[-.doc] +DAT=[-.dat] +INCL=[-.include] +SRC=[-.src] +UTIL=[-.util] +SYSVMS=[-.sys.vms] +SYSSHR=[-.sys.share] +SYSUNIX=[-.sys.unix] +WINTTY=[-.win.tty] +WINSHR=[-.win.share] +WINTTY=[-.win.tty] +WINCURS=[-.win.curses] +WINX11=[-.win.X11] +WINQT=[-.win.Qt] +WINSHIM=[-.win.shim] +WINCHAIN=[-.win.chain] + +# Lua +LUAVER=548 +LUADOTVER=5.4.8 +LUAUNDERVER=5_4_8 +# Lua location relative to src +LUAINC=[-.lib.lua.lua$(LUAVER).src] +LUALIB=[-.lib.lua]lua$(LUAVER).olb +LUASRCDIR =[-.lib.lua.lua$(LUAVER).src] +LUASRCINCDIR=$(LUASRCDIR) + +# +# If your compiler needs an appropriate switch to accept C99 code. +# VSI C defaults to /STANDARD=relaxed which allows several C +# dialects including C99. +# +# CSTD=/STANDARD=C99 +# + +# Compiler flags +CFLAGS :=/INCLUDE=($(INCL),$(LUAINC)) /NAMES=(AS_IS) $(CSTD) +CXXFLAGS = /INCLUDE_DIR=($(INCL),$(LUAINC)) /NAMES=(AS_IS) + +# Link flags +LFLAGS = + +# external programs +# MAKE = make +CC = CC +#touch :=SET FILE/TRUNCATE +touch = append/New _NLA0: +LINK = link +RM = delete +#TRUE uses an actual helper true.exe +TRUE = true +#FALSE uses an actual helper false.exe +FALSE = false +#ECHO uses an actual helper echo.exe +ECHO = echo +CXX ?= CXX +MOC ?= moc +MOCPATH ?= $(QTDIR)/bin/$(MOC) +# The default is for the TARGET_* variables to match the defaults. +# If we're cross-compiling these will get overridden elsewhere, likely via +# a hints file. TARGETPFX was set above earlier. +TARGET_CC = $(CC) +TARGET_CFLAGS = $(CFLAGS) +TARGET_LINK = $(LINK) +TARGET_LFLAGS = $(LFLAGS) +TARGET_CXX = $(CXX) +TARGET_CXXFLAGS = $(CXXFLAGS) +TARGET_LIBS = $(LIBS) + +HACKLIB=hacklib.olb +HACKLIBOBJLIST=hacklib.obj,[-.util]panic.obj + +# Set SYSTEM target +SYSTEM = SysVMS + +comma:=, + +# all .h files +CONFIGBASEH := color config config1 patchlevel tradstdc hacklib integer \ + global coord vmsconf cstd nhlua unixconf \ + pcconf micro windconf warnings fnamesiz + +HACKBASEH := hack lint align dungeon wintype sym defsym \ + mkroom artilist objclass objects youprop \ + prop permonst monattk monflag monsters \ + mondata context rm botl rect region trap \ + display vision seffects selvar sndprocs stairs decl \ + quest spell obj engrave you attrib monst \ + mextra skills timeout flag winprocs sys + +CONFIG_H = $(addsuffix .h, $(addprefix $(INCL), $(CONFIGBASEH))) +HACK_H = $(addsuffix .h, $(addprefix $(INCL), $(CONFIGBASEH) $(HACKBASEH))) + +#QTn_H = +# all .c that are part of the main NetHack program and are not +# operating-system or windowing-system specific. +# Do not include date.c in this list. +HACKFILES := allmain alloc apply artifact attrib ball bones botl \ + calendar cfgfiles cmd coloratt dbridge decl detect \ + dig display dlb do do_name do_wear dog dogmove dokick \ + dothrow drawing dungeon earlyarg eat end engrave exper explode \ + extralev files fountain getpos glyphs hack hacklib iactions \ + insight invent isaac64 light lock mail makemon mcastu mdlib mhitm \ + mhitu minion mklev mkmap mkmaze mkobj mkroom mon \ + mondata monmove monst mplayer mthrowu muse music \ + nhlua nhlsel nhlobj objnam o_init objects \ + options pager pickup pline polyself potion pray \ + priest quest questpgr read rect region report restore \ + rip rnd role rumors save selvar sfbase sfstruct \ + shk shknam sit sounds \ + sp_lev spell stairs steal steed strutil symbols sys teleport \ + timeout topten track trap u_init utf8map \ + uhitm vault version vision weapon were wield \ + windows wizard wizcmds worm worn write zap + +# the date file +DATEFILES = date + +# --------------- +# platforms / OS +# --------------- + +# Files for sys.vms +OPENVMSFILES = vmsfiles vmsmail vmsmisc vmstty vmsunix +OPENVMSMAIN = vmsmain + +# --------------- +# window ports +# --------------- + +# files for a straight tty interface +WINTTYFILES = getline termcap topl wintty + +# Files for curses interface +WINCURSESFILES = cursmain curswins cursmisc cursdial cursstat cursinit \ + cursmesg cursinvt + +# Files for X11 interface +WINX11FILES = Window dialogs winX winmap winmenu winmesg winmisc \ + winstat wintext winval + +# Files for Qt interface +WINQTFILES = qt_bind qt_click qt_clust qt_delay qt_glyph qt_icon qt_inv \ + qt_key qt_line qt_main qt_map qt_menu qt_msg qt_plsel qt_rip qt_set \ + qt_stat qt_str qt_streq qt_svsel qt_win qt_xcmd qt_yndlg + +# shared win files +#WINSHAREFILES = ioctl + +# +# Files for a Qt 4, Qt 5, or Qt 6 interface +# +# generated source files made by Qt's 'moc' program from $(WINQT)qt_*.h; +# appended to WINQTSRC for use by 'make depend' +# WINQTMOC = qt_kde0.moc qt_main.moc qt_map.moc qt_menu.moc qt_msg.moc \ +# qt_plsel.moc qt_set.moc qt_stat.moc qt_xcmd.moc qt_yndlg.moc +# WINQTSRC = $(WINQT)qt_bind.cpp $(WINQT)qt_click.cpp \ +# $(WINQT)qt_clust.cpp $(WINQT)qt_delay.cpp \ +# $(WINQT)qt_glyph.cpp $(WINQT)qt_icon.cpp $(WINQT)qt_inv.cpp \ +# $(WINQT)qt_key.cpp $(WINQT)qt_line.cpp $(WINQT)qt_main.cpp \ +# $(WINQT)qt_map.cpp $(WINQT)qt_menu.cpp $(WINQT)qt_msg.cpp \ +# $(WINQT)qt_plsel.cpp $(WINQT)qt_rip.cpp $(WINQT)qt_set.cpp \ +# $(WINQT)qt_stat.cpp $(WINQT)qt_str.cpp $(WINQT)qt_streq.cpp \ +# $(WINQT)qt_svsel.cpp $(WINQT)qt_win.cpp $(WINQT)qt_xcmd.cpp \ +# $(WINQT)qt_yndlg.cpp $(WINQTMOC) tile.c +# WINQTOBJ = $(TARGETPFX)qt_bind.o $(TARGETPFX)qt_click.o \ +# $(TARGETPFX)qt_clust.o $(TARGETPFX)qt_delay.o \ +# $(TARGETPFX)qt_glyph.o $(TARGETPFX)qt_icon.o \ +# $(TARGETPFX)qt_inv.o $(TARGETPFX)qt_key.o $(TARGETPFX)qt_line.o \ +# $(TARGETPFX)qt_main.o $(TARGETPFX)qt_map.o $(TARGETPFX)qt_menu.o \ +# $(TARGETPFX)qt_msg.o $(TARGETPFX)qt_plsel.o $(TARGETPFX)qt_rip.o \ +# $(TARGETPFX)qt_set.o $(TARGETPFX)qt_stat.o $(TARGETPFX)qt_str.o \ +# $(TARGETPFX)qt_streq.o $(TARGETPFX)qt_svsel.o $(TARGETPFX)qt_win.o \ +# $(TARGETPFX)qt_xcmd.o $(TARGETPFX)qt_yndlg.o #$(TARGETPFX)tile.o +# + +# ----------------- +# derived variables +# ----------------- + +HACKSRC = $(addsuffix .c, $(addprefix $(SRC), $(HACKFILES))) +DATESRC = $(addsuffix .c, $(addprefix $(SRC), $(DATEFILES))) +VMSSRC = $(addsuffix .c, $(addprefix $(SYSVMS), $(OPENVMSFILES))) +WINTTYSRC = $(addsuffix .c, $(addprefix $(WINTTY), $(WINTTYFILES))) +WINCURSESSRC = $(addsuffix .c, $(addprefix $(WINCURS), $(WINCURSESFILES))) +WINX11SRC = $(addsuffix .c, $(addprefix $(WINX11), $(WINX11FILES))) +WINQTSRC = $(addsuffix .cpp, $(addprefix $(WINQT), $(WINQTFILES))) +#WINSHARESRC = $(addsuffix .c, $(addprefix $(WINSHR), $(WINSHAREFILES))) +MAINSRC = $(addsuffix .c, $(addprefix $(SYSVMS), $(OPENVMSMAIN))) + +HACKOBJS = $(addsuffix .obj, $(HACKFILES)) +DATEOBJ = $(addsuffix .obj, $(DATEFILES)) +VMSOBJS = $(addsuffix .obj, $(OPENVMSFILES)) +WINTTYOBJS = $(addsuffix .obj, $(WINTTYFILES)) +#WINCURSESOBJS = $(addsuffix .obj, $(WINCURSESFILES)) +#WINX11OBJS = $(addsuffix .obj, $(WINX11FILES)) +#WINQTOBJS = $(addsuffix .obj, $(WINQTFILES)) +#WINSHAREOBJS = $(addsuffix .obj, $(WINSHAREFILES)) +MAINOBJ = $(addsuffix .obj, $(OPENVMSMAIN)) + +# file for regular expression matching +#REGEXFILE ?= posixregex +#REGEXOBJ ?= pmatchregex +REGEXFILE ?= cppregex +ifeq "$(REGEXFILE)" "cppregex" +REGEXSRC = $(addsuffix .cpp, $(addprefix $(SYSSHR), $(REGEXFILE))) +else +REGEXSRC = $(addsuffix .c, $(addprefix $(SYSSHR), $(REGEXFILE))) +endif +REGEXOBJ = $(addsuffix .obj, $(REGEXFILE)) + +# file for termcap +TERMCAPFILE ?= tclib +TERMCAPSRC = $(addsuffix .c, $(addprefix $(SYSSHR), $(TERMCAPFILE))) +TERMCAPOBJ = $(addsuffix .obj, $(TERMCAPFILE)) + +# if you defined RANDOM in unixconf.h since your system did not come +# with a reasonable random number generator +# RANDOBJ = $(TARGETPFX)random.obj +#RANDOBJ = + +LUABASESRC = lapi lauxlib lbaselib lcode lcorolib lctype ldblib \ + ldebug ldo ldump lfunc lgc linit liolib llex \ + lmathlib lmem loadlib lobject lopcodes loslib \ + lparser lstate lstring lstrlib ltable ltablib \ + ltm lundump lutf8lib lvm lzio +#LUASRC = $(addsuffix .c, $(addprefix $(LUASRCDIR), $(LUABASESRC))) +LUAOBJS = $(addsuffix .obj, $(LUABASESRC)) +LUALIBOBJS = $(addsuffix .obj$(comma), $(LUABASESRC)) +LUASPOTLESSOBJS = $(addsuffix .obj;*$(comma), $(LUABASESRC)) + +ALLSRC = $(HACKSRC) $(VMSSRC) $(WINTTYSRC) $(WINCURSESSRC) \ + $(WINX11SRC) $(WINQTSRC) $(WINSHARESRC) \ + $(REGEXSRC) $(TERMCAPSRC) +# +# $(TARGETPFX)date.o is not included in this list +ALLOBJS = $(HACKOBJS) $(VMSOBJS) $(WINTTYOBJS) $(RANDOBJ) \ + $(WINCURSESOBJS) $(WINX11OBJS) $(WINQTOBJS) \ + $(WINSHAREOBJS) $(REGEXOBJ) $(TERMCAPOBJ) + +GAME = nethack +# GAME = nethack.prg +GAMEBIN = $(GAME).exe + +LINKOBJLIST = $(addsuffix $(comma), $(ALLOBJS)) +CLEANFILES = $(addsuffix ;*$(comma), $(ALLOBJS) $(MAINOBJ) \ + $(GAMEBIN)) \ + $(DATEOBJ);* +SPOTLESSFILES = $(addsuffix ;*$(comma), $(LUASPOTLESSOBJS) \ + luaplaceholder.obj) + +# rules +%.obj: $(SRC)%.c + $(CC) $(CFLAGS) $< /OBJECT=$@ + +%.obj: $(SYSVMS)%.c + $(CC) $(CFLAGS) $< /OBJECT=$@ + +%.obj: $(SYSSHR)%.c + $(CC) $(CFLAGS) $< /OBJECT=$@ + +%.obj: $(SYSSHR)%.cpp + $(CXX) $(CXXFLAGS) $< -o $@ + +%.obj: $(LUASRCDIR)%.c + $(CC) $(CFLAGS) /define=(LUA_USE_C89) $< /OBJECT=$@ + +# targets +.PHONY: SysVMS all pregame $(GAME) clean spotless package +.PHONY: tell-fetch-lua fetch-lua + +# first target is also the default target for 'make' without any arguments +all: $(GAME) + @echo "" + +pregame: + $(PREGAME) + +$(GAME): pregame $(HACKLIB) $(MAKEDEFS) $(LUALIB) $(WAVS) $(GAMEBIN) + @echo "$(GAME) is up to date." + +$(GAMEBIN): $(LUALIB) $(MAINOBJ) $(ALLOBJS) $(DATEOBJ) + @echo "Linking $(GAME)." +# @echo $(TARGET_LINK) $(TARGET_LFLAGS) $(MAINOBJ), \ +# $(LINKOBJLIST) $(DATEOBJ) \ +# /EXECUTABLE=$@ \ +# +sys$$common:[lua.lib]liblua.olb/library + $(AT)$(TARGET_LINK) $(TARGET_LFLAGS) $(MAINOBJ), \ + $(LINKOBJLIST) $(DATEOBJ) \ + /EXECUTABLE=$@\ + +$(LUALIB)/library + +hacklib.olb: $(HACKLIBOBJLIST) + if f$$search("hacklib.olb").eqs."" then - + library/create hacklib.olb/object + library/insert/replace hacklib.olb $(HACKLIBOBJLIST) + +#$(WINLIB) $(TARGET_LIBS) $(LUALIB) + +$(INCL)nhlua.h: + echo "/* nhlua.h - generated by Makefile.vms */" > $@ + @echo \#"include ""$(LUASRCINCDIR)lua.h""" >> $@ + @echo "ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN;" >>$@ + @echo \#"include ""$(LUASRCINCDIR)lualib.h""" >> $@ + @echo \#"include ""$(LUASRCINCDIR)lauxlib.h""" >> $@ + @echo "/*nhlua.h*/" >> $@ + +#$(INCL)nhlua.h: +# echo "/* nhlua.h - generated by -vms9 */" > $@ +# @echo \#"include ""sys$$common:[lua.include]lua.h""" >> $@ +# @echo "ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN;" >>$@ +# @echo \#"include ""sys$$common:[lua.include]lualib.h""" >> $@ +# @echo \#"include ""sys$$common:[lua.include]lauxlib.h""" >> $@ +# @echo "/*nhlua.h*/" >> $@ + +$(LUALIB): [-.lib.lua]lua$(LUAVER).dir $(LUAOBJS) luaplaceholder.obj + if f$$search("$(LUALIB)").eqs."" then library/create/obj $(LUALIB) + library/insert/replace $(LUALIB) $(LUALIBOBJS) luaplaceholder.obj + + +lapi.obj: $(LUASRCDIR)lapi.c +lauxlib.obj: $(LUASRCDIR)lauxlib.c +lbaselib.obj: $(LUASRCDIR)lbaselib.c +lcode.obj: $(LUASRCDIR)lcode.c +lcorolib.obj: $(LUASRCDIR)lcorolib.c +lctype.obj: $(LUASRCDIR)lctype.c +ldblib.obj: $(LUASRCDIR)ldblib.c +ldebug.obj: $(LUASRCDIR)ldebug.c +ldo.obj: $(LUASRCDIR)ldo.c +ldump.obj: $(LUASRCDIR)ldump.c +lfunc.obj: $(LUASRCDIR)lfunc.c +lgc.obj: $(LUASRCDIR)lgc.c +linit.obj: $(LUASRCDIR)linit.c +liolib.obj: $(LUASRCDIR)liolib.c +llex.obj: $(LUASRCDIR)llex.c +lmathlib.obj: $(LUASRCDIR)lmathlib.c +lmem.obj: $(LUASRCDIR)lmem.c +loadlib.obj: $(LUASRCDIR)loadlib.c +lobject.obj: $(LUASRCDIR)lobject.c +lopcodes.obj: $(LUASRCDIR)lopcodes.c +loslib.obj: $(LUASRCDIR)loslib.c +lparser.obj: $(LUASRCDIR)lparser.c +lstate.obj: $(LUASRCDIR)lstate.c +lstring.obj: $(LUASRCDIR)lstring.c +lstrlib.obj: $(LUASRCDIR)lstrlib.c +ltable.obj: $(LUASRCDIR)ltable.c +ltablib.obj: $(LUASRCDIR)ltablib.c +ltm.obj: $(LUASRCDIR)ltm.c +lundump.obj: $(LUASRCDIR)lundump.c +lutf8lib.obj: $(LUASRCDIR)lutf8lib.c +lvm.obj: $(LUASRCDIR)lvm.c +lzio.obj: $(LUASRCDIR)lzio.c + +#LUABASESRC = lapi lauxlib lbaselib lcode lcorolib lctype ldblib \ +# ldebug ldo ldump lfunc lgc linit liolib llex \ +# lmathlib lmem loadlib lobject lopcodes loslib \ +# lparser lstate lstring lstrlib ltable ltablib \ +# ltm lundump lutf8lib lvm lzio + + +luaplaceholder.obj: luaplaceholder.c + $(CC) $(CFLAGS) luaplaceholder.c /OBJECT=$@ +luaplaceholder.c: + @echo int placeholder = 1; >luaplaceholder.c + +[-.lib]lua.dir: + create/directory [-.lib.lua] + +[-]lib.dir: + create/directory [-.lib] + +[-.lib.lua]lua$(LUAVER).dir: + @echo You need to make fetch-lua + false + +fetch-lua: [-]lib.dir [-.lib]lua.dir + if f$$search("[-.lib.lua]lua$(LUAVER).tgz").eqs."" then \ + curl http://www.lua.org/ftp/lua-$(LUADOTVER).tar.gz \ + --output [-.lib.lua]lua$(LUAVER).tgz + if f$$search("[-.lib.lua]lua$(LUAVER).tgz").nes."" then \ + gzip --force -d [-.lib.lua]lua$(LUAVER).tgz + if f$$search("[-.lib.lua]lua$(LUAVER).tar").nes."" then \ + pipe set def [-.lib.lua] && \ + tar -xf lua$(LUAVER).tar && \ + set def [--.src] + if (f$$search("[-.lib.lua]lua-$(LUAUNDERVER).DIR;1").nes."" \ + .AND. f$$search("[-.lib.lua]lua$(LUAVER).dir;1").eqs."") then \ + rename [-.lib.lua]lua-$(LUAUNDERVER).DIR;1 \ + [-.lib.lua]lua$(LUAVER).dir;1 + +tile.c: $(WINSHR)tilemap.c $(HACK_H) + @( cd $(UTIL) ; $(MAKE) $(SRC)tile.c ) + +# date.c should be recompiled any time any of the source or include code +# is modified. +$(DATEOBJ): $(DATESRC) $(HACK_H) $(HACKCSRC) $(ALLOBJS) + $(TARGET_CC) $(TARGET_CFLAGS) $(GITHASH) $(GITBRANCH) \ + /OBJECT=$@ $(DATESRC) + +tags: $(CSOURCES) + @echo ctags -tw ... + @ctags -tw $(CSOURCES) + @( cd $(INCL) ; ctags -tw $(HSOURCES) ) + @( cd $(UTIL) ; $(MAKE) tags ) + +clean: + -delete/log $(CLEANFILES) + +spotless: clean + -delete/log $(SPOTLESSFILES) $(INCL)nhlua.h;* +# -$(RM) $(GAMEBIN);* + +package: + @echo packaging complete (nothing to do). + +# VMS-specific code +vmsmain.obj: $(SYSVMS)vmsmain.c $(HACK_H) $(INCL)dlb.h +vmstty.obj: $(SYSVMS)vmstty.c $(HACK_H) $(INCL)wintty.h \ + $(INCL)tcap.h +vmsunix.obj: $(SYSVMS)vmsunix.c $(HACK_H) +vmsmisc.obj: $(SYSVMS)vmsmisc.c $(SYSVMS)oldcrtl.c $(CONFIG_H) +vmsfiles.obj: $(SYSVMS)vmsfiles.c $(CONFIG_H) +vmsmail.obj: $(SYSVMS)vmsmail.c $(CONFIG_H) $(INCL)mail.h \ + $(INCL)wintype.h $(INCL)winprocs.h $(INCL)color.h + +# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT +# +$(TARGETPFX)pcmain.obj: $(SYSSHR)pcmain.c $(HACK_H) $(INCL)dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)pcmain.c +$(TARGETPFX)pcsys.obj: $(SYSSHR)pcsys.c $(HACK_H) $(INCL)wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)pcsys.c +$(TARGETPFX)pctty.obj: $(SYSSHR)pctty.c $(HACK_H) $(INCL)wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)pctty.c +$(TARGETPFX)pcunix.obj: $(SYSSHR)pcunix.c $(HACK_H) $(INCL)wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)pcunix.c +$(TARGETPFX)pmatchregex.obj: $(SYSSHR)pmatchregex.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)pmatchregex.c +$(TARGETPFX)posixregex.obj: $(SYSSHR)posixregex.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)posixregex.c +$(TARGETPFX)random.obj: $(SYSSHR)random.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)random.c +$(TARGETPFX)ioctl.obj: $(SYSSHR)ioctl.c $(HACK_H) $(INCL)tcap.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)ioctl.c +$(TARGETPFX)unixtty.obj: $(SYSSHR)unixtty.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSSHR)unixtty.c +$(TARGETPFX)unixmain.obj: $(SYSUNIX)unixmain.c $(HACK_H) $(INCL)dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSUNIX)unixmain.c +$(TARGETPFX)unixunix.obj: $(SYSUNIX)unixunix.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSUNIX)unixunix.c +$(TARGETPFX)unixres.obj: $(SYSUNIX)unixres.c $(CONFIG_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(SYSUNIX)unixres.c +$(TARGETPFX)getline.obj: $(WINTTY)getline.c $(HACK_H) $(INCL)wintty.h \ + $(INCL)func_tab.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINTTY)getline.c +$(TARGETPFX)termcap.obj: $(WINTTY)termcap.c $(HACK_H) $(INCL)wintty.h \ + $(INCL)tcap.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINTTY)termcap.c +$(TARGETPFX)topl.obj: $(WINTTY)topl.c $(HACK_H) $(INCL)tcap.h \ + $(INCL)wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINTTY)topl.c +$(TARGETPFX)wintty.obj: $(WINTTY)wintty.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)tcap.h $(INCL)wintty.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINTTY)wintty.c +$(TARGETPFX)cursmain.obj: $(WINCURS)cursmain.c $(HACK_H) $(INCL)wincurs.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursmain.c +$(TARGETPFX)curswins.obj: $(WINCURS)curswins.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)curswins.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)curswins.c +$(TARGETPFX)cursmisc.obj: $(WINCURS)cursmisc.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)cursmisc.h \ + $(INCL)func_tab.h $(INCL)dlb.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursmisc.c +$(TARGETPFX)cursdial.obj: $(WINCURS)cursdial.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)cursdial.h \ + $(INCL)func_tab.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursdial.c +$(TARGETPFX)cursstat.obj: $(WINCURS)cursstat.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)cursstat.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursstat.c +$(TARGETPFX)cursinit.obj: $(WINCURS)cursinit.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)cursinit.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursinit.c +$(TARGETPFX)cursmesg.obj: $(WINCURS)cursmesg.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)cursmesg.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursmesg.c +$(TARGETPFX)cursinvt.obj: $(WINCURS)cursinvt.c $(HACK_H) \ + $(INCL)wincurs.h $(WINCURS)cursinvt.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCURS)cursinvt.c +$(TARGETPFX)Window.obj: $(WINX11)Window.c $(INCL)xwindowp.h \ + $(INCL)xwindow.h $(CONFIG_H) $(INCL)lint.h \ + $(INCL)winX.h $(INCL)color.h $(INCL)wintype.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)Window.c +$(TARGETPFX)dialogs.obj: $(WINX11)dialogs.c $(CONFIG_H) $(INCL)lint.h \ + $(INCL)winX.h $(INCL)color.h $(INCL)wintype.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)dialogs.c +$(TARGETPFX)winX.obj: $(WINX11)winX.c $(HACK_H) $(INCL)winX.h \ + $(INCL)dlb.h $(INCL)xwindow.h $(WINX11)nh72icon \ + $(WINX11)nh56icon $(WINX11)nh32icon + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winX.c +$(TARGETPFX)winmap.obj: $(WINX11)winmap.c $(INCL)xwindow.h $(HACK_H) \ + $(INCL)dlb.h $(INCL)winX.h $(INCL)tile2x11.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winmap.c +$(TARGETPFX)winmenu.obj: $(WINX11)winmenu.c $(HACK_H) $(INCL)winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winmenu.c +$(TARGETPFX)winmesg.obj: $(WINX11)winmesg.c $(INCL)xwindow.h $(HACK_H) \ + $(INCL)winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winmesg.c +$(TARGETPFX)winmisc.obj: $(WINX11)winmisc.c $(HACK_H) $(INCL)func_tab.h \ + $(INCL)winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winmisc.c +$(TARGETPFX)winstat.obj: $(WINX11)winstat.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winstat.c +$(TARGETPFX)wintext.obj: $(WINX11)wintext.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)wintext.c +$(TARGETPFX)winval.obj: $(WINX11)winval.c $(HACK_H) $(INCL)winX.h + $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) /OBJECT=$@ $(WINX11)winval.c +$(TARGETPFX)tile.obj: tile.c $(HACK_H) +$(TARGETPFX)winshim.obj: $(WINSHIM)winshim.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINSHIM)winshim.c +$(TARGETPFX)cppregex.obj: $(SYSSHR)cppregex.cpp $(CONFIG_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(SYSSHR)cppregex.cpp +$(TARGETPFX)qt_bind.obj: $(WINQT)qt_bind.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_bind.h $(WINQT)qt_main.h \ + $(WINQT)qt_kde0.h $(WINQT)qt_click.h $(WINQT)qt_delay.h \ + $(WINQT)qt_xcmd.h $(WINQT)qt_key.h $(WINQT)qt_map.h \ + $(WINQT)qt_win.h $(WINQT)qt_clust.h $(WINQT)qt_menu.h \ + $(WINQT)qt_rip.h $(WINQT)qt_msg.h $(WINQT)qt_plsel.h \ + $(WINQT)qt_svsel.h $(WINQT)qt_set.h $(WINQT)qt_stat.h \ + $(WINQT)qt_icon.h $(WINQT)qt_streq.h $(WINQT)qt_line.h \ + $(WINQT)qt_yndlg.h $(WINQT)qt_str.h $(INCL)dlb.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_bind.cpp +$(TARGETPFX)qt_click.obj: $(WINQT)qt_click.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_click.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_click.cpp +$(TARGETPFX)qt_clust.obj: $(WINQT)qt_clust.cpp $(WINQT)qt_clust.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_clust.cpp +$(TARGETPFX)qt_delay.obj: $(WINQT)qt_delay.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_delay.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_delay.cpp +$(TARGETPFX)qt_glyph.obj: $(WINQT)qt_glyph.cpp $(HACK_H) \ + $(INCL)tile2x11.h $(WINQT)qt_pre.h $(WINQT)qt_post.h \ + $(WINQT)qt_glyph.h $(WINQT)qt_bind.h $(WINQT)qt_main.h \ + $(WINQT)qt_kde0.h $(WINQT)qt_set.h $(WINQT)qt_inv.h \ + $(WINQT)qt_map.h $(WINQT)qt_win.h $(WINQT)qt_clust.h \ + $(WINQT)qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_glyph.cpp +$(TARGETPFX)qt_icon.obj: $(WINQT)qt_icon.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_icon.h $(WINQT)qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_icon.cpp +$(TARGETPFX)qt_inv.obj: $(WINQT)qt_inv.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_inv.h $(WINQT)qt_glyph.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_set.h \ + $(WINQT)qt_bind.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_inv.cpp +$(TARGETPFX)qt_key.obj: $(WINQT)qt_key.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_key.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_key.cpp +$(TARGETPFX)qt_line.obj: $(WINQT)qt_line.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_line.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_line.cpp +$(TARGETPFX)qt_main.obj: $(WINQT)qt_main.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_main.h $(WINQT)qt_kde0.h \ + qt_main.moc $(WINQT)qt_bind.h $(WINQT)qt_glyph.h \ + $(WINQT)qt_inv.h $(WINQT)qt_key.h $(WINQT)qt_map.h \ + $(WINQT)qt_win.h $(WINQT)qt_clust.h $(WINQT)qt_msg.h \ + $(WINQT)qt_set.h $(WINQT)qt_stat.h $(WINQT)qt_icon.h \ + $(WINQT)qt_str.h qt_kde0.moc $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_main.cpp +$(TARGETPFX)qt_map.obj: $(WINQT)qt_map.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_map.h $(WINQT)qt_win.h \ + $(WINQT)qt_clust.h qt_map.moc $(WINQT)qt_click.h \ + $(WINQT)qt_glyph.h $(WINQT)qt_set.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_map.cpp +$(TARGETPFX)qt_menu.obj: $(WINQT)qt_menu.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_menu.h $(WINQT)qt_win.h \ + $(WINQT)qt_rip.h qt_menu.moc $(WINQT)qt_key.h \ + $(WINQT)qt_glyph.h $(WINQT)qt_set.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_streq.h \ + $(WINQT)qt_line.h $(WINQT)qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_menu.cpp +$(TARGETPFX)qt_msg.obj: $(WINQT)qt_msg.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_msg.h $(WINQT)qt_win.h \ + qt_msg.moc $(WINQT)qt_map.h $(WINQT)qt_clust.h \ + $(WINQT)qt_set.h $(WINQT)qt_bind.h $(WINQT)qt_main.h \ + $(WINQT)qt_kde0.h $(WINQT)qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_msg.cpp +$(TARGETPFX)qt_plsel.obj: $(WINQT)qt_plsel.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_plsel.h qt_plsel.moc \ + $(WINQT)qt_bind.h $(WINQT)qt_main.h $(WINQT)qt_kde0.h \ + $(WINQT)qt_glyph.h $(WINQT)qt_set.h $(WINQT)qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_plsel.cpp +$(TARGETPFX)qt_rip.obj: $(WINQT)qt_rip.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_rip.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_rip.cpp +$(TARGETPFX)qt_set.obj: $(WINQT)qt_set.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_set.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h qt_set.moc \ + $(WINQT)qt_glyph.h $(WINQT)qt_xcmd.h $(WINQT)qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_set.cpp +$(TARGETPFX)qt_stat.obj: $(WINQT)qt_stat.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_stat.h $(WINQT)qt_win.h \ + $(WINQT)qt_icon.h qt_stat.moc $(WINQT)qt_set.h \ + $(WINQT)qt_bind.h $(WINQT)qt_main.h $(WINQT)qt_kde0.h \ + $(WINQT)qt_str.h $(WINQT)qt_xpms.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_stat.cpp +$(TARGETPFX)qt_str.obj: $(WINQT)qt_str.cpp $(WINQT)qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_str.cpp +$(TARGETPFX)qt_streq.obj: $(WINQT)qt_streq.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_streq.h $(WINQT)qt_line.h \ + $(WINQT)qt_str.h $(WINQT)qt_set.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_streq.cpp +$(TARGETPFX)qt_svsel.obj: $(WINQT)qt_svsel.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_svsel.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_str.h \ + $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_svsel.cpp +$(TARGETPFX)qt_win.obj: $(WINQT)qt_win.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_win.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_click.h \ + $(WINQT)qt_glyph.h $(WINQT)qt_inv.h $(WINQT)qt_key.h \ + $(WINQT)qt_icon.h $(WINQT)qt_map.h $(WINQT)qt_clust.h \ + $(WINQT)qt_menu.h $(WINQT)qt_rip.h $(WINQT)qt_msg.h \ + $(WINQT)qt_set.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_win.cpp +$(TARGETPFX)qt_xcmd.obj: $(WINQT)qt_xcmd.cpp $(HACK_H) $(INCL)func_tab.h \ + $(WINQT)qt_pre.h $(WINQT)qt_post.h $(WINQT)qt_xcmd.h \ + qt_xcmd.moc $(WINQT)qt_key.h $(WINQT)qt_bind.h \ + $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(WINQT)qt_set.h \ + $(WINQT)qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_xcmd.cpp +$(TARGETPFX)qt_yndlg.obj: $(WINQT)qt_yndlg.cpp $(HACK_H) $(WINQT)qt_pre.h \ + $(WINQT)qt_post.h $(WINQT)qt_yndlg.h qt_yndlg.moc \ + $(WINQT)qt_key.h $(WINQT)qt_str.h $(QTn_H) + $(TARGET_CXX) $(TARGET_CXXFLAGS) /OBJECT=$@ $(WINQT)qt_yndlg.cpp +qt_kde0.moc: $(WINQT)qt_kde0.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_kde0.h +qt_main.moc: $(WINQT)qt_main.h $(WINQT)qt_kde0.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_main.h +qt_map.moc: $(WINQT)qt_map.h $(WINQT)qt_win.h $(WINQT)qt_clust.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_map.h +qt_menu.moc: $(WINQT)qt_menu.h $(WINQT)qt_win.h $(WINQT)qt_rip.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_menu.h +qt_msg.moc: $(WINQT)qt_msg.h $(WINQT)qt_win.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_msg.h +qt_plsel.moc: $(WINQT)qt_plsel.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_plsel.h +qt_set.moc: $(WINQT)qt_set.h $(WINQT)qt_bind.h $(WINQT)qt_main.h \ + $(WINQT)qt_kde0.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_set.h +qt_stat.moc: $(WINQT)qt_stat.h $(WINQT)qt_win.h $(WINQT)qt_icon.h \ + $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_stat.h +qt_xcmd.moc: $(WINQT)qt_xcmd.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_xcmd.h +qt_yndlg.moc: $(WINQT)qt_yndlg.h $(QTn_H) + $(MOCPATH) /OBJECT=$@ $(WINQT)qt_yndlg.h +$(TARGETPFX)tile.obj: tile.c $(HACK_H) +$(TARGETPFX)wc_chainin.obj: $(WINCHAIN)wc_chainin.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCHAIN)wc_chainin.c +$(TARGETPFX)wc_chainout.obj: $(WINCHAIN)wc_chainout.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCHAIN)wc_chainout.c +$(TARGETPFX)wc_trace.obj: $(WINCHAIN)wc_trace.c $(HACK_H) $(INCL)wintty.h \ + $(INCL)func_tab.h + $(TARGET_CC) $(TARGET_CFLAGS) /OBJECT=$@ $(WINCHAIN)wc_trace.c +$(TARGETPFX)allmain.obj: allmain.c $(HACK_H) +$(TARGETPFX)alloc.obj: alloc.c $(CONFIG_H) +$(TARGETPFX)apply.obj: apply.c $(HACK_H) +$(TARGETPFX)artifact.obj: artifact.c $(HACK_H) $(INCL)artifact.h +$(TARGETPFX)attrib.obj: attrib.c $(HACK_H) +$(TARGETPFX)ball.obj: ball.c $(HACK_H) +$(TARGETPFX)bones.obj: bones.c $(HACK_H) +$(TARGETPFX)botl.obj: botl.c $(HACK_H) +$(TARGETPFX)calendar.obj: calendar.c $(HACK_H) +$(TARGETPFX)cfgfiles.obj: cfgfiles.c $(HACK_H) +$(TARGETPFX)cmd.obj: cmd.c $(HACK_H) $(INCL)func_tab.h +$(TARGETPFX)coloratt.obj: coloratt.c $(HACK_H) +$(TARGETPFX)dbridge.obj: dbridge.c $(HACK_H) +$(TARGETPFX)decl.obj: decl.c $(HACK_H) +$(TARGETPFX)detect.obj: detect.c $(HACK_H) $(INCL)artifact.h +$(TARGETPFX)dig.obj: dig.c $(HACK_H) +$(TARGETPFX)display.obj: display.c $(HACK_H) +$(TARGETPFX)dlb.obj: dlb.c $(CONFIG_H) $(INCL)dlb.h +$(TARGETPFX)do.obj: do.c $(HACK_H) +$(TARGETPFX)do_name.obj: do_name.c $(HACK_H) +$(TARGETPFX)do_wear.obj: do_wear.c $(HACK_H) +$(TARGETPFX)dog.obj: dog.c $(HACK_H) +$(TARGETPFX)dogmove.obj: dogmove.c $(HACK_H) $(INCL)mfndpos.h +$(TARGETPFX)dokick.obj: dokick.c $(HACK_H) +$(TARGETPFX)dothrow.obj: dothrow.c $(HACK_H) +$(TARGETPFX)drawing.obj: drawing.c $(CONFIG_H) $(INCL)color.h \ + $(INCL)rm.h $(INCL)objclass.h $(INCL)defsym.h \ + $(INCL)objects.h $(INCL)wintype.h $(INCL)sym.h +$(TARGETPFX)dungeon.obj: dungeon.c $(HACK_H) $(INCL)dgn_file.h \ + $(INCL)dlb.h +$(TARGETPFX)eat.obj: eat.c $(HACK_H) +$(TARGETPFX)end.obj: end.c $(HACK_H) $(INCL)dlb.h +$(TARGETPFX)engrave.obj: engrave.c $(HACK_H) +$(TARGETPFX)exper.obj: exper.c $(HACK_H) +$(TARGETPFX)explode.obj: explode.c $(HACK_H) +$(TARGETPFX)extralev.obj: extralev.c $(HACK_H) +$(TARGETPFX)files.obj: files.c $(HACK_H) $(INCL)dlb.h $(INCL)wintty.h \ + #zlib.h +$(TARGETPFX)fountain.obj: fountain.c $(HACK_H) +$(TARGETPFX)getpos.obj: getpos.c $(HACK_H) +$(TARGETPFX)glyphs.obj: glyphs.c $(HACK_H) +$(TARGETPFX)hack.obj: hack.c $(HACK_H) +$(TARGETPFX)hacklib.obj: hacklib.c $(HACK_H) +$(TARGETPFX)iactions.obj: iactions.c $(HACK_H) +$(TARGETPFX)insight.obj: insight.c $(HACK_H) +$(TARGETPFX)invent.obj: invent.c $(HACK_H) +$(TARGETPFX)isaac64.obj: isaac64.c $(CONFIG_H) $(INCL)isaac64.h +$(TARGETPFX)light.obj: light.c $(HACK_H) +$(TARGETPFX)lock.obj: lock.c $(HACK_H) +$(TARGETPFX)mail.obj: mail.c $(HACK_H) $(INCL)mail.h +$(TARGETPFX)makemon.obj: makemon.c $(HACK_H) +$(TARGETPFX)mcastu.obj: mcastu.c $(HACK_H) +$(TARGETPFX)mdlib.obj: mdlib.c $(CONFIG_H) $(INCL)permonst.h \ + $(INCL)align.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monsters.h $(INCL)objclass.h \ + $(INCL)defsym.h $(INCL)objects.h $(INCL)wintype.h \ + $(INCL)sym.h $(INCL)artilist.h $(INCL)dungeon.h \ + $(INCL)sndprocs.h $(INCL)seffects.h $(INCL)obj.h \ + $(INCL)monst.h $(INCL)mextra.h $(INCL)you.h \ + $(INCL)attrib.h $(INCL)prop.h $(INCL)skills.h \ + $(INCL)context.h $(INCL)flag.h $(INCL)dlb.h \ + $(INCL)weight.h +$(TARGETPFX)mhitm.obj: mhitm.c $(HACK_H) $(INCL)artifact.h +$(TARGETPFX)mhitu.obj: mhitu.c $(HACK_H) $(INCL)artifact.h +$(TARGETPFX)minion.obj: minion.c $(HACK_H) +$(TARGETPFX)mklev.obj: mklev.c $(HACK_H) +$(TARGETPFX)mkmap.obj: mkmap.c $(HACK_H) $(INCL)sp_lev.h +$(TARGETPFX)mkmaze.obj: mkmaze.c $(HACK_H) $(INCL)sp_lev.h +$(TARGETPFX)mkobj.obj: mkobj.c $(HACK_H) +$(TARGETPFX)mkroom.obj: mkroom.c $(HACK_H) +$(TARGETPFX)mon.obj: mon.c $(HACK_H) $(INCL)mfndpos.h +$(TARGETPFX)mondata.obj: mondata.c $(HACK_H) +$(TARGETPFX)monmove.obj: monmove.c $(HACK_H) $(INCL)mfndpos.h \ + $(INCL)artifact.h +$(TARGETPFX)monst.obj: monst.c $(CONFIG_H) $(INCL)permonst.h \ + $(INCL)align.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monsters.h $(INCL)wintype.h $(INCL)sym.h \ + $(INCL)defsym.h $(INCL)color.h $(INCL)weight.h +$(TARGETPFX)mplayer.obj: mplayer.c $(HACK_H) +$(TARGETPFX)mthrowu.obj: mthrowu.c $(HACK_H) +$(TARGETPFX)muse.obj: muse.c $(HACK_H) +$(TARGETPFX)music.obj: music.c $(HACK_H) +$(TARGETPFX)nhlua.obj: nhlua.c $(HACK_H) $(INCL)dlb.h +$(TARGETPFX)nhlsel.obj: nhlsel.c $(HACK_H) $(INCL)sp_lev.h +$(TARGETPFX)nhlobj.obj: nhlobj.c $(HACK_H) $(INCL)sp_lev.h +$(TARGETPFX)o_init.obj: o_init.c $(HACK_H) +$(TARGETPFX)objects.obj: objects.c $(CONFIG_H) $(INCL)obj.h \ + $(INCL)prop.h $(INCL)skills.h $(INCL)color.h \ + $(INCL)objclass.h $(INCL)defsym.h $(INCL)objects.h +$(TARGETPFX)objnam.obj: objnam.c $(HACK_H) +$(TARGETPFX)options.obj: options.c $(CONFIG_H) $(INCL)objclass.h \ + $(INCL)defsym.h $(INCL)objects.h $(INCL)flag.h \ + $(HACK_H) $(INCL)tcap.h $(INCL)optlist.h +$(TARGETPFX)pager.obj: pager.c $(HACK_H) $(INCL)dlb.h +$(TARGETPFX)pickup.obj: pickup.c $(HACK_H) +$(TARGETPFX)pline.obj: pline.c $(HACK_H) +$(TARGETPFX)polyself.obj: polyself.c $(HACK_H) +$(TARGETPFX)potion.obj: potion.c $(HACK_H) +$(TARGETPFX)pray.obj: pray.c $(HACK_H) +$(TARGETPFX)priest.obj: priest.c $(HACK_H) $(INCL)mfndpos.h +$(TARGETPFX)quest.obj: quest.c $(HACK_H) +$(TARGETPFX)questpgr.obj: questpgr.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)wintty.h +$(TARGETPFX)read.obj: read.c $(HACK_H) +$(TARGETPFX)rect.obj: rect.c $(HACK_H) +$(TARGETPFX)region.obj: region.c $(HACK_H) +$(TARGETPFX)report.obj: report.c $(HACK_H) +$(TARGETPFX)restore.obj: restore.c $(HACK_H) $(INCL)tcap.h +$(TARGETPFX)rip.obj: rip.c $(HACK_H) +$(TARGETPFX)rnd.obj: rnd.c $(HACK_H) $(INCL)isaac64.h +$(TARGETPFX)role.obj: role.c $(HACK_H) +$(TARGETPFX)rumors.obj: rumors.c $(HACK_H) $(INCL)dlb.h +$(TARGETPFX)save.obj: save.c $(HACK_H) +$(TARGETPFX)selvar.obj: selvar.c $(HACK_H) +$(TARGETPFX)sfbase.obj: sfbase.c $(HACK_H) $(INCL)sfprocs.h $(INCL)sfmacros.h +$(TARGETPFX)sfstruct.obj: sfstruct.c $(HACK_H) $(INCL)sfprocs.h $(INCL)sfmacros.h +$(TARGETPFX)shk.obj: shk.c $(HACK_H) +$(TARGETPFX)shknam.obj: shknam.c $(HACK_H) +$(TARGETPFX)sit.obj: sit.c $(HACK_H) $(INCL)artifact.h +$(TARGETPFX)sounds.obj: sounds.c $(HACK_H) +$(TARGETPFX)sp_lev.obj: sp_lev.c $(HACK_H) $(INCL)sp_lev.h +$(TARGETPFX)spell.obj: spell.c $(HACK_H) +$(TARGETPFX)stairs.obj: stairs.c $(HACK_H) +$(TARGETPFX)steal.obj: steal.c $(HACK_H) +$(TARGETPFX)steed.obj: steed.c $(HACK_H) +$(TARGETPFX)symbols.obj: symbols.c $(HACK_H) $(INCL)tcap.h +$(TARGETPFX)sys.obj: sys.c $(HACK_H) +$(TARGETPFX)teleport.obj: teleport.c $(HACK_H) +$(TARGETPFX)timeout.obj: timeout.c $(HACK_H) +$(TARGETPFX)topten.obj: topten.c $(HACK_H) $(INCL)dlb.h +$(TARGETPFX)track.obj: track.c $(HACK_H) +$(TARGETPFX)trap.obj: trap.c $(HACK_H) +$(TARGETPFX)u_init.obj: u_init.c $(HACK_H) +$(TARGETPFX)utf8map.obj: utf8map.c $(HACK_H) +$(TARGETPFX)uhitm.obj: uhitm.c $(HACK_H) +$(TARGETPFX)vault.obj: vault.c $(HACK_H) +$(TARGETPFX)version.obj: version.c $(HACK_H) $(INCL)dlb.h +$(TARGETPFX)vision.obj: vision.c $(HACK_H) +$(TARGETPFX)weapon.obj: weapon.c $(HACK_H) +$(TARGETPFX)were.obj: were.c $(HACK_H) +$(TARGETPFX)wield.obj: wield.c $(HACK_H) +$(TARGETPFX)windows.obj: windows.c $(HACK_H) $(INCL)dlb.h $(INCL)wintty.h +$(TARGETPFX)wizard.obj: wizard.c $(HACK_H) +$(TARGETPFX)wizcmds.obj: wizcmds.c $(HACK_H) +$(TARGETPFX)worm.obj: worm.c $(HACK_H) +$(TARGETPFX)worn.obj: worn.c $(HACK_H) +$(TARGETPFX)write.obj: write.c $(HACK_H) +$(TARGETPFX)zap.obj: zap.c $(HACK_H) +# DEPENDENCIES MUST END AT END OF FILE +# IF YOU PUT STUFF HERE IT WILL GO AWAY diff --git a/sys/vms/Makefile_top.vms b/sys/vms/Makefile_top.vms new file mode 100644 index 000000000..274f2207e --- /dev/null +++ b/sys/vms/Makefile_top.vms @@ -0,0 +1,438 @@ +# NetHack Top-level Makefile. +# NetHack 5.0 Makefile.vms $NHDT-Date: 1642630921 2022/01/19 22:22:01 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.72 $ +# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland +# NetHack may be freely redistributed. See license for details. + +# Root of source tree: (Note: dot is after setup.sh has been used +# to create the active Makefiles from sys/unix/Makefile.*. +# It isn't sys/unix/ where you might happen to be reading this.) +NHSROOT=[] + +# Newer makes predefine $(MAKE) to 'make' and do smarter processing +# of recursive make calls if $(MAKE) is used. +# These makes allow $(MAKE) to be overridden by the environment if +# someone wants to (or has to) use something other than the standard +# make, so we do not want to unconditionally set $(MAKE) here. +# +# Unfortunately, some older makes do not predefine $(MAKE); if you +# have one of these, uncomment the following line. +# (You will know that you have one if you get complaints about unable +# to execute things like 'data' and 'rumors'.) +# MAKE = make + + +# NetHack 5.0 Makefile.vms $NHDT-Date: 1654287121 2022/06/03 20:12:01 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.145 $ +# Copyright (c) 2023 by Michael Allison +# NetHack may be freely redistributed. See license for details. +# +# OpenVMS GNU Makefile for OpenVMS 9.x and VSI C +# with GNU Make V4.1 (or greater). +# +# Tested on x86_64 version of OpenVMS V9.2-1. +# + +# Root of source tree: +NHSROOT= + +# relative directories from top +DOC=[.doc] +DAT=[.dat] +INCL=[.include] +SRC=[.src] +UTIL=[.util] +LIB=[.lib] +SYSVMS=[.sys.vms] +SYSSHR=[.sys.share] +SYSUNIX=[.sys.unix] +WINTTY=[.win.tty] +WINSHR=[.win.share] +WINTTY=[.win.tty] +WINCURS=[.win.curses] +WINX11=[.win.X11] +WINQT=[.win.Qt] +WINSHIM=[.win.shim] +WINCHAIN=[.win.chain] + +# Lua macros +LUAVER=548 +LUADOTVER=5.4.8 +LUAUNDERVER=5_4_8 +LUAINC=[.lib.lua.lua$(LUAVER).src] +LUALIB=[.lib.lua]lua$(LUAVER).olb +LUASRCDIR =[.lib.lua.lua$(LUAVER).src] +LUASRCINCDIR=$(LUASRCDIR) +LUATESTTARGET = $(LUAINC)lua.h +LUABASELIB = liblua-$(LUADOTVER).olb + +# make NetHack (as opposite to variants or such) +#PREFIX = /usr +GAME = nethack +# GAME = nethack.exe +# GAME = nethack.prg +#GAMEUID = games +#GAMEGRP = bin + +# Permissions - some places use setgid instead of setuid, for instance. +# See also the option "SECURE" in include/config.h. +#GAMEPERM = 04755 +FILEPERM = 0644 +# VARFILEPERM = 0644 +EXEPERM = 0755 +DIRPERM = 0755 +# VARDIRPERM = 0755 + +# VARDIR may also appear in unixconf.h as "VAR_PLAYGROUND" else HACKDIR +# +# Note well! 'make install' believes in creating a nice tidy HACKDIR +# for installation, free of debris from previous NetHack versions -- +# therefore there should not be anything in HACKDIR that you want to +# keep (if there is, you'll have to do the installation by hand or +# modify the install commands below). +#HACKDIR = $(PREFIX)/games/lib/$(GAME)dir +#VARDIR = $(HACKDIR) +# Where nethack.sh is installed (as 'nethack'). +# If this is not defined, the shell wrapper script is not used. +#SHELLDIR = $(PREFIX)/games + +# Extra data files depending upon the interface(s) built into nethack. +# per discussion in Install.X11 and Install.Qt +# Qt prefers nhtiles.bmp but can use x11tiles, and it ignores NetHack.ad. +# X11 uses those last two. +# Both can display a conventional text map instead of tiles. +# tty and/or curses (no extra data files outside of the dlb container): +#VARDATND = +# All X11 and/or Qt variations may also include tty or curses or both): +# X11 without Qt: +# VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm +# X11 with GRAPHIC_TOMBSTONE (requires 'xpm'): +# VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm rip.xpm +# both X11 and Qt: +# VARDATND = x11tiles nhtiles.bmp NetHack.ad pet_mark.xbm pilemark.xbm rip.xpm +# Qt without X11; assumes GRAPHIC_TOMBSTONE: +# VARDATND = nhtiles.bmp pet_mark.xbm pilemark.xbm rip.xpm + +VARDATD = bogusmon data engrave epitaph oracles options quest.lua rumors +VARDAT = $(VARDATD) $(VARDATND) + +# Some versions of make use the SHELL environment variable as the +# shell for running commands. We need this to be a Bourne shell. +# SHELL = /bin/sh +# for Atari (obsolete) +# SHELL=E:/GEMINI2/MUPFEL.TTP + +# Commands for setting the owner and group on files during installation. +# Some systems fail with one or the other when installing over NFS or for +# other permission-related reasons. If that happens, you may want to set the +# command to "true", which is a no-op. Note that disabling chown or chgrp +# will only work if setuid (or setgid) behavior is not desired or required. +#CHOWN = chown +#CHGRP = chgrp + +# +# end of configuration +# + +DATHELP = help hh cmdhelp keyhelp history opthelp optmenu usagehlp wizhelp + +SPEC_LEVS = asmodeus.lua baalz.lua bigrm-*.lua castle.lua fakewiz?.lua \ + juiblex.lua knox.lua medusa-?.lua minend-?.lua minefill.lua \ + minetn-?.lua oracle.lua orcus.lua sanctum.lua soko?-?.lua \ + tower?.lua valley.lua wizard?.lua nhcore.lua nhlib.lua themerms.lua \ + astral.lua air.lua earth.lua fire.lua water.lua hellfill.lua tut-?.lua +QUEST_LEVS = ???-goal.lua ???-fil?.lua ???-loca.lua ???-strt.lua + +DATNODLB = $(VARDATND) license symbols +DATDLB = $(DATHELP) dungeon.lua tribute $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD) +DODAT = $(DATNODLB) $(DATDLB) + +ALLDEP = $(GAME) recover Guidebook $(VARDAT) spec_levs check-dlb + +# first target is also the default target for 'make' without any arguments +all: $(ALLDEP) + pipe true + @echo "Done." + +$(GAME): lua_support + pipe set default $(SRC) && $(MAKE) LUA_VERSION=$(LUADOTVER) $(GAME) \ + && set def [-] + +lua_support: [.include]nhlua.h + @true + +# Note: many of the dependencies below are here to allow parallel make +# to generate valid output + +Guidebook: + pipe set def $(DOC) && $(MAKE) Guidebook && set def [-] + +Guidebook.txt: + pipe set def $(DOC) && $(MAKE) Guidebook.txt && set def [-] + +Guidebook.pdf: + pipe set def $(DOC) && $(MAKE) Guidebook.pdf && set def [-] + +manpages: + pipe set def $(DOC) && $(MAKE) manpages && set def [-] + +data: $(GAME) + pipe set def $(DAT) && $(MAKE) data && set def [-] + +engrave: $(GAME) + pipe set def $(DAT) && $(MAKE) engrave && set def [-] + +bogusmon: $(GAME) + pipe set def $(DAT) && $(MAKE) bogusmon && set def [-] + +epitaph: $(GAME) + pipe set def $(DAT) && $(MAKE) epitaph && set def [-] + +rumors: $(GAME) + pipe set def $(DAT) && $(MAKE) rumors && set def [-] + +oracles: $(GAME) + pipe set def $(DAT) && $(MAKE) oracles && set def [-] + +# Note: options should have already been made with make, but... +options: $(GAME) + pipe set def $(DAT) && $(MAKE) options && set def [-] + +quest.lua: $(GAME) + +spec_levs: + pipe set def $(DAT) && $(MAKE) spec_levs && set def [-] + pipe set def $(DAT) && $(MAKE) quest_levs && set def [-] + +nhtiles.bmp: $(GAME) + pipe set def $(UTIL) && $(MAKE) tile2bmp && set def [-] + pipe set def $(DAT) && $(MAKE) nhtiles.bmp && set def [-] + +x11tiles: $(GAME) + pipe set def $(UTIL) && $(MAKE) tile2x11 && set def [-] + pipe set def $(DAT) && $(MAKE) x11tiles && set def [-] + +NetHack.ad: $(GAME) + pipe set def $(DAT) && $(MAKE) NetHack.ad && set def [-] + +pet_mark.xbm: + pipe set def $(DAT) && $(MAKE) pet_mark.xbm && set def [-] + +pilemark.xbm: + pipe set def $(DAT) && $(MAKE) pilemark.xbm && set def [-] + +rip.xpm: + pipe set def $(DAT) && $(MAKE) rip.xpm && set def [-] + +mapbg.xpm: + pipe set def $(DAT) && $(MAKE) mapbg.xpm && set def [-] + +nhsplash.xpm: + pipe set def $(DAT) && $(MAKE) nhsplash.xpm && set def [-] + +nh16.img: $(GAME) + pipe set def $(UTIL) && $(MAKE) tile2img.ttp && set def [-] + pipe set def $(DAT) && $(MAKE) nh16.img && set def [-] + +rip.img: + pip set def $(UTIL) && $(MAKE) xpm2img.ttp && set def [-] + pipe set def $(DAT) && $(MAKE) rip.img && set def [-] +GEM_RSC.RSC: + pipe set def $(DAT) && $(MAKE) GEM_RSC.RSC && set def [-] + +title.img: + pipe set def $(DAT) && $(MAKE) title.img && set def [-] + +check-dlb: options + echo disabled $@ +# @if egrep -s librarian dat/options ; then $(MAKE) dlb ; else true ; fi + +dlb: + pipe set def $(UTIL) && $(MAKE) dlb && set def [-] + pipe set def $(DAT) && LC_ALL=C && mcr [-.util]dlb cf nhdat $(DATDLB) \ + && set def [-] + +wasm: + pipe set def $(SRC) && \ + $(MAKE) CROSS_TO_WASM=1 [-.targets.wasm]nethack.js && \ + set def [-] + +package: $(GAME) recover $(VARDAT) spec_levs + pipe set def $(SRC) && $(MAKE) $(PACKAGE) && set def [-] + +# recover can be used when INSURANCE is defined in include/config.h +# and the checkpoint option is true +recover: $(GAME) + pipe set def $(UTIL) && $(MAKE) recover && set def [-] + +dofiles: + echo disabled $@ +# target=`sed -n \ +# -e '/librarian/{' \ +# -e 's/.*/dlb/p' \ +# -e 'q' \ +# -e '}' \ +# -e '$$s/.*/nodlb/p' < dat/options` ; \ +# $(MAKE) dofiles-$${target-nodlb} +# cp src/$(GAME) $(INSTDIR) +# cp util/recover $(INSTDIR) +# -if test -n '$(SHELLDIR)'; then rm -f $(SHELLDIR)/$(GAME); fi +# if test -n '$(SHELLDIR)'; then \ +# sed -e 's;/usr/games/lib/nethackdir;$(HACKDIR);' \ +# -e 's;HACKDIR/nethack;HACKDIR/$(GAME);' \ +# < sys/unix/nethack.sh \ +# > $(SHELLDIR)/$(GAME) ; fi +# set up their permissions +# -( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) $(GAME) recover ; \ +# $(CHGRP) $(GAMEGRP) $(GAME) recover ) +# chmod $(GAMEPERM) $(INSTDIR)/$(GAME) +# chmod $(EXEPERM) $(INSTDIR)/recover +# -if test -n '$(SHELLDIR)'; then \ +# $(CHOWN) $(GAMEUID) $(SHELLDIR)/$(GAME); fi +# if test -n '$(SHELLDIR)'; then \ +# $(CHGRP) $(GAMEGRP) $(SHELLDIR)/$(GAME); \ +# chmod $(EXEPERM) $(SHELLDIR)/$(GAME); fi + +dofiles-dlb: check-dlb + pipe set def $(DAT) && copy nhdat $(DATNODLB) $(INSTDIR) && \ + set def [-] +# set up their permissions +# -( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) nhdat $(DATNODLB) ; \ +# $(CHGRP) $(GAMEGRP) nhdat $(DATNODLB) ; \ +# chmod $(FILEPERM) nhdat $(DATNODLB) ) + +dofiles-nodlb: +# copy over the game files + pipe set def $(DAT) && copy $(DAT) $(INSTDIR) && \ + set def [-] +# set up their permissions +# -( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) $(DAT) ; \ +# $(CHGRP) $(GAMEGRP) $(DAT) ; \ +# chmod $(FILEPERM) $(DAT) ) +# +# This is not part of the dependency build hierarchy. +# It requires an explicit "make fetch-Lua". + +$(INCL)nhlua.h: + echo "/* nhlua.h - generated by top-level Makefile.vms */" > $@ + @echo \#"include ""lua.h""" >> $@ + @echo "ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN;" >>$@ + @echo \#"include ""lualib.h""" >> $@ + @echo \#"include ""lauxlib.h""" >> $@ + @echo "/*nhlua.h*/" >> $@ + +[.lib]lua.dir: + create/directory [.lib.lua] + +[]lib.dir: + create/directory [.lib] + +[.lib.lua]lua$(LUAVER).dir: + @echo You need to make fetch-lua + false + +fetch-lua: []lib.dir [.lib]lua.dir + if f$$search("[.lib.lua]lua$(LUAVER).tgz").eqs."" then \ + curl --insecure https://www.lua.org/ftp/lua-$(LUADOTVER).tar.gz \ + --output [.lib.lua]lua$(LUAVER).tgz + if f$$search("[.lib.lua]lua$(LUAVER).tgz").nes."" then \ + gzip --force -d [.lib.lua]lua$(LUAVER).tgz + if f$$search("[.lib.lua]lua$(LUAVER).tar").nes."" then \ + pipe set def [.lib.lua] && \ + tar -xf lua$(LUAVER).tar && \ + set def [--] + if (f$$search("[.lib.lua]lua-$(LUAUNDERVER).DIR;1").nes."" \ + .AND. f$$search("[.lib.lua]lua$(LUAVER).dir;1").eqs."") then \ + rename [.lib.lua]lua-$(LUAUNDERVER).DIR;1 \ + [.lib.lua]lua$(LUAVER).dir;1 +# remove [.include]nhlua.h in case it was created for some other Lua version + @pipe if f$$search("[.include]nhlua.h").nes."" then \ + delete [.include]nhlua.h;* && echo 'delete [.include]nhlua.h;*' + +# 'make update' can be used to install a revised version after making +# customizations or such. Unlike 'make install', it doesn't delete everything +# from the target directory to have a clean start. +update: $(GAME) recover $(VARDAT) spec_levs + echo disabled $@ +# (don't yank the old version out from under people who're playing it) +# -mv $(INSTDIR)/$(GAME) $(INSTDIR)/$(GAME).old +# -mv $(INSTDIR)/nhdat $(INSTDIR)/nhdat.old +# set up new versions of the game files +# ( $(MAKE) dofiles ) +# should already be present, but make sure +# touch $(VARDIR)/perm $(VARDIR)/record +# and a reminder +# @echo You may also want to install the man pages via the doc Makefile. + +rootcheck: + @true; $(ROOTCHECK) + +install: rootcheck $(GAME) recover $(VARDAT) spec_levs + true; $(PREINSTALL) + echo disabled $@ +# set up the directories +# not all mkdirs have -p; those that don't will create a -p directory +# -if test -n '$(SHELLDIR)'; then \ +# mkdir -p $(SHELLDIR); fi +# rm -rf $(INSTDIR) $(VARDIR) +# -mkdir -p $(INSTDIR) $(VARDIR) $(VARDIR)/save +# if test -d ./-p; then rmdir ./-p; fi +# -$(CHOWN) $(GAMEUID) $(INSTDIR) $(VARDIR) $(VARDIR)/save +# $(CHGRP) $(GAMEGRP) $(INSTDIR) $(VARDIR) $(VARDIR)/save +# order counts here: +# chmod $(DIRPERM) $(INSTDIR) +# chmod $(VARDIRPERM) $(VARDIR) $(VARDIR)/save +# set up the game files +# ( $(MAKE) dofiles ) +# set up some additional files +# touch $(VARDIR)/perm $(VARDIR)/record $(VARDIR)/logfile $(VARDIR)/xlogfile \ +# $(VARDIR)/livelog +# -( cd $(VARDIR) ; $(CHOWN) $(GAMEUID) perm record logfile xlogfile livelog ; \ +# $(CHGRP) $(GAMEGRP) perm record logfile xlogfile livelog ; \ +# chmod $(VARFILEPERM) perm record logfile xlogfile livelog ) +# true; $(POSTINSTALL) +# and a reminder +# @echo You may also want to reinstall the man pages via the doc Makefile. + + +# 'make clean' removes all the .o files, but leaves around all the executables +# and compiled data files +#clean: clean-lib clean-keep-lib +# @true + +clean-lib: +# -pipe set def $(LUASRCDIR) && $(MAKE) clean && set def [--.util] + +clean-keep-lib: +# ( cd src ; $(MAKE) clean ) +# ( cd util ; $(MAKE) clean ) +# pipe set def $(DAT) $(MAKE) clean && set def [-.util] +# ( cd doc ; $(MAKE) clean ) + +spotless-lib:: clean-lib + -( cd lib/lua && rm $(LUABASELIB) ) + +spotless-keep-lib: clean-keep-lib +# ( cd src ; $(MAKE) spotless ) +# ( cd util ; $(MAKE) spotless ) +# pipe set def $(DAT) && $(MAKE) spotless && set def [-] +# ( cd doc ; $(MAKE) spotless ) +spotless-clean-submodule: + @( if test -f submodules/lua/lua.h ; then \ + git submodule deinit submodules/lua ; fi ) + +clean: + pipe set def $(DAT) && $(MAKE) clean && set def [-] + pipe set def $(SRC) && $(MAKE) clean && set def [-] + pipe set def $(UTIL) && $(MAKE) clean && set def [-] + pipe set def $(DOC) && $(MAKE) clean && set def [-] + +# -delete/log $(CLEANFILES) + +spotless: clean + pipe set def $(DAT) && $(MAKE) spotless && set def [-] + pipe set def $(SRC) && $(MAKE) spotless && set def [-] + pipe set def $(UTIL) && $(MAKE) spotless && set def [-] + pipe set def $(DOC) && $(MAKE) spotless && set def [-] + -delete/log $(SPOTLESSFILES) $(INCL)nhlua.h;* + +# pipe set def $(DAT) && $(MAKE) spotless && set def [-] +# -$(RM) $(GAMEBIN);* diff --git a/sys/vms/Makefile_utl.vms b/sys/vms/Makefile_utl.vms new file mode 100644 index 000000000..6d62d51e4 --- /dev/null +++ b/sys/vms/Makefile_utl.vms @@ -0,0 +1,331 @@ +# Makefile for NetHack's utility programs. +# NetHack 5.0 util Makefile.vms $NHDT-Date: 1602258295 2020/10/09 15:44:55 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.53 $ +# Copyright (c) 2018 by Robert Patrick Rankin +# NetHack may be freely redistributed. See license for details. + +# Root of source tree relative to here: +NHSROOT=[-] + +# NetHack 5.0 began introducing C99 code. +# +# If your compiler needs an appropriate switch to accept C99 code. +# CSTD = -std=c99 + +# directories relative to here (util) +DOC=[-.doc] +DAT=[-.dat] +INCL=[-.include] +SRC=[-.src] +UTIL=[-.util] +SYSVMS=[-.sys.vms] +SYSSHR=[-.sys.share] +SYSUNIX=[-.sys.unix] +WINTTY=[-.win.tty] +WINSHR=[-.win.share] +WINTTY=[-.win.tty] +WINCURS=[-.win.curses] +WINX11=[-.win.X11] +WINQT=[-.win.Qt] +WINSHIM=[-.win.shim] +WINCHAIN=[-.win.chain] + +# Lua location relative to here +LUAVER=548 +LUADOTVER=5.4.8 +LUAUNDERVER=5_4_8 +LUAINC=[-.lib.lua.lua$(LUAVER).src] +LUALIB=[-.lib.lua]lua$(LUAVER).olb +LUASRCDIR =[-.lib.lua.lua$(LUAVER).src] +LUASRCINCDIR=$(LUASRCDIR) +#LUASRCINCDIR=SYS$COMMON:[LUA.INCLUDE] + +# hacklib +HACKLIB=hacklib.olb +HACKLIBOBJS=[-.src]hacklib.obj,[-.util]panic.obj + +comma:=, +LIBS = +OBJDIR = [-.src] + +# Compiler flags +CFLAGS :=/INCLUDE=($(INCL),$(LUAINC)) /NAMES=(AS_IS) $(CSTD) +CXXFLAGS = /INCLUDE_DIR=($(INCL),$(LUAINC)) /NAMES=(AS_IS) + +# Link flags +LFLAGS = + +# external programs +# MAKE = make +CC = CC +#touch :=SET FILE/TRUNCATE +touch = append/New _NLA0: +LINK = link +RM = delete +#TRUE uses an actual helper true.exe +TRUE = true +#FALSE uses an actual helper false.exe +FALSE = false +#ECHO uses an actual helper echo.exe +ECHO = echo +CXX ?= CXX +MOC ?= moc +MOCPATH ?= $(QTDIR)/bin/$(MOC) +# The default is for the TARGET_* variables to match the defaults. +# If we're cross-compiling these will get overridden elsewhere, likely via +# a hints file. TARGETPFX was set above earlier. +TARGET_CC = $(CC) +TARGET_CFLAGS = $(CFLAGS) $(CSTD) +TARGET_LINK = $(LINK) +TARGET_LFLAGS = $(LFLAGS) +TARGET_CXX = $(CXX) +TARGET_CXXFLAGS = $(CXXFLAGS) +TARGET_LIBS = $(LIBS) +# [LINK might be defined to use $(CXX); we don't want that here.] +CLINK=$(TARGET_LINK) +CXXLINK=$(TARGET_LINK) + +# timestamps for primary header files, matching src/Makefile +#CONFIG_H = $(SRC)config.h-t +#HACK_H = $(SRC)hack.h-t + +# utility .c files +MAKESRC = makedefs.c $(SRC)mdlib.c +RECOVSRC = recover.c +DLBSRC = dlb_main.c +UTILSRCS = $(MAKESRC) panic.c $(RECOVSRC) $(DLBSRC) + +# files that define all monsters and objects +CMONOBJ = $(SRC)monst.c $(SRC)objects.c +OMONOBJ = $(OBJDIR)monst.obj $(OBJDIR)objects.obj +# files that provide access to NetHack's names +CNAMING = $(SRC)drawing.c $(CMONOBJ) +ONAMING = $(OBJDIR)drawing.obj $(OMONOBJ) +# dynamic memory allocation +CALLOC = $(SRC)alloc.c +OALLOC = $(OBJDIR)alloc.obj +CPANIC = panic.c +OPANIC = []panic.obj +# build time info +CDATE = $(SRC)date.c +ODATE = $(OBJDIR)date.obj + +# object files for makedefs +MAKEOBJS = []makedefs.obj $(OMONOBJ) $(ODATE) $(OALLOC) $(OPANIC) + +# object files for recovery utility +RECOVOBJS = $(TARGETPFX)recover.obj $(TARGETPFX)recover_ver.obj + +# object files for the data librarian +DLBOBJS = dlb_main.obj $(OBJDIR)dlb.obj $(OALLOC) $(OPANIC) + +# Distinguish between the build tools for the native host +# and the build tools for the target environment in commands. +# This allows the same set of Makefiles to be used for native +# builds and for cross-compiles by overriding these in hints +# files or on the command line. + +TARGETPFX= +TARGET_CC = $(CC) +TARGET_CFLAGS = $(CFLAGS) $(CSTD) +TARGET_CLINK = $(CLINK) +TARGET_LFLAGS = $(LFLAGS) +TARGET_CXX = $(CXX) +TARGET_CXXFLAGS = $(CXXFLAGS) + +# hacklib +# +$(HACKLIB): $(HACKLIBOBJS) [-.util]panic.obj + LIBRARY/CREATE $(HACKLIB)/object + LIBRARY/INSERT $(HACKLIB) $(HACKLIBOBJS) +# dependencies for makedefs +# + +makedefs.exe: $(HACKLIB) $(MAKEOBJS) uplaceholder.obj mdgrep.h + $(CLINK) $(LFLAGS) /EXE=$@ \ + $(addsuffix $(comma),$(MAKEOBJS)) uplaceholder.obj, \ + $(HACKLIB)/lib + +# note: the headers listed here are maintained manually rather than via +# 'make depend'; only the ones which are directly included by +# makedefs.c are listed, without various nested ones that they include; +# for makedefs (but not for nethack's core), mdlib.c gets included +# rather than be compiled separately +makedefs.obj: makedefs.c $(SRC)mdlib.c $(CONFIG_H) \ + $(INCL)permonst.h $(INCL)objclass.h \ + $(INCL)artilist.h $(INCL)dungeon.h $(INCL)obj.h \ + $(INCL)monst.h $(INCL)monsters.h $(INCL)objects.h \ + $(INCL)you.h $(INCL)context.h $(INCL)flag.h \ + $(INCL)dlb.h $(INCL)patchlevel.h mdgrep.h + $(CC) $(CFLAGS) $(CSTD) makedefs.c /OBJ=$@ + +uplaceholder.c: + echo int uplaceholder = 1; >$@ + +uplaceholder.obj: uplaceholder.c + + +# Don't require perl to build; that is why mdgrep.h is spelled wrong below. +mdgreph: mdgrep.pl + perl mdgrep.pl + +# These are for reference purposes only. They aren't required in the build. +$(INCL)onames.h: makedefs $(INCL)objects.h + mcr []makedefs -o +$(INCL)pm.h: makedefs $(INCL)monsters.h + mcr []makedefs -p + +# we defer this makedefs call to the src Makefile, since it knows all about +# the main src and include files date.h is a timestamp for +$(INCL)date.h:: + @pipe set def $(SRC) && $(MAKE) $(INCL)date.h && set def [-] + +# support code used by several of the utility programs (but not makedefs) +panic.obj: panic.c $(CONFIG_H) + $(CC) $(CFLAGS) $(CSTD) panic.c /OBJ=$@ + + +# with all of extern.h's functions to complain about, we drown in +# 'defined but not used' without -u +#lintdgn: +# @lint -axhu -I.include -DLINT $(UTILSRCS) $(CALLOC) \ +# | sed '/_flsbuf/d' +# +# +# dependencies for recover +# +$(TARGETPFX)recover.exe: $(HACKLIB) $(RECOVOBJS) uplaceholder.obj + $(TARGET_CLINK) $(TARGET_LFLAGS) /EXE=$@ \ + $(addsuffix $(comma),$(RECOVOBJS)) uplaceholder.obj, \ + $(HACKLIB)/lib $(LIBS) + +$(TARGETPFX)recover.obj: recover.c $(CONFIG_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(CSTD) recover.c /OBJ=$@ + +$(TARGETPFX)recover_ver.obj: [-.src]version.c $(HACK_H) + $(TARGET_CC) $(TARGET_CFLAGS) $(CSTD) \ + /DEFINE=(MINIMAL_FOR_RECOVER) \ + [-.src]version.c /OBJ=$@ + +# dependencies for dlb +# +dlb: $(DLBOBJS) + $(CLINK) $(LFLAGS) /EXE=dlb $(DLBOBJS) $(LIBS) + +dlb_main.obj: dlb_main.c $(CONFIG_H) $(INCL)dlb.h + $(CC) $(CFLAGS) $(CSTD) dlb_main.c /OBJ=$@ + + +# dependencies for tile utilities +# +TEXT_IO = tiletext.obj tiletxt.obj $(OALLOC) $(ONAMING) +GIFREADERS = gifread.obj +PPMWRITERS = ppmwrite.obj + +tileutils: tilemap gif2txt txt2ppm tile2x11 + +gif2txt.exe: $(GIFREADERS) $(TEXT_IO) + $(CLINK) $(LFLAGS) /EXE=$@ $(GIFREADERS) $(TEXT_IO) $(LIBS) +txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) + $(CLINK) $(LFLAGS) /EXE=$@ $(PPMWRITERS) $(TEXT_IO) $(LIBS) + +tile2x11.exe: tile2x11.obj $(TEXT_IO) + $(CLINK) $(LFLAGS) /EXE=$@ tile2x11.obj $(TEXT_IO) $(LIBS) + +tile2bmp.exe: tile2bmp.obj $(TEXT_IO) + $(CLINK) $(LFLAGS) /EXE=$@ tile2bmp.obj $(TEXT_IO) + +tile2beos.exe: tile2beos.obj $(TEXT_IO) + $(CXXLINK) $(LFLAGS) /EXE=$@ tile2beos.obj $(TEXT_IO) + +#--compiling and linking in one step leaves extra debugging files (in their +# own subdirectories!) on OSX; compile and link separately to suppress +# that without mucking about with extra OS-specific CFLAGS and/or LFLAGS +#tilemap: .win/share/tilemap.c $(HACK_H) +# $(CC) $(CFLAGS) $(LFLAGS) -o tilemap .win/share/tilemap.c $(LIBS) +tilemap.exe: tilemap.obj $(OBJDIR)objects.obj $(OBJDIR)monst.obj \ + $(OBJDIR)drawing.obj + $(CLINK) $(LFLAGS) /EXE=$@ tilemap.obj $(OBJDIR)objects.obj \ + $(OBJDIR)monst.obj $(OBJDIR)drawing.obj $(LIBS) +$(SRC)tile.c: tilemap + mcr []tilemap + +tiletext.obj: $(WINSHR)tiletext.c $(CONFIG_H) $(WINSHR)tile.h + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) $(WINSHR)tiletext.c /OBJ=$@ +tiletxt.obj: $(WINSHR)tiletxt.c $(WINSHR)tilemap.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) $(WINSHR)tiletxt.c /OBJ=$@ +tilemap.obj: $(WINSHR)tilemap.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) $(WINSHR)tilemap.c /OBJ=$@ + +gifread.obj: $(WINSHR)gifread.c $(CONFIG_H) $(WINSHR)tile.h + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) $(WINSHR)gifread.c /OBJ=$@ +ppmwrite.obj: $(WINSHR)ppmwrite.c $(CONFIG_H) $(WINSHR)tile.h + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) $(WINSHR)ppmwrite.c /OBJ=$@ + +tile2bmp.obj: $(WINSHR)tile2bmp.c $(HACK_H) $(WINSHR)tile.h + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) $(WINSHR)tile2bmp.c /OBJ=$@ + +tile2x11.obj: .win/X11/tile2x11.c $(HACK_H) .win/share/tile.h \ + $(INCL)tile2x11.h + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) $(WINSHR)tile2x11.c /OBJ=$@ + +tile2img.obj: [-.win.gem]tile2img.c $(HACK_H) $(WINSHR)tile.h \ + $(INCL)bitmfile.h + $(CC) $(CFLAGS) $(CSTD) /INCLUDE=$(WINSHR) [-.win.gem]tile2img.c /OBJ=$@ +xpm2img.obj: [-.win.gem]xpm2img.c $(HACK_H) $(INCL)bitmfile.h + $(CC) $(CFLAGS) $(CSTD) -c .win/gem/xpm2img.c /obj=$@ +bitmfile.obj: [-.win.gem]bitmfile.c $(INCL)bitmfile.h + $(CC) $(CFLAGS) $(CSTD) [-.win.gem]bitmfile.c /obj=$@ + +uudecode.exe: uudecode.obj + $(CLINK) $(LFLAGS) /EXE=$@ uudecode.obj $(LIBS) +uudecode.obj: $(SYSSHR)uudecode.c + $(CC) $(CFLAGS) $(CSTD) /obj=$@ $(SYSSHR)uudecode.c + +# make sure host object files from src are available when needed +# (note: these dependencies have been copied from Makefile.src so only come +# indirectly from 'make depend', hence are subject to bit rot as src changes) +$(OBJDIR)alloc.obj: $(SRC)alloc.c $(CONFIG_H) + $(CC) $(CFLAGS) $(CSTD) $(SRC)alloc.c /obj=$@ +$(OBJDIR)drawing.obj: $(SRC)drawing.c $(CONFIG_H) $(INCL)color.h \ + $(INCL)rm.h $(INCL)objclass.h $(INCL)defsym.h \ + $(INCL)objects.h $(INCL)sym.h + $(CC) $(CFLAGS) $(CSTD) $(SRC)drawing.c /obj=$@ +$(OBJDIR)decl.obj: $(SRC)decl.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) $(SRC)decl.c /obj=$@ +$(OBJDIR)monst.obj: $(SRC)monst.c $(CONFIG_H) $(INCL)permonst.h \ + $(INCL)align.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monsters.h $(INCL)sym.h $(INCL)defsym.h \ + $(INCL)color.h + $(CC) $(CFLAGS) $(CSTD) $(SRC)monst.c /obj=$@ +$(OBJDIR)objects.obj: $(SRC)objects.c $(CONFIG_H) $(INCL)obj.h \ + $(INCL)prop.h $(INCL)skills.h $(INCL)color.h \ + $(INCL)objclass.h $(INCL)defsym.h $(INCL)objects.h + $(CC) $(CFLAGS) $(CSTD) $(SRC)objects.c /obj=$@ +$(OBJDIR)dlb.obj: $(SRC)dlb.c $(CONFIG_H) $(INCL)dlb.h + $(CC) $(CFLAGS) $(CSTD) $(SRC)dlb.c /obj=$@ +# this differs substantially from what Makefile.src specifies +$(OBJDIR)date.obj: $(SRC)date.c $(CONFIG_H) + $(CC) $(CFLAGS) $(CSTD) $(SRC)date.c /obj=$@ + +# make sure hack.h dependencies get transitive information +$(HACK_H): $(CONFIG_H) + @pipe set def $(SRC) && $(MAKE) $(HACK_H) && set def $(UTIL) +$(CONFIG_H): $(INCL)config.h + @pipe set def $(SRC) && $(MAKE) $(CONFIG_H) && set def $(UTIL) + +clean-fixup: + -delete/log $(INCL)tile.h;* + +clean: clean-fixup + -delete/log *.obj;* + +spotless: clean + -delete/log makedefs.exe;*,recover.exe;*,dlb.exe;* + -delete/log gif2txt.exe;*,txt2ppm.exe;*,tile2x11.exe;* \ + ,tile2img.ttp;*,xpm2img.ttp;*, \ + tilemap.exe;*,tileedit.exe;*,tile2bmp.exe;*,uudecode.exe; +.PHONY: recover makedefs + +recover: recover.exe +makedefs: makedefs.exe + diff --git a/sys/vms/install.com b/sys/vms/install.com index 09f6f839d..867e5bd94 100755 --- a/sys/vms/install.com +++ b/sys/vms/install.com @@ -29,27 +29,39 @@ $ ! to avoid inadvertent logical name interaction $ play_files = "PERM.,RECORD.,LOGFILE.,XLOGFILE.,PANICLOG." $ help_files = "HELP.,HH.,CMDHELP.,KEYHELP.,WIZHELP.,OPTHELP.," - + "HISTORY.,LICENSE." -$ data_files = "DATA.,RUMORS.,ORACLES.,OPTIONS.,QUEST.DAT,TRIBUTE.," - +$ data_files = "DATA.,RUMORS.,ORACLES.,OPTIONS.,TRIBUTE.," - + "ENGRAVE.,EPITAPH.,BOGUSMON." $ sysconf_file = "[.sys.vms]sysconf" $ guidebook = "[.doc]Guidebook.txt" $ invoc_proc = "[.sys.vms]nethack.com" $ trmcp_file = "[.sys.share]termcap" -$ spec_files = "AIR.LEV,ASMODEUS.LEV,ASTRAL.LEV,BAALZ.LEV,BIGRM-*.LEV," - - + "CASTLE.LEV,EARTH.LEV,FAKEWIZ%.LEV,FIRE.LEV," - - + "JUIBLEX.LEV,KNOX.LEV,MEDUSA-%.LEV,MINEFILL.LEV," - - + "MINETN-%.LEV,MINEND-%.LEV,ORACLE.LEV,ORCUS.LEV," - - + "SANCTUM.LEV,SOKO%-%.LEV,TOWER%.LEV,VALLEY.LEV," - - + "WATER.LEV,WIZARD%.LEV" -$ spec_input = "bigroom.des castle.des endgame.des " - - + "gehennom.des knox.des medusa.des mines.des " - - + "oracle.des sokoban.des tower.des yendor.des" -$ qstl_files = "%%%-GOAL.LEV,%%%-FIL%.LEV,%%%-LOCA.LEV,%%%-STRT.LEV" -$ qstl_input = "Arch.des Barb.des Caveman.des Healer.des " - - + "Knight.des Monk.des Priest.des Ranger.des Rogue.des " - - + "Samurai.des Tourist.des Wizard.des Valkyrie.des" -$ dngn_files = "DUNGEON." -$ dngn_input = "dungeon.pdf" +$ spec_files = "air.lua,asmodeus.lua,astral.lua,baalz.lua," - + + "bigrm-*.lua,castle.lua,earth.lua,fakewiz%.lua," - + + "fire.lua,hellfill.lua,juiblex.lua,knox.lua," - + + "medusa-%.lua,minefill.lua,minetn-%.lua," - + + "minend-%.lua,nhcore.lua,nhlib.lua," - + + "oracle.lua,orcus.lua,quest.lua,sanctum.lua," - + + "soko%-%.lua,themerms.lua,tower%.lua,tut-%.lua," - + + "valley.lua,water.lua,wizard%.lua" +$ qstl_files = "%%%-goal.lua,%%%-fil%.lua,%%%-loca.lua,%%%-strt.lua" +$ dngn_files = "dungeon.lua" +$! +$! spec_files = "AIR.LEV,ASMODEUS.LEV,ASTRAL.LEV,BAALZ.LEV,BIGRM-%.LEV," - +$! + "CASTLE.LEV,EARTH.LEV,FAKEWIZ%.LEV,FIRE.LEV," - +$! + "JUIBLEX.LEV,KNOX.LEV,MEDUSA-%.LEV,MINEFILL.LEV," - +$! + "MINETN-%.LEV,MINEND-%.LEV,ORACLE.LEV,ORCUS.LEV," - +$! + "SANCTUM.LEV,SOKO%-%.LEV,TOWER%.LEV,VALLEY.LEV," - +$! + "WATER.LEV,WIZARD%.LEV" +$! spec_input = "bigroom.des castle.des endgame.des " - +$! + "gehennom.des knox.des medusa.des mines.des " - +$! + "oracle.des sokoban.des tower.des yendor.des" +$! qstl_files = "%%%-GOAL.LEV,%%%-FIL%.LEV,%%%-LOCA.LEV,%%%-STRT.LEV" +$! qstl_input = "Arch.des Barb.des Caveman.des Healer.des " - +$! + "Knight.des Monk.des Priest.des Ranger.des Rogue.des " - +$! + "Samurai.des Tourist.des Wizard.des Valkyrie.des" +$! dngn_files = "DUNGEON." +$! dngn_input = "dungeon.pdf" +$! $ dlb_files = help_files + "," + data_files + "," - + spec_files + "," + qstl_files + "," + dngn_files $ data_libry = "nh-data.dlb" @@ -91,15 +103,17 @@ $ makedefs -h !oracles.txt -> oracles $ milestone "(dungeon preprocess)" $ makedefs -s $ milestone "(engrave, epitaph, bogusmon)" -$ makedefs -e !dungeon.def -> dungeon.pdf -$ milestone "(quest text)" +$ makedefs -v +$ milestone "(options)" +$! makedefs -e !dungeon.def -> dungeon.pdf +$! milestone "(quest text)" $ makedefs -q !quest.txt -> quest.dat $ milestone "(special levels)" -$ lev_comp 'spec_input' !special levels -$ milestone "(quest levels)" -$ lev_comp 'qstl_input' !quest levels -$ milestone "(dungeon compile)" -$ dgn_comp 'dngn_input' !dungeon database +$! lev_comp 'spec_input' !special levels +$! milestone "(quest levels)" +$! lev_comp 'qstl_input' !quest levels +$! milestone "(dungeon compile)" +$! dgn_comp 'dngn_input' !dungeon database $ set default [-] !move up $ if p3.nes."" .and. f$edit(p3,"UPCASE").nes."DATA_PLUS_DLB" then exit $ diff --git a/sys/vms/lev_lex.h b/sys/vms/lev_lex.h deleted file mode 100644 index 31a923f42..000000000 --- a/sys/vms/lev_lex.h +++ /dev/null @@ -1,25 +0,0 @@ -/* NetHack 3.6 lev_lex.h $NHDT-Date: 1432512790 2015/05/25 00:13:10 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* "vms/lev_lex.h" copied into "util/stdio.h" for use in *_lex.c only! - * This is an awful kludge to allow util/*_lex.c made by SunOS's `lex' - * to be compiled as is. (It isn't needed with `flex' or VMS POSIX - * `lex' and is benign when either of those configurations are used.) - * It works because the actual setup of yyin & yyout is performed in - * src/lev_main.c, where stdin & stdout are still correctly defined. - * - * The troublesome code is - * #include "stdio.h" - * ... - * FILE *yyin = stdin, *yyout = stdout; - * The file scope initializers with non-constant values require this - * hack, and the quotes instead of brackets makes it easy to do. - */ - -#include -#ifdef stdin -#undef stdin -#endif -#define stdin 0 -#ifdef stdout -#undef stdout -#endif -#define stdout 0 diff --git a/sys/vms/oldcrtl.c b/sys/vms/oldcrtl.c index 40a30127b..1ffb6d210 100644 --- a/sys/vms/oldcrtl.c +++ b/sys/vms/oldcrtl.c @@ -1,5 +1,5 @@ -/* NetHack 3.6 oldcrtl.c $NHDT-Date: 1432512789 2015/05/25 00:13:09 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Pat Rankin May'90 */ +/* NetHack 5.0 oldcrtl.c $NHDT-Date: 1596498304 2020/08/03 23:45:04 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.9 $ */ +/* Pat Rankin May'90 */ /* VMS NetHack support, not needed for vms 4.6,4.7,5.x,or later */ #ifdef VERYOLD_VMS @@ -7,7 +7,7 @@ * The following routines are used by NetHack but were not available * from the C Run-Time Library (VAXCRTL) prior to VMS V4.6. * - * atexit, memcmp, memcpy, qsort, rename, vprintf, vsprintf + * atexit, memcmp, memcpy, qsort, rename, vprintf, vsprintf * * Most of them are implemented here, but others will have to be worked * around in another fashion [such as '#define USE_OLDARGS' (even though diff --git a/sys/vms/sysconf b/sys/vms/sysconf index b4ffd357b..8fe0fb3eb 100644 --- a/sys/vms/sysconf +++ b/sys/vms/sysconf @@ -1,4 +1,4 @@ -# NetHack 3.6 sysconf $NHDT-Date: 1524689429 2018/04/25 20:50:29 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.2 $ +# NetHack 5.0 sysconf $NHDT-Date: 1704043695 2023/12/31 17:28:15 $ $NHDT-Branch: keni-luabits2 $:$NHDT-Revision: 1.7 $ # Copyright (c) 2015 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. # @@ -16,10 +16,19 @@ #EXPLORERS=* #SHELLERS= +# If the user name is found in this list, prompt for username instead. +# Uses the same syntax as the WIZARDS option above. +# A public server should probably disable this. +GENERICUSERS=play player game games nethack nethacker + +# Use the character name for matching WIZARDS, EXPLORERS and SHELLERS, +# instead of the user's login name. +#CHECK_PLNAME=1 + # Limit the number of simultaneous games. (Setting a limit has a side-effect # of changing the file names for the games in progress. With no limit, they # are named NNNcccccc.*, when NNN is a decimal formatting of the users's UIC -# value (group * 65536 + member; orinarily formatted as a pair of numbers +# value (group * 65536 + member; ordinarily formatted as a pair of numbers # expressed in octal, [group,member]) and cccccc is the character name. # With a limit, they are named Llock.*, where L is a single letter.) # Limit is documented to be 25 even though 26 is easily feasible.... @@ -36,6 +45,11 @@ # incubi to use nymphs' charm behavior rather than their own seduce behavior. #SEDUCE=0 +# Uncomment the next line to enable some accessibility features such +# as S_hero_override and S_pet_override symbols for screen readers +# in the user config file. +#ACCESSIBILITY=1 + # Uncomment to disable savefile UID checking. #CHECK_SAVE_UID=0 @@ -52,9 +66,60 @@ # numeric (1) user id. #PERS_IS_UID=1 +# Help menu control; 0 - include "command line usage" entry in help menu; +# 1 - suppress it from the menu. Does not affect 'nethack --usage' when +# player has access to the command line. The usage feedback describes +# command line handling for UNIX so enabling it won't be much use here. +HIDEUSAGE=1 + # Maximum number of score file entries to use for random statue names #MAX_STATUENAME_RANK=10 +# Use "Live logging" for important events (achievements, wishes, etc) +# Only available if NetHack was compiled with LIVELOG. +# Only really meaningful for public servers or debugging. +# See the log in-game with #chronicle -command. +# Bitmask for kinds of things you want to log - combine the following values +# as desired. +# 0x0000 - No live logging (default) +# 0x0001 - Wishes +# 0x0002 - Significant achievements (complete sokoban, perform invocation, etc) +# 0x0004 - Kill, destroy or bribe a unique monster. +# 0x0008 - Significant religious events (sacrifice gifts, crowning) +# 0x0010 - Life-saving +# 0x0020 - Break conduct - see also LLC_TURNS below. +# 0x0040 - Artifact obtained (#name Sting, dip for Excalibur) +# 0x0080 - Genocides +# 0x0100 - Murder of tame pet +# 0x0200 - Changed alignment temporarily or permanently +# 0x0400 - Log URL for dumplog if ascended +# 0x0800 - Log dumplog url for all games +# 0x1000 - Log 'minor' achievements - can be spammy +# 0x2000 - Spoiler event; can include in livelog but hidden from #chronicle +# 0x4000 - Include as 'major' event in dumplog; can be hidden from livelog +# 0x8000 - Livelog debug msgs +#LIVELOG=0x1FFF + +# Show debugging information originating from these source files. +# Use '*' for all, or list source files separated by spaces. +# Only available if game has been compiled with DEBUG, and can be +# overridden via DEBUGFILES environment variable. +#DEBUGFILES=* + +# Save end of game dump log to this file. +# Only available if NetHack was compiled with DUMPLOG +# Allows following placeholders: +# %% literal '%' +# %v version (eg. "5.0.0-0") +# %u game UID +# %t game start time, UNIX timestamp format +# %T current time, UNIX timestamp format +# %d game start time, YYYYMMDDhhmmss format +# %D current time, YYYYMMDDhhmmss format +# %n player name +# %N first character of player name +#DUMPLOGFILE=/tmp/nethack.%n.%d.log + # Number of bones file pools. # The pool you belong to is determined at game start. You will # load and save bones only from that pool. Generally useful @@ -63,12 +128,6 @@ # Disabled by setting to 0, or commenting out. #BONES_POOLS=10 -# Show debugging information originating from these source files. -# Use '*' for all, or list source files separated by spaces. -# Only available if game has been compiled with DEBUG, and can be -# overridden via DEBUGFILES environment variable. -#DEBUGFILES=* - # Try to get more info in case of a program bug or crash. Only used # if the program is built with the PANICTRACE compile-time option enabled. # By default PANICTRACE is enabled if (NH_DEVEL_STATUS != NH_STATUS_RELEASED), @@ -83,10 +142,22 @@ PANICTRACE_GDB=1 #PANICTRACE_LIBC= #-- +# 'portable_device_paths' is only supported for Windows. Starting with +# 3.6.3, nethack on Windows treats the folder containing nethack.exe and +# nethackW.exe as read-only and puts data files which are generated or +# modified during play or by the user in assorted folders derived from +# user name. 3.6.4 added PORTABLE_DEVICE_PATHS to allow reverting to +# the old behavior of having the run-time configuration file and other +# data in the same directory as the executable so that the whole thing +# can be moved from one machine to another (flash drive or perhaps cloud) +# without updating folder paths. +#PORTABLE_DEVICE_PATHS=0 + # Ordinary run-time options can be set here to override the builtin-in -# default values. Unlike the SYSCF values above, individual users can -# still choose their own option settings via NETHACKOPTIONS in their -# environment or via sys$login:nethack.ini run-time configuration file. +# default values. Unlike all the SYSCF values above, individual users +# can override the overridden options set here by choosing their own +# option settings via NETHACKOPTIONS in their environment or via +# sys$login:nethack.ini run-time configuration file. #OPTIONS=!autopickup,fruit:tomato,symset:DECgraphics #eof diff --git a/sys/vms/vmsbuild.com b/sys/vms/vmsbuild.com index 44735d1f3..971573bd1 100755 --- a/sys/vms/vmsbuild.com +++ b/sys/vms/vmsbuild.com @@ -1,6 +1,6 @@ -$ ! vms/vmsbuild.com -- compile and link NetHack 3.6.* [pr] -$ version_number = "3.6.7" -$ ! $NHDT-Date: 1557701518 2019/05/12 22:51:58 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.23 $ +$ ! vms/vmsbuild.com -- compile and link NetHack 5.0.* [pr] +$ version_number = "5.0.0" +$ ! $NHDT-Date: 1687541093 2023/06/23 17:24:53 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.39 $ $ ! Copyright (c) 2018 by Robert Patrick Rankin $ ! NetHack may be freely redistributed. See license for details. $ ! @@ -9,10 +9,11 @@ $ ! $ set default [.src] !or [-.-.src] if starting from [.sys.vms] $ ! $ @[-.sys.vms]vmsbuild [compiler-option] [link-option] [cc-switches] - $ ! [linker-switches] [interface] $ ! options: -$ ! compiler-option : either "VAXC", "DECC" or "GNUC" or "" !default VAXC +$ ! compiler-option : either "VSIC", "VAXC", "DECC", +$ ! "GNUC" or "" or "fetchlua" !default in 5.0 is VSIC $ ! link-option : either "SHARE[able]" or "LIB[rary]" !default SHARE $ ! cc-switches : optional qualifiers for CC (such as "/noOpt/Debug") -$ ! linker-switches : optional qualifers for LINK (/Debug or /noTraceback) +$ ! linker-switches : optional qualifiers for LINK (/Debug or /noTraceback) $ ! interface : "TTY" or "CURSES" or "TTY+CURSES" or "CURSES+TTY" $ ! notes: $ ! If the symbol "CC" is defined, compiler-option is not used (unless it @@ -25,16 +26,24 @@ $ ! to re-link with GNUC library, 'CC' must begin with "G" (or "g"). $ ! All options are positional; to specify a later one without an earlier $ ! one, use "" in the earlier one's position, such as $ ! $ @[-.sys.vms]vmsbuild "" "" "" "" "TTY+CURSES" +$ ! +$ ! Lua Version +$ luaver = "548" +$ luadotver = "5.4.8" +$ luaunderver = "5_4_8" $ $ decc_dflt = f$trnlnm("DECC$CC_DEFAULT") $ j = (decc_dflt.nes."") .and. 1 +$ vsic_ = "CC" + f$element(j,"#","#/DECC") + "/NOLIST" $ vaxc_ = "CC" + f$element(j,"#","#/VAXC") + "/NOLIST/OPTIMIZE=NOINLINE" $ decc_ = "CC" + f$element(j,"#","#/DECC") + "/PREFIX=ALL/NOLIST" $ gnuc_ = "GCC" $ if f$type(gcc).eqs."STRING" then gnuc_ = gcc $ gnulib = "gnu_cc:[000000]gcclib/Library" !(not used w/ vaxc) $ ! common CC options (/obj=file doesn't work for GCC 1.36, use rename instead) -$ c_c_ = "/INCLUDE=[-.INCLUDE]" +$ c_c_ = "/INCLUDE=([-.INCLUDE],[-.LIB.lua''luaver'.SRC])" - + + "/DEFINE=(""LUA_USE_C89"",USE_FCNTL)" +$ cxx_c_ = "/INCLUDE=([-.INCLUDE],[-.LIB.LUA''luaver'.SRC])" $ veryold_vms = f$extract(1,1,f$getsyi("VERSION")).eqs."4" - .and. f$extract(3,3,f$getsyi("VERSION")).lts."6" $ if veryold_vms then c_c_ = c_c_ + "/DEFINE=(""VERYOLD_VMS"")" @@ -47,26 +56,35 @@ $ vmsbuild = f$environment("PROCEDURE") $ ! validate first parameter $ p1 := 'p1' $ if p1.eqs."" .and. (axp .or. decc_dflt.eqs."/DECC") then p1 = "DECC" -$ o_VAXC = 0 !(c_opt substring positions) -$ o_DECC = 5 -$ o_GNUC = 10 -$ o_LINK = 15 -$ o_SPCL = 20 -$ c_opt = f$locate("|"+p1, "|VAXC|DECC|GNUC|LINK|SPECIAL|") !5 +$ o_VSIC = 0 +$ o_VAXC = 5 !(c_opt substring positions) +$ o_DECC = 10 +$ o_GNUC = 15 +$ o_LINK = 20 +$ o_SPCL = 25 +$ o_FETCHLUA = 33 +$ o_BUILDLUA = 42 +$ c_opt = f$locate("|"+p1, - + "|VSIC|VAXC|DECC|GNUC|LINK|SPECIAL|FETCHLUA|BUILDLUA") +$! write sys$output c_opt $ if (c_opt/5)*5 .eq. c_opt then goto p1_ok +$ if (c_opt .eq. o_FETCHLUA) .OR. (c_opt .eq. o_BUILDLUA) then goto p1_ok $ copy sys$input: sys$error: !p1 usage %first arg is compiler option; it must be one of - "VAXC" -- use VAX C to compile everything - or "DECC" -- use DEC C to compile everything - or "GNUC" -- use GNU C to compile everything - or "LINK" -- skip compilation, just relink nethack.exe - or "SPEC[IAL]" -- just compile and link lev_comp.exe - or "" -- default operation (VAXC unless 'CC' is defined) + "VSIC" -- use VSI C to compile everything + or "VAXC" -- use VAX C to compile everything + or "DECC" -- use DEC C to compile everything + or "GNUC" -- use GNU C to compile everything + or "LINK" -- skip compilation, just relink nethack.exe + or "SPEC[IAL]" -- just compile and link dlb.exe and recover.exe + or "FETCHLUA" -- skip compilation, just fetch lua from lua.org + or "BUILDLUA" -- build [-.lib.lua]lua'LUAVER'.olb + or "" -- carry out default operation (VAXC unless 'CC' is defined) Note: if a DCL symbol for CC is defined, "VAXC" and "GNUC" are no-ops. If the symbol value begins with "G" (or "g"), then the GNU C library will be included in all link operations. Do not rebuild - lev_comp with "SPECIAL" unless you have a CC symbol setup with + dlb+recover with "SPECIAL" unless you have a CC symbol setup with the proper options. $ abort $p1_ok: @@ -76,7 +94,7 @@ $ l_opt = f$locate("|"+p2, "|SHAREABLE|LIBRARY__|NONE_____|") !10 $ if (l_opt/10)*10 .eq. l_opt then goto p2_ok $ copy sys$input: sys$error: !p2 usage %second arg is C run-time library handling; it must be one of - "SHAREABLE" -- link with SYS$SHARE:VAXCRTL.EXE/SHAREABLE + "SHAREABLE" -- link with SYS$SHARE:LIBRTL.EXE/SHAREABLE or "LIBRARY" -- link with SYS$LIBRARY:VAXCRTL.OLB/LIBRARY or "NONE" -- explicitly indicate DECC$SHR or "" -- default operation (use shareable image) @@ -90,10 +108,12 @@ $ set default 'f$parse(vmsbuild,,,"DEVICE")''f$parse(vmsbuild,,,"DIRECTORY")' $ set default [-.-.src] !move to source directory $ ! compiler setup; if a symbol for "CC" is already defined it will be used $ if f$type(cc).eqs."STRING" then goto got_cc -$ cc = vaxc_ !assume "VAXC" requested or defaulted +$ cc = vsic_ !assume "VSIC" requested or defaulted +$ cxx = "CXX" $ if c_opt.eq.o_GNUC then goto chk_gcc !explicitly invoked w/ "GNUC" option $ if c_opt.eq.o_DECC then cc = decc_ -$ if c_opt.ne.o_VAXC then goto got_cc !"SPEC" or "LINK", skip compiler check +$ if c_opt.eq.o_VAXC then cc = vaxc_ +$ if c_opt.ne.o_VSIC then goto got_cc !"SPEC" or "LINK", skip compiler check $ ! we want to prevent function inlining with vaxc v3.x (/opt=noinline) $ ! but we can't use noInline with v2.x, so need to determine version $ set noOn @@ -147,9 +167,19 @@ $skip_gas: $ on warning then continue $ if .not.gas_ok then c_c_ = c_c_ - ")" + ",""const="")" $ c_c_ = "/INCLUDE=[-.INCLUDE]" + c_c_ +$ cxx_c_ = "/INCLUDE=[-.INCLUDE]" + cxx_c_ $ ! $got_cc: +$ +$! not sure if 8.x DECC supports /NAMES=(AS_IS). Use next line, if so +$! if (c_opt.ne.o_VAXC) .and. (c_opt.ne.o_GNUC) .and. (c_opt.ne.o_DECC) +$ if (c_opt.ne.o_VAXC) .and. (c_opt.ne.o_GNUC) +$ then +$ c_c_ = c_c_ + "/NAMES=(AS_IS) +$ cxx_c_ = cxx_c_ + "/NAMES=(AS_IS) +$ endif $ cc = cc + c_c_ !append common qualifiers +$ cxx = cxx + cxx_c_ $ if p3.nes."" then cc = cc + p3 !append optional user preferences $ g := 'f$extract(0,1,cc)' $ if g.eqs."$" then g := 'f$extract(1,1,cc)' !"foreign" gcc @@ -162,7 +192,7 @@ $ if f$trnlnm("F").nes."" then close/noLog f $ create crtl.opt !empty $ open/Append f crtl.opt $ write f "! crtl.opt" -$ if c_opt.eq.o_DECC .or. l_opt.eq.20 +$ if c_opt.eq.o_DECC .or. c_opt.eq.o_VSIC .or. l_opt.eq.20 $ then $! l_opt=="none", leave crtl.opt empty (shs$share:decc$shr.exe/Share) $ else $ ! gnulib order: vaxcrtl.exe+gcclib.olb vs gcclib.olb+vaxcrtl.olb @@ -204,13 +234,24 @@ $! $compile_file: !input via 'c_file' $ no_lib = ( f$extract(0,1,c_file) .eqs. "#" ) $ if no_lib then c_file = f$extract(1,255,c_file) +$ if f$search("''c_file'.cpp").nes."" ! for regex +$ then +$ c_file = c_file + ".cpp" +$ compiler = "''cxx'" +$ else +$ c_file = c_file + ".c" +$ compiler = "''cc'" +$ endif $ c_name = f$edit(f$parse(c_file,,,"NAME"),"LOWERCASE") $ f_opts = "" !options for this file $ if f$type('c_name'_options).nes."" then f_opts = 'c_name'_options $ milestone " (",c_name,")" $ if f$search("''c_name'.obj").nes."" then delete 'c_name'.obj;* -$ cc 'f_opts' 'c_file' -$ if .not.no_lib then nh_obj_list == nh_obj_list + ",''c_name'.obj;0" +$ 'compiler' 'f_opts' 'c_file' +$ if .not.no_lib +$ then +$ libr/Obj/Replace 'nethacklib' 'c_name'.obj;0 +$ endif $ return $! $compile_list: !input via 'c_list' @@ -220,24 +261,102 @@ $ c_loop: $ j = j + 1 $ c_file = f$element(j,",",c_list) !get next file $ if c_file.eqs."," then goto c_done -$ c_file = c_file + ".c" $ gosub compile_file $ goto c_loop $ c_done: -$ nh_obj_list == f$extract(1,999,nh_obj_list) -$ if nh_obj_list.nes."" then libr/Obj 'nethacklib' 'nh_obj_list'/Replace -$ if nh_obj_list.nes."" then delete 'nh_obj_list' -$ delete/symbol/global nh_obj_list $ return +$fetchlua: +$ create/dir [-.lib] +$ set def [-.lib] +$ on error then goto luafixdir +$ pipe - + if f$search("lua''luaver'.tar.gz").eqs."" then - + curl http://www.lua.org/ftp/lua-'luadotver'.tar.gz - + --output lua'luaver'.tgz && - + if (f$search("lua''luaver'.tar").eqs."") .AND. - + (f$search("lua''luaver'.tgz").nes."") then - + gzip -d lua'luaver'.tgz && - + if f$search("lua''luaver'.tar").nes."" then - + tar -xf lua'luaver'.tar && - + if (f$search("lua-''luaunderver'.DIR;1").nes."") .AND. - + (f$search("lua''luaver'.dir;1").eqs."") then - + rename lua-'luaunderver'.DIR;1 lua'luaver'.dir;1 +$ milestone "[-.lib.lua'''luaver']" +$luafixdir: + set def [-.src] +$ if f$search("[-.include]nhlua.h;-1").nes."" then - + purge [-.include]nhlua.h +$ if f$search("[-.include]nhlua.h").nes."" then - + delete [-.include]nhlua.h; +$ milestone " (wiped existing [-.include]nhlua.h)" +$ exit +$! +$! 5.0 runtime LUA level parser/loader +$! +$buildlua: +$ if f$search("[-.lib]lua.dir;").eqs."" then - + create/dir [-.lib.lua] +$ save_nethacklib = nethacklib +$! +$! Temporarily override the value of nethacklib so that +$! the lua modules go into the lua library, not nethacklib. $! +$ nethacklib = "[-.lib.lua]lua''luaver'.olb" +$ if f$search("''nethacklib'").eqs."" then - + libr/Obj 'nethacklib'/Create +$ if f$search("''nethacklib';-1").nes."" then - + purge 'nethacklib' +$ c_list = "[-.lib.lua''luaver'.src]lapi,[-.lib.lua''luaver'.src]lauxlib" - + + ",[-.lib.lua''luaver'.src]lbaselib" - + + ",[-.lib.lua''luaver'.src]lcode,[-.lib.lua''luaver'.src]lcorolib" - + + ",[-.lib.lua''luaver'.src]lctype,[-.lib.lua''luaver'.src]ldblib" - + + ",[-.lib.lua''luaver'.src]ldebug,[-.lib.lua''luaver'.src]ldo" - + + ",[-.lib.lua''luaver'.src]ldump,[-.lib.lua''luaver'.src]lfunc" - + + ",[-.lib.lua''luaver'.src]lgc,[-.lib.lua''luaver'.src]linit" - + + ",[-.lib.lua''luaver'.src]liolib,[-.lib.lua''luaver'.src]llex" - + + ",[-.lib.lua''luaver'.src]lmathlib,[-.lib.lua''luaver'.src]lmem" - + + ",[-.lib.lua''luaver'.src]loadlib,[-.lib.lua''luaver'.src]lobject" - + + ",[-.lib.lua''luaver'.src]lopcodes,[-.lib.lua''luaver'.src]loslib" - + + ",[-.lib.lua''luaver'.src]lparser,[-.lib.lua''luaver'.src]lstate" - + + ",[-.lib.lua''luaver'.src]lstring,[-.lib.lua''luaver'.src]lstrlib" - + + ",[-.lib.lua''luaver'.src]ltable,[-.lib.lua''luaver'.src]ltablib" - + + ",[-.lib.lua''luaver'.src]ltm,[-.lib.lua''luaver'.src]lundump" - + + ",[-.lib.lua''luaver'.src]lutf8lib,[-.lib.lua''luaver'.src]lvm" - + + ",[-.lib.lua''luaver'.src]lzio" +$ gosub compile_list +$ milestone " ''nethacklib'" +$ luafinish: +$ nethacklib = save_nethacklib +$ return $begin: +$ if (c_opt .eq. o_FETCHLUA) .OR. (c_opt .eq. o_BUILDLUA) +$ then +$ if c_opt .eq. 33 then gosub fetchlua +$ if c_opt .eq. 42 then gosub buildlua +$ goto done +$ endif +$! +$! Check some prerequisites +$! +$ if f$search("[-.lib]lua''luaver'.dir").eqs."" +$ then +$ write sys$output "You need to: @vmsbuild fetchlua +$ exit +$ endif +$ if f$search("[-.lib.lua]lua''luaver'.olb").eqs."" +$ then +$ write sys$output "You need to: @vmsbuild buildlua +$ exit +$ endif $! $! miscellaneous special source file setup $! -$ if f$search("pmatchregex.c").eqs."" then copy [-.sys.share]pmatchregex.c []*.* -$ if f$search("random.c").eqs."" then copy [-.sys.share]random.c []*.* -$ if f$search("tclib.c") .eqs."" then copy [-.sys.share]tclib.c []*.* -$ if f$search("[-.util]lev_yacc.c").eqs."" then @[-.sys.vms]spec_lev.com +$! default to using cppregex +$ if f$search("regex.c").eqs."" then - + copy [-.sys.share]cppregex.cpp []regex.cpp +$! if f$search("random.c").eqs."" then copy [-.sys.share]random.c []*.* +$ if f$search("tclib.c") .eqs."" then - + copy [-.sys.share]tclib.c []*.* $! $ p5 := 'p5' $ ttysrc = "[-.win.tty]getline,[-.win.tty]termcap" - @@ -250,6 +369,21 @@ $ interface = ttysrc !default $ if p5.eqs."CURSES" then interface = cursessrc $ if p5.eqs."TTY+CURSES" then interface = ttysrc + "," + cursessrc $ if p5.eqs."CURSES+TTY" then interface = cursessrc + "," + ttysrc +$ +$ if f$search("[-.include]nhlua.h").eqs."" +$ then +$ create [-.include]nhlua.h !empty +$ set file/att=(RFM:STM) [-.include]nhlua.h +$ open/Append f [-.include]nhlua.h +$ write f "/* nhlua.h - generated by vmsbuild.com */" +$ write f "#include ""[-.lib.lua''luaver'.src]lua.h""" +$ write f "ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN;" +$ write f "#include ""[-.lib.lua''luaver'.src]lualib.h""" +$ write f "#include ""[-.lib.lua''luaver'.src]lauxlib.h""" +$ write f "/*nhlua.h*/" +$ close f +$ endif +$ milestone " ([-.include]nhlua.h)" $! $! create object library $! @@ -257,77 +391,77 @@ $ if c_opt.ne.o_SPCL .or. f$search(nethacklib).eqs."" then - libr/Obj 'nethacklib'/Create=(Block=3000,Hist=0) $ if f$search("''nethacklib';-1").nes."" then purge 'nethacklib' $! -$! compile and link makedefs, then nethack, lev_comp+dgn_comp, dlb+recover. +$! compile and link makedefs, then nethack, dlb+recover. $! $ milestone "" -$ c_list = "[-.sys.vms]vmsmisc,[-.sys.vms]vmsfiles,[]alloc,dlb,monst,objects" +$! +$ c_list = "[-.sys.vms]vmsmisc,[-.sys.vms]vmsfiles,[]alloc,dlb," - + + "monst,objects,date,#[-.util]panic" $ if c_opt.eq.o_SPCL then c_list = c_list + ",decl,drawing" $ gosub compile_list $ if c_opt.eq.o_SPCL then goto special !"SPECIAL" requested, skip main build $ set default [-.util] $ c_list = "#makedefs" $ gosub compile_list -$ link makedefs.obj,'nethacklib'/Lib,[-.src]ident.opt/Opt,[-.src]crtl/Opt +$ link makedefs.obj,[-.src]panic.obj,'nethacklib'/Lib,[-.src]ident.opt/Opt,[-.src]crtl/Opt $ milestone "makedefs" $! create some build-time files -$ makedefs -p !pm.h -$ makedefs -o !onames.h -$ makedefs -v !date.h -$ milestone " (*.h)" -$ makedefs -z !../src/vis_tab.c, ../include/vis_tab.h +$! 5.0 does not require these +$! makedefs -p !pm.h +$! makedefs -o !onames.h +$! makedefs -v !date.h $ milestone " (*.c)" $ set default [-.src] $! compile most of the source files: -$ c_list = "decl,version,[-.sys.vms]vmsmain,[-.sys.vms]vmsunix" - +$ c_list = "decl,version,[-.sys.vms]vmsunix" - + ",[-.sys.vms]vmstty,[-.sys.vms]vmsmail" - + ",[]isaac64" - !already in [.src] - + ",[]random,[]tclib,[]pmatchregex" !copied from [-.sys.share] + + ",[]tclib,[]regex" !copied from [-.sys.share] $ gosub compile_list $ c_list = interface !ttysrc or cursessrc or both $ gosub compile_list -$ c_list = "allmain,apply,artifact,attrib,ball,bones,botl,cmd,dbridge,detect" - - + ",dig,display,do,do_name,do_wear,dog,dogmove,dokick,dothrow,drawing" - - + ",dungeon,eat,end,engrave,exper,explode,extralev,files,fountain" +$ c_list = "allmain,apply,artifact,attrib,ball,bones,botl,calendar,cmd" - + + ",coloratt,dbridge,dothrow,drawing,detect,dig,display,do,do_name" - + + ",do_wear,dog,dogmove,dokick,dungeon,eat,end,engrave,exper,explode" - + + ",extralev,files,fountain,getpos,glyphs" $ gosub compile_list -$ c_list = "hack,hacklib,invent,light,lock,mail,makemon,mapglyph,mcastu" - - + ",mhitm,mhitu,minion,mklev,mkmap,mkmaze,mkobj,mkroom,mon,mondata" - - + ",monmove,mplayer,mthrowu,muse,music,o_init,objnam,options" - - + ",pager,pickup" +$ c_list = "hack,hacklib,iactions,insight,invent,light,lock,mail,makemon" - + + ",mcastu,mdlib,mhitm,mhitu,minion,mklev,mkmap,mkmaze" - + + ",mkobj,mkroom,mon,mondata,monmove,mplayer,mthrowu,muse" - + + ",music" $ gosub compile_list -$ c_list = "pline,polyself,potion,pray,priest,quest,questpgr,read" - - + ",rect,region,restore,rip,rnd,role,rumors,save,shk,shknam,sit" - - + ",sounds,sp_lev,spell,steal,steed,sys,teleport,timeout,topten" - - + ",track,trap,u_init" +$! +$! Files added in 5.0 for Lua glue +$! +$ c_list = "nhlua,nhlobj,nhlsel" $ gosub compile_list -$ c_list = "uhitm,vault,vision,vis_tab,weapon,were,wield,windows" - - + ",wizard,worm,worn,write,zap" +$ c_list = "o_init,objnam,options,pager,pickup" - + + ",pline,polyself,potion,pray,priest,quest,questpgr,read" - + + ",rect,region,report,restore,rip,rnd,role,rumors,save,selvar" - + + ",sfstruct,shk,shknam,sit,sounds,sp_lev,spell,stairs,steal" - + + ",steed,strutil,symbols,sys,teleport,timeout,topten,track" - + + ",trap,u_init,utf8map" +$ gosub compile_list +$ c_list = "uhitm,vault,vision,weapon,were,wield,windows" - + + ",wizard,wizcmds,worm,worn,write,zap" $ gosub compile_list $! $link: +$! We do these at the end +$ c_list = "#[-.sys.vms]vmsmain,#date" +$ gosub compile_list $ milestone "" -$ link/Exe=nethack.exe nethack.opt/Options,ident.opt/Options,crtl.opt/Options +$ link /EXECUTABLE=nethack.exe vmsmain.obj,date.obj- + +[-.src]nethack.olb/library - + +sys$disk:[-.lib.lua]lua548.olb/library $ milestone "NetHack" $ if c_opt.eq.o_LINK then goto done !"LINK" only $special: $! -$! build special level and dungeon compilers +$! utilities only [dgn_comp and lev_comp are gone] $! $ set default [-.util] -$ c_list = "#panic,#lev_main,#lev_yacc,#dgn_main,#dgn_yacc" -$ if c_opt.eq.o_SPCL then c_list = "[-.sys.vms]vmsfiles," + c_list -$ gosub compile_list -$ c_list = "#lev_lex,#dgn_lex" -$ copy [-.sys.vms]lev_lex.h stdio.*/Prot=(s:rwd,o:rwd) -$ gosub compile_list -$ rename stdio.h lev_lex.* -$ link/exe=lev_comp.exe lev_main.obj,lev_yacc.obj,lev_lex.obj,- - panic.obj,'nethacklib'/Lib,[-.src]ident.opt/Opt,[-.src]crtl.opt/Opt -$ milestone "lev_comp" -$ link/exe=dgn_comp.exe dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,- - panic.obj,'nethacklib'/Lib,[-.src]ident.opt/Opt,[-.src]crtl.opt/Opt -$ milestone "dgn_comp" -$! -$ c_list = "#dlb_main,#recover" +$ c_list = "#panic,#dlb_main,#recover" $ gosub compile_list $ link/exe=dlb.exe dlb_main.obj,- panic.obj,'nethacklib'/Lib,[-.src]ident.opt/Opt,[-.src]crtl.opt/Opt diff --git a/sys/vms/vmsfiles.c b/sys/vms/vmsfiles.c index 89e6aff4a..cc05e1030 100644 --- a/sys/vms/vmsfiles.c +++ b/sys/vms/vmsfiles.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vmsfiles.c $NHDT-Date: 1449801740 2015/12/11 02:42:20 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.10 $ */ +/* NetHack 5.0 vmsfiles.c $NHDT-Date: 1685522046 2023/05/31 08:34:06 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.19 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2007. */ /* NetHack may be freely redistributed. See license for details. */ @@ -8,14 +8,19 @@ * routines or substitute for ones where we want behavior modification. */ #include "config.h" -#include -/* lint supression due to lack of extern.h */ -int FDECL(vms_link, (const char *, const char *)); -int FDECL(vms_unlink, (const char *)); -int FDECL(vms_creat, (const char *, unsigned int)); -boolean FDECL(same_dir, (const char *, const char *)); -int FDECL(c__translate, (int)); +#ifdef VMSVSI +#include +#include +#include +#endif + +/* lint suppression due to lack of extern.h */ +int vms_link(const char *, const char *); +int vms_unlink(const char *); +int vms_creat(const char *, unsigned int); +boolean same_dir(const char *, const char *); +int c__translate(int); #include #if 0 @@ -27,16 +32,18 @@ int FDECL(c__translate, (int)); #ifndef C$$TRANSLATE /* don't rely on VAXCRTL's internal routine */ #define C$$TRANSLATE(status) (errno = EVMSERR, vaxc$errno = (status)) #endif + +#ifndef VMSVSI extern unsigned long sys$parse(), sys$search(), sys$enter(), sys$remove(); -extern int VDECL(lib$match_cond, (int, int, ...)); +extern int lib$match_cond(int, int, ...); +#endif #define vms_success(sts) ((sts) & 1) /* odd, */ #define vms_failure(sts) (!vms_success(sts)) /* even */ -/* vms_link() -- create an additional directory for an existing file */ +/* vms_link() -- create an additional directory entry for an existing file */ int -vms_link(file, new) -const char *file, *new; +vms_link(const char *file, const char *new) { struct FAB fab; struct NAM nam; @@ -83,8 +90,7 @@ const char *file, *new; (because the file won't be deleted, just made inaccessible!). */ int -vms_unlink(file) -const char *file; +vms_unlink(const char *file) { struct FAB fab; struct NAM nam; @@ -115,19 +121,17 @@ const char *file; */ #undef creat int -vms_creat(file, mode) -const char *file; -unsigned int mode; +vms_creat(const char *file, unsigned int mode) { char filnambuf[BUFSIZ]; /*(not BUFSZ)*/ - if (index(file, ';')) { + if (strchr(file, ';')) { /* assumes remove or delete, not vms_unlink */ if (!unlink(file)) { (void) sleep(1); (void) unlink(file); } - } else if (!index(file, '.')) { + } else if (!strchr(file, '.')) { /* force some punctuation to be present */ file = strcat(strcpy(filnambuf, file), "."); } @@ -141,15 +145,12 @@ unsigned int mode; */ #undef open int -vms_open(file, flags, mode) -const char *file; -int flags; -unsigned int mode; +vms_open(const char *file, int flags, unsigned int mode) { char filnambuf[BUFSIZ]; /*(not BUFSZ)*/ int fd; - if (!index(file, '.') && !index(file, ';')) { + if (!strchr(file, '.') && !strchr(file, ';')) { /* force some punctuation to be present to make sure that the file name can't accidentally match a logical name */ file = strcat(strcpy(filnambuf, file), ";0"); @@ -165,13 +166,12 @@ unsigned int mode; /* do likewise for fopen() */ #undef fopen FILE * -vms_fopen(file, mode) -const char *file, *mode; +vms_fopen(const char *file, const char *mode) { char filnambuf[BUFSIZ]; /*(not BUFSZ)*/ FILE *fp; - if (!index(file, '.') && !index(file, ';')) { + if (!strchr(file, '.') && !strchr(file, ';')) { /* force some punctuation to be present to make sure that the file name can't accidentally match a logical name */ file = strcat(strcpy(filnambuf, file), ";0"); @@ -191,8 +191,7 @@ const char *file, *mode; the command line). This version doesn't handle Unix-style file specs. */ boolean -same_dir(d1, d2) -const char *d1, *d2; +same_dir(const char *d1, const char *d2) { if (!d1 || !*d1 || !d2 || !*d2) return FALSE; @@ -247,10 +246,9 @@ const char *d1, *d2; #define CASE2(V, W) CASE1(V) : CASE1(W) int -c__translate(code) -int code; +c__translate(int code) { - register int trans; + int trans; /* clang-format off */ /* *INDENT-OFF* */ @@ -306,12 +304,11 @@ static char base_name[NAM$C_MAXRSS + 1]; /* return a copy of the 'base' portion of a filename */ char * -vms_basename(name) -const char *name; +vms_basename(const char *name, boolean keep_suffix) { unsigned len; - char *base, *base_p; - register const char *name_p; + char *base, *base_p, *xtra_p; + const char *name_p; /* skip directory/path */ if ((name_p = strrchr(name, ']')) != 0) @@ -325,10 +322,14 @@ const char *name; if (!*name) name = "."; /* this should never happen */ - /* find extension/version and derive length of basename */ - if ((name_p = strchr(name, '.')) == 0 || name_p == name) - name_p = strchr(name, ';'); - len = (name_p && name_p > name) ? name_p - name : strlen(name); + /* find extension/version and derive length of basename; + for 'keep_suffix', this won't be accurate if version number is + present and delimited by dot instead of semi-colon, but normal + usage is for DEBUGFILES and that uses compiler supplied name */ + name_p = strrchr(name, ';'); + if (!keep_suffix && (xtra_p = strrchr(name, '.')) != 0) + name_p = xtra_p; + len = (name_p && name_p > name) ? name_p - name : (unsigned) strlen(name); /* return a lowercase copy of the name in a private static buffer */ base = strncpy(base_name, name, len); diff --git a/sys/vms/vmsmail.c b/sys/vms/vmsmail.c index 989775687..87685fd7e 100644 --- a/sys/vms/vmsmail.c +++ b/sys/vms/vmsmail.c @@ -1,20 +1,25 @@ -/* NetHack 3.6 vmsmail.c $NHDT-Date: 1449801741 2015/12/11 02:42:21 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.10 $ */ +/* NetHack 5.0 vmsmail.c $NHDT-Date: 1685522048 2023/05/31 08:34:08 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.18 $ */ /* Copyright (c) Robert Patrick Rankin, 1991. */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" #include "mail.h" -/* lint supression due to lack of extern.h */ -unsigned long NDECL(init_broadcast_trapping); -unsigned long NDECL(enable_broadcast_trapping); -unsigned long NDECL(disable_broadcast_trapping); -struct mail_info *NDECL(parse_next_broadcast); +/* lint suppression due to lack of extern.h */ +unsigned long init_broadcast_trapping(void); +unsigned long enable_broadcast_trapping(void); +unsigned long disable_broadcast_trapping(void); +struct mail_info *parse_next_broadcast(void); + +#ifdef VMSVSI +#include +#include +#include +#endif #ifdef MAIL #include "wintype.h" #include "winprocs.h" -#include #include #include #ifndef __GNUC__ @@ -27,20 +32,25 @@ struct mail_info *NDECL(parse_next_broadcast); /* #include */ #define vms_ok(sts) ((sts) & 1) -static struct mail_info *FDECL(parse_brdcst, (char *)); -static void FDECL(filter_brdcst, (char *)); -static void NDECL(flush_broadcasts); -static void FDECL(broadcast_ast, (int)); -extern char *FDECL(eos, (char *)); -extern char *FDECL(strstri, (const char *, const char *)); -extern int FDECL(strncmpi, (const char *, const char *, int)); +static struct mail_info *parse_brdcst(char *); +static void filter_brdcst(char *); +static void flush_broadcasts(void); +static void broadcast_ast(int); +extern char *eos(char *); +extern char *strstri(const char *, const char *); +extern int strncmpi(const char *, const char *, int); -extern size_t FDECL(strspn, (const char *, const char *)); +extern size_t strspn(const char *, const char *); #ifndef __DECC -extern int VDECL(sscanf, (const char *, const char *, ...)); +extern int sscanf(const char *, const char *, ...); #endif + +#ifdef VMSVSI +#include +#else extern unsigned long smg$create_pasteboard(), smg$get_broadcast_message(), smg$set_broadcast_trapping(), smg$disable_broadcast_trapping(); +#endif extern volatile int broadcasts; /* defining declaration in mail.c */ @@ -60,7 +70,7 @@ static long pasteboard_id = 0; /* SMG's magic cookie */ * Unrecognized broadcasts result in the mail-daemon * arriving and announcing the display text, but no scroll being created. * If SHELL is undefined, then all broadcasts are treated as 'other'; since - * no subproceses are allowed, there'd be no way to respond to the scroll. + * no subprocesses are allowed, there'd be no way to respond to the scroll. * * When a scroll of mail is read by the character, readmail() extracts * the command string and uses it for the default when prompting the @@ -88,7 +98,7 @@ static long pasteboard_id = 0; /* SMG's magic cookie */ * Anything else results in just the message text being passed along, no * scroll of mail so consequently no command to execute when scroll read. * The user can set up ``$ XYZZY :== SEND'' prior to invoking NetHack if - * vanilla JNET responses to Bitnet messages are prefered. + * vanilla JNET responses to Bitnet messages are preferred. * * Static return buffers are used because only one broadcast gets * processed at a time, and the essential information in each one is @@ -107,14 +117,14 @@ static char nam_buf[63], /* maximum onamelth, size of ONAME(object) */ /* try to decipher and categorize broadcast message text */ static struct mail_info * -parse_brdcst(buf) /* called by parse_next_broadcast() */ -char *buf; /* input: filtered broadcast text */ +parse_brdcst(char *buf) /* called by parse_next_broadcast() */ + /* input: filtered broadcast text */ { int typ; char *txt; const char *nam, *cmd; #ifdef SHELL /* only parse if spawned commands are enabled */ - register char *p, *q; + char *p, *q; boolean is_jnet_send; char user[127 + 1], node[127 + 1], sentinel; @@ -294,10 +304,10 @@ char *buf; /* input: filtered broadcast text */ /* filter out non-printable characters and redundant noise */ -static void filter_brdcst(buf) /* called by parse_next_broadcast() */ -register char *buf; /* in: original text; out: filtered text */ +static void filter_brdcst(char *buf) /* called by parse_next_broadcast() */ + /* in: original text; out: filtered text */ { - register char c, *p, *buf_p; + char c, *p, *buf_p; /* filter the text; restrict consecutive spaces or dots to just two */ for (p = buf_p = buf; *buf_p; buf_p++) { @@ -330,7 +340,7 @@ static char empty_string[] = ""; /* fetch the text of a captured broadcast, then mangle and decipher it */ -struct mail_info *parse_next_broadcast() /* called by ckmailstatus(mail.c) */ +struct mail_info *parse_next_broadcast(void) /* called by ckmailstatus(mail.c) */ { short length, msg_type; $DESCRIPTOR(message, empty_string); /* string descriptor for buf[] */ @@ -353,7 +363,7 @@ struct mail_info *parse_next_broadcast() /* called by ckmailstatus(mail.c) */ /* spit out any pending broadcast messages whenever we leave */ -static void flush_broadcasts() /* called from disable_broadcast_trapping() */ +static void flush_broadcasts(void) /* called from disable_broadcast_trapping() */ { if (broadcasts > 0) { short len, typ; @@ -376,8 +386,7 @@ static void flush_broadcasts() /* called from disable_broadcast_trapping() */ */ /*ARGSUSED*/ static void -broadcast_ast(dummy) /* called asynchronously by terminal driver */ -int dummy UNUSED; +broadcast_ast(int dummy UNUSED) /* called asynchronously by terminal driver */ { broadcasts++; } @@ -385,7 +394,7 @@ int dummy UNUSED; /* initialize the broadcast manipulation code; SMG makes this easy */ unsigned long -init_broadcast_trapping() /* called by setftty() [once only] */ +init_broadcast_trapping(void) /* called by setftty() [once only] */ { unsigned long sts, preserve_screen_flag = 1; @@ -405,7 +414,7 @@ init_broadcast_trapping() /* called by setftty() [once only] */ /* set up the terminal driver to deliver $brkthru data to a mailbox device */ unsigned long -enable_broadcast_trapping() /* called by setftty() */ +enable_broadcast_trapping(void) /* called by setftty() */ { unsigned long sts = 1; @@ -427,7 +436,7 @@ enable_broadcast_trapping() /* called by setftty() */ /* return to 'normal'; $brkthru data goes straight to the terminal */ unsigned long -disable_broadcast_trapping() /* called by settty() */ +disable_broadcast_trapping(void) /* called by settty() */ { unsigned long sts = 1; @@ -445,22 +454,22 @@ disable_broadcast_trapping() /* called by settty() */ /* simple stubs for non-mail configuration */ unsigned long -init_broadcast_trapping() +init_broadcast_trapping(void) { return 1; } unsigned long -enable_broadcast_trapping() +enable_broadcast_trapping(void) { return 1; } unsigned long -disable_broadcast_trapping() +disable_broadcast_trapping(void) { return 1; } struct mail_info * -parse_next_broadcast() +parse_next_broadcast(void) { return 0; } @@ -494,7 +503,7 @@ struct mail_info *foo; } void -ckmailstatus() +ckmailstatus(void) { struct mail_info *brdcst, *parse_next_broadcast(); @@ -509,7 +518,7 @@ ckmailstatus() } int -main() +main(int argc UNUSED, char *argv[] UNUSED) { char dummy[BUFSIZ]; @@ -526,23 +535,21 @@ main() } void -panic(s) -char *s; +panic(char *s) { raw_print(s); exit(EXIT_FAILURE); } void -raw_print(s) -char *s; +raw_print(char *s) { puts(s); fflush(stdout); } void -wait_synch() +wait_synch(void) { char dummy[BUFSIZ]; diff --git a/sys/vms/vmsmain.c b/sys/vms/vmsmain.c index 0a8572007..23d80025f 100644 --- a/sys/vms/vmsmain.c +++ b/sys/vms/vmsmain.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vmsmain.c $NHDT-Date: 1449801742 2015/12/11 02:42:22 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.32 $ */ +/* NetHack 5.0 vmsmain.c $NHDT-Date: 1693359633 2023/08/30 01:40:33 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.57 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -7,34 +7,40 @@ #include "hack.h" #include "dlb.h" +#ifdef VMSVSI +#include +#include +#include +#endif + #include -static void NDECL(whoami); -static void FDECL(process_options, (int, char **)); -static void NDECL(byebye); +static void whoami(void); +static void process_options(int, char **); +static void byebye(void); #ifndef SAVE_ON_FATAL_ERROR #ifndef __DECC #define vms_handler_type int #else #define vms_handler_type unsigned int #endif -extern void FDECL(VAXC$ESTABLISH, - (vms_handler_type (*) (genericptr_t, genericptr_t))); -static vms_handler_type FDECL(vms_handler, (genericptr_t, genericptr_t)); +extern void VAXC$ESTABLISH(vms_handler_type (*) (genericptr_t, + genericptr_t)); +static vms_handler_type vms_handler(genericptr_t, genericptr_t); #include /* system service status codes */ #endif -static void NDECL(wd_message); +static void wd_message(void); static boolean wiz_error_flag = FALSE; +static char *progname = (char *) 0; + int -main(argc, argv) -int argc; -char *argv[]; +main(int argc, char *argv[]) { - register int fd; + NHFILE *nhfp; #ifdef CHDIR - register char *dir; + char *dir; #endif boolean resuming = FALSE; /* assume new game */ @@ -44,12 +50,15 @@ char *argv[]; privon(); #endif - sys_early_init(); + early_init(argc, argv); atexit(byebye); - hname = argv[0]; - hname = vms_basename(hname); /* name used in 'usage' type messages */ - hackpid = getpid(); + /* vms_basename(,FALSE) strips device, directory, suffix, and version; + the result is returned in a static buffer so we make a copy that + isn't at risk of getting clobbered by core's handling of DEBUGFILES */ + progname = dupstr(vms_basename(argv[0], FALSE)); + gh.hname = progname; + svh.hackpid = getpid(); (void) umask(0); choose_windows(DEFAULT_WINDOW_SYS); @@ -67,8 +76,19 @@ char *argv[]; dir = nh_getenv("HACKDIR"); #endif if (argc > 1) { + if (argcheck(argc, argv, ARG_VERSION) == 2) + exit(EXIT_SUCCESS); + + if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { + gd.deferred_showpaths = TRUE; + return 0; + } + if (argcheck(argc, argv, ARG_DEBUG) == 1) { + argc--; + argv++; + } #ifdef CHDIR - if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { + if (argc > 1 && !strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page * says -d directory, hope nobody's using -desomething_else */ @@ -141,7 +161,7 @@ char *argv[]; if (wizard) { /* use character name rather than lock letter for file names */ - locknum = 0; + gl.locknum = 0; } else { /* suppress interrupts while processing lock file */ (void) signal(SIGQUIT, SIG_IGN); @@ -149,14 +169,14 @@ char *argv[]; } /* * getlock() complains and quits if there is already a game - * in progress for current character name (when locknum == 0) - * or if there are too many active games (when locknum > 0). + * in progress for current character name (when gl.locknum == 0) + * or if there are too many active games (when gl.locknum > 0). * When proceeding, it creates an empty .0 file to * designate the current game. * getlock() constructs based on the character - * name (for !locknum) or on first available of alock, block, + * name (for !gl.locknum) or on first available of alock, block, * clock, &c not currently in use in the playground directory - * (for locknum > 0). + * (for gl.locknum > 0). */ getlock(); @@ -168,15 +188,15 @@ char *argv[]; */ vision_init(); - display_gamewindows(); + init_sound_disp_gamewindows(); /* * First, try to find and restore a save file for specified character. * We'll return here if new game player_selection() renames the hero. */ attempt_restore: - if ((fd = restore_saved_game()) >= 0) { - const char *fq_save = fqname(SAVEF, SAVEPREFIX, 1); + if ((nhfp = restore_saved_game()) != 0) { + const char *fq_save = fqname(gs.SAVEF, SAVEPREFIX, 1); (void) chmod(fq_save, 0); /* disallow parallel restores */ (void) signal(SIGINT, (SIG_RET_TYPE) done1); @@ -188,11 +208,11 @@ char *argv[]; #endif pline("Restoring save file..."); mark_synch(); /* flush output */ - if (dorecover(fd)) { + if (dorecover(nhfp)) { resuming = TRUE; /* not starting new game */ wd_message(); if (discover || wizard) { - if (yn("Do you want to keep the save file?") == 'n') + if (y_n("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else (void) chmod(fq_save, FCMASK); /* back to readable */ @@ -212,7 +232,7 @@ char *argv[]; if locking alphabetically, the existing lock file can still be used; otherwise, discard current one and create another for the new character name */ - if (!locknum) { + if (!gl.locknum) { delete_levelfile(0); /* remove empty lock file */ getlock(); } @@ -230,9 +250,7 @@ char *argv[]; } static void -process_options(argc, argv) -int argc; -char *argv[]; +process_options(int argc, char *argv[]) { int i; @@ -257,18 +275,18 @@ char *argv[]; #endif case 'u': if (argv[0][2]) - (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); + (void) strncpy(svp.plname, argv[0] + 2, sizeof(svp.plname) - 1); else if (argc > 1) { argc--; argv++; - (void) strncpy(plname, argv[0], sizeof(plname) - 1); + (void) strncpy(svp.plname, argv[0], sizeof(svp.plname) - 1); } else raw_print("Player name expected after -u"); break; case 'I': case 'i': if (!strncmpi(argv[0] + 1, "IBM", 3)) { - load_symset("IBMGraphics", PRIMARY); + load_symset("IBMGraphics", PRIMARYSET); load_symset("RogueIBM", ROGUESET); switch_symbols(TRUE); } @@ -276,7 +294,7 @@ char *argv[]; /* case 'D': */ case 'd': if (!strncmpi(argv[0] + 1, "DEC", 3)) { - load_symset("DECGraphics", PRIMARY); + load_symset("DECGraphics", PRIMARYSET); switch_symbols(TRUE); } break; @@ -315,18 +333,16 @@ char *argv[]; } if (argc > 1) - locknum = atoi(argv[1]); + gl.locknum = atoi(argv[1]); #ifdef MAX_NR_OF_PLAYERS - if (!locknum || locknum > MAX_NR_OF_PLAYERS) - locknum = MAX_NR_OF_PLAYERS; + if (!gl.locknum || gl.locknum > MAX_NR_OF_PLAYERS) + gl.locknum = MAX_NR_OF_PLAYERS; #endif } #ifdef CHDIR void -chdirx(dir, wr) -const char *dir; -boolean wr; +chdirx(const char *dir, boolean wr) { #ifndef HACKDIR static const char *defdir = "."; @@ -355,7 +371,7 @@ boolean wr; #endif /* CHDIR */ static void -whoami() +whoami(void) { /* * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS; @@ -366,20 +382,21 @@ whoami() * Note that we trust the user here; it is possible to play under * somebody else's name. */ - register char *s; + char *s; - if (!*plname && (s = nh_getenv("USER"))) - (void) lcase(strncpy(plname, s, sizeof(plname) - 1)); + if (!*svp.plname && (s = nh_getenv("USER"))) + (void) lcase(strncpy(svp.plname, s, sizeof(svp.plname) - 1)); } static void -byebye() +byebye(void) { - void FDECL((*hup), (int) ); + void (*hup)(int); #ifdef SHELL extern unsigned long dosh_pid, mail_pid; - extern unsigned long FDECL(sys$delprc, - (unsigned long *, const genericptr_t)); +#ifndef VMSVSI + extern unsigned long sys$delprc(unsigned long *, const genericptr_t); +#endif /* clean up any subprocess we've spawned that may still be hanging around */ @@ -388,11 +405,19 @@ byebye() if (mail_pid) (void) sys$delprc(&mail_pid, (genericptr_t) 0), mail_pid = 0; #endif +#ifdef FREE_ALL_MEMORY + if (progname && !program_state.panicking) { + if (gh.hname == progname) + gh.hname = (char *) 0; + free((genericptr_t) progname), progname = (char *) 0; + } +#endif /* SIGHUP doesn't seem to do anything on VMS, so we fudge it here... */ - hup = (void FDECL((*), (int) )) signal(SIGHUP, SIG_IGN); - if (!program_state.exiting++ && hup != (void FDECL((*), (int) )) SIG_DFL - && hup != (void FDECL((*), (int) )) SIG_IGN) { + hup = (void (*)(int)) signal(SIGHUP, SIG_IGN); + if (!program_state.exiting++ + && hup != (void (*)(int)) SIG_DFL + && hup != (void (*)(int)) SIG_IGN) { (*hup)(SIGHUP); } @@ -406,8 +431,9 @@ byebye() from saving the game after a fatal error has occurred. */ /*ARGSUSED*/ static vms_handler_type /* should be `unsigned long', but the -*/ -vms_handler(sigargs, mechargs) /*+ prototype in is screwed */ -genericptr_t sigargs, mechargs; /* [0] is argc, [1..argc] are the real args */ +vms_handler( /*+ prototype in is screwed */ +genericptr_t sigargs, +genericptr_t mechargs) /* [0] is argc, [1..argc] are the real args */ { unsigned long condition = ((unsigned long *) sigargs)[1]; @@ -425,15 +451,14 @@ genericptr_t sigargs, mechargs; /* [0] is argc, [1..argc] are the real args */ #endif void -sethanguphandler(handler) -void FDECL((*handler), (int)); +sethanguphandler(void (*handler)(int)) { (void) signal(SIGHUP, (SIG_RET_TYPE) handler); } #ifdef PORT_HELP void -port_help() +port_help(void) { /* * Display VMS-specific help. Just show contents of the helpfile @@ -445,7 +470,7 @@ port_help() /* validate wizard mode if player has requested access to it */ boolean -authorize_wizard_mode() +authorize_wizard_mode(void) { if (!strcmpi(nh_getenv("USER"), WIZARD_NAME)) return TRUE; @@ -453,8 +478,15 @@ authorize_wizard_mode() return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + static void -wd_message() +wd_message(void) { if (wiz_error_flag) { pline("Only user \"%s\" may access debug (wizard) mode.", @@ -466,7 +498,7 @@ wd_message() } unsigned long -sys_random_seed() +sys_random_seed(void) { unsigned long seed; unsigned long pid = (unsigned long) getpid(); @@ -481,4 +513,28 @@ sys_random_seed() return seed; } +void +get_nhuuid(void) +{ + unsigned char stmp[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + if (svn.nhuuid[0]) + return; + + /* FIXME: fill in a useful valie UUID somehow */ + Snprintf(svn.nhuuid, sizeof svn.nhuuid, "%s", (char *) stmp); +} + +void +free_nhuuid(void) +{ + int i; + + for (i = 0; i < SIZE(svn.nhuuid); i++) { + svn.nhuuid[i] = 0; + } +} + /*vmsmain.c*/ diff --git a/sys/vms/vmsmisc.c b/sys/vms/vmsmisc.c index 8cb266cc7..83210662a 100644 --- a/sys/vms/vmsmisc.c +++ b/sys/vms/vmsmisc.c @@ -1,24 +1,33 @@ -/* NetHack 3.6 vmsmisc.c $NHDT-Date: 1524689429 2018/04/25 20:50:29 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.11 $ */ +/* NetHack 5.0 vmsmisc.c $NHDT-Date: 1685522049 2023/05/31 08:34:09 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.18 $ */ /* Copyright (c) 2011 by Robert Patrick Rankin */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" #undef exit + +#ifdef VMSVSI +#include +#include +#include +#endif + #include #include int debuggable = 0; /* 1 if we can debug or show a call trace */ -void FDECL(vms_exit, (int)); -void NDECL(vms_abort); +ATTRNORETURN void vms_exit(int) NORETURN; +ATTRNORETURN void vms_abort(void) NORETURN; /* first arg should be unsigned long but has unsigned int */ -extern void VDECL(lib$signal, (unsigned, ...)); + +#ifndef VMSVSI +extern void lib$signal(unsigned, ...); +#endif /* terminate, converting Unix-style exit code into VMS status code */ -void -vms_exit(status) -int status; +ATTRNORETURN void +vms_exit(int status) { /* convert non-zero to failure, zero to success */ exit(status ? (SS$_ABORT | STS$M_INHIB_MSG) : SS$_NORMAL); @@ -26,8 +35,8 @@ int status; } /* put the user into the debugger; used for abort() when in wizard mode */ -void -vms_abort() +ATTRNORETURN void +vms_abort(void) { if (debuggable) lib$signal(SS$_DEBUG); diff --git a/sys/vms/vmssetup.com b/sys/vms/vmssetup.com new file mode 100644 index 000000000..3f3a3764b --- /dev/null +++ b/sys/vms/vmssetup.com @@ -0,0 +1,25 @@ +$ ! vmssetup.com -- place GNU Makefiles in their target directories +$ version_number = "5.0.0" +$ ! $NHDT-Date: 1687541093 2024/03/08 17:24:53 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.39 $ +$ ! NetHack may be freely redistributed. See license for details. +$ ! +$ relsrc = "" +$ reldst = "-.-" +$ if (f$search("[]dat.dir") .nes. "") .AND. - + (f$search("[]src.dir") .nes. "") .AND. - + (f$search("[]include.dir") .nes. "") .AND. - + (f$search("[]sys.dir") .nes. "") then - + relsrc = ".sys.vms" +$ if (f$search("[]dat.dir") .nes. "") .AND. - + (f$search("[]src.dir") .nes. "") .AND. - + (f$search("[]include.dir") .nes. "") .AND. - + (f$search("[]sys.dir") .nes. "") then - + reldst = "" +$ copy ['relsrc']Makefile_top.vms ['reldst']Makefile.vms +$ copy ['relsrc']Makefile_dat.vms ['reldst'.dat]Makefile.vms +$ copy ['relsrc']Makefile_doc.vms ['reldst'.doc]Makefile.vms +$ copy ['relsrc']Makefile_src.vms ['reldst'.src]Makefile.vms +$ copy ['relsrc']Makefile_utl.vms ['reldst'.util]Makefile.vms +$! +$done: +$ exit diff --git a/sys/vms/vmstty.c b/sys/vms/vmstty.c index 44bd02711..8d9b5bf74 100644 --- a/sys/vms/vmstty.c +++ b/sys/vms/vmstty.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vmstty.c $NHDT-Date: 1449801743 2015/12/11 02:42:23 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.17 $ */ +/* NetHack 5.0 vmstty.c $NHDT-Date: 1596498309 2020/08/03 23:45:09 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.21 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -9,6 +9,13 @@ #include "wintty.h" #include "tcap.h" +#ifdef VMSVSI +#include +#include +#include +#include +#endif + #include #include #ifndef __GNUC__ @@ -32,16 +39,21 @@ #include #include + +#ifndef VMSVSI unsigned long lib$disable_ctrl(), lib$enable_ctrl(); unsigned long sys$assign(), sys$dassgn(), sys$qiow(); +#endif #ifndef USE_QIO_INPUT +#ifndef VMSVSI unsigned long smg$create_virtual_keyboard(), smg$delete_virtual_keyboard(), smg$read_keystroke(), smg$cancel_input(); +#endif #else -static short FDECL(parse_function_key, (int)); +static short parse_function_key(int); #endif -static void NDECL(setctty); -static void NDECL(resettty); +static void setctty(void); +static void resettty(void); #define vms_ok(sts) ((sts) &1) #define META(c) ((c) | 0x80) /* 8th bit */ @@ -104,11 +116,11 @@ static unsigned long tt_char_restore = 0, tt_char_active = 0, static unsigned long ctrl_mask = 0; #ifdef DEBUG -extern int NDECL(nh_vms_getchar); +extern int nh_vms_getchar(void); /* rename the real vms_getchar and interpose this one in front of it */ int -vms_getchar() +vms_getchar(void) { static int althack = 0, altprefix; char *nhalthack; @@ -135,7 +147,7 @@ vms_getchar() #endif /*DEBUG*/ int -vms_getchar() +vms_getchar(void) { short key; #ifdef USE_QIO_INPUT @@ -171,16 +183,16 @@ vms_getchar() } else if (kb_buf == ESC || kb_buf == CSI || kb_buf == SS3) { switch (parse_function_key((int) kb_buf)) { case SMG$K_TRM_UP: - key = Cmd.move_N; + key = gc.Cmd.dirchars[2]; break; case SMG$K_TRM_DOWN: - key = Cmd.move_S; + key = gc.Cmd.dirchars[6]; break; case SMG$K_TRM_LEFT: - key = Cmd.move_W; + key = gc.Cmd.dirchars[0]; break; case SMG$K_TRM_RIGHT: - key = Cmd.move_E; + key = gc.Cmd.dirchars[4]; break; default: key = ESC; @@ -201,16 +213,16 @@ vms_getchar() smg$read_keystroke(&kb, &key); switch (key) { case SMG$K_TRM_UP: - key = Cmd.move_N; + key = gc.Cmd.move_N; break; case SMG$K_TRM_DOWN: - key = Cmd.move_S; + key = gc.Cmd.move_S; break; case SMG$K_TRM_LEFT: - key = Cmd.move_W; + key = gc.Cmd.move_W; break; case SMG$K_TRM_RIGHT: - key = Cmd.move_E; + key = gc.Cmd.move_E; break; case '\r': key = '\n'; @@ -281,8 +293,7 @@ static const char *arrow_or_PF = "ABCDPQRS", /* suffix char */ /* Ultimate return value is (index into smg_keypad_codes[] + 256). */ static short -parse_function_key(c) -register int c; +parse_function_key(int c) { struct _rd_iosb iosb; unsigned long sts; @@ -308,8 +319,8 @@ register int c; } else sts = SS$_NORMAL; if (vms_ok(sts) || sts == SS$_TIMEOUT) { - register int cnt = iosb.trm_offset + iosb.trm_siz + inc; - register char *p = seq_buf; + int cnt = iosb.trm_offset + iosb.trm_siz + inc; + char *p = seq_buf; if (c == ESC) /* check for 7-bit vt100/ANSI, or vt52 */ if (*p == '[' || *p == 'O') @@ -317,7 +328,7 @@ register int c; else if (strchr(arrow_or_PF, *p)) c = SS3; /*CSI*/ if (cnt > 0 && (c == SS3 || (c == CSI && strchr(arrow_or_PF, *p)))) { - register char *q = strchr(smg_keypad_codes, *p); + char *q = strchr(smg_keypad_codes, *p); if (q) result = 256 + (q - smg_keypad_codes); @@ -356,7 +367,7 @@ register int c; #endif /* USE_QIO_INPUT */ static void -setctty() +setctty(void) { struct _sm_iosb iosb; unsigned long status; @@ -378,7 +389,7 @@ setctty() /* atexit() routine */ static void -resettty() +resettty(void) { if (settty_needed) { bombing = TRUE; /* don't clear screen; preserve traceback info */ @@ -394,7 +405,7 @@ resettty() * (for initial startup and for returning from '!' or ^Z). */ void -gettty() +gettty(void) { static char dev_tty[] = "TT:"; static $DESCRIPTOR(tty_dsc, dev_tty); @@ -445,11 +456,10 @@ gettty() /* reset terminal to original state */ void -settty(s) -const char *s; +settty(const char *s) { if (!bombing) - end_screen(); + term_end_screen(); if (s) raw_print(s); if (settty_needed) { @@ -474,8 +484,7 @@ const char *s; /* same as settty, with no clearing of the screen */ void -shuttty(s) -const char *s; +shuttty(const char *s) { bombing = TRUE; settty(s); @@ -483,7 +492,7 @@ const char *s; } void -setftty() +setftty(void) { unsigned long mask = LIB$M_CLI_CTRLT | LIB$M_CLI_CTRLY; @@ -504,29 +513,31 @@ setftty() sg.sm.tt2_char = tt2_char_active; setctty(); - start_screen(); + term_start_screen(); settty_needed = TRUE; } -/* enable kbd interupts if enabled when game started */ +/* enable kbd interrupts if enabled when game started */ void -intron() +intron(void) { intr_char = CTRL('C'); } /* disable kbd interrupts if required*/ void -introff() +introff(void) { intr_char = 0; } #ifdef TIMED_DELAY -extern unsigned long FDECL(lib$emul, (const long *, const long *, - const long *, long *)); +#ifndef VMSVSI +extern unsigned long lib$emul(const long *, const long *, const long *, + long *); extern unsigned long sys$schdwk(), sys$hiber(); +#endif #define VMS_UNITS_PER_SECOND 10000000L /* hundreds of nanoseconds, 1e-7 */ /* constant for conversion from milliseconds to VMS delta time (negative) */ @@ -535,8 +546,7 @@ static const long mseconds_to_delta = VMS_UNITS_PER_SECOND / 1000L * -1L; /* sleep for specified number of milliseconds (note: the timer used generally only has 10-millisecond resolution at the hardware level...) */ void -msleep(mseconds) -unsigned mseconds; /* milliseconds */ +msleep(unsigned mseconds) /* milliseconds */ { long pid = 0L, zero = 0L, msec, qtime[2]; @@ -567,7 +577,40 @@ VA_DECL(const char *, s) VA_END(); #ifndef SAVE_ON_FATAL_ERROR /* prevent vmsmain's exit handler byebye() from calling hangup() */ - sethanguphandler((void FDECL((*), (int) )) SIG_DFL); +/* sethanguphandler((void (*)(int) )) SIG_DFL; */ + sethanguphandler((SIG_RET_TYPE) SIG_DFL); #endif exit(EXIT_FAILURE); } + +#ifdef SIGWINCH +/* called by resize_tty(wintty.c) after receiving a SIGWINCH signal; + terminal size has changed and we should update LI and CO (from termcap) */ +void +getwindowsz(void) +{ + /* + * gettty() has code to do this, but it can't be used directly because + * it fetches terminal state in order to reset that upon termination. + * We need to avoid clobbering other saved state with values used by + * game-in-progress. For now, do nothing. + */ + return; +} +#endif + +#ifdef ENHANCED_SYMBOLS +/* + * set in term_start_screen() and allows + * OS-specific changes that may be + * required for support of utf8. + * Currently a placeholder for VMS. + */ +void +tty_utf8graphics_fixup(void) +{ + return; +} +#endif /* ENHANCED_SYMBOLS */ + +/*vmstty.c */ diff --git a/sys/vms/vmsunix.c b/sys/vms/vmsunix.c index 1b75a86b0..c44819092 100644 --- a/sys/vms/vmsunix.c +++ b/sys/vms/vmsunix.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vmsunix.c $NHDT-Date: 1449801743 2015/12/11 02:42:23 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.15 $ */ +/* NetHack 5.0 vmsunix.c $NHDT-Date: 1685522050 2023/05/31 08:34:10 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.31 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -7,6 +7,14 @@ #include "hack.h" +#ifdef VMSVSI +#include +#include +#include +#define sys$imgsta SYS$IMGSTA +#include +#endif + #include #include #include @@ -21,40 +29,41 @@ #include #undef umask #endif -#include extern int debuggable; /* defined in vmsmisc.c */ -extern void VDECL(lib$signal, (unsigned, ...)); +#ifndef VMSVSI +extern void lib$signal(unsigned, ...); extern unsigned long sys$setprv(); extern unsigned long lib$getdvi(), lib$getjpi(), lib$spawn(), lib$attach(); extern unsigned long smg$init_term_table_by_type(), smg$del_term_table(); +#endif + #define vms_ok(sts) ((sts) & 1) /* odd => success */ /* this could be static; it's only used within this file; - it won't be used at all if C_LIB$INTIALIZE gets commented out below, + it won't be used at all if C_LIB$INITIALIZE gets commented out below, so make it global so that compiler won't complain that it's not used */ -int FDECL(vmsexeini, (const void *, const void *, const unsigned char *)); +int vmsexeini(const void *, const void *, const unsigned char *); -static int FDECL(veryold, (int)); -static char *NDECL(verify_term); +static int veryold(int); +static char *verify_term(void); #if defined(SHELL) || defined(SUSPEND) -static void FDECL(hack_escape, (BOOLEAN_P, const char *)); -static void FDECL(hack_resume, (BOOLEAN_P)); +static void hack_escape(boolean, const char *); +static void hack_resume(boolean); #endif static int -veryold(fd) -int fd; +veryold(int fd) { - register int i; + int i; time_t date; struct stat buf; if (fstat(fd, &buf)) return 0; /* cannot get status */ #ifndef INSURANCE - if (buf.st_size != sizeof(int)) + if (buf.st_size != sizeof (int)) return 0; /* not an xlock file */ #endif (void) time(&date); @@ -62,7 +71,7 @@ int fd; int lockedpid; /* should be the same size as hackpid */ unsigned long status, dummy, code = JPI$_PID; - if (read(fd, (genericptr_t) &lockedpid, sizeof(lockedpid)) + if (read(fd, (genericptr_t) &lockedpid, sizeof lockedpid) != sizeof(lockedpid)) /* strange ... */ return 0; status = lib$getjpi(&code, &lockedpid, 0, &dummy); @@ -77,19 +86,19 @@ int fd; */ for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) { /* try to remove all */ - set_levelfile_name(lock, i); - (void) delete (lock); + set_levelfile_name(gl.lock, i); + (void) delete (gl.lock); } - set_levelfile_name(lock, 0); - if (delete (lock)) + set_levelfile_name(gl.lock, 0); + if (delete (gl.lock)) return 0; /* cannot remove it */ return 1; /* success! */ } void -getlock() +getlock(void) { - register int i = 0, fd; + int i = 0, fd; /* idea from rpick%ucqais@uccba.uc.edu * prevent automated rerolling of characters @@ -106,46 +115,46 @@ getlock() error("Quitting."); } - /* default value of lock[] is "1lock" where '1' gets changed to + /* default value of gl.lock[] is "1lock" where '1' gets changed to 'a','b',&c below; override the default and use if we aren't restricting the number of simultaneous games */ - if (!locknum) - Sprintf(lock, "_%u%s", (unsigned) getuid(), plname); + if (!gl.locknum) + Sprintf(gl.lock, "_%u%s", (unsigned) getuid(), svp.plname); - regularize(lock); - set_levelfile_name(lock, 0); - if (locknum > 25) - locknum = 25; + regularize(gl.lock); + set_levelfile_name(gl.lock, 0); + if (gl.locknum > 25) + gl.locknum = 25; do { - if (locknum) - lock[0] = 'a' + i++; + if (gl.locknum) + gl.lock[0] = 'a' + i++; - if ((fd = open(lock, 0, 0)) == -1) { + if ((fd = open(gl.lock, 0, 0)) == -1) { if (errno == ENOENT) goto gotlock; /* no such file */ - perror(lock); + perror(gl.lock); unlock_file(HLOCK); - error("Cannot open %s", lock); + error("Cannot open %s", gl.lock); } if (veryold(fd)) /* if true, this closes fd and unlinks lock */ goto gotlock; (void) close(fd); - } while (i < locknum); + } while (i < gl.locknum); unlock_file(HLOCK); - error(locknum ? "Too many hacks running now." + error(gl.locknum ? "Too many hacks running now." : "There is a game in progress under your name."); -gotlock: - fd = creat(lock, FCMASK); + gotlock: + fd = creat(gl.lock, FCMASK); unlock_file(HLOCK); if (fd == -1) { error("cannot creat lock file."); } else { - if (write(fd, (char *) &hackpid, sizeof(hackpid)) - != sizeof(hackpid)) { + if (write(fd, (char *) &svh.hackpid, sizeof(svh.hackpid)) + != sizeof(svh.hackpid)) { error("cannot write lock"); } if (close(fd) == -1) { @@ -154,10 +163,10 @@ getlock() } } -void regularize(s) /* normalize file name */ -register char *s; +/* normalize file name */ +void regularize(char *s) { - register char *lp; + char *lp; for (lp = s; *lp; lp++) /* note: '-' becomes '_' */ if (!(isalpha(*lp) || isdigit(*lp) || *lp == '$')) @@ -166,7 +175,7 @@ register char *s; #undef getuid int -vms_getuid() +vms_getuid(void) { return ((getgid() << 16) | getuid()); } @@ -176,8 +185,7 @@ vms_getuid() #endif /* check whether the open file specified by `fd' is in stream-lf format */ boolean -file_is_stmlf(fd) -int fd; +file_is_stmlf(int fd) { int rfm; struct stat buf; @@ -205,10 +213,7 @@ int fd; /* vms_define() - assign a value to a logical name */ int -vms_define(name, value, flag) -const char *name; -const char *value; -int flag; +vms_define(const char *name, const char *value, int flag) { struct dsc { unsigned short len, mbz; @@ -221,7 +226,10 @@ int flag; }; static struct itm3 itm_lst[] = { { 0, LNM$_STRING, 0, 0 }, { 0, 0 } }; struct dsc nam_dsc, val_dsc, tbl_dsc; - unsigned long result, sys$crelnm(), lib$set_logical(); + unsigned long result; +#ifndef VMSVSI + unsigned long sys$crelnm(), lib$set_logical(); +#endif /* set up string descriptors */ nam_dsc.mbz = val_dsc.mbz = tbl_dsc.mbz = 0; @@ -232,6 +240,7 @@ int flag; switch (flag) { case ENV_JOB: /* job logical name */ tbl_dsc.len = strlen(tbl_dsc.adr = "LNM$JOB"); + FALLTHROUGH; /*FALLTHRU*/ case ENV_SUP: /* supervisor-mode process logical name */ result = lib$set_logical(&nam_dsc, &val_dsc, &tbl_dsc); @@ -251,8 +260,7 @@ int flag; /* vms_putenv() - create or modify an environment value */ int -vms_putenv(string) -const char *string; +vms_putenv(const char *string) { char name[ENVSIZ + 1], value[ENVSIZ + 1], *p; /* [255+1] */ @@ -277,7 +285,7 @@ const char *string; Called by verify_termcap() for convenience. */ static char * -verify_term() +verify_term(void) { char *term = getenv("NETHACK_TERM"); if (!term) @@ -300,7 +308,7 @@ verify_term() if (devtype && vms_ok(smg$init_term_table_by_type(&devtype, &termtab, &smgdsc))) { - register char *p = &smgdevtyp[smgdsc.dsc$w_length]; + char *p = &smgdevtyp[smgdsc.dsc$w_length]; /* strip trailing blanks */ while (p > smgdevtyp && *--p == ' ') *p = '\0'; @@ -320,7 +328,7 @@ verify_term() #define NETHACK_DEF_TERMCAP "nethackdir:termcap" #define HACK_DEF_TERMCAP "hackdir:termcap" -char *verify_termcap() /* called from startup(src/termcap.c) */ +char *verify_termcap(void) /* called from startup(src/termcap.c) */ { struct stat dummy; const char *tc = getenv("TERMCAP"); @@ -356,7 +364,7 @@ char *verify_termcap() /* called from startup(src/termcap.c) */ static unsigned long oprv[2]; void -privoff() +privoff(void) { unsigned long pid = 0, prv[2] = { ~0, ~0 }; unsigned short code = JPI$_PROCPRIV; @@ -367,17 +375,53 @@ privoff() } void -privon() +privon(void) { (void) sys$setprv(1, oprv, 0, (unsigned long *) 0); } #endif /* CHDIR || SHELL || SECURE */ +#ifdef SYSCF +boolean +check_user_string(const char *userlist) +{ + char usrnambuf[BUFSZ]; + const char *sptr, *p, *q; + int ln; + + if (!strcmp(userlist, "*")) + return TRUE; + + /* FIXME: ought to use $getjpi or $getuai to retrieve user name here... */ + Strcpy(usrnambuf, nh_getenv("USER")); + ln = (int) strlen(usrnambuf); + if (!ln) + return FALSE; + + while ((sptr = strstri(userlist, usrnambuf)) != 0) { + /* check for full word: start of list or following a space or comma */ + if ((sptr == userlist || sptr[-1] == ' ' || sptr[-1] == ',') + /* and also preceding a space or comma or at end of list */ + && (sptr[ln] == ' ' || sptr[ln] == ',' || sptr[ln] == '\0')) + return TRUE; + /* doesn't match full word, but maybe we got a false hit when + looking for "jane" in the list "janedoe jane" so keep going */ + p = strchr(sptr + 1, ' '); + q = strchr(sptr + 1, ','); + if (!p || (q && q < p)) + p = q; + if (!p) + break; + userlist = p + 1; + } + + return FALSE; +} +#endif /* SYSCF */ + #if defined(SHELL) || defined(SUSPEND) static void -hack_escape(screen_manip, msg_str) -boolean screen_manip; -const char *msg_str; +hack_escape(boolean screen_manip, const char *msg_str) { if (screen_manip) suspend_nhwindows(msg_str); /* clear screen, reset terminal, &c */ @@ -386,8 +430,7 @@ const char *msg_str; } static void -hack_resume(screen_manip) -boolean screen_manip; +hack_resume(boolean screen_manip) { (void) signal(SIGINT, (SIG_RET_TYPE) done1); if (wizard) @@ -404,8 +447,16 @@ unsigned long dosh_pid = 0, /* this should cover any interactive escape */ leave any process hanging around) */ int -dosh() +dosh(void) { +#ifdef SYSCF + if (!sysopt.shellers || !sysopt.shellers[0] + || !check_user_string(sysopt.shellers)) { + /* FIXME: should no longer assume a particular command keystroke */ + Norep("Unavailable command '!'."); + return 0; + } +#endif return vms_doshell("", TRUE); /* call for interactive child process */ } @@ -422,9 +473,7 @@ dosh() * will be piped into oblivion. Used for silent phone call rejection. */ int -vms_doshell(execstring, screenoutput) -const char *execstring; -boolean screenoutput; +vms_doshell(const char *execstring, boolean screenoutput) { unsigned long status, new_pid, spawnflags = 0; struct dsc$descriptor_s comstring, *command, *inoutfile = 0; @@ -484,7 +533,7 @@ boolean screenoutput; * if not, there's nothing we can do. */ int -dosuspend() +dosuspend(void) { static long owner_pid = -1; unsigned long status; @@ -518,13 +567,10 @@ dosuspend() /* this would fit better in vmsfiles.c except that that gets linked with the utility programs and we don't want this code there */ -static void FDECL(savefile, (const char *, int, int *, char ***)); +static void savefile(const char *, int, int *, char ***); static void -savefile(name, indx, asize, array) -const char *name; -int indx, *asize; -char ***array; +savefile(const char *name, int indx, int *asize, char ***array) { char **newarray; int i, oldsize; @@ -549,14 +595,17 @@ struct dsc { char *adr; }; /* descriptor */ typedef unsigned long vmscond; /* vms condition value */ -vmscond FDECL(lib$find_file, (const struct dsc *, struct dsc *, genericptr *)); -vmscond FDECL(lib$find_file_end, (void **)); + +#ifndef VMSVSI +vmscond lib$find_file(const struct dsc *, struct dsc *, genericptr *); +vmscond lib$find_file_end(void **); +#endif /* collect a list of character names from all save files for this player */ int -vms_get_saved_games(savetemplate, outarray) -const char *savetemplate; /* wildcarded save file name in native VMS format */ -char ***outarray; +vms_get_saved_games( + const char *savetemplate, /* wildcarded save name in native VMS format */ + char ***outarray) { struct dsc in, out; unsigned short l; @@ -564,7 +613,7 @@ char ***outarray; char *charname, wildcard[255 + 1], filename[255 + 1]; genericptr_t context = 0; - Strcpy(wildcard, savetemplate); /* plname_from_file overwrites SAVEF */ + Strcpy(wildcard, savetemplate); /* plname_from_file overwrites gs.SAVEF */ in.mbz = 0; /* class and type; leave them unspecified */ in.len = (unsigned short) strlen(wildcard); in.adr = wildcard; @@ -581,7 +630,7 @@ char ***outarray; if (filename[l - 1] != ' ') break; filename[l] = '\0'; - if ((charname = plname_from_file(filename)) != 0) + if ((charname = plname_from_file(filename, FALSE)) != 0) savefile(charname, count++, &asize, outarray); } (void) lib$find_file_end(&context); @@ -594,8 +643,7 @@ char ***outarray; /* nethack has detected an internal error; try to give a trace of call stack */ void -vms_traceback(how) -int how; /* 1: exit after traceback; 2: stay in debugger */ +vms_traceback(int how) /* 1: exit after traceback; 2: stay in debugger */ { /* assumes that a static initializer applies to the first union field and that no padding will be placed between len and str */ @@ -617,7 +665,7 @@ int how; /* 1: exit after traceback; 2: stay in debugger */ in a last-gasp environment so apply the KISS principle...) */ DBGCMD("set Module/Calls ; show Calls 18"), /* epilogue; "exit" ends the sequence it's part of, but it doesn't - seem able to cause program termination end when used separately; + seem able to cause program termination when used separately; instead of relying on it, we'll redirect debugger input to come from the null device so that it'll get an end-of-input condition when it tries to get a command from the user */ @@ -666,16 +714,16 @@ int how; /* 1: exit after traceback; 2: stay in debugger */ * It all takes place before nethack even starts, and sets up * `debuggable' to control possible use of lib$signal(SS$_DEBUG). */ -typedef unsigned FDECL((*condition_handler), (unsigned *, unsigned *)); -extern condition_handler FDECL(lib$establish, (condition_handler)); -extern unsigned FDECL(lib$sig_to_ret, (unsigned *, unsigned *)); +typedef unsigned (*condition_handler)(unsigned *, unsigned *); +extern condition_handler lib$establish(condition_handler); +extern unsigned lib$sig_to_ret(unsigned *, unsigned *); /* SYS$IMGSTA() is not documented: if called at image startup, it controls access to the debugger; fortunately, the linker knows now to find it without needing to link against sys.stb (VAX) or use LINK/System (Alpha). We won't be calling it, but we indirectly check whether it has already been called by checking if nethack.exe has it as a transfer address. */ -extern unsigned FDECL(sys$imgsta, ()); +extern unsigned sys$imgsta(void); /* * These structures are in header files contained in sys$lib_c.tlb, @@ -742,9 +790,8 @@ struct eiha { /* extended image header activation block, $EIHADEF */ with magic arguments; C run-time library won't be initialized yet */ /*ARGSUSED*/ int -vmsexeini(inirtn_unused, clirtn_unused, imghdr) -const void *inirtn_unused, *clirtn_unused; -const unsigned char *imghdr; +vmsexeini(const void *inirtn_unused, const void *clirtn_unused, + const unsigned char *imghdr) { const struct ihd *vax_hdr; const struct eihd *axp_hdr; @@ -799,11 +846,11 @@ const unsigned char *imghdr; * are appended rather than overwriting each other). * * VAX C made global variables become named program sections, to be - * compatable with Fortran COMMON blocks, simplifying mixed-language - * programs. GNU C for VAX/VMS did the same, to be compatable with + * compatible with Fortran COMMON blocks, simplifying mixed-language + * programs. GNU C for VAX/VMS did the same, to be compatible with * VAX C. By default, DEC C makes global variables be global symbols * instead, with its /Extern_Model=Relaxed_Ref_Def mode, but can be - * told to be VAX C compatable by using /Extern_Model=Common_Block. + * told to be VAX C compatible by using /Extern_Model=Common_Block. * * We don't want to force that for the whole program; occasional use * of /Extern_Model=Strict_Ref_Def to find mistakes is too useful. @@ -820,7 +867,7 @@ const unsigned char *imghdr; * So, we switch modes for this hack only. Besides, psect attributes * for lib$initialize are different from the ones used for ordinary * variables, so we'd need to resort to some linker magic anyway. - * (With assembly language, in addtion to having full control of the + * (With assembly language, in addition to having full control of the * psect attributes in the source code, Macro32 would include enough * information in its object file such that linker wouldn't need any * extra instructions from us to make this work.) [If anyone links @@ -844,7 +891,7 @@ const unsigned long lib$initialize[] = { (unsigned long) (void *) vmsexeini }; #endif /* We also need to link against a linker options file containing: sys$library:starlet.olb/Include=(lib$initialize) -psect_attr=lib$initialize, Con,Usr,noPic,Rel,Gbl,noShr,noExe,Rd,noWrt,Long +psect_attr=lib$initialize, Con,Rel,Gbl,noShr,noExe,Rd,noWrt */ #endif /* C_LIB$INITIALIZE */ /* End of debugger hackery. */ diff --git a/sys/wince/.gitattributes b/sys/wince/.gitattributes deleted file mode 100644 index 5b2f07891..000000000 --- a/sys/wince/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -*.ce NHSUBST -*.mak NHSUBST -*.bat NHSUBST -* NH_filestag=(file%s_for_Windows_CE_and_PocketPC_-_untested_for_3.6.6) diff --git a/sys/wince/Install.ce b/sys/wince/Install.ce deleted file mode 100644 index 225c13a98..000000000 --- a/sys/wince/Install.ce +++ /dev/null @@ -1,136 +0,0 @@ -Copyright (c) Alex Kompel, 2002 -NetHack may be freely redistributed. See license for details. -======================================================================== - Instructions for compiling and installing - NetHack 3.6 on a Windows CE or PocketPC system -======================================================================== - Last revision: $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ - -Credit for the porting of NetHack to Windows CE goes to Alex Kompel who -initially developed and contributed the port. - -In order to build NetHack for Windows CE, you need *both* of the following: - - o A copy of Microsoft Visual C V6.0 SP3 or later. Things may work with - an earlier version of the compiler, but the current code has not been - tested with an earlier version. - o Embedded Visual C++ 3.0 or later - - -FIRST STEP: - -The first step in building NetHack for Windows CE is to execute -sys/wince/cesetup.bat. - -From the command prompt: - cd sys\wince - cesetup - -From a Windows explorer window: - double-click on cesetup.bat - -A "wince" directory will be created off the top of the NetHack source -tree, and a Microsoft embedded C workspace file will be placed in the -top of the NetHack source tree. - ------------- -| BUILDING | ------------- - -Boostrapping the build process on Windows NT/2000/XP - -1. With the Visual C++ 6.0 tools in your path, - Run "nmake /f bootstrp.mak" from the wince folder. - -Compiling - -2. Start the Embedded Visual C IDE. In the Embedded Visual C IDE - Menus, choose: - File | Open Workspace - -3. Set up for the build. - - o In the Visual C "Open Workspace" dialog box, navigate to the top - of your NetHack source directory tree. - - In there, highlight "wince.vcw" and click on Open. - Once the workspace has been opened, you should see the following - list in the Visual C selection window: - + nethack_hpc files - + nethack_palm_pc files - + nethack_pocket_pc files - + nethack_smartphone files - - o On the Embedded Visual C menus, choose: - Build | Set Active Platform - Select the platform that corresponds to your device: - Palm-size PC 2.11 - palm size PC running Windows CE version 2.11 - Pocket PC - palm-size PC running Windows CE 3.0 and higher (PocketPC) - H/PC Pro 2.11 - handheld computers running Windows CE 2.11 anf higher - Smartphone 2002 - Microsoft SmartPhone device - - o On the Visual C menus again, choose either: - Build | Set Active Configuration - where configuration is one of the following (make sure it matches the platform - you have selected): - nethack_hpc - Win32 (WCE MIPS) HPCRelease - H/PC Pro 2.11 MIPS processor release executable - nethack_hpc - Win32 (WCE x86em) HPCDebug - H/PC Pro 2.11 x86 emulation debug executable - nethack_hpc - Win32 (WCE ARM) HPCRelease - H/PC Pro 2.11 ARM processor release executable - nethack_hpc - Win32 (WCE SH3) HPCRelease - H/PC Pro 2.11 SH3 processor release executable - nethack_hpc - Win32 (WCE x86em) HPCRelease - H/PC Pro 2.11 x86 emulation release executable - nethack_hpc - Win32 (WCE SH4) HPCRelease - H/PC Pro 2.11 SH4 processor release executable - nethack_palm_pc - Win32 (WCE MIPS) PalmPCRelease - Palm-size PC 2.11 MIPS processor release executable - nethack_palm_pc - Win32 (WCE x86em) PalmPCDebug - Palm-size PC 2.11 x86 emulation debug executable - nethack_palm_pc - Win32 (WCE SH3) PalmPCRelease - Palm-size PC 2.11 SH3 processor release executable - nethack_palm_pc - Win32 (WCE x86em) PalmPCRelease - Palm-size PC 2.11 x86 emulation release executable - nethack_pocket_pc - Win32 (WCE MIPS) PocketPCRelease - Pocket PC MIPS processor release executable - nethack_pocket_pc - Win32 (WCE ARM) PocketPCRelease - Pocket PC ARM processor release executable - nethack_pocket_pc - Win32 (WCE x86em) PocketPCRelease - Pocket PC x86 emulation release executable - nethack_pocket_pc - Win32 (WCE x86em) PocketPCDebug - Pocket PC x86 emulation debug executable - nethack_pocket_pc - Win32 (WCE SH3) PocketPCRelease - Pocket PC SH3 processor release executable - nethack_smartphone - Win32 (WCE ARM) SPhoneRelease - Smartphone 2002 ARM processor release executable - nethack_smartphone - Win32 (WCE x86em) SPhoneDebug - Smartphone 2002 x86 emulation debug executable - -Building - -4. Start your build. - - o On the Embedded Visual C menus once again, choose: - Build | Build nethackm.exe - This starts the build. It is likely that the IDE message window - where you are doing the compiling will be occupied for a while. - Notes: - - o You may get a bunch of warnings regarding missing include files in the - beginning of the build process - ignore them. For some reason the tool - that produces these messages ignores preprocessor directives. The actual - build will go just fine. - o Sometimes the compiler chokes on do_wear.c Ignore that - let the build - finish. Then run it again - it will compile just fine. (Seems to be some - sort of bug in EVC++) - -Transfer - -5. Transfer the files and executables to your handheld by extracting the - files into some folder on the CE device - that should do it. - - -Notes - - If you want to use IBMGraphics make sure that you have a proper - font installed on the device that supports OEM character set - (for example, Lucida Console) - - -PROBLEMS - - - If you discover a bug and wish to report it, or if you have comments - or suggestions we recommend using our "Contact Us" web page at: - http://www.nethack.org/common/contact.html - - If you don't have access to the web, or you want to send us a patch - to the NetHack source code feel free to drop us a line c/o: - DevTeam (at) nethack.org - - Happy NetHacking! diff --git a/sys/wince/bootstrp.mak b/sys/wince/bootstrp.mak deleted file mode 100644 index 5d92dc760..000000000 --- a/sys/wince/bootstrp.mak +++ /dev/null @@ -1,877 +0,0 @@ -# NetHack 3.6 bootstrp.mak $NHDT-Date: 1432512801 2015/05/25 00:13:21 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ -# Copyright (c) Michael Allison -# -# NetHack Windows CE bootstrap file for MS Visual C++ V6.x and -# above and MS NMAKE -# -# This will: -# - build makedefs -# - -#============================================================================== -# Do not delete the following 3 lines. -# -TARGETOS=BOTH -APPVER=4.0 -!include - -# -# 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 -NTSYS = ..\sys\winnt # NT Win32 specific files -TTY = ..\win\tty # window port files (tty) -WIN32 = ..\win\win32 # window port files (WINCE) -WSHR = ..\win\share # Tile support files -SWINCE= ..\wince # wince files -WINCE = ..\wince # wince build area -OBJ = $(WINCE)\ceobj -DLB = $(DAT)\nhdat - -#========================================== -# Setting up the compiler and linker -# macros. All builds include the base ones. -#========================================== - -CFLAGSBASE = -c $(cflags) $(cvarsmt) -I$(INCL) -nologo $(cdebug) $(WINPINC) -DDLB -LFLAGSBASEC = $(linkdebug) /NODEFAULTLIB /INCREMENTAL:NO /RELEASE /NOLOGO -subsystem:console,4.0 $(conlibsmt) -LFLAGSBASEG = $(linkdebug) $(guiflags) $(guilibsmt) comctl32.lib - -#========================================== -# Util builds -#========================================== - -CFLAGSU = $(CFLAGSBASE) $(WINPFLAG) -LFLAGSU = $(LFLAGSBASEC) - -LEVCFLAGS= -c -nologo -DWINVER=0x0400 -DWIN32 -D_WIN32 \ - -D_MT -MT -I..\include -nologo -Z7 -Od -DDLB - - -#========================================== -#================ RULES ================== -#========================================== - -.SUFFIXES: .exe .o .til .uu .c .y .l - -#========================================== -# Rules for files in src -#========================================== - -#.c{$(OBJ)}.o: -# $(cc) $(CFLAGSU) -Fo$@ $< - -{$(SRC)}.c{$(OBJ)}.o: - $(CC) $(CFLAGSU) -Fo$@ $< - -#========================================== -# Rules for files in sys\share -#========================================== - -{$(SSYS)}.c{$(OBJ)}.o: - $(CC) $(CFLAGSU) -Fo$@ $< - -#========================================== -# Rules for files in sys\winnt -#========================================== - -{$(NTSYS)}.c{$(OBJ)}.o: - $(CC) $(CFLAGSU) -Fo$@ $< - -{$(NTSYS)}.h{$(INCL)}.h: - copy $< $@ - -#========================================== -# Rules for files in util -#========================================== - -{$(UTIL)}.c{$(OBJ)}.o: - $(CC) $(CFLAGSU) -Fo$@ $< - -#========================================== -# Rules for files in win\share -#========================================== - -{$(WSHR)}.c{$(OBJ)}.o: - $(CC) $(CFLAGSU) -Fo$@ $< - -{$(WSHR)}.h{$(INCL)}.h: - copy $< $@ - -#{$(WSHR)}.txt{$(DAT)}.txt: -# copy $< $@ - -#========================================== -# Rules for files in win\tty -#========================================== - -{$(TTY)}.c{$(OBJ)}.o: - $(CC) $(CFLAGSU) -Fo$@ $< - - -#========================================== -# Rules for files in win\win32 -#========================================== - -{$(WIN32)}.c{$(OBJ)}.o: - $(cc) $(CFLAGSU) -Fo$@ $< - -#========================================== -# Rules for files in sys\wince -#========================================== - -{$(SWINCE)}.c{$(OBJ)}.o: - $(cc) $(CFLAGSU) -Fo$@ $< - -#========================================== -#================ MACROS ================== -#========================================== - -# -# Shorten up the location for some files -# - -O = $(OBJ)^\ - -U = $(UTIL)^\ - -# -# Utility Objects. -# - -MAKESRC = $(U)makedefs.c - -SPLEVSRC = $(U)lev_yacc.c $(U)lev_$(LEX).c $(U)lev_main.c $(U)panic.c - -DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_$(LEX).c $(U)dgn_main.c - -MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o - -SPLEVOBJS = $(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o \ - $(O)alloc.o $(O)decl.o $(O)drawing.o \ - $(O)monst.o $(O)objects.o $(O)panic.o - -DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o \ - $(O)alloc.o $(O)panic.o - -TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt - -# -# These are not invoked during a normal game build in 3.5.0 -# -TEXT_IO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o - -TEXT_IO32 = $(O)tilete32.o $(O)tiletx32.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o - -GIFREADERS = $(O)gifread.o $(O)alloc.o $(O)panic.o -GIFREADERS32 = $(O)gifrd32.o $(O)alloc.o $(O)panic.o - -PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o - -DLBOBJ = $(O)dlb.o - -#========================================== -# Header file macros -#========================================== - -CONFIG_H = $(INCL)\config.h $(INCL)\config1.h $(INCL)\tradstdc.h \ - $(INCL)\global.h $(INCL)\coord.h $(INCL)\vmsconf.h \ - $(INCL)\system.h $(INCL)\unixconf.h $(INCL)\os2conf.h \ - $(INCL)\micro.h $(INCL)\pcconf.h $(INCL)\tosconf.h \ - $(INCL)\amiconf.h $(INCL)\macconf.h $(INCL)\beconf.h \ - $(INCL)\ntconf.h $(INCL)\wceconf.h - -HACK_H = $(INCL)\hack.h $(CONFIG_H) $(INCL)\align.h \ - $(INCL)\dungeon.h $(INCL)\monsym.h $(INCL)\mkroom.h \ - $(INCL)\objclass.h $(INCL)\youprop.h $(INCL)\prop.h \ - $(INCL)\permonst.h $(INCL)\mextra.h $(INCL)\monattk.h \ - $(INCL)\monflag.h $(INCL)\mondata.h $(INCL)\pm.h \ - $(INCL)\wintype.h $(INCL)\decl.h $(INCL)\quest.h \ - $(INCL)\spell.h $(INCL)\color.h $(INCL)\obj.h \ - $(INCL)\you.h $(INCL)\attrib.h $(INCL)\monst.h \ - $(INCL)\skills.h $(INCL)\onames.h $(INCL)\timeout.h \ - $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ - $(INCL)\vision.h $(INCL)\display.h $(INCL)\engrave.h \ - $(INCL)\rect.h $(INCL)\region.h $(INCL)\winprocs.h \ - $(INCL)\wintty.h $(INCL)\trampoli.h - -LEV_H = $(INCL)\lev.h -DGN_FILE_H = $(INCL)\dgn_file.h -LEV_COMP_H = $(INCL)\lev_comp.h -SP_LEV_H = $(INCL)\sp_lev.h -TILE_H = ..\win\share\tile.h - -#========================================== -# Miscellaneous -#========================================== - -DATABASE = $(DAT)\data.base - -#========================================== -#=============== TARGETS ================== -#========================================== - -# -# The default make target (so just typing 'nmake' is useful). -# -default : all - -# -# Everything -# - -all : $(INCL)\date.h $(INCL)\onames.h $(INCL)\pm.h \ - $(SRC)\monstr.c $(SRC)\vis_tab.c $(U)lev_comp.exe $(INCL)\vis_tab.h \ - $(U)dgn_comp.exe $(U)uudecode.exe \ - $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ - $(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB) $(SRC)\tile.c \ - $(SWINCE)\nethack.ico $(SWINCE)\tiles.bmp $(SWINCE)\mnsel.bmp \ - $(SWINCE)\mnunsel.bmp $(SWINCE)\petmark.bmp $(SWINCE)\mnselcnt.bmp \ - $(SWINCE)\keypad.bmp $(SWINCE)\menubar.bmp - @echo Done! - -$(O)sp_lev.tag: $(DAT)\bigroom.des $(DAT)\castle.des \ - $(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des \ - $(DAT)\medusa.des $(DAT)\oracle.des $(DAT)\tower.des \ - $(DAT)\yendor.des $(DAT)\arch.des $(DAT)\barb.des \ - $(DAT)\caveman.des $(DAT)\healer.des $(DAT)\knight.des \ - $(DAT)\monk.des $(DAT)\priest.des $(DAT)\ranger.des \ - $(DAT)\rogue.des $(DAT)\samurai.des $(DAT)\sokoban.des \ - $(DAT)\tourist.des $(DAT)\valkyrie.des $(DAT)\wizard.des - cd $(DAT) - $(U)lev_comp bigroom.des - $(U)lev_comp castle.des - $(U)lev_comp endgame.des - $(U)lev_comp gehennom.des - $(U)lev_comp knox.des - $(U)lev_comp mines.des - $(U)lev_comp medusa.des - $(U)lev_comp oracle.des - $(U)lev_comp sokoban.des - $(U)lev_comp tower.des - $(U)lev_comp yendor.des - $(U)lev_comp arch.des - $(U)lev_comp barb.des - $(U)lev_comp caveman.des - $(U)lev_comp healer.des - $(U)lev_comp knight.des - $(U)lev_comp monk.des - $(U)lev_comp priest.des - $(U)lev_comp ranger.des - $(U)lev_comp rogue.des - $(U)lev_comp samurai.des - $(U)lev_comp tourist.des - $(U)lev_comp valkyrie.des - $(U)lev_comp wizard.des - cd $(WINCE) - echo sp_levs done > $(O)sp_lev.tag - -#$(NHRES): $(TILEBMP16) $(WINCE)\winhack.rc $(WINCE)\mnsel.bmp \ -# $(WINCE)\mnselcnt.bmp $(WINCE)\mnunsel.bmp \ -# $(WINCE)\petmark.bmp $(WINCE)\NetHack.ico $(WINCE)\rip.bmp \ -# $(WINCE)\splash.bmp -# $(rc) -r -fo$@ -i$(WINCE) -dNDEBUG $(WINCE)\winhack.rc - -# -# Utility Targets. -# - -#========================================== -# Makedefs Stuff -#========================================== - -$(U)makedefs.exe: $(MAKEOBJS) - $(link) $(LFLAGSU) -out:$@ $(MAKEOBJS) - -$(O)makedefs.o: $(CONFIG_H) $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\objclass.h \ - $(INCL)\monsym.h $(INCL)\qtext.h $(INCL)\patchlevel.h \ - $(U)makedefs.c - if not exist $(OBJ)\*.* echo creating directory $(OBJ) - if not exist $(OBJ)\*.* mkdir $(OBJ) - $(CC) $(CFLAGSU) -Fo$@ $(U)makedefs.c - -# -# date.h should be remade every time any of the source or include -# files is modified. -# - -$(INCL)\date.h $(OPTIONS_FILE) : $(U)makedefs.exe - $(U)makedefs -v - -$(INCL)\onames.h : $(U)makedefs.exe - $(U)makedefs -o - -$(INCL)\pm.h : $(U)makedefs.exe - $(U)makedefs -p - -#$(INCL)\trap.h : $(U)makedefs.exe -# $(U)makedefs -t - -$(SRC)\monstr.c: $(U)makedefs.exe - $(U)makedefs -m - -$(INCL)\vis_tab.h: $(U)makedefs.exe - $(U)makedefs -z - -$(SRC)\vis_tab.c: $(U)makedefs.exe - $(U)makedefs -z - -#========================================== -# uudecode utility and uuencoded targets -#========================================== - -$(U)uudecode.exe: $(O)uudecode.o - $(link) $(LFLAGSU) -out:$@ $(O)uudecode.o - -$(O)uudecode.o: $(SSYS)\uudecode.c - -$(SWINCE)\NetHack.ico : $(U)uudecode.exe $(SWINCE)\nhico.uu - chdir $(SWINCE) - ..\util\uudecode.exe nhico.uu - chdir $(WINCE) - -$(SWINCE)\mnsel.bmp: $(U)uudecode.exe $(SWINCE)\mnsel.uu - chdir $(SWINCE) - ..\util\uudecode.exe mnsel.uu - chdir $(WINCE) - -$(SWINCE)\mnselcnt.bmp: $(U)uudecode.exe $(SWINCE)\mnselcnt.uu - chdir $(SWINCE) - ..\util\uudecode.exe mnselcnt.uu - chdir $(WINCE) - -$(SWINCE)\mnunsel.bmp: $(U)uudecode.exe $(SWINCE)\mnunsel.uu - chdir $(SWINCE) - ..\util\uudecode.exe mnunsel.uu - chdir $(WINCE) - -$(SWINCE)\petmark.bmp: $(U)uudecode.exe $(SWINCE)\petmark.uu - chdir $(SWINCE) - ..\util\uudecode.exe petmark.uu - chdir $(WINCE) - -$(SWINCE)\rip.bmp: $(U)uudecode.exe $(SWINCE)\rip.uu - chdir $(SWINCE) - ..\util\uudecode.exe rip.uu - chdir $(WINCE) - -$(SWINCE)\splash.bmp: $(U)uudecode.exe $(SWINCE)\splash.uu - chdir $(SWINCE) - ..\util\uudecode.exe splash.uu - chdir $(WINCE) - -$(SWINCE)\keypad.bmp: $(U)uudecode.exe $(SWINCE)\keypad.uu - chdir $(SWINCE) - ..\util\uudecode.exe keypad.uu - chdir $(WINCE) - -$(SWINCE)\menubar.bmp: $(U)uudecode.exe $(SWINCE)\menubar.uu - chdir $(SWINCE) - ..\util\uudecode.exe menubar.uu - chdir $(WINCE) - -#========================================== -# Level Compiler Stuff -#========================================== - -$(U)lev_comp.exe: $(SPLEVOBJS) - echo Linking $@... - $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk - $(SPLEVOBJS:^ =^ - ) -<< - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c - $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)lev_yacc.c - -$(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ - $(U)lev_$(LEX).c - $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)lev_$(LEX).c - -$(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) - $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)lev_main.c - - -$(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y - @echo We will copy the prebuilt lev_yacc.c and - @echo lev_comp.h from $(SSYS) into $(UTIL) and use them. - @copy $(SSYS)\lev_yacc.c $(U)lev_yacc.c >nul - @copy $(SSYS)\lev_comp.h $(INCL)\lev_comp.h >nul - @echo /**/ >>$(U)lev_yacc.c - @echo /**/ >>$(INCL)\lev_comp.h - -$(U)lev_$(LEX).c: $(U)lev_comp.l - @echo We will copy the prebuilt lev_lex.c - @echo from $(SSYS) into $(UTIL) and use it. - @copy $(SSYS)\lev_lex.c $@ >nul - @echo /**/ >>$@ - -#========================================== -# Dungeon Compiler Stuff -#========================================== - -$(U)dgn_comp.exe: $(DGNCOMPOBJS) - @echo Linking $@... - $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk - $(DGNCOMPOBJS:^ =^ - ) -<< - -$(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h $(U)dgn_yacc.c - $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)dgn_yacc.c - -$(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_$(LEX).c - $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)dgn_$(LEX).c - -$(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c - $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)dgn_main.c - -$(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y - @echo We will copy the prebuilt $(U)dgn_yacc.c and - @echo dgn_comp.h from $(SSYS) into $(UTIL) and use them. - @copy $(SSYS)\dgn_yacc.c $(U)dgn_yacc.c >nul - @copy $(SSYS)\dgn_comp.h $(INCL)\dgn_comp.h >nul - @echo /**/ >>$(U)dgn_yacc.c - @echo /**/ >>$(INCL)\dgn_comp.h - -$(U)dgn_$(LEX).c: $(U)dgn_comp.l - @echo We will copy the prebuilt dgn_lex.c - @echo from $(SSYS) into $(UTIL) and use it. - @copy $(SSYS)\dgn_lex.c $@ >nul - @echo /**/ >>$@ - -#========================================== -# Create directory for holding object files -#========================================== - -$(O)obj.tag: - if not exist $(OBJ)\*.* echo creating directory $(OBJ) - if not exist $(OBJ)\*.* mkdir $(OBJ) - echo directory created >$@ - -#========================================== -# Notify of any CL environment variables -# in effect since they change the compiler -# options. -#========================================== - -envchk: -! IF "$(CL)"!="" - @echo Warning, the CL Environment variable is defined: - @echo CL=$(CL) -! ENDIF - @echo ---- - @echo NOTE: This build will include tile support. - @echo ---- - -#========================================== -#=========== SECONDARY TARGETS ============ -#========================================== - -#=========================================== -# Header files NOT distributed in ..\include -#=========================================== - -$(INCL)\win32api.h: $(NTSYS)\win32api.h - copy $(NTSYS)\win32api.h $@ - - -#========================================== -# DLB utility and nhdat file creation -#========================================== - -$(U)dlb_main.exe: $(DLBOBJ) $(O)dlb.o - $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk - $(O)dlb_main.o - $(O)dlb.o - $(O)alloc.o - $(O)panic.o -<< - -$(O)dlb.o: $(O)dlb_main.o $(O)alloc.o $(O)panic.o $(INCL)\dlb.h - $(CC) $(CFLAGSU) /Fo$@ $(SRC)\dlb.c - -$(O)dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(INCL)\dlb.h - $(CC) $(CFLAGSU) /Fo$@ $(UTIL)\dlb_main.c - -#$(DAT)\porthelp: $(NTSYS)\porthelp -# copy $(NTSYS)\porthelp $@ >nul - -$(DAT)\nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \ - $(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \ - $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon \ - $(DAT)\license $(O)sp_lev.tag - cd $(DAT) - echo data >dlb.lst - echo oracles >>dlb.lst - if exist options echo options >>dlb.lst - if exist ttyoptions echo ttyoptions >>dlb.lst - if exist guioptions echo guioptions >>dlb.lst - if exist porthelp echo porthelp >>dlb.lst - echo quest.dat >>dlb.lst - echo rumors >>dlb.lst - echo help >>dlb.lst - echo hh >>dlb.lst - echo cmdhelp >>dlb.lst - echo history >>dlb.lst - echo opthelp >>dlb.lst - echo wizhelp >>dlb.lst - echo dungeon >>dlb.lst - echo license >>dlb.lst - for %%N in (*.lev) do echo %%N >>dlb.lst - $(U)dlb_main cIf dlb.lst nhdat - cd $(WINCE) - -#========================================== -# Tile Mapping -#========================================== - -$(SRC)\tile.c: $(U)tilemap.exe - echo A new $@ has been created - $(U)tilemap - -$(U)tilemap.exe: $(O)tilemap.o - $(link) $(LFLAGSU) -out:$@ $(O)tilemap.o - -$(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ $(WSHR)\tilemap.c - -$(O)tiletx32.o: $(WSHR)\tilemap.c $(HACK_H) - $(CC) $(CFLAGSU) /DTILETEXT /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tilemap.c - -$(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) - $(CC) $(CFLAGSU) /DTILETEXT -Fo$@ $(WSHR)\tilemap.c - -$(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) - $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(WSHR)\gifread.c - -$(O)gifrd32.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) - $(CC) $(CFLAGSU) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\gifread.c - -$(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(TILE_H) - $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(WSHR)\ppmwrite.c - -$(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) - $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(WSHR)\tiletext.c - -$(O)tilete32.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) - $(CC) $(CFLAGSU) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tiletext.c - -$(SWINCE)\tiles.bmp: $(U)tile2bmp.exe $(TILEFILES) - echo Creating 16x16 binary tile files (this may take some time) - $(U)tile2bmp $@ - -#$(TILEBMP32): $(TILEUTIL32) $(TILEFILES32) -# echo Creating 32x32 binary tile files (this may take some time) -# $(U)til2bm32 $(TILEBMP32) - - -$(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) - @echo Linking $@... - $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk - $(O)tile2bmp.o - $(TEXT_IO:^ =^ - ) -<< - -$(U)til2bm32.exe: $(O)til2bm32.o $(TEXT_IO32) - @echo Linking $@... - $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk - $(O)til2bm32.o - $(TEXT_IO32:^ =^ - ) -<< - -$(O)tile2bmp.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(INCL)\win32api.h - $(CC) $(CFLAGSU) -I$(WSHR) /DPACKED_FILE /Fo$@ $(WSHR)\tile2bmp.c - -$(O)til2bm32.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(INCL)\win32api.h - $(CC) $(CFLAGSU) -I$(WSHR) /DPACKED_FILE /DTILE_X=32 /DTILE_Y=32 /Fo$@ $(WSHR)\tile2bmp.c - -#=================================================================== -# OTHER DEPENDENCIES -#=================================================================== - -# -# dat dependencies -# - -$(DAT)\data: $(UTIL)\makedefs.exe - $(U)makedefs -d - -$(DAT)\rumors: $(UTIL)\makedefs.exe $(DAT)\rumors.tru $(DAT)\rumors.fal - $(U)makedefs -r - -$(DAT)\quest.dat: $(UTIL)\makedefs.exe $(DAT)\quest.txt - $(U)makedefs -q - -$(DAT)\oracles: $(UTIL)\makedefs.exe $(DAT)\oracles.txt - $(U)makedefs -h - -$(DAT)\dungeon: $(UTIL)\makedefs.exe $(DAT)\dungeon.def - $(U)makedefs -e - cd $(DAT) - $(U)dgn_comp dungeon.pdf - cd $(WINCE) - -# -# NT dependencies -# -# -#$(O)nttty.o: $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(NTSYS)\nttty.c -# $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(NTSYS)\nttty.c -#$(O)winnt.o: $(HACK_H) $(INCL)\win32api.h $(NTSYS)\winnt.c -# $(CC) $(CFLAGSU) -Fo$@ $(NTSYS)\winnt.c -#$(O)ntsound.o: $(HACK_H) $(NTSYS)\ntsound.c -# $(CC) $(CFLAGSU) -Fo$@ $(NTSYS)\ntsound.c - -# -# util dependencies -# - -$(O)panic.o: $(U)panic.c $(CONFIG_H) - $(CC) $(CFLAGSU) -Fo$@ $(U)panic.c - -# -# The rest are stolen from sys/unix/Makefile.src, -# with slashes changed to back-slashes -# and -c (which is included in CFLAGSU) substituted -# with -Fo$@ , but otherwise untouched. That -# means that there is some irrelevant stuff -# in here, but maintenance should be easier. -# -$(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h - $(CC) $(CFLAGSU) -Fo$@ ..\sys\atari\tos.c -$(O)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)\dlb.h \ - $(INCL)\win32api.h - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pcmain.c -$(O)pcsys.o: ..\sys\share\pcsys.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pcsys.c -$(O)pctty.o: ..\sys\share\pctty.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pctty.c -$(O)pcunix.o: ..\sys\share\pcunix.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pcunix.c -$(O)random.o: ..\sys\share\random.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\random.c -$(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\ioctl.c -$(O)unixtty.o: ..\sys\share\unixtty.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\unixtty.c -$(O)unixmain.o: ..\sys\unix\unixmain.c $(HACK_H) $(INCL)\dlb.h - $(CC) $(CFLAGSU) -Fo$@ ..\sys\unix\unixmain.c -$(O)unixunix.o: ..\sys\unix\unixunix.c $(HACK_H) - $(CC) $(CFLAGSU) -Fo$@ ..\sys\unix\unixunix.c -$(O)bemain.o: ..\sys\be\bemain.c $(HACK_H) $(INCL)\dlb.h - $(CC) $(CFLAGSU) -Fo$@ ..\sys\be\bemain.c -$(O)getline.o: ..\win\tty\getline.c $(HACK_H) $(INCL)\func_tab.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\getline.c -$(O)termcap.o: ..\win\tty\termcap.c $(HACK_H) $(INCL)\tcap.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\termcap.c -$(O)topl.o: ..\win\tty\topl.c $(HACK_H) $(INCL)\tcap.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\topl.c -$(O)wintty.o: ..\win\tty\wintty.c $(HACK_H) $(INCL)\dlb.h \ - $(INCL)\date.h $(INCL)\patchlevel.h $(INCL)\tcap.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\wintty.c -$(O)Window.o: ..\win\X11\Window.c $(INCL)\xwindowp.h $(INCL)\xwindow.h \ - $(CONFIG_H) - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\Window.c -$(O)dialogs.o: ..\win\X11\dialogs.c $(CONFIG_H) - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\dialogs.c -$(O)winX.o: ..\win\X11\winX.c $(HACK_H) $(INCL)\winX.h $(INCL)\dlb.h \ - $(INCL)\patchlevel.h ..\win\X11\nh72icon \ - ..\win\X11\nh56icon ..\win\X11\nh32icon - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winX.c -$(O)winmap.o: ..\win\X11\winmap.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\dlb.h \ - $(INCL)\winX.h $(INCL)\tile2x11.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmap.c -$(O)winmenu.o: ..\win\X11\winmenu.c $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmenu.c -$(O)winmesg.o: ..\win\X11\winmesg.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmesg.c -$(O)winmisc.o: ..\win\X11\winmisc.c $(HACK_H) $(INCL)\func_tab.h \ - $(INCL)\winX.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmisc.c -$(O)winstat.o: ..\win\X11\winstat.c $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winstat.c -$(O)wintext.o: ..\win\X11\wintext.c $(HACK_H) $(INCL)\winX.h $(INCL)\xwindow.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\wintext.c -$(O)winval.o: ..\win\X11\winval.c $(HACK_H) $(INCL)\winX.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winval.c -$(O)tile.o: $(SRC)\tile.c $(HACK_H) -$(O)gnaskstr.o: ..\win\gnome\gnaskstr.c ..\win\gnome\gnaskstr.h \ - ..\win\gnome\gnmain.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnaskstr.c -$(O)gnbind.o: ..\win\gnome\gnbind.c ..\win\gnome\gnbind.h ..\win\gnome\gnmain.h \ - ..\win\gnome\gnaskstr.h ..\win\gnome\gnyesno.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnbind.c -$(O)gnglyph.o: ..\win\gnome\gnglyph.c ..\win\gnome\gnglyph.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnglyph.c -$(O)gnmain.o: ..\win\gnome\gnmain.c ..\win\gnome\gnmain.h ..\win\gnome\gnsignal.h \ - ..\win\gnome\gnbind.h ..\win\gnome\gnopts.h $(HACK_H) \ - $(INCL)\date.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmain.c -$(O)gnmap.o: ..\win\gnome\gnmap.c ..\win\gnome\gnmap.h ..\win\gnome\gnglyph.h \ - ..\win\gnome\gnsignal.h $(HACK_H) - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmap.c -$(O)gnmenu.o: ..\win\gnome\gnmenu.c ..\win\gnome\gnmenu.h ..\win\gnome\gnmain.h \ - ..\win\gnome\gnbind.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmenu.c -$(O)gnmesg.o: ..\win\gnome\gnmesg.c ..\win\gnome\gnmesg.h ..\win\gnome\gnsignal.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmesg.c -$(O)gnopts.o: ..\win\gnome\gnopts.c ..\win\gnome\gnopts.h ..\win\gnome\gnglyph.h \ - ..\win\gnome\gnmain.h ..\win\gnome\gnmap.h $(HACK_H) - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnopts.c -$(O)gnplayer.o: ..\win\gnome\gnplayer.c ..\win\gnome\gnplayer.h \ - ..\win\gnome\gnmain.h $(HACK_H) - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnplayer.c -$(O)gnsignal.o: ..\win\gnome\gnsignal.c ..\win\gnome\gnsignal.h \ - ..\win\gnome\gnmain.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnsignal.c -$(O)gnstatus.o: ..\win\gnome\gnstatus.c ..\win\gnome\gnstatus.h \ - ..\win\gnome\gnsignal.h ..\win\gnome\gn_xpms.h \ - ..\win\gnome\gnomeprv.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnstatus.c -$(O)gntext.o: ..\win\gnome\gntext.c ..\win\gnome\gntext.h ..\win\gnome\gnmain.h \ - ..\win\gnome\gn_rip.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gntext.c -$(O)gnyesno.o: ..\win\gnome\gnyesno.c ..\win\gnome\gnbind.h ..\win\gnome\gnyesno.h - $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnyesno.c -$(O)wingem.o: ..\win\gem\wingem.c $(HACK_H) $(INCL)\func_tab.h $(INCL)\dlb.h \ - $(INCL)\patchlevel.h $(INCL)\wingem.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\gem\wingem.c -$(O)wingem1.o: ..\win\gem\wingem1.c $(INCL)\gem_rsc.h $(INCL)\load_img.h \ - $(INCL)\wintype.h $(INCL)\wingem.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\gem\wingem1.c -$(O)load_img.o: ..\win\gem\load_img.c $(INCL)\load_img.h - $(CC) $(CFLAGSU) -Fo$@ ..\win\gem\load_img.c -$(O)tile.o: $(SRC)\tile.c $(HACK_H) -$(O)qt_win.o: ..\win\Qt\qt_win.cpp $(HACK_H) $(INCL)\func_tab.h \ - $(INCL)\dlb.h $(INCL)\patchlevel.h $(INCL)\qt_win.h \ - $(INCL)\qt_clust.h $(INCL)\qt_kde0.h \ - $(INCL)\qt_xpms.h qt_win.moc qt_kde0.moc - $(CXX) $(CXXFLAGS) -c ..\win\Qt\qt_win.cpp -$(O)qt_clust.o: ..\win\Qt\qt_clust.cpp $(INCL)\qt_clust.h - $(CXX) $(CXXFLAGS) -c ..\win\Qt\qt_clust.cpp -$(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) -$(O)vis_tab.o: $(SRC)\vis_tab.c $(CONFIG_H) $(INCL)\vis_tab.h -$(O)allmain.o: $(SRC)\allmain.c $(HACK_H) -$(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) -$(O)apply.o: $(SRC)\apply.c $(HACK_H) -$(O)artifact.o: $(SRC)\artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h -$(O)attrib.o: $(SRC)\attrib.c $(HACK_H) $(INCL)\artifact.h -$(O)ball.o: $(SRC)\ball.c $(HACK_H) -$(O)bones.o: $(SRC)\bones.c $(HACK_H) $(INCL)\lev.h -$(O)botl.o: $(SRC)\botl.c $(HACK_H) -$(O)cmd.o: $(SRC)\cmd.c $(HACK_H) $(INCL)\func_tab.h -$(O)dbridge.o: $(SRC)\dbridge.c $(HACK_H) -$(O)decl.o: $(SRC)\decl.c $(HACK_H) -$(O)detect.o: $(SRC)\detect.c $(HACK_H) $(INCL)\artifact.h -$(O)dig.o: $(SRC)\dig.c $(HACK_H) -$(O)display.o: $(SRC)\display.c $(HACK_H) -$(O)dlb.o: $(SRC)\dlb.c $(CONFIG_H) $(INCL)\dlb.h -$(O)do.o: $(SRC)\do.c $(HACK_H) $(INCL)\lev.h -$(O)do_name.o: $(SRC)\do_name.c $(HACK_H) -$(O)do_wear.o: $(SRC)\do_wear.c $(HACK_H) -$(O)dog.o: $(SRC)\dog.c $(HACK_H) -$(O)dogmove.o: $(SRC)\dogmove.c $(HACK_H) $(INCL)\mfndpos.h -$(O)dokick.o: $(SRC)\dokick.c $(HACK_H) -$(O)dothrow.o: $(SRC)\dothrow.c $(HACK_H) -$(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(INCL)\tcap.h -$(O)dungeon.o: $(SRC)\dungeon.c $(HACK_H) $(INCL)\dgn_file.h $(INCL)\dlb.h -$(O)eat.o: $(SRC)\eat.c $(HACK_H) -$(O)end.o: $(SRC)\end.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h -$(O)engrave.o: $(SRC)\engrave.c $(HACK_H) $(INCL)\lev.h -$(O)exper.o: $(SRC)\exper.c $(HACK_H) -$(O)explode.o: $(SRC)\explode.c $(HACK_H) -$(O)extralev.o: $(SRC)\extralev.c $(HACK_H) -$(O)files.o: $(SRC)\files.c $(HACK_H) $(INCL)\dlb.h -$(O)fountain.o: $(SRC)\fountain.c $(HACK_H) -$(O)hack.o: $(SRC)\hack.c $(HACK_H) -$(O)hacklib.o: $(SRC)\hacklib.c $(HACK_H) -$(O)invent.o: $(SRC)\invent.c $(HACK_H) $(INCL)\artifact.h -$(O)light.o: $(SRC)\light.c $(HACK_H) $(INCL)\lev.h -$(O)lock.o: $(SRC)\lock.c $(HACK_H) -$(O)mail.o: $(SRC)\mail.c $(HACK_H) $(INCL)\mail.h -$(O)makemon.o: $(SRC)\makemon.c $(HACK_H) -$(O)mapglyph.o: $(SRC)\mapglyph.c $(HACK_H) -$(O)mcastu.o: $(SRC)\mcastu.c $(HACK_H) -$(O)mhitm.o: $(SRC)\mhitm.c $(HACK_H) $(INCL)\artifact.h -$(O)mhitu.o: $(SRC)\mhitu.c $(HACK_H) $(INCL)\artifact.h -$(O)minion.o: $(SRC)\minion.c $(HACK_H) -$(O)mklev.o: $(SRC)\mklev.c $(HACK_H) -$(O)mkmap.o: $(SRC)\mkmap.c $(HACK_H) $(INCL)\sp_lev.h -$(O)mkmaze.o: $(SRC)\mkmaze.c $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev.h -$(O)mkobj.o: $(SRC)\mkobj.c $(HACK_H) $(INCL)\artifact.h -$(O)mkroom.o: $(SRC)\mkroom.c $(HACK_H) -$(O)mon.o: $(SRC)\mon.c $(HACK_H) $(INCL)\mfndpos.h -$(O)mondata.o: $(SRC)\mondata.c $(HACK_H) -$(O)monmove.o: $(SRC)\monmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h -$(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \ - $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\monsym.h \ - $(INCL)\dungeon.h $(INCL)\color.h -$(O)mplayer.o: $(SRC)\mplayer.c $(HACK_H) -$(O)mthrowu.o: $(SRC)\mthrowu.c $(HACK_H) -$(O)muse.o: $(SRC)\muse.c $(HACK_H) -$(O)music.o: $(SRC)\music.c $(HACK_H) #interp.c -$(O)o_init.o: $(SRC)\o_init.c $(HACK_H) $(INCL)\lev.h -$(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ - $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h -$(O)objnam.o: $(SRC)\objnam.c $(HACK_H) -$(O)options.o: $(SRC)\options.c $(CONFIG_H) $(INCL)\objclass.h $(INCL)\flag.h \ - $(HACK_H) $(INCL)\tcap.h -$(O)pager.o: $(SRC)\pager.c $(HACK_H) $(INCL)\dlb.h -$(O)pickup.o: $(SRC)\pickup.c $(HACK_H) -$(O)pline.o: $(SRC)\pline.c $(HACK_H) -$(O)polyself.o: $(SRC)\polyself.c $(HACK_H) -$(O)potion.o: $(SRC)\potion.c $(HACK_H) -$(O)pray.o: $(SRC)\pray.c $(HACK_H) -$(O)priest.o: $(SRC)\priest.c $(HACK_H) $(INCL)\mfndpos.h -$(O)quest.o: $(SRC)\quest.c $(HACK_H) $(INCL)\qtext.h -$(O)questpgr.o: $(SRC)\questpgr.c $(HACK_H) $(INCL)\dlb.h $(INCL)\qtext.h -$(O)read.o: $(SRC)\read.c $(HACK_H) -$(O)rect.o: $(SRC)\rect.c $(HACK_H) -$(O)region.o: $(SRC)\region.c $(HACK_H) $(INCL)\lev.h -$(O)restore.o: $(SRC)\restore.c $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h -$(O)rip.o: $(SRC)\rip.c $(HACK_H) -$(O)rnd.o: $(SRC)\rnd.c $(HACK_H) -$(O)role.o: $(SRC)\role.c $(HACK_H) -$(O)rumors.o: $(SRC)\rumors.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h -$(O)save.o: $(SRC)\save.c $(HACK_H) $(INCL)\lev.h -$(O)shk.o: $(SRC)\shk.c $(HACK_H) -$(O)shknam.o: $(SRC)\shknam.c $(HACK_H) -$(O)sit.o: $(SRC)\sit.c $(HACK_H) $(INCL)\artifact.h -$(O)sounds.o: $(SRC)\sounds.c $(HACK_H) -$(O)sp_lev.o: $(SRC)\sp_lev.c $(HACK_H) $(INCL)\dlb.h $(INCL)\sp_lev.h -$(O)spell.o: $(SRC)\spell.c $(HACK_H) -$(O)steal.o: $(SRC)\steal.c $(HACK_H) -$(O)steed.o: $(SRC)\steed.c $(HACK_H) -$(O)teleport.o: $(SRC)\teleport.c $(HACK_H) -$(O)timeout.o: $(SRC)\timeout.c $(HACK_H) $(INCL)\lev.h -$(O)topten.o: $(SRC)\topten.c $(HACK_H) $(INCL)\dlb.h $(INCL)\patchlevel.h -$(O)track.o: $(SRC)\track.c $(HACK_H) -$(O)trap.o: $(SRC)\trap.c $(HACK_H) -$(O)u_init.o: $(SRC)\u_init.c $(HACK_H) -$(O)uhitm.o: $(SRC)\uhitm.c $(HACK_H) -$(O)vault.o: $(SRC)\vault.c $(HACK_H) -$(O)version.o: $(SRC)\version.c $(HACK_H) $(INCL)\date.h $(INCL)\patchlevel.h -$(O)vision.o: $(SRC)\vision.c $(HACK_H) $(INCL)\vis_tab.h -$(O)weapon.o: $(SRC)\weapon.c $(HACK_H) -$(O)were.o: $(SRC)\were.c $(HACK_H) -$(O)wield.o: $(SRC)\wield.c $(HACK_H) -$(O)windows.o: $(SRC)\windows.c $(HACK_H) $(INCL)\wingem.h $(INCL)\winGnome.h -$(O)wizard.o: $(SRC)\wizard.c $(HACK_H) $(INCL)\qtext.h -$(O)worm.o: $(SRC)\worm.c $(HACK_H) $(INCL)\lev.h -$(O)worn.o: $(SRC)\worn.c $(HACK_H) -$(O)write.o: $(SRC)\write.c $(HACK_H) -$(O)zap.o: $(SRC)\zap.c $(HACK_H) - -# end of file - diff --git a/sys/wince/ceinc/.gitattributes b/sys/wince/ceinc/.gitattributes deleted file mode 100644 index 92832fbc3..000000000 --- a/sys/wince/ceinc/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* NH_filestag=(header_file%s_for_Windows_CE_and_PocketPC_-_untested_for_3.6.6) diff --git a/sys/wince/ceinc/assert.h b/sys/wince/ceinc/assert.h deleted file mode 100644 index 1c18ba66a..000000000 --- a/sys/wince/ceinc/assert.h +++ /dev/null @@ -1,17 +0,0 @@ -/*** -*assert.h - define the assert macro -* -****/ - -#undef assert - -#ifdef NDEBUG - -#define assert(exp) ((void) 0) - -#else - -#define assert(exp) \ - (void)((exp) || (panic("%s at %s line %ld", #exp, __FILE__, __LINE__), 1)) - -#endif /* NDEBUG */ diff --git a/sys/wince/ceinc/errno.h b/sys/wince/ceinc/errno.h deleted file mode 100644 index 6645e2bb9..000000000 --- a/sys/wince/ceinc/errno.h +++ /dev/null @@ -1,3 +0,0 @@ -/* empty file */ - -extern int errno; diff --git a/sys/wince/ceinc/fcntl.h b/sys/wince/ceinc/fcntl.h deleted file mode 100644 index 0b1524b2b..000000000 --- a/sys/wince/ceinc/fcntl.h +++ /dev/null @@ -1,67 +0,0 @@ -/*** -*fcntl.h - file control options used by open() -* -*Purpose: -* This file defines constants for the file control options used -* by the _open() function. -* [System V] -* -* [Public] -* -****/ - -#ifndef _INC_FCNTL -#define _INC_FCNTL - -#define _O_RDONLY 0x0000 /* open for reading only */ -#define _O_WRONLY 0x0001 /* open for writing only */ -#define _O_RDWR 0x0002 /* open for reading and writing */ -#define _O_APPEND 0x0008 /* writes done at eof */ - -#define _O_CREAT 0x0100 /* create and open file */ -#define _O_TRUNC 0x0200 /* open and truncate */ -#define _O_EXCL 0x0400 /* open only if file doesn't already exist */ - -/* O_TEXT files have sequences translated to on read()'s, -** and sequences translated to on write()'s -*/ - -#define _O_TEXT 0x4000 /* file mode is text (translated) */ -#define _O_BINARY 0x8000 /* file mode is binary (untranslated) */ - -/* macro to translate the C 2.0 name used to force binary mode for files */ - -#define _O_RAW _O_BINARY - -/* Open handle inherit bit */ - -#define _O_NOINHERIT 0x0080 /* child process doesn't inherit file */ - -/* Temporary file bit - file is deleted when last handle is closed */ - -#define _O_TEMPORARY 0x0040 /* temporary file bit */ - -/* sequential/random access hints */ - -#define _O_SEQUENTIAL 0x0020 /* file access is primarily sequential */ -#define _O_RANDOM 0x0010 /* file access is primarily random */ - -#if !__STDC__ || defined(_POSIX_) -/* Non-ANSI names for compatibility */ -#define O_RDONLY _O_RDONLY -#define O_WRONLY _O_WRONLY -#define O_RDWR _O_RDWR -#define O_APPEND _O_APPEND -#define O_CREAT _O_CREAT -#define O_TRUNC _O_TRUNC -#define O_EXCL _O_EXCL -#define O_TEXT _O_TEXT -#define O_BINARY _O_BINARY -#define O_RAW _O_BINARY -#define O_TEMPORARY _O_TEMPORARY -#define O_NOINHERIT _O_NOINHERIT -#define O_SEQUENTIAL _O_SEQUENTIAL -#define O_RANDOM _O_RANDOM -#endif /* __STDC__ */ - -#endif /* _INC_FCNTL */ diff --git a/sys/wince/ceinc/sys/.gitattributes b/sys/wince/ceinc/sys/.gitattributes deleted file mode 100644 index ba88adb8a..000000000 --- a/sys/wince/ceinc/sys/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* NH_filestag=(sys/stat.h_for_Windows_CE_and_PocketPC_-_untested_for_3.6.2) diff --git a/sys/wince/ceinc/sys/stat.h b/sys/wince/ceinc/sys/stat.h deleted file mode 100644 index fa882cb5b..000000000 --- a/sys/wince/ceinc/sys/stat.h +++ /dev/null @@ -1 +0,0 @@ -/* empty file */ diff --git a/sys/wince/celib.c b/sys/wince/celib.c deleted file mode 100644 index 713f45de6..000000000 --- a/sys/wince/celib.c +++ /dev/null @@ -1,906 +0,0 @@ -/* NetHack 3.6 celib.c $NHDT-Date: 1432512803 2015/05/25 00:13:23 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#define NEED_VARARGS -#include "hack.h" -#include -// #include "wceconf.h" - -static union { - time_t t_val; - struct time_pack { - unsigned int ss : 6; - unsigned int mm : 6; - unsigned int dd : 5; - unsigned int hh : 6; - unsigned int mo : 4; - unsigned int yr : 10; - unsigned int wd : 3; - } tm_val; -} _t_cnv; - -#define IS_LEAP(yr) (((yr) % 4 == 0 || (yr) % 100 == 0) && !(yr) % 400 == 0) -static char _day_mo_leap[12] = { 31, 29, 31, 30, 31, 30, - 31, 31, 30, 31, 30, 31 }; -static char _day_mo[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -struct tm *__cdecl localtime(const time_t *ptime) -{ - static struct tm ptm; - int i; - if (!ptime) - return NULL; - - _t_cnv.t_val = *ptime; - - ptm.tm_sec = _t_cnv.tm_val.ss; /* seconds after the minute - [0,59] */ - ptm.tm_min = _t_cnv.tm_val.mm; /* minutes after the hour - [0,59] */ - ptm.tm_hour = _t_cnv.tm_val.hh; /* hours since midnight - [0,23] */ - ptm.tm_mday = _t_cnv.tm_val.dd; /* day of the month - [1,31] */ - ptm.tm_mon = _t_cnv.tm_val.mo - 1; /* months since January - [0,11] */ - ptm.tm_year = _t_cnv.tm_val.yr; /* years since 1900 */ - ptm.tm_wday = _t_cnv.tm_val.wd; /* days since Sunday - [0,6] */ - - ptm.tm_yday = _t_cnv.tm_val.dd; /* days since January 1 - [0,365] */ - for (i = 0; i < ptm.tm_mon; i++) - ptm.tm_yday += - IS_LEAP(_t_cnv.tm_val.yr + 1900) ? _day_mo_leap[i] : _day_mo[i]; - - ptm.tm_isdst = 0; /* daylight savings time flag - NOT IMPLEMENTED */ - return &ptm; -} - -time_t __cdecl time(time_t *timeptr) -{ - SYSTEMTIME stm; - GetLocalTime(&stm); - - _t_cnv.tm_val.yr = stm.wYear - 1900; - _t_cnv.tm_val.mo = stm.wMonth; - _t_cnv.tm_val.dd = stm.wDay; - _t_cnv.tm_val.hh = stm.wHour; - _t_cnv.tm_val.mm = stm.wMinute; - _t_cnv.tm_val.ss = stm.wSecond; - _t_cnv.tm_val.wd = stm.wDayOfWeek; - - if (timeptr) - *timeptr = _t_cnv.t_val; - return _t_cnv.t_val; -} - -time_t __cdecl mktime(struct tm *tb) -{ - if (!tb) - return (time_t) -1; - - _t_cnv.tm_val.yr = tb->tm_year; - _t_cnv.tm_val.mo = tb->tm_mon; - _t_cnv.tm_val.dd = tb->tm_mday; - _t_cnv.tm_val.hh = tb->tm_hour; - _t_cnv.tm_val.mm = tb->tm_min; - _t_cnv.tm_val.ss = tb->tm_sec; - _t_cnv.tm_val.wd = tb->tm_wday; - - return _t_cnv.t_val; -} - -/*------------------------------------------------------------------------------*/ -/* __io.h__ */ -/* Hack io.h function with stdio.h functions */ -/* ASSUMPTION : int can hold FILE* */ -static TCHAR _nh_cwd[MAX_PATH]; -const int MAGIC_OFFSET = 5; -#define FILE_TABLE_SIZE 256 -static HANDLE _nh_file_table[FILE_TABLE_SIZE]; -static int file_pointer = -1; - -static HANDLE -get_file_handle(int i) -{ - i -= MAGIC_OFFSET; - if (i >= 0 && i < FILE_TABLE_SIZE) - return _nh_file_table[i]; - else - return INVALID_HANDLE_VALUE; -} - -static int -alloc_file_handle(HANDLE h) -{ - int i; - if (file_pointer == -1) { - file_pointer = 0; - for (i = 0; i < FILE_TABLE_SIZE; i++) - _nh_file_table[i] = INVALID_HANDLE_VALUE; - } - - i = (file_pointer + 1) % FILE_TABLE_SIZE; - while (_nh_file_table[i] != INVALID_HANDLE_VALUE) { - if (i == file_pointer) { - MessageBox(NULL, _T("Ran out of file handles."), - _T("Fatal Error"), MB_OK); - abort(); - } - i = (i + 1) % FILE_TABLE_SIZE; - } - - file_pointer = i; - _nh_file_table[file_pointer] = h; - return file_pointer + MAGIC_OFFSET; -} - -int __cdecl close(int f) -{ - int retval; - f -= MAGIC_OFFSET; - if (f < 0 || f >= FILE_TABLE_SIZE) - return -1; - retval = (CloseHandle(_nh_file_table[f]) ? 0 : -1); - _nh_file_table[f] = INVALID_HANDLE_VALUE; - return retval; -} - -int __cdecl creat(const char *fname, int mode) -{ - HANDLE f; - TCHAR wbuf[MAX_PATH + 1]; - ZeroMemory(wbuf, sizeof(wbuf)); - NH_A2W(fname, wbuf, MAX_PATH); - - f = CreateFile(wbuf, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, NULL); - - if (f == INVALID_HANDLE_VALUE) - return -1; - else - return alloc_file_handle(f); -} - -int __cdecl eof(int f) -{ - DWORD fpos, fsize; - HANDLE p = get_file_handle(f); - - if (f == -1) - return -1; - - fpos = SetFilePointer(p, 0, NULL, FILE_CURRENT); - fsize = SetFilePointer(p, 0, NULL, FILE_END); - if (fpos == 0xFFFFFFFF || fsize == 0xFFFFFFFF) - return -1; - if (fpos == fsize) - return 1; - else { - SetFilePointer(p, fpos, NULL, FILE_BEGIN); - return 0; - } -} - -long __cdecl lseek(int f, long offset, int origin) -{ - HANDLE p = get_file_handle(f); - DWORD fpos; - switch (origin) { - case SEEK_SET: - fpos = SetFilePointer(p, offset, NULL, FILE_BEGIN); - break; - case SEEK_CUR: - fpos = SetFilePointer(p, offset, NULL, FILE_CURRENT); - break; - case SEEK_END: - fpos = SetFilePointer(p, offset, NULL, FILE_END); - break; - default: - fpos = 0xFFFFFFFF; - break; - } - if (fpos == 0xFFFFFFFF) - return -1; - else - return (long) fpos; -} - -int __cdecl open(const char *filename, int oflag, ...) -{ - TCHAR fname[MAX_PATH + 1]; - TCHAR path[MAX_PATH + 1]; - HANDLE f; - DWORD fileaccess; - DWORD filecreate; - - /* O_TEXT is not supported */ - - /* - * decode the access flags - */ - switch (oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR)) { - case _O_RDONLY: /* read access */ - fileaccess = GENERIC_READ; - break; - case _O_WRONLY: /* write access */ - fileaccess = GENERIC_READ | GENERIC_WRITE; - break; - case _O_RDWR: /* read and write access */ - fileaccess = GENERIC_READ | GENERIC_WRITE; - break; - default: /* error, bad oflag */ - return -1; - } - - /* - * decode open/create method flags - */ - switch (oflag & (_O_CREAT | _O_EXCL | _O_TRUNC)) { - case 0: - case _O_EXCL: // ignore EXCL w/o CREAT - filecreate = OPEN_EXISTING; - break; - - case _O_CREAT: - filecreate = OPEN_ALWAYS; - break; - - case _O_CREAT | _O_EXCL: - case _O_CREAT | _O_TRUNC | _O_EXCL: - filecreate = CREATE_NEW; - break; - - case _O_TRUNC: - case _O_TRUNC | _O_EXCL: // ignore EXCL w/o CREAT - filecreate = TRUNCATE_EXISTING; - break; - - case _O_CREAT | _O_TRUNC: - filecreate = CREATE_ALWAYS; - break; - - default: - return -1; - } - - /* assemple the file name */ - ZeroMemory(fname, sizeof(fname)); - ZeroMemory(path, sizeof(path)); - NH_A2W(filename, fname, MAX_PATH); - if (*filename != '\\' && *filename != '/') { - _tcscpy(path, _nh_cwd); - _tcsncat(path, _T("\\"), MAX_PATH - _tcslen(path)); - } - _tcsncat(path, fname, MAX_PATH - _tcslen(path)); - - /* - * try to open/create the file - */ - if ((f = CreateFile(path, fileaccess, 0, NULL, filecreate, - FILE_ATTRIBUTE_NORMAL, NULL)) - == INVALID_HANDLE_VALUE) { - return -1; - } - - if (!(oflag & O_APPEND)) - SetFilePointer(f, 0, NULL, FILE_BEGIN); - return alloc_file_handle(f); -} - -int __cdecl read(int f, void *buffer, unsigned int count) -{ - HANDLE p = get_file_handle(f); - DWORD bytes_read; - if (!ReadFile(p, buffer, count, &bytes_read, NULL)) - return -1; - else - return (int) bytes_read; -} - -int __cdecl unlink(const char *filename) -{ - TCHAR wbuf[MAX_PATH + 1]; - TCHAR fname[MAX_PATH + 1]; - - ZeroMemory(wbuf, sizeof(wbuf)); - ZeroMemory(fname, sizeof(fname)); - NH_A2W(filename, wbuf, MAX_PATH); - if (*filename != '\\' && *filename != '/') { - _tcscpy(fname, _nh_cwd); - _tcsncat(fname, _T("\\"), MAX_PATH - _tcslen(fname)); - } - _tcsncat(fname, wbuf, MAX_PATH - _tcslen(fname)); - - return !DeleteFileW(fname); -} - -int __cdecl write(int f, const void *buffer, unsigned int count) -{ - HANDLE p = get_file_handle(f); - DWORD bytes_written; - if (!WriteFile(p, buffer, count, &bytes_written, NULL)) - return -1; - else - return (int) bytes_written; -} - -int __cdecl rename(const char *oldname, const char *newname) -{ - WCHAR f1[MAX_PATH + 1]; - WCHAR f2[MAX_PATH + 1]; - ZeroMemory(f1, sizeof(f1)); - ZeroMemory(f2, sizeof(f2)); - MultiByteToWideChar(CP_ACP, 0, oldname, -1, f1, MAX_PATH); - MultiByteToWideChar(CP_ACP, 0, newname, -1, f2, MAX_PATH); - return !MoveFile(f1, f2); -} - -int __cdecl access(const char *path, int mode) -{ - DWORD attr; - WCHAR f[MAX_PATH + 1]; - ZeroMemory(f, sizeof(f)); - MultiByteToWideChar(CP_ACP, 0, path, -1, f, MAX_PATH); - - attr = GetFileAttributes(f); - if (attr == (DWORD) -1) - return -1; - - if ((attr & FILE_ATTRIBUTE_READONLY) && (mode & 2)) - return -1; - else - return 0; -} - -int -chdir(const char *dirname) -{ - ZeroMemory(_nh_cwd, sizeof(_nh_cwd)); - NH_A2W(dirname, _nh_cwd, MAX_PATH); - return 0; -} - -char * -getcwd(char *buffer, int maxlen) -{ - if (maxlen < (int) _tcslen(_nh_cwd)) - return NULL; - else - return NH_W2A(_nh_cwd, buffer, maxlen); -} - -/*------------------------------------------------------------------------------*/ -/* __errno.h__ */ -int errno; - -/*------------------------------------------------------------------------------*/ -/* - * Chdrive() changes the default drive. - */ -void -chdrive(char *str) -{ - return; -} - -/* - * This is used in nhlan.c to implement some of the LAN_FEATURES. - */ -char * -get_username(lan_username_size) -int *lan_username_size; -{ - static char username_buffer[BUFSZ]; - strcpy(username_buffer, "nhsave"); - return username_buffer; -} - -void -Delay(int ms) -{ - (void) Sleep(ms); -} - -void -more() -{ -} - -int -isatty(int f) -{ - return 0; -} - -#if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) -int __cdecl isupper(int c) -{ - char str[2]; - WCHAR wstr[2]; - str[0] = c; - str[1] = 0; - - NH_A2W(str, wstr, 1); - return iswupper(wstr[0]); -} - -int __cdecl isdigit(int c) -{ - return ('0' <= c && c <= '9'); -} - -int __cdecl isxdigit(int c) -{ - return (('0' <= c && c <= '9') || ('a' <= c && c <= 'f') - || ('A' <= c && c <= 'F')); -} - -int __cdecl isspace(int c) -{ - char str[2]; - WCHAR wstr[2]; - str[0] = c; - str[1] = 0; - - NH_A2W(str, wstr, 1); - return iswspace(wstr[0]); -} - -int __cdecl isprint(int c) -{ - char str[2]; - WCHAR wstr[2]; - str[0] = c; - str[1] = 0; - - NH_A2W(str, wstr, 1); - return iswprint(wstr[0]); -} - -char *__cdecl _strdup(const char *s) -{ - char *p; - p = malloc(strlen(s) + 1); - return strcpy(p, s); -} - -char *__cdecl strrchr(const char *s, int c) -{ - WCHAR wstr[1024]; - WCHAR *w; - w = wcsrchr(NH_A2W(s, wstr, 1024), c); - if (w) - return (char *) (s + (w - wstr)); - else - return NULL; -} - -int __cdecl _stricmp(const char *a, const char *b) -{ - return strncmpi(a, b, 65535u); -} - -#endif - -#if defined(WIN_CE_PS2xx) -/* stdio.h functions are missing from PAlm Size PC SDK 1.2 (SH3 and MIPS) */ - -#pragma warning(disable : 4273) - -FILE *__cdecl fopen(const char *filename, const char *mode) -{ - int modeflag; - int whileflag; - int filedes; - - /* First mode character must be 'r', 'w', or 'a'. */ - switch (*mode) { - case 'r': - modeflag = _O_RDONLY; - break; - case 'w': - modeflag = _O_WRONLY | _O_CREAT | _O_TRUNC; - break; - case 'a': - modeflag = _O_WRONLY | _O_CREAT | _O_APPEND; - break; - default: - return NULL; - } - - whileflag = 1; - while (*++mode && whileflag) - switch (*mode) { - case '+': - if (modeflag & _O_RDWR) - whileflag = 0; - else { - modeflag |= _O_RDWR; - modeflag &= ~(_O_RDONLY | _O_WRONLY); - } - break; - - case 'b': - if (modeflag & (_O_TEXT | _O_BINARY)) - whileflag = 0; - else - modeflag |= _O_BINARY; - break; - - case 't': /* not supported */ - whileflag = 0; - break; - - default: - whileflag = 0; - break; - } - - if ((filedes = open(filename, modeflag)) == -1) - return NULL; - - return (FILE *) filedes; -} - -int __cdecl fscanf(FILE *f, const char *format, ...) -{ - /* Format spec: %[*] [width] [l] type ] */ - int ch; - int sch; - int matched = 0; - int width = 65535; - int modifier = -1; - int skip_flag = 0; - int n_read = 0; - char buf[BUFSZ]; - TCHAR wbuf[BUFSZ]; - char *p; - va_list args; - -#define RETURN_SCANF(i) \ - { \ - va_end(args); \ - return i; \ - } -#define NEXT_CHAR(f) (n_read++, fgetc(f)) - - va_start(args, format); - - ch = *format++; - sch = NEXT_CHAR(f); - while (ch && sch != EOF) { - if (isspace(ch)) { - while (ch && isspace(ch)) - ch = *format++; - while (sch != EOF && isspace(sch)) - sch = NEXT_CHAR(f); - format--; - goto next_spec; - } - - /* read % */ - if (ch != '%') { - if (sch != ch) - RETURN_SCANF(matched); - sch = NEXT_CHAR(f); - goto next_spec; - } else { - /* process '%%' */ - ch = *format++; - if (ch == '%') { - if (sch != '%') - RETURN_SCANF(matched); - sch = NEXT_CHAR(f); - goto next_spec; - } - - if (ch == '*') { - /* read skip flag - '*' */ - skip_flag = 1; - ch = *format++; - } - - /* get width */ - if (isdigit(ch)) { - width = 0; - while (ch && isdigit(ch)) { - width = width * 10 + (ch - '0'); - ch = *format++; - } - } - - /* get modifier */ - if (ch == 'l') { - modifier = 'l'; - ch = *format++; - } - - /* get type */ - switch (ch) { - case 'c': - if (!skip_flag) { - *(va_arg(args, char *) ) = sch; - matched++; - } - sch = NEXT_CHAR(f); - goto next_spec; - case 'd': - p = buf; - /* skip space */ - while (sch != EOF && isspace(sch)) - sch = NEXT_CHAR(f); - while (sch != EOF && isdigit(sch) && --width >= 0) { - *p++ = sch; - sch = NEXT_CHAR(f); - } - *p = '\x0'; - if (!skip_flag) { - matched++; - if (modifier == 'l') { - *(va_arg(args, long *) ) = - wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 10); - } else { - *(va_arg(args, int *) ) = - wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 10); - } - } - goto next_spec; - case 'x': - p = buf; - while (sch != EOF && isspace(sch)) - sch = NEXT_CHAR(f); - while (sch != EOF && isxdigit(sch) && --width >= 0) { - *p++ = sch; - sch = NEXT_CHAR(f); - } - *p = '\x0'; - if (!skip_flag) { - matched++; - if (modifier == 'l') { - *(va_arg(args, long *) ) = - wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 16); - } else { - *(va_arg(args, int *) ) = - wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 16); - } - } - goto next_spec; - case 'n': - *(va_arg(args, int *) ) = n_read; - matched++; - goto next_spec; - case 's': - if (skip_flag) { - while (sch != EOF && !isspace(sch) && --width >= 0) { - sch = NEXT_CHAR(f); - } - } else { - p = va_arg(args, char *); - while (sch != EOF && !isspace(sch) && --width >= 0) { - *p++ = sch; - sch = NEXT_CHAR(f); - } - *p = '\x0'; - matched++; - } - goto next_spec; - case '[': { - char pattern[256]; - int start, end; - int negate; - - ZeroMemory(pattern, sizeof(pattern)); - p = pattern; - - /* try to parse '^' modifier */ - ch = *format++; - if (ch == '^') { - negate = 1; - ch = *format++; - } else { - negate = 0; - } - if (ch == 0) - RETURN_SCANF(EOF); - - for (; ch && ch != ']'; ch = *format++) { - /* try to parse range: a-z */ - if (format[0] == '-' && format[1] && format[1] != ']') { - start = ch; - format++; - end = *format++; - while (start <= end) { - if (!strchr(pattern, (char) start)) - *p++ = (char) start; - start++; - } - } else { - if (!strchr(pattern, (char) ch)) - *p++ = (char) ch; - } - } - - if (skip_flag) { - while (sch != EOF && strchr(pattern, sch) - && --width >= 0) { - sch = NEXT_CHAR(f); - } - } else { - p = va_arg(args, char *); - if (negate) - while (sch != EOF && !strchr(pattern, sch) - && --width >= 0) { - *p++ = sch; - sch = NEXT_CHAR(f); - } - else - while (sch != EOF && strchr(pattern, sch) - && --width >= 0) { - *p++ = sch; - sch = NEXT_CHAR(f); - } - *p = '\x0'; - matched++; - } - } - goto next_spec; - default: - RETURN_SCANF(EOF); - } - } - - next_spec: - width = 65535; - modifier = -1; - skip_flag = 0; - ch = *format++; - } - fseek(f, -1, SEEK_CUR); - RETURN_SCANF(matched); - -#undef RETURN_SCANF -#undef NEXT_CHAR -} - -int __cdecl fprintf(FILE *f, const char *format, ...) -{ - int retval; - va_list args; - - if (!f || !format) - return 0; - - va_start(args, format); - retval = vfprintf(f, format, args); - va_end(args); - - return retval; -} - -int __cdecl vfprintf(FILE *f, const char *format, va_list args) -{ - char buf[4096]; - int retval; - - if (!f || !format) - return 0; - - retval = vsprintf(buf, format, args); - - write((int) f, buf, strlen(buf)); - - return retval; -} - -int __cdecl fgetc(FILE *f) -{ - char c; - int fh = (int) f; - - if (!f) - return EOF; - if (read(fh, &c, 1) == 1) - return c; - else - return EOF; -} - -char *__cdecl fgets(char *s, int size, FILE *f) -{ - /* not the best performance but it will do for now...*/ - char c; - if (!f || !s || size == 0) - return NULL; - while (--size > 0) { - if ((c = fgetc(f)) == EOF) - return NULL; - - *s++ = c; - if (c == '\n') - break; - } - *s = '\x0'; - return s; -} - -int __cdecl printf(const char *format, ...) -{ - int retval; - va_list args; - - if (!format) - return 0; - - va_start(args, format); - retval = vprintf(format, args); - va_end(args); - - return retval; -} - -int __cdecl vprintf(const char *format, va_list args) -{ - char buf[4096]; - int retval; - - retval = vsprintf(buf, format, args); - puts(buf); - return retval; -} - -// int __cdecl putchar(int); -int __cdecl puts(const char *s) -{ - TCHAR wbuf[4096]; - NH_A2W(s, wbuf, 4096); - MessageBox(NULL, wbuf, _T("stdout"), MB_OK); - return 0; -} - -FILE *__cdecl _getstdfilex(int desc) -{ - return NULL; -} - -int __cdecl fclose(FILE *f) -{ - if (!f) - return EOF; - return close((int) f) == -1 ? EOF : 0; -} - -size_t __cdecl fread(void *p, size_t size, size_t count, FILE *f) -{ - int read_bytes; - if (!f || !p || size == 0 || count == 0) - return 0; - read_bytes = read((int) f, p, size * count); - return read_bytes > 0 ? (read_bytes / size) : 0; -} - -size_t __cdecl fwrite(const void *p, size_t size, size_t count, FILE *f) -{ - int write_bytes; - if (!f || !p || size == 0 || count == 0) - return 0; - write_bytes = write((int) f, p, size * count); - return write_bytes > 0 ? write_bytes / size : 0; -} - -int __cdecl fflush(FILE *f) -{ - return 0; -} - -int __cdecl feof(FILE *f) -{ - return (f && eof((int) f) == 0) ? 0 : 1; -} - -int __cdecl fseek(FILE *f, long offset, int from) -{ - return (f && lseek((int) f, offset, from) >= 0) ? 0 : 1; -} - -long __cdecl ftell(FILE *f) -{ - return f ? lseek((int) f, 0, SEEK_CUR) : -1; -} - -#endif diff --git a/sys/wince/cesetup.bat b/sys/wince/cesetup.bat deleted file mode 100755 index 791f5e327..000000000 --- a/sys/wince/cesetup.bat +++ /dev/null @@ -1,40 +0,0 @@ -@REM NetHack 3.6 cesetup.bat $NHDT-Date: 1432512801 2015/05/25 00:13:21 $ $NHDT-Branch: master $:$NHDT-Revision: 1.15 $ */ -@REM Copyright (c) Alex Kompel, 2002 -@REM NetHack may be freely redistributed. See license for details. -@REM Win32 nhsetup batch file, see Install.ce for details -@REM -@echo off -REM -REM Make sure directories necessary for build exist -REM -if NOT exist ..\..\wince\*.* mkdir ..\..\wince -REM -REM Get these files from the win\win32 port -REM -copy ..\..\win\win32\mnsel.uu ..\..\wince\mnsel.uu -copy ..\..\win\win32\mnselcnt.uu ..\..\wince\mnselcnt.uu -copy ..\..\win\win32\mnunsel.uu ..\..\wince\mnunsel.uu -copy ..\..\win\win32\petmark.uu ..\..\wince\petmark.uu -copy ..\..\sys\wince\menubar.uu ..\..\wince\menubar.uu -copy ..\..\sys\wince\keypad.uu ..\..\wince\keypad.uu -copy ..\..\sys\wince\nhico.uu ..\..\wince\nhico.uu -REM -REM Get these files from sys\wince -REM -copy bootstrp.mak ..\..\wince\bootstrp.mak -copy wince.vcw ..\..\wince.vcw -copy hpc.vcp ..\..\wince\wince_hpc.vcp -copy palmpc.vcp ..\..\wince\wince_palm_pc.vcp -copy pocketpc.vcp ..\..\wince\wince_pocket_pc.vcp -copy smartphn.vcp ..\..\wince\wince_smartphone.vcp -echo. -echo Proceed with the following steps: -echo. -echo cd ..\..\wince -echo nmake /f bootstrp.mak -echo. -echo Then start Embedded Visual C and open -echo the workspace wince.vcw (at the top of the NetHack tree) -echo to build. See Install.ce for details. -echo. - diff --git a/sys/wince/cesound.c b/sys/wince/cesound.c deleted file mode 100644 index 4130feb77..000000000 --- a/sys/wince/cesound.c +++ /dev/null @@ -1,29 +0,0 @@ -/* NetHack 3.6 cesound.c $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ */ -/* Copyright (c) NetHack PC Development Team 1993 */ -/* NetHack may be freely redistributed. See license for details. */ -/* */ -/* - * cesound.c - Windows CE NetHack sound support - * - * - */ - -#include "hack.h" -#include - -#ifdef USER_SOUNDS - -void -play_usersound(filename, volume) -const char *filename; -int volume; -{ - TCHAR wbuf[MAX_PATH + 1]; - /* pline("play_usersound: %s (%d).", filename, volume); */ - ZeroMemory(wbuf, sizeof(wbuf)); - (void) sndPlaySound(NH_A2W(filename, wbuf, MAX_PATH), - SND_ASYNC | SND_NODEFAULT); -} - -#endif /*USER_SOUNDS*/ -/* cesound.c */ diff --git a/sys/wince/defaults.nh b/sys/wince/defaults.nh deleted file mode 100644 index b3c068939..000000000 --- a/sys/wince/defaults.nh +++ /dev/null @@ -1,84 +0,0 @@ -# $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ -# Copyright (c) 2007 by Michael Allison -# NetHack may be freely redistributed. See license for details. -# -# Sample config file for win32 NetHack -# A '#' at the beginning of a line means the rest of the line is a comment. -# -# Some options MUST be set in this file, other options can be toggled while -# playing. For a list of options available see the file. -# -# To change the configuration, comment out the unwanted lines, and -# uncomment the configuration you want. - -# *** OPTIONS *** -# -# Use the IBM character set rather than just plain ascii characters -# for tty window-port. -# OPTIONS=IBMGraphics - -# *** Personal Preferences *** -# Some options to set personal preferences. Uncomment and change these to -# suit your personal preference. If several people are to use the same -# configuration, options like these should not be set. -# -#OPTIONS=name:Janet,role:Valkyrie,race:Human,gender:female,align:lawful -#OPTIONS=dogname:Fido,catname:Morris,fruit:guava -#OPTIONS=horsename:Silver -#OPTIONS=autopickup,pickup_types:$"=/!?+ -#OPTIONS=packorder:")[%?+/=!(*0_` -#OPTIONS=scores:10 top/2 around/own -#OPTIONS=nolegacy,noverbose -#OPTIONS=menustyle:traditional - -# -# General options. You might also set "silent" so as not to attract -# the boss's attention. -# -OPTIONS=time,noshowexp,number_pad,lit_corridor,rest_on_space -# -# If you want to get rid of "use #quit to quit..." use: -#OPTIONS=suppress_alert:3.3.1 -# -# Set some options to control graphical window-port (these will -# be safely and silently ignored by the tty port) -# -# Map window settings -# possible map_mode options include: tiles|ascii4x6|ascii6x8|ascii8x8|ascii16x8| -# ascii7x12|ascii8x12|ascii16x12|ascii12x16| -# ascii10x18|fit_to_screen -OPTIONS=map_mode:tiles,scroll_margin:4 - -# Menu settings -# OPTIONS=font_menu:Arial - -# Other -OPTIONS=hilite_pet,!toptenwin -OPTIONS=!splash_screen,player_selection:prompts -OPTIONS=vary_msgcount:3 -OPTIONS=fullscreen,wraptext,softkeyboard - -# Status/message window colors -# Possible color options include: -# six digit hexadecimal RGB color value ("#8F8F8F"), black, red, green, brown, -# blue, magenta, cyan, gray (or grey), orange, brightgreen, yellow, brightblue, -# brightmagenta, brightcyan, white, trueblack, purple, silver, maroon, fuchsia, -# lime, olive, navy, teal, aqua, activeborder, activecaption, appworkspace, -# background, btnface, btnshadow, btntext, captiontext, graytext, highlight, -# highlighttext, inactiveborder, inactivecaption, menu, menutext, scrollbar, -# window, windowframe, windowtext. -#OPTIONS=windowcolors:status windowtext/window message windowtext/window -OPTIONS=windowcolors:status white/#000000 message white/#000000 menu white/#000000 text white/#000000 - -# -#HACKDIR=c:\games\nethack -# -# Note: On Windows HACKDIR defaults to the location -# of the NetHack.exe or NetHackw.exe file. -# Setting HACKDIR above will override that. -# -# LEVELS and SAVE default to HACKDIR -# -#LEVELS=c:\games\nethack\bones -#SAVE=c:\games\nethack\bones - diff --git a/sys/wince/keypad.uu b/sys/wince/keypad.uu deleted file mode 100644 index b36f63971..000000000 --- a/sys/wince/keypad.uu +++ /dev/null @@ -1,8 +0,0 @@ -begin 600 keypad.bmp -M0DV^`````````#X````H````<`````@````!``$``````(`````````````` -M`````````````````/___P#__________________P``[__[____________ -M_R0``.?_\_?C]__W__?_]^MU``#CP>/GU?/AX\/OY_O5=0``X>/#Q\'QX\'C -MS^?YZR4``/_W_^?5\^?_\^__^]5M``#____WX_?O__OW__?_)```________ -*__________\``.?5 -` -end diff --git a/sys/wince/menubar.uu b/sys/wince/menubar.uu deleted file mode 100644 index b4f07c5dc..000000000 --- a/sys/wince/menubar.uu +++ /dev/null @@ -1,12 +0,0 @@ -begin 600 menubar.bmp -M0DUV`0```````'8````H````(````!`````!``0````````!```````````` -M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(`` -M``#_``#_````__\`_P```/\`_P#__P``____`'=W=W=W=W=W=W=W=W=W=W=W -M=W=W=W=W=W=W=W=W=W=W=$1$1$1$1'=W=W=W=W=W=W1$_T1/]$1W=W=W=W=W -M=W=T1/_T__1$=W=W=W=W=W=W=/______]'=W=P<'!P=W=W3_______1W=W#P -M\/#P=W=T3__T__]$=W -#include "winMS.h" -#include "mhaskyn.h" - -int -mswin_yes_no_dialog(const char *question, const char *choices, int def) -{ - return '\032'; -} diff --git a/sys/wince/mhaskyn.h b/sys/wince/mhaskyn.h deleted file mode 100644 index 971a778e3..000000000 --- a/sys/wince/mhaskyn.h +++ /dev/null @@ -1,12 +0,0 @@ -/* NetHack 3.6 mhaskyn.h $NHDT-Date: 1432512800 2015/05/25 00:13:20 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINAskYesNO_h -#define MSWINAskYesNO_h - -#include "winMS.h" - -int mswin_yes_no_dialog(const char *question, const char *choices, int def); - -#endif /* MSWINAskYesNO_h */ diff --git a/sys/wince/mhcmd.c b/sys/wince/mhcmd.c deleted file mode 100644 index c82bf7624..000000000 --- a/sys/wince/mhcmd.c +++ /dev/null @@ -1,1532 +0,0 @@ -/* NetHack 3.6 mhcmd.c $NHDT-Date: 1524689383 2018/04/25 20:49:43 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.15 $ */ -/* Copyright (c) 2009 by Michael Allison */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include -#include "mhcmd.h" -#include "mhinput.h" -#include "mhcolor.h" - -static TCHAR szNHCmdWindowClass[] = TEXT("MSNethackCmdWndClass"); - -#ifndef C -#define C(c) (0x1f & (c)) -#endif - -/* cell status 0 */ -#define NH_CST_CHECKED 1 - -/* fonts */ -#define NH_CMDPAD_FONT_NORMAL 0 -#define NH_CMDPAD_FONT_MAX 0 - -/* type of the cell */ -#define NH_CELL_REG 0 -#define NH_CELL_CTRL 1 -#define NH_CELL_CAP 2 -#define NH_CELL_SHIFT 3 -#define NH_CELL_LAYOUT_NEW 4 -#define NH_CELL_LAYOUT_MENU 5 - -#define NH_CMDSET_MAXSIZE 64 - -/* Keypad cell information - - NHCmdPadCell.cell_type NHCmdPadCell.data - ----------- ---------- - NH_CELL_REG (int)>=0 - index in the - current keypad layout set (loads a new layout) - -1 - restore default (saved) layout - NH_CELL_CTRL not used - NH_CELL_CAP not used - NH_CELL_SHIFT not used - NH_CELL_LAYOUT_NEW pointer to the new keypad layout - layout (NHCmdLayout*) - NH_CELL_LAYOUT_MENU pointer to the layout set (NHCmdSet* - if - NULL then nhcmdset_default is used) -*/ -typedef struct t_NHCmdPadCell { - UINT cmd_code; /* Windows command code (menu processing - not implemented - - set to -1) */ - char f_char[16]; /* nethack char */ - char text[16]; /* display text */ - int image; /* >0 - image ID in IDB_KEYPAD bitmap - <=0 - absolute index of the font table */ - int type; /* cell type */ - int mult; /* cell width multiplier */ - void *data; /* internal data for the cell type */ -} NHCmdPadCell, *PNHCmdPadCell; - -/* command layout */ -typedef struct t_NHCmdLayout { - char name[64]; - int rows; - int columns; - NHCmdPadCell cells[]; -} NHCmdLayout, *PNHCmdLayout; - -/* set of command layouts */ -typedef struct t_NHCmdSet { - int count; - struct t_NHCmdSetElem { - PNHCmdLayout layout; - BOOL free_on_destroy; - } elements[NH_CMDSET_MAXSIZE]; -} NHCmdSet, *PNHCmdSet; - -/* display cell layout */ -typedef struct t_NHCmdPadLayoutCell { - POINT orig; /* origin of the cell rect */ - BYTE type; /* cell type */ - int state; /* cell state */ -} NHCmdPadLayoutCell, *PNHCmdPadLayoutCell; - -/* command window data */ -typedef struct mswin_nethack_cmd_window { - SIZE cell_size; /* cell size */ - HFONT font[NH_CMDPAD_FONT_MAX + 1]; /* fonts for cell text */ - HBITMAP images; /* key images map */ - int active_cell; /* current active cell */ - - boolean is_caps; /* is CAPS selected */ - boolean is_ctrl; /* is CRTL selected */ - boolean is_shift; /* is SHIFT selected */ - - PNHCmdLayout layout_current; /* current layout */ - PNHCmdLayout layout_save; /* saved layout */ - PNHCmdPadLayoutCell cells; /* display cells */ - -#if defined(WIN_CE_SMARTPHONE) - PNHCmdLayout layout_selected; /* since we use - layout - command for menu also - we need to store the layout - that was - selected by a user - */ -#endif -} NHCmdWindow, *PNHCmdWindow; - -LRESULT CALLBACK NHCommandWndProc(HWND, UINT, WPARAM, LPARAM); -static void register_command_window_class(); -static void LayoutCmdWindow(HWND hWnd); -static void SetCmdWindowLayout(HWND hWnd, PNHCmdLayout layout); -static int CellFromPoint(PNHCmdWindow data, POINT pt); -static void CalculateCellSize(HWND hWnd, LPSIZE pSize, LPSIZE windowSize); -static void HighlightCell(HWND hWnd, int cell, BOOL isSelected); -static void ActivateCell(HWND hWnd, int cell); -static void PushNethackCommand(const char *cmd_char_str, int is_ctrl); - -/*------------------- keyboard keys layout functions -----------------------*/ -PNHCmdLayout nhcmdlayout_create(const char *name, int rows, int columns); -void nhcmdlayout_init(PNHCmdLayout p, PNHCmdPadCell cells); -#define nhcmdlayout_rows(p) ((p)->rows) -#define nhcmdlayout_columns(p) ((p)->columns) -#define nhcmdlayout_row(p, x) (&((p)->cells[(p)->columns * (x)])) -#define nhcmdlayout_cell(p, x, y) (&((p)->cells[(p)->columns * (x) + (y)])) -#define nhcmdlayout_cell_direct(p, i) (&((p)->cells[(i)])) -void nhcmdlayout_destroy(PNHCmdLayout p); - -/*----------------- keyboard keys layout set functions ---------------------*/ -PNHCmdSet nhcmdset_create(); -int nhcmdset_count(PNHCmdSet p); -PNHCmdLayout nhcmdset_get(PNHCmdSet p, int index); -const char *nhcmdset_get_name(PNHCmdSet p, int index); -void nhcmdset_add(PNHCmdSet p, PNHCmdLayout layout); -void nhcmdset_destroy(PNHCmdSet p); - -/*-------------------- message handlers -----------------------------------*/ -static void onPaint(HWND hWnd); // on WM_PAINT -static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); // on WM_CREATE -static void onMouseDown(HWND hWnd, WPARAM wParam, - LPARAM lParam); // on WM_LBUTTONDOWN -static void onMouseMove(HWND hWnd, WPARAM wParam, - LPARAM lParam); // on WM_MOUSEMOVE -static void onMouseUp(HWND hWnd, WPARAM wParam, - LPARAM lParam); // on WM_LBUTTONUP - -/*----------------------- static data -------------------------------------*/ -static PNHCmdSet nhcmdset_current = 0; -static PNHCmdSet nhcmdset_default = 0; - -/*---------------------- Pre-definde keyboard layouts --------------------*/ -#ifdef WIN_CE_SMARTPHONE - -/* dimensions of the command pad */ -#define NH_CMDPAD_ROWS 4 -#define NH_CMDPAD_COLS 3 -#define NH_CMDPAD_CELLNUM (NH_CMDPAD_COLS * NH_CMDPAD_ROWS) - -/* layout indexes */ -#define NH_LAYOUT_GENERAL 0 -#define NH_LAYOUT_MOVEMENT 1 -#define NH_LAYOUT_ATTACK 2 -#define NH_LAYOUT_ITEM_HANDLING 3 -#define NH_LAYOUT_CONTROLS 4 -#define NH_LAYOUT_ADV_MOVEMENT 5 -#define NH_LAYOUT_ITEM_LOOKUP 6 -#define NH_LAYOUT_WIZARD 7 - -/* template menu layout */ -NHCmdPadCell cells_layout_menu[NH_CMDPAD_CELLNUM] = { - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "<<", -NH_CMDPAD_FONT_NORMAL, NH_CELL_LAYOUT_NEW, 1, NULL }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", ">>", -NH_CMDPAD_FONT_NORMAL, NH_CELL_LAYOUT_NEW, 1, NULL } -}; - -/* movement layout */ -NHCmdPadCell cells_layout_movement[NH_CMDPAD_CELLNUM] = { - { -1, "7", "7", 1, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "8", "8", 2, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "9", "9", 3, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "4", "4", 4, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ".", ".", 5, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "6", "6", 6, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "1", "1", 7, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "2", "2", 8, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "3", "3", 9, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "<", "<", 10, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ">", ">", 12, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* attack layout */ -NHCmdPadCell cells_layout_attack[NH_CMDPAD_CELLNUM] = { - { -1, "t", "t", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "w", "w", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "x", "x", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "f", "f", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "z", "z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "Z", "Z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "r", "r", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "a", "a", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "q", "q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\x04", "^D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "F", "F", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) NH_LAYOUT_MOVEMENT }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* item handling layout */ -NHCmdPadCell cells_layout_item_handling[NH_CMDPAD_CELLNUM] = { - { -1, "W", "W", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "P", "P", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "d", "d", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "T", "T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "R", "R", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "D", "D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "=", "=", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "i", "i", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "Q", "Q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "A", "A", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "I", "I", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* General */ -NHCmdPadCell cells_layout_general[NH_CMDPAD_CELLNUM] = { - { -1, "q", "q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "e", "e", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "l", "l", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "s", "s", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "E", "E", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\x01", "^A", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "c", "c", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "o", "o", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "p", "p", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ":", ":", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ",", ",", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* game controls layout */ -NHCmdPadCell cells_layout_game[NH_CMDPAD_CELLNUM] = { - { -1, "S", "S", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "h", "h", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "C", "C", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "@", "@", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\\", "\\", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "O", "O", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "&", "&", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\x18", "^X", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x10", "^P", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "X", "X", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "#", "#", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* advanced movement layout */ -NHCmdPadCell cells_layout_adv_movement[NH_CMDPAD_CELLNUM] = { - { -1, "g", "g", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) NH_LAYOUT_MOVEMENT }, - { -1, "G", "G", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) NH_LAYOUT_MOVEMENT }, - { -1, "m", "m", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) NH_LAYOUT_MOVEMENT }, - { -1, "M", "M", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) NH_LAYOUT_MOVEMENT }, - { -1, "_", "_", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\x14", "^T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "j", "j", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "<", "<", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ">", ">", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "^", "^", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* item lookup layout */ -NHCmdPadCell cells_layout_lookup[NH_CMDPAD_CELLNUM] = { - { -1, ";", ";", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "^", "^", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "]", "]", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ")", ")", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "=", "=", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "*", "*", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "(", "(", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\"", "\"", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "$", "$", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "+", "+", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -/* wizard mode layout */ -NHCmdPadCell cells_layout_wizard[NH_CMDPAD_CELLNUM] = { - { -1, "\x05", "^e", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x06", "^f", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x07", "^g", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x09", "^i", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x0f", "^o", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x16", "^v", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x17", "^w", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "\x14", "^T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, - (void *) - 1 }, - { -1, "#", "#", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } -}; - -#else /* !WIN_CE_SMARTPHONE */ - -/* dimensions of the command pad */ -#define NH_CMDPAD_ROWS 4 -#define NH_CMDPAD_COLS 14 -#define NH_CMDPAD_CELLNUM (NH_CMDPAD_COLS * NH_CMDPAD_ROWS) - -/* lowercase layout */ -NHCmdPadCell cells_layout_mod1[NH_CMDPAD_ROWS * NH_CMDPAD_COLS] = { - { -1, "7", "7", 1, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "8", "8", 2, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "9", "9", 3, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\x1b", "Esc", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for ESC */ - { -1, "?", "?", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "*", "*", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ",", ",", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "/", "/", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ":", ":", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ";", ";", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "-", "-", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "#", "#", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "^", "^", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - - { -1, "4", "4", 4, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "5", "5", 5, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "6", "6", 6, NH_CELL_REG, 1, (void *) - 1 }, - { -1, " ", "CAP", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CAP, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for CAPS */ - { -1, "a", "a", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "b", "b", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "c", "c", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "d", "d", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "e", "e", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "f", "f", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "g", "g", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "h", "h", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "i", "i", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - - { -1, "1", "1", 7, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "2", "2", 8, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "3", "3", 9, NH_CELL_REG, 1, (void *) - 1 }, - { -1, " ", "Shft", -NH_CMDPAD_FONT_NORMAL, NH_CELL_SHIFT, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for shift */ - { -1, "j", "j", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "k", "k", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "l", "l", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "m", "m", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "n", "n", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "o", "o", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "p", "p", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "q", "q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "r", "r", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - - { -1, "<", "<", 10, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ".", ".", 11, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ">", ">", 12, NH_CELL_REG, 1, (void *) - 1 }, - { -1, " ", "Ctrl", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CTRL, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for CTRL */ - { -1, "s", "s", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "t", "t", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "u", "u", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "v", "v", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "w", "w", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "x", "x", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "y", "y", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "z", "z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\\", "\\", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 } -}; - -/* uppercase layout */ -NHCmdPadCell cells_layout_mod2[-NH_CMDPAD_ROWS * -NH_CMDPAD_COLS] = { - { -1, "7", "7", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "8", "8", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "9", "9", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\x1b", "Esc", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for ESC */ - { -1, "?", "?", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "*", "*", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "[", "[", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "(", "(", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ")", ")", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "+", "+", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "=", "=", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "\"", "\"", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "$", "$", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - - { -1, "4", "4", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "5", "5", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "6", "6", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, " ", "CAP", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CAP, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for CAPS */ - { -1, "A", "A", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "B", "B", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "C", "C", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "D", "D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "E", "E", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "F", "F", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "G", "G", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "H", "H", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "I", "I", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - - { -1, "1", "1", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "2", "2", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "3", "3", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, " ", "Shft", -NH_CMDPAD_FONT_NORMAL, NH_CELL_SHIFT, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for shift */ - { -1, "J", "J", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "K", "K", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "L", "L", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "M", "M", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "N", "N", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "O", "O", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "P", "P", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "Q", "Q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "R", "R", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - - { -1, "<", "<", 10, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "0", "0", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, ">", ">", 12, NH_CELL_REG, 1, (void *) - 1 }, - { -1, " ", "Ctrl", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CTRL, 2, NULL }, - { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0, - NULL }, /* complement for CTRL */ - { -1, "S", "S", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "T", "T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "U", "U", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "V", "V", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "W", "W", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "X", "X", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "Y", "Y", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "Z", "Z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 }, - { -1, "@", "@", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void *) - 1 } -}; - -#endif /* !WIN_CE_SMARTPHONE */ - -/*-------------------------------------------------------------------------*/ -HWND -mswin_init_command_window() -{ - static int run_once = 0; - HWND ret; - - /* register window class */ - if (!run_once) { - register_command_window_class(); - run_once = 1; - } - - /* create window */ - ret = CreateWindow( - szNHCmdWindowClass, /* registered class name */ - NULL, /* window name */ - WS_CHILD | WS_CLIPSIBLINGS, /* window style */ - 0, /* horizontal position of window - set it later */ - 0, /* vertical position of window - set it later */ - 0, /* window width - set it later */ - 0, /* window height - set it later*/ - GetNHApp()->hMainWnd, /* handle to parent or owner window */ - NULL, /* menu handle or child identifier */ - GetNHApp()->hApp, /* handle to application instance */ - NULL); /* window-creation data */ - if (!ret) { - panic("Cannot create command window"); - } - return ret; -} -/*-------------------------------------------------------------------------*/ -/* calculate mimimum window size */ -void -mswin_command_window_size(HWND hwnd, LPSIZE sz) -{ - SIZE cell_size; - PNHCmdWindow data; - data = (PNHCmdWindow) GetWindowLong(hwnd, GWL_USERDATA); - if (!data) { - sz->cx = sz->cy = 0; - } else { - CalculateCellSize(hwnd, &cell_size, sz); - sz->cx = max(cell_size.cx * nhcmdlayout_columns(data->layout_current) - + 2 * GetSystemMetrics(SM_CXBORDER), - sz->cx); - sz->cy = max(cell_size.cy * nhcmdlayout_rows(data->layout_current) - + 2 * GetSystemMetrics(SM_CYBORDER), - sz->cy); - } -} -/*-------------------------------------------------------------------------*/ -void -register_command_window_class() -{ - WNDCLASS wcex; - PNHCmdLayout plt; - ZeroMemory(&wcex, sizeof(wcex)); - - /* window class */ - wcex.style = CS_NOCLOSE; - wcex.lpfnWndProc = (WNDPROC) NHCommandWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = GetNHApp()->hApp; - wcex.hIcon = NULL; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = mswin_get_brush(NHW_KEYPAD, MSWIN_COLOR_BG); - wcex.lpszMenuName = NULL; - wcex.lpszClassName = szNHCmdWindowClass; - - if (!RegisterClass(&wcex)) { - panic("cannot register Map window class"); - } - - /* create default command set */ - nhcmdset_current = nhcmdset_default = nhcmdset_create(); - -#ifdef WIN_CE_SMARTPHONE - plt = nhcmdlayout_create("General", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_general); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("Movement", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_movement); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("Attack", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_attack); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("Item Handling", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_item_handling); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("Game Controls", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_game); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("Advanced Movement", NH_CMDPAD_ROWS, - NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_adv_movement); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("Item Lookup", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_lookup); - nhcmdset_add(nhcmdset_current, plt); - - if (wizard) { - plt = - nhcmdlayout_create("Wizard Mode", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_wizard); - nhcmdset_add(nhcmdset_current, plt); - } - -#else /* ! WIN_CE_SMARTPHONE */ - plt = nhcmdlayout_create("lowercase", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_mod1); - nhcmdset_add(nhcmdset_current, plt); - - plt = nhcmdlayout_create("uppercase", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); - nhcmdlayout_init(plt, cells_layout_mod2); - nhcmdset_add(nhcmdset_current, plt); -#endif /* WIN_CE_SMARTPHONE */ -} -/*-------------------------------------------------------------------------*/ -LRESULT CALLBACK -NHCommandWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - PNHCmdWindow data; - int i; - - switch (message) { - case WM_CREATE: - onCreate(hWnd, wParam, lParam); - break; - - case WM_PAINT: - onPaint(hWnd); - break; - - case WM_SIZE: - LayoutCmdWindow(hWnd); - break; - - case WM_LBUTTONDOWN: - onMouseDown(hWnd, wParam, lParam); - return 0; - - case WM_MOUSEMOVE: - /* proceed only if if have mouse focus (set in onMouseDown() - - left mouse button is pressed) */ - if (GetCapture() == hWnd) { - onMouseMove(hWnd, wParam, lParam); - return 0; - } else { - return 1; - } - break; - - case WM_LBUTTONUP: - /* proceed only if if have mouse focus (set in onMouseDown()) */ - if (GetCapture() == hWnd) { - onMouseUp(hWnd, wParam, lParam); - return 0; - } else { - return 1; - } - break; - - case WM_DESTROY: - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - for (i = 0; i <= NH_CMDPAD_FONT_MAX; i++) - if (data->font[i]) - DeleteObject(data->font[i]); - free(data); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - break; - - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return FALSE; -} -/*-------------------------------------------------------------------------*/ -void -onPaint(HWND hWnd) -{ - PNHCmdWindow data; - PAINTSTRUCT ps; - HDC hDC; - int x, y; - TCHAR wbuf[BUFSZ]; - HGDIOBJ saveFont; - BITMAP bm; - int cell_index; - - /* get window data */ - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - - hDC = BeginPaint(hWnd, &ps); - - if (!IsRectEmpty(&ps.rcPaint)) { - HGDIOBJ oldBr; - HBRUSH hbrPattern; - COLORREF OldBg, OldFg; - HPEN hPen; - HGDIOBJ hOldPen; - - saveFont = SelectObject(hDC, data->font[NH_CMDPAD_FONT_NORMAL]); - OldBg = SetBkColor(hDC, mswin_get_color(NHW_KEYPAD, MSWIN_COLOR_BG)); - OldFg = - SetTextColor(hDC, mswin_get_color(NHW_KEYPAD, MSWIN_COLOR_FG)); - - GetObject(data->images, sizeof(BITMAP), (LPVOID) &bm); - - hbrPattern = CreatePatternBrush(data->images); - hPen = CreatePen(PS_SOLID, 1, - mswin_get_color(NHW_KEYPAD, MSWIN_COLOR_FG)); - - for (x = 0, cell_index = 0; - x < nhcmdlayout_rows(data->layout_current); x++) - for (y = 0; y < nhcmdlayout_columns(data->layout_current); - y++, cell_index++) { - RECT cell_rt; - POINT pt[5]; - PNHCmdPadCell p_cell_data; - - p_cell_data = - nhcmdlayout_cell_direct(data->layout_current, cell_index); - - /* calculate the cell rectangle */ - cell_rt.left = data->cells[cell_index].orig.x; - cell_rt.top = data->cells[cell_index].orig.y; - cell_rt.right = data->cells[cell_index].orig.x - + data->cell_size.cx * p_cell_data->mult; - cell_rt.bottom = - data->cells[cell_index].orig.y + data->cell_size.cy; - - /* draw border */ - hOldPen = SelectObject(hDC, hPen); - pt[0].x = cell_rt.left; - pt[0].y = cell_rt.top; - pt[1].x = cell_rt.right; - pt[1].y = cell_rt.top; - pt[2].x = cell_rt.right; - pt[2].y = cell_rt.bottom; - pt[3].x = cell_rt.left; - pt[3].y = cell_rt.bottom; - pt[4].x = cell_rt.left; - pt[4].y = cell_rt.top; - Polyline(hDC, pt, 5); - SelectObject(hDC, hOldPen); - - /* calculate clipping rectangle for the text */ - cell_rt.left++; - cell_rt.top++; - cell_rt.right--; - cell_rt.bottom--; - - /* draw the cell text */ - if (p_cell_data->image <= 0) { - SelectObject(hDC, data->font[-p_cell_data->image]); - DrawText(hDC, NH_A2W(p_cell_data->text, wbuf, BUFSZ), - strlen(p_cell_data->text), &cell_rt, - DT_CENTER | DT_VCENTER | DT_SINGLELINE - | DT_NOPREFIX); - } else { - /* draw bitmap */ - int bmOffset; - RECT bitmap_rt; - - bmOffset = (p_cell_data->image - 1) * bm.bmHeight; - - bitmap_rt.left = - ((cell_rt.left + cell_rt.right) - - min(bm.bmHeight, (cell_rt.right - cell_rt.left))) - / 2; - bitmap_rt.top = - ((cell_rt.bottom + cell_rt.top) - - min(bm.bmHeight, (cell_rt.bottom - cell_rt.top))) - / 2; - bitmap_rt.right = - bitmap_rt.left - + min(bm.bmHeight, (cell_rt.right - cell_rt.left)); - bitmap_rt.bottom = - bitmap_rt.top - + min(bm.bmHeight, (cell_rt.bottom - cell_rt.top)); - - SetBrushOrgEx(hDC, bitmap_rt.left - bmOffset, - bitmap_rt.top, NULL); - oldBr = SelectObject(hDC, hbrPattern); - PatBlt(hDC, bitmap_rt.left, bitmap_rt.top, - bitmap_rt.right - bitmap_rt.left, - bitmap_rt.bottom - bitmap_rt.top, PATCOPY); - SelectObject(hDC, oldBr); - } - - /* invert the cell if it is selected */ - if (data->cells[cell_index].state == NH_CST_CHECKED) { - IntersectRect(&cell_rt, &cell_rt, &ps.rcPaint); - PatBlt(hDC, cell_rt.left, cell_rt.top, - cell_rt.right - cell_rt.left, - cell_rt.bottom - cell_rt.top, DSTINVERT); - } - } - - SetTextColor(hDC, OldFg); - SetBkColor(hDC, OldBg); - SelectObject(hDC, saveFont); - DeleteObject(hbrPattern); - DeleteObject(hPen); - } - EndPaint(hWnd, &ps); -} -/*-------------------------------------------------------------------------*/ -void -onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHCmdWindow data; - - /* set window data */ - data = (PNHCmdWindow) malloc(sizeof(NHCmdWindow)); - if (!data) - panic("out of memory"); - - ZeroMemory(data, sizeof(NHCmdWindow)); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) data); - - data->active_cell = -1; - - /* load images bitmap */ - data->images = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_KEYPAD)); - if (!data->images) - panic("cannot load keypad bitmap"); - - /* create default layouts */ - data->layout_current = 0; - data->layout_save = 0; - data->cells = 0; - -#if defined(WIN_CE_SMARTPHONE) - data->layout_selected = nhcmdset_get(nhcmdset_current, 0); -#endif - - /* set default layout */ - SetCmdWindowLayout(hWnd, nhcmdset_get(nhcmdset_current, 0)); -} -/*-------------------------------------------------------------------------*/ -void -LayoutCmdWindow(HWND hWnd) -{ - RECT clrt; - SIZE windowSize; - PNHCmdWindow data; - int i, j; - int x, y; - LOGFONT lgfnt; - int index; - - GetClientRect(hWnd, &clrt); - if (IsRectEmpty(&clrt)) - return; - - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (!data->layout_current) - return; - - /* calculate cell size */ - windowSize.cx = clrt.right - clrt.left; - windowSize.cy = clrt.bottom - clrt.top; - CalculateCellSize(hWnd, &data->cell_size, &windowSize); - - /* initialize display cells aray */ - x = 0; - y = 0; - for (i = 0, index = 0; i < nhcmdlayout_rows(data->layout_current); i++) { - for (j = 0; j < nhcmdlayout_columns(data->layout_current); - j++, index++) { - data->cells[index].orig.x = x; - data->cells[index].orig.y = y; - data->cells[index].type = - nhcmdlayout_cell_direct(data->layout_current, index)->type; - - switch (data->cells[index].type) { - case NH_CELL_CTRL: - data->cells[index].state = data->is_ctrl ? NH_CST_CHECKED : 0; - break; - case NH_CELL_CAP: - data->cells[index].state = data->is_caps ? NH_CST_CHECKED : 0; - break; - case NH_CELL_SHIFT: - data->cells[index].state = - data->is_shift ? NH_CST_CHECKED : 0; - break; - default: - data->cells[index].state = 0; - } - - x += data->cell_size.cx - * nhcmdlayout_cell_direct(data->layout_current, index)->mult; - } - x = 0; - y += data->cell_size.cy; - } - - /* create font for display cell text */ - for (i = 0; i <= NH_CMDPAD_FONT_MAX; i++) - if (data->font[i]) - DeleteObject(data->font[i]); - - ZeroMemory(&lgfnt, sizeof(lgfnt)); - lgfnt.lfHeight = data->cell_size.cy; // height of font - lgfnt.lfWidth = 0; // average character width - lgfnt.lfEscapement = 0; // angle of escapement - lgfnt.lfOrientation = 0; // base-line orientation angle - lgfnt.lfWeight = FW_NORMAL; // font weight - lgfnt.lfItalic = FALSE; // italic attribute option - lgfnt.lfUnderline = FALSE; // underline attribute option - lgfnt.lfStrikeOut = FALSE; // strikeout attribute option - lgfnt.lfCharSet = ANSI_CHARSET; // character set identifier - lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision - lgfnt.lfClipPrecision = CLIP_CHARACTER_PRECIS; // clipping precision - lgfnt.lfQuality = DEFAULT_QUALITY; // output quality - if (iflags.wc_font_message && *iflags.wc_font_message) { - lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family - NH_A2W(iflags.wc_font_message, lgfnt.lfFaceName, LF_FACESIZE); - } else { - lgfnt.lfPitchAndFamily = VARIABLE_PITCH; // pitch and family - } - data->font[NH_CMDPAD_FONT_NORMAL] = CreateFontIndirect(&lgfnt); - - InvalidateRect(hWnd, NULL, TRUE); -} -/*-------------------------------------------------------------------------*/ -void -SetCmdWindowLayout(HWND hWnd, PNHCmdLayout layout) -{ - PNHCmdWindow data; - int size; - - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data->layout_current == layout) - return; - - data->layout_current = layout; - size = sizeof(NHCmdPadLayoutCell) * nhcmdlayout_rows(layout) - * nhcmdlayout_columns(layout); - data->cells = (PNHCmdPadLayoutCell) realloc(data->cells, size); - ZeroMemory(data->cells, size); - LayoutCmdWindow(hWnd); -} -/*-------------------------------------------------------------------------*/ -void -onMouseDown(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHCmdWindow data; - POINT mpt; - - /* get mouse coordinates */ - mpt.x = LOWORD(lParam); - mpt.y = HIWORD(lParam); - - /* map mouse coordinates to the display cell */ - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - data->active_cell = CellFromPoint(data, mpt); - if (data->active_cell == -1) - return; - - /* set mouse focus to the current window */ - SetCapture(hWnd); - - /* invert the selection */ - HighlightCell(hWnd, data->active_cell, - (data->cells[data->active_cell].state != NH_CST_CHECKED)); -} -/*-------------------------------------------------------------------------*/ -void -onMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHCmdWindow data; - POINT mpt; - int newActiveCell; - - /* get mouse coordinates */ - mpt.x = LOWORD(lParam); - mpt.y = HIWORD(lParam); - - /* map mouse coordinates to the display cell */ - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - newActiveCell = CellFromPoint(data, mpt); - if (data->active_cell == -1) - return; - - /* if mouse is within orginal display cell - select the cell otherwise - clear the selection */ - switch (nhcmdlayout_cell_direct(data->layout_current, data->active_cell) - ->type) { - case NH_CELL_REG: - HighlightCell(hWnd, data->active_cell, - (newActiveCell == data->active_cell)); - break; - - case NH_CELL_CTRL: - HighlightCell(hWnd, data->active_cell, - ((newActiveCell == data->active_cell) ? !data->is_ctrl - : data->is_ctrl)); - break; - - case NH_CELL_CAP: - HighlightCell(hWnd, data->active_cell, - ((newActiveCell == data->active_cell) ? !data->is_caps - : data->is_caps)); - break; - } -} -/*-------------------------------------------------------------------------*/ -void -onMouseUp(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHCmdWindow data; - - /* release mouse capture */ - ReleaseCapture(); - - /* get active display cell */ - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data->active_cell == -1) - return; - - ActivateCell(hWnd, data->active_cell); - - data->active_cell = -1; -} -/*-------------------------------------------------------------------------*/ -void -ActivateCell(HWND hWnd, int cell) -{ - PNHCmdWindow data; - PNHCmdPadCell p_cell_data; - int i; - - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (!data) - return; - p_cell_data = nhcmdlayout_cell_direct(data->layout_current, cell); - - /* act depending on the cell type: - CAPS - change layout - CTRL - modify CTRL status - REG - place keyboard event on the nethack input queue - */ - switch (p_cell_data->type) { - case NH_CELL_REG: - if (data->is_ctrl) { - PushNethackCommand(p_cell_data->f_char, 1); - - data->is_ctrl = 0; - for (i = 0; i < nhcmdlayout_rows(data->layout_current) - * nhcmdlayout_columns(data->layout_current); - i++) { - if (nhcmdlayout_cell_direct(data->layout_current, i)->type - == NH_CELL_CTRL) { - HighlightCell(hWnd, i, data->is_ctrl); - } - } - } else { - PushNethackCommand(p_cell_data->f_char, 0); - } - HighlightCell(hWnd, cell, FALSE); - - // select a new layout if present - i = (int) p_cell_data->data; - if (i == -1) { - if (data->layout_save) - SetCmdWindowLayout(hWnd, data->layout_save); - data->layout_save = NULL; - } else { - if (!data->layout_save) - data->layout_save = data->layout_current; - SetCmdWindowLayout(hWnd, nhcmdset_get(nhcmdset_current, i)); - } - - if (!data->is_shift) - break; - // else fall through and reset the shift - - case NH_CELL_SHIFT: - data->is_shift = !data->is_shift; - SetCmdWindowLayout(hWnd, (data->is_shift ^ data->is_caps) - ? nhcmdset_get(nhcmdset_current, 1) - : nhcmdset_get(nhcmdset_current, 0)); - data->cells[cell].state = data->is_shift ? NH_CST_CHECKED : 0; - InvalidateRect(hWnd, NULL, TRUE); - break; - - case NH_CELL_CTRL: - data->is_ctrl = !data->is_ctrl; - HighlightCell(hWnd, cell, data->is_ctrl); - break; - - case NH_CELL_CAP: - data->is_caps = !data->is_caps; - SetCmdWindowLayout(hWnd, (data->is_shift ^ data->is_caps) - ? nhcmdset_get(nhcmdset_current, 1) - : nhcmdset_get(nhcmdset_current, 0)); - data->cells[cell].state = data->is_caps ? NH_CST_CHECKED : 0; - InvalidateRect(hWnd, NULL, TRUE); - break; - - case NH_CELL_LAYOUT_NEW: { - PNHCmdLayout pLayout; - - HighlightCell(hWnd, cell, FALSE); - - pLayout = (PNHCmdLayout) p_cell_data->data; - if (pLayout) { - SetCmdWindowLayout(hWnd, pLayout); - } - } break; - - case NH_CELL_LAYOUT_MENU: { - winid wid; - int i; - anything any; - menu_item *selected = 0; - PNHCmdSet pSet; - - HighlightCell(hWnd, cell, FALSE); - - pSet = (PNHCmdSet) p_cell_data->data; - if (!pSet) - pSet = nhcmdset_default; - - wid = mswin_create_nhwindow(NHW_MENU); - mswin_start_menu(wid); - for (i = 0; i < nhcmdset_count(pSet); i++) { - any.a_void = nhcmdset_get(pSet, i); - mswin_add_menu(wid, NO_GLYPH, &any, 'a' + i, 0, ATR_NONE, - nhcmdset_get_name(pSet, i), FALSE); - } - mswin_end_menu(wid, "Select keypad layout"); - i = select_menu(wid, PICK_ONE, &selected); - mswin_destroy_nhwindow(wid); - - if (i == 1) { -#if defined(WIN_CE_SMARTPHONE) - data->layout_selected = (PNHCmdLayout) selected[0].item.a_void; -#endif - SetCmdWindowLayout(hWnd, (PNHCmdLayout) selected[0].item.a_void); - } - } break; - } -} -/*-------------------------------------------------------------------------*/ -int -CellFromPoint(PNHCmdWindow data, POINT pt) -{ - int i; - for (i = 0; i < nhcmdlayout_rows(data->layout_current) - * nhcmdlayout_columns(data->layout_current); - i++) { - RECT cell_rt; - cell_rt.left = data->cells[i].orig.x; - cell_rt.top = data->cells[i].orig.y; - cell_rt.right = - data->cells[i].orig.x - + data->cell_size.cx - * nhcmdlayout_cell_direct(data->layout_current, i)->mult; - cell_rt.bottom = data->cells[i].orig.y + data->cell_size.cy; - if (PtInRect(&cell_rt, pt)) - return i; - } - return -1; -} -/*-------------------------------------------------------------------------*/ -void -CalculateCellSize(HWND hWnd, LPSIZE pSize, LPSIZE pWindowSize) -{ - HDC hdc; - PNHCmdWindow data; - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (!data) - return; - - hdc = GetDC(hWnd); - - /* if windows size is specified - attempt ro stretch cells across - the window size. If not - make default cell size based on - 10 points font. Make sure that cell cesize does not exceeds 20 points - */ - if (pWindowSize->cx > 0) - pSize->cx = - pWindowSize->cx / nhcmdlayout_columns(data->layout_current); - else - pSize->cx = 10 * GetDeviceCaps(hdc, LOGPIXELSX) / 72; - pSize->cx = min(pSize->cx, 20 * GetDeviceCaps(hdc, LOGPIXELSX) / 72); - - if (pWindowSize->cy > 0) - pSize->cy = pWindowSize->cy / nhcmdlayout_rows(data->layout_current); - else - pSize->cy = 10 * GetDeviceCaps(hdc, LOGPIXELSY) / 72; - pSize->cy = min(pSize->cy, 20 * GetDeviceCaps(hdc, LOGPIXELSY) / 72); - - ReleaseDC(hWnd, hdc); -} -/*-------------------------------------------------------------------------*/ -void -HighlightCell(HWND hWnd, int cell, BOOL isSelected) -{ - HDC hDC; - PNHCmdWindow data; - int prevState; - - data = (PNHCmdWindow) GetWindowLong(hWnd, GWL_USERDATA); - prevState = data->cells[cell].state; - data->cells[cell].state = (isSelected) ? NH_CST_CHECKED : 0; - - if (prevState != data->cells[cell].state) { - hDC = GetDC(hWnd); - PatBlt(hDC, data->cells[cell].orig.x + 1, - data->cells[cell].orig.y + 1, - data->cell_size.cx - * nhcmdlayout_cell_direct(data->layout_current, cell) - ->mult - - 2, - data->cell_size.cy - 2, DSTINVERT); - ReleaseDC(hWnd, hDC); - } -} -/*-------------------------------------------------------------------------*/ -void -PushNethackCommand(const char *cmd_char_str, int is_ctrl) -{ - while (*cmd_char_str) { - if (is_ctrl) { - NHEVENT_KBD(C(*cmd_char_str)); - } else { - NHEVENT_KBD(*cmd_char_str); - } - cmd_char_str++; - } -} - -/*-------------------------------------------------------------------------*/ -/*------------------- keyboard keys layout functions ----------------------*/ -/*-------------------------------------------------------------------------*/ -PNHCmdLayout -nhcmdlayout_create(const char *name, int rows, int columns) -{ - PNHCmdLayout p; - int i; - - i = sizeof(NHCmdLayout) + rows * columns * sizeof(NHCmdPadCell); - p = (PNHCmdLayout) malloc(i); - ZeroMemory(p, i); - p->rows = rows; - p->columns = columns; - strncpy(p->name, name, sizeof(p->name) - 1); - for (i = 0; i < rows * columns; i++) { - p->cells[i].cmd_code = -1; - p->cells[i].image = -NH_CMDPAD_FONT_NORMAL; - p->cells[i].type = 1; - p->cells[i].mult = 1; - } - return p; -} -/*-------------------------------------------------------------------------*/ -void -nhcmdlayout_init(PNHCmdLayout p, PNHCmdPadCell cells) -{ - memcpy(p->cells, cells, p->rows * p->columns * sizeof(NHCmdPadCell)); -} - -void -nhcmdlayout_destroy(PNHCmdLayout p) -{ - free(p); -} - -/*-------------------------------------------------------------------------*/ -/*----------------- keyboard keys layout set functions --------------------*/ -/*-------------------------------------------------------------------------*/ -PNHCmdSet -nhcmdset_create() -{ - PNHCmdSet p; - p = (PNHCmdSet) malloc(sizeof(NHCmdSet)); - ZeroMemory(p, sizeof(NHCmdSet)); - return p; -} -/*-------------------------------------------------------------------------*/ -int -nhcmdset_count(PNHCmdSet p) -{ - assert(p); - return p->count; -} -/*-------------------------------------------------------------------------*/ -PNHCmdLayout -nhcmdset_get(PNHCmdSet p, int index) -{ - assert(p); - assert(index >= 0 && index < p->count); - return p->elements[index].layout; -} -/*-------------------------------------------------------------------------*/ -const char * -nhcmdset_get_name(PNHCmdSet p, int index) -{ - assert(p); - assert(index >= 0 && index < p->count); - return p->elements[index].layout->name; -} -/*-------------------------------------------------------------------------*/ -void -nhcmdset_add(PNHCmdSet p, PNHCmdLayout layout) -{ - assert(p); - assert(p->count < NH_CMDSET_MAXSIZE); - p->elements[p->count].layout = layout; - p->elements[p->count].free_on_destroy = 0; - p->count++; -} -/*-------------------------------------------------------------------------*/ -void -nhcmdset_destroy(PNHCmdSet p) -{ - int i = 0; - assert(p); - for (i = 0; i < p->count; i++) { - if (p->elements[i].free_on_destroy) { - nhcmdlayout_destroy(p->elements[i].layout); - } - } - free(p); -} -/*-------------------------------------------------------------------------*/ - -#if defined(WIN_CE_SMARTPHONE) -/* special keypad input handling for SmartPhone - the phone keypad maps to VK_* as shown below. - some keys might not be present, e.g. VK_TFLIP - sofkey1 softkey2 VK_TSOFT1, VK_TSOFT2 - ^ VK_TUP - < + > VK_TLEFT, VK_TACTION, VK_TRIGHT - v VK_TDOWN - home back VK_THOME, VK_TBACK - talk end VK_TTALK, VK_TEND - 1 2 3 VK_T0..VK_T9 - 4 5 6 ... - 7 8 9 ... - * 0 # VK_TSTAR, VK_TPOUND - other buttons include - VK_TRECORD - VK_TPOWER, VK_TVOLUMEUP, VK_TVOLUMEDOWN - VK_TFLIP -*/ -BOOL -NHSPhoneTranslateKbdMessage(WPARAM wParam, LPARAM lParam, BOOL keyDown) -{ - PNHCmdWindow data; - int index = -1; - - /* get window data */ - data = (PNHCmdWindow) GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); - if (!data) - return FALSE; - - switch (wParam) { - case VK_T0: - index = 10; - break; - - case VK_T1: - index = 0; - break; - - case VK_T2: - index = 1; - break; - - case VK_T3: - index = 2; - break; - - case VK_T4: - index = 3; - break; - - case VK_T5: - index = 4; - break; - - case VK_T6: - index = 5; - break; - - case VK_T7: - index = 6; - break; - - case VK_T8: - index = 7; - break; - - case VK_T9: - index = 8; - break; - - case VK_TSTAR: - index = 9; - break; - - case VK_TPOUND: - index = 11; - break; - } - - if (index >= 0) { - HighlightCell(GetNHApp()->hCmdWnd, index, keyDown); - if (keyDown) - ActivateCell(GetNHApp()->hCmdWnd, index); - return TRUE; - } else { - return FALSE; - } -} -/*-------------------------------------------------------------------------*/ -void -NHSPhoneSetKeypadFromString(const char *str) -{ - PNHCmdWindow data; - PNHCmdSet p = 0; - PNHCmdLayout layout_prev = 0; - PNHCmdLayout layout_cur = 0; - char buf[2][BUFSZ]; - int i, lcount; - char *s; - - assert(NH_CMDPAD_ROWS == 4); - - data = (PNHCmdWindow) GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); - if (!data) - return; - - p = nhcmdset_create(); - - ZeroMemory(buf, sizeof(buf)); - if (sscanf(str, "%s or %s", buf[1], buf[0]) != 2) { - ZeroMemory(buf, sizeof(buf)); - strncpy(buf[0], str, sizeof(buf[0]) - 1); - } - - lcount = 10; /* create new layout on the first iteration */ - for (i = 0; i < 2; i++) { - s = buf[i]; - while (*s) { - char c_start, c_end, c_char; - - /* parse character ranges */ - if (isalnum((c_start = s[0])) && s[1] == '-' - && isalnum((c_end = s[2]))) { - s += 2; - } else { - c_start = c_end = *s; - } - - for (c_char = c_start; c_char <= c_end; c_char++) { - if (lcount >= 10) { - /* create layout */ - lcount = 0; - layout_prev = layout_cur; - layout_cur = nhcmdlayout_create("noname", NH_CMDPAD_ROWS, - NH_CMDPAD_COLS); - nhcmdlayout_init(layout_cur, cells_layout_menu); - - nhcmdlayout_cell(layout_cur, 3, 0)->data = layout_prev; - nhcmdlayout_cell(layout_cur, 3, 2)->data = 0; - - nhcmdset_add(p, layout_cur); - p->elements[p->count - 1].free_on_destroy = 1; - - if (layout_prev) { - nhcmdlayout_cell(layout_prev, 3, 2)->data = - layout_cur; - } - } - - if (lcount == 9) - lcount = 10; // skip '#' - nhcmdlayout_cell_direct(layout_cur, lcount)->f_char[0] = - c_char; - if (c_char == '\033') { - strcpy(nhcmdlayout_cell_direct(layout_cur, lcount)->text, - "esc"); - nhcmdlayout_cell_direct(layout_cur, lcount)->image = - 14; /* 14 is a ESC symbol in IDB_KEYPAD */ - } else { - nhcmdlayout_cell_direct(layout_cur, lcount)->text[0] = - c_char; - nhcmdlayout_cell_direct(layout_cur, lcount)->text[1] = - '\x0'; - } - - /* increment character count in the current layout */ - lcount++; - } - - /* prepareg next charcter from the source string */ - s++; - } - } - - /* install the new set */ - if (nhcmdset_current != nhcmdset_default) - nhcmdset_destroy(nhcmdset_current); - nhcmdset_current = p; - SetCmdWindowLayout(GetNHApp()->hCmdWnd, - nhcmdset_get(nhcmdset_current, 0)); -} -/*-------------------------------------------------------------------------*/ -void -NHSPhoneSetKeypadDirection() -{ - PNHCmdWindow data; - - data = (PNHCmdWindow) GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); - if (!data) - return; - - if (nhcmdset_current != nhcmdset_default) - nhcmdset_destroy(nhcmdset_current); - nhcmdset_current = nhcmdset_default; - SetCmdWindowLayout(GetNHApp()->hCmdWnd, - nhcmdset_get(nhcmdset_current, NH_LAYOUT_MOVEMENT)); -} -/*-------------------------------------------------------------------------*/ -void -NHSPhoneSetKeypadDefault() -{ - PNHCmdWindow data; - - data = (PNHCmdWindow) GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); - if (!data) - return; - - if (nhcmdset_current != nhcmdset_default) - nhcmdset_destroy(nhcmdset_current); - nhcmdset_current = nhcmdset_default; - SetCmdWindowLayout(GetNHApp()->hCmdWnd, - data->layout_selected - ? data->layout_selected - : nhcmdset_get(nhcmdset_current, 0)); -} - -#endif /* defined (WIN_CE_SMARTHPONE) */ diff --git a/sys/wince/mhcmd.h b/sys/wince/mhcmd.h deleted file mode 100644 index 9a5fada66..000000000 --- a/sys/wince/mhcmd.h +++ /dev/null @@ -1,27 +0,0 @@ -/* NetHack 3.6 mhcmd.h $NHDT-Date: 1524689383 2018/04/25 20:49:43 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.2 $ */ -/* Copyright (c) 2002 by Michael Allison */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINCMDWindow_h -#define MSWINCMDWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -HWND mswin_init_command_window(); - -/* if either sz->cx or sz->cy are already set this function will - no modify it. It will adjust them to the minimum size - required by the command window */ -void mswin_command_window_size(HWND hwnd, LPSIZE sz); - -#if defined(WIN_CE_SMARTPHONE) -/* special keypad input handling for SmartPhone */ -BOOL NHSPhoneTranslateKbdMessage(WPARAM wParam, LPARAM lParam, BOOL keyDown); -void NHSPhoneSetKeypadFromString(const char *str); -void NHSPhoneSetKeypadDirection(); -void NHSPhoneSetKeypadDefault(); -#endif - -#endif /* MSWINCMDWindow_h */ diff --git a/sys/wince/mhcolor.c b/sys/wince/mhcolor.c deleted file mode 100644 index 1689889f9..000000000 --- a/sys/wince/mhcolor.c +++ /dev/null @@ -1,233 +0,0 @@ -/* NetHack 3.6 mhcolor.c $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -/* color management and such */ - -#include "winMS.h" -#include "mhcolor.h" - -#define TOTAL_BRUSHES 10 -#define NHBRUSH_CODE(win, type) ((((win) &0xFF) << 8) | ((type) &0xFF)) - -struct t_brush_table { - int code; - HBRUSH brush; - COLORREF color; -}; -static struct t_brush_table brush_table[TOTAL_BRUSHES]; -static int max_brush = 0; - -static struct t_brush_table default_brush_table[] = { - { NHBRUSH_CODE(NHW_STATUS, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, - { NHBRUSH_CODE(NHW_MESSAGE, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, - { NHBRUSH_CODE(NHW_STATUS, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, - { NHBRUSH_CODE(NHW_TEXT, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, - { NHBRUSH_CODE(NHW_KEYPAD, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, - { NHBRUSH_CODE(NHW_MAP, MSWIN_COLOR_FG), NULL, RGB(96, 96, 96) }, - - { NHBRUSH_CODE(NHW_MENU, MSWIN_COLOR_BG), NULL, RGB(255, 255, 255) }, - { NHBRUSH_CODE(NHW_MESSAGE, MSWIN_COLOR_BG), NULL, RGB(192, 192, 192) }, - { NHBRUSH_CODE(NHW_STATUS, MSWIN_COLOR_BG), NULL, RGB(192, 192, 192) }, - { NHBRUSH_CODE(NHW_TEXT, MSWIN_COLOR_BG), NULL, RGB(255, 255, 255) }, - { NHBRUSH_CODE(NHW_KEYPAD, MSWIN_COLOR_BG), NULL, RGB(255, 255, 255) }, - { NHBRUSH_CODE(NHW_MAP, MSWIN_COLOR_BG), NULL, RGB(192, 192, 192) }, - { -1, NULL, RGB(0, 0, 0) } -}; - -static void mswin_color_from_string(char *colorstring, HBRUSH *brushptr, - COLORREF *colorptr); - -typedef struct ctv { - const char *colorstring; - COLORREF colorvalue; -} color_table_value; - -/* - * The color list here is a combination of: - * NetHack colors. (See mhmap.c) - * HTML colors. (See http://www.w3.org/TR/REC-html40/types.html#h-6.5 ) - */ - -static color_table_value color_table[] = { - /* NetHack colors */ - { "black", RGB(0x55, 0x55, 0x55) }, - { "red", RGB(0xFF, 0x00, 0x00) }, - { "green", RGB(0x00, 0x80, 0x00) }, - { "brown", RGB(0xA5, 0x2A, 0x2A) }, - { "blue", RGB(0x00, 0x00, 0xFF) }, - { "magenta", RGB(0xFF, 0x00, 0xFF) }, - { "cyan", RGB(0x00, 0xFF, 0xFF) }, - { "orange", RGB(0xFF, 0xA5, 0x00) }, - { "brightgreen", RGB(0x00, 0xFF, 0x00) }, - { "yellow", RGB(0xFF, 0xFF, 0x00) }, - { "brightblue", RGB(0x00, 0xC0, 0xFF) }, - { "brightmagenta", RGB(0xFF, 0x80, 0xFF) }, - { "brightcyan", RGB(0x80, 0xFF, 0xFF) }, - { "white", RGB(0xFF, 0xFF, 0xFF) }, - /* Remaining HTML colors */ - { "trueblack", RGB(0x00, 0x00, 0x00) }, - { "gray", RGB(0x80, 0x80, 0x80) }, - { "grey", RGB(0x80, 0x80, 0x80) }, - { "purple", RGB(0x80, 0x00, 0x80) }, - { "silver", RGB(0xC0, 0xC0, 0xC0) }, - { "maroon", RGB(0x80, 0x00, 0x00) }, - { "fuchsia", RGB(0xFF, 0x00, 0xFF) }, /* = NetHack magenta */ - { "lime", RGB(0x00, 0xFF, 0x00) }, /* = NetHack bright green */ - { "olive", RGB(0x80, 0x80, 0x00) }, - { "navy", RGB(0x00, 0x00, 0x80) }, - { "teal", RGB(0x00, 0x80, 0x80) }, - { "aqua", RGB(0x00, 0xFF, 0xFF) }, /* = NetHack cyan */ - { "", RGB(0x00, 0x00, 0x00) }, -}; - -typedef struct ctbv { - char *colorstring; - int syscolorvalue; -} color_table_brush_value; - -static color_table_brush_value color_table_brush[] = { - { "activeborder", COLOR_ACTIVEBORDER }, - { "activecaption", COLOR_ACTIVECAPTION }, - { "appworkspace", COLOR_APPWORKSPACE }, - { "background", COLOR_BACKGROUND }, - { "btnface", COLOR_BTNFACE }, - { "btnshadow", COLOR_BTNSHADOW }, - { "btntext", COLOR_BTNTEXT }, - { "captiontext", COLOR_CAPTIONTEXT }, - { "graytext", COLOR_GRAYTEXT }, - { "greytext", COLOR_GRAYTEXT }, - { "highlight", COLOR_HIGHLIGHT }, - { "highlighttext", COLOR_HIGHLIGHTTEXT }, - { "inactiveborder", COLOR_INACTIVEBORDER }, - { "inactivecaption", COLOR_INACTIVECAPTION }, - { "menu", COLOR_MENU }, - { "menutext", COLOR_MENUTEXT }, - { "scrollbar", COLOR_SCROLLBAR }, - { "window", COLOR_WINDOW }, - { "windowframe", COLOR_WINDOWFRAME }, - { "windowtext", COLOR_WINDOWTEXT }, - { "", -1 }, -}; - -void -mswin_init_color_table() -{ - int i; - struct t_brush_table *p; - - /* cleanup */ - for (i = 0; i < max_brush; i++) - DeleteObject(brush_table[i].brush); - max_brush = 0; - -/* initialize brush table */ -#define BRUSHTABLE_ENTRY(opt, win, type) \ - brush_table[max_brush].code = NHBRUSH_CODE((win), (type)); \ - mswin_color_from_string((opt), &brush_table[max_brush].brush, \ - &brush_table[max_brush].color); \ - max_brush++; - - BRUSHTABLE_ENTRY(iflags.wc_foregrnd_menu, NHW_MENU, MSWIN_COLOR_FG); - BRUSHTABLE_ENTRY(iflags.wc_foregrnd_message, NHW_MESSAGE, MSWIN_COLOR_FG); - BRUSHTABLE_ENTRY(iflags.wc_foregrnd_status, NHW_STATUS, MSWIN_COLOR_FG); - BRUSHTABLE_ENTRY(iflags.wc_foregrnd_text, NHW_TEXT, MSWIN_COLOR_FG); - BRUSHTABLE_ENTRY(iflags.wc_foregrnd_message, NHW_KEYPAD, MSWIN_COLOR_FG); - - BRUSHTABLE_ENTRY(iflags.wc_backgrnd_menu, NHW_MENU, MSWIN_COLOR_BG); - BRUSHTABLE_ENTRY(iflags.wc_backgrnd_message, NHW_MESSAGE, MSWIN_COLOR_BG); - BRUSHTABLE_ENTRY(iflags.wc_backgrnd_status, NHW_STATUS, MSWIN_COLOR_BG); - BRUSHTABLE_ENTRY(iflags.wc_backgrnd_text, NHW_TEXT, MSWIN_COLOR_BG); - BRUSHTABLE_ENTRY(iflags.wc_backgrnd_message, NHW_KEYPAD, MSWIN_COLOR_BG); -#undef BRUSHTABLE_ENTRY - - /* go through the values and fill in "blanks" (use default values) */ - for (i = 0; i < max_brush; i++) { - if (!brush_table[i].brush) { - for (p = default_brush_table; p->code != -1; p++) { - if (p->code == brush_table[i].code) { - brush_table[i].brush = CreateSolidBrush(p->color); - brush_table[i].color = p->color; - } - } - } - } -} - -HBRUSH -mswin_get_brush(int win_type, int color_index) -{ - int i; - for (i = 0; i < max_brush; i++) - if (brush_table[i].code == NHBRUSH_CODE(win_type, color_index)) - return brush_table[i].brush; - return NULL; -} - -COLORREF -mswin_get_color(int win_type, int color_index) -{ - int i; - for (i = 0; i < max_brush; i++) - if (brush_table[i].code == NHBRUSH_CODE(win_type, color_index)) - return brush_table[i].color; - return RGB(0, 0, 0); -} - -static void -mswin_color_from_string(char *colorstring, HBRUSH *brushptr, - COLORREF *colorptr) -{ - color_table_value *ctv_ptr = color_table; - color_table_brush_value *ctbv_ptr = color_table_brush; - int red_value, blue_value, green_value; - static char *hexadecimals = "0123456789abcdef"; - - *brushptr = NULL; - *colorptr = RGB(0, 0, 0); - - if (colorstring == NULL) - return; - if (*colorstring == '#') { - if (strlen(++colorstring) != 6) - return; - - red_value = - index(hexadecimals, tolower(*colorstring++)) - hexadecimals; - red_value *= 16; - red_value += - index(hexadecimals, tolower(*colorstring++)) - hexadecimals; - - green_value = - index(hexadecimals, tolower(*colorstring++)) - hexadecimals; - green_value *= 16; - green_value += - index(hexadecimals, tolower(*colorstring++)) - hexadecimals; - - blue_value = - index(hexadecimals, tolower(*colorstring++)) - hexadecimals; - blue_value *= 16; - blue_value += - index(hexadecimals, tolower(*colorstring++)) - hexadecimals; - - *colorptr = RGB(red_value, blue_value, green_value); - } else { - while (*ctv_ptr->colorstring - && _stricmp(ctv_ptr->colorstring, colorstring)) - ++ctv_ptr; - if (*ctv_ptr->colorstring) { - *colorptr = ctv_ptr->colorvalue; - } else { - while (*ctbv_ptr->colorstring - && _stricmp(ctbv_ptr->colorstring, colorstring)) - ++ctbv_ptr; - if (*ctbv_ptr->colorstring) { - *brushptr = SYSCLR_TO_BRUSH(ctbv_ptr->syscolorvalue); - *colorptr = GetSysColor(ctbv_ptr->syscolorvalue); - } - } - } - if (max_brush > TOTAL_BRUSHES) - panic("Too many colors!"); - *brushptr = CreateSolidBrush(*colorptr); -} diff --git a/sys/wince/mhcolor.h b/sys/wince/mhcolor.h deleted file mode 100644 index a776236a3..000000000 --- a/sys/wince/mhcolor.h +++ /dev/null @@ -1,18 +0,0 @@ -/* NetHack 3.6 mhcolor.h $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.6 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -/* color management functions */ - -#ifndef MSWINColor_h -#define MSWINColor_h - -#define MSWIN_COLOR_BG 0 -#define MSWIN_COLOR_FG 1 -#define SYSCLR_TO_BRUSH(x) ((HBRUSH)((x) + 1)) - -extern void mswin_init_color_table(); -extern HBRUSH mswin_get_brush(int win_type, int color_index); -extern COLORREF mswin_get_color(int win_type, int color_index); - -#endif /* MSWINColor_h */ diff --git a/sys/wince/mhdlg.c b/sys/wince/mhdlg.c deleted file mode 100644 index 9e0c559d4..000000000 --- a/sys/wince/mhdlg.c +++ /dev/null @@ -1,825 +0,0 @@ -/* NetHack 3.6 mhdlg.c $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -/* various dialog boxes are defined here */ - -#include "winMS.h" -#include "hack.h" -#include "func_tab.h" -#include "mhdlg.h" -#include "mhmain.h" - -#define CheckDlgButton(dlg, btn_id, st) \ - SendDlgItemMessage((dlg), (btn_id), BM_SETCHECK, (WPARAM)(st), 0) - -/*---------------------------------------------------------------*/ -/* data for getlin dialog */ -struct getlin_data { - const char *question; - char *result; - size_t result_size; -}; - -LRESULT CALLBACK GetlinDlgProc(HWND, UINT, WPARAM, LPARAM); - -int -mswin_getlin_window(const char *question, char *result, size_t result_size) -{ - int ret; - struct getlin_data data; - - /* initilize dialog data */ - ZeroMemory(&data, sizeof(data)); - data.question = question; - data.result = result; - data.result_size = result_size; - - /* create modal dialog window */ - ret = DialogBoxParam(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_GETLIN), - GetNHApp()->hMainWnd, GetlinDlgProc, (LPARAM) &data); - if (ret == -1) - panic("Cannot create getlin window"); - - return ret; -} - -LRESULT CALLBACK -GetlinDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - struct getlin_data *data; - RECT main_rt, text_rt, dlg_rt, edit_rt; - SIZE dlg_sz; - TCHAR wbuf[BUFSZ]; - HDC hdc; - HWND control; - HWND hwndMap; - -#if defined(WIN_CE_POCKETPC) - SHInputDialog(hWnd, message, wParam); -#endif - - switch (message) { - case WM_INITDIALOG: - data = (struct getlin_data *) lParam; - SetWindowText(hWnd, NH_A2W(data->question, wbuf, sizeof(wbuf))); - SetWindowLong(hWnd, GWL_USERDATA, lParam); - - /* get title text width */ - SetRect(&text_rt, 0, 0, 100, 50); - hdc = GetWindowDC(hWnd); - DrawText(hdc, wbuf, _tcslen(wbuf), &text_rt, - DT_CALCRECT | DT_SINGLELINE | DT_NOPREFIX | DT_LEFT - | DT_VCENTER); - ReleaseDC(hWnd, hdc); - - /* center dialog in the main window */ - GetWindowRect(hWnd, &dlg_rt); - hwndMap = mswin_hwnd_from_winid(WIN_MAP); - GetWindowRect(IsWindow(hwndMap) ? hwndMap : GetNHApp()->hMainWnd, - &main_rt); - dlg_sz.cx = max( - dlg_rt.right - dlg_rt.left, - min(text_rt.right - text_rt.left + GetSystemMetrics(SM_CXICON), - main_rt.right - main_rt.left)); - dlg_sz.cy = - min(dlg_rt.bottom - dlg_rt.top, main_rt.bottom - main_rt.top); - dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2; - dlg_rt.right = dlg_rt.left + dlg_sz.cx; - dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2; - dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; - MoveWindow(hWnd, (main_rt.left + main_rt.right - dlg_sz.cx) / 2, - (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx, - dlg_sz.cy, TRUE); - - /* change layout of controls */ - GetClientRect(hWnd, &dlg_rt); - - control = GetDlgItem(hWnd, IDC_GETLIN_EDIT); - GetWindowRect(control, &edit_rt); - MoveWindow(control, 0, 0, dlg_rt.right - dlg_rt.left, - edit_rt.bottom - edit_rt.top, TRUE); - - control = GetDlgItem(hWnd, IDOK); - GetWindowRect(control, &text_rt); - MoveWindow(control, 0, edit_rt.bottom - edit_rt.top, - (dlg_rt.right - dlg_rt.left) / 2, - text_rt.bottom - text_rt.top, TRUE); - - control = GetDlgItem(hWnd, IDCANCEL); - GetWindowRect(control, &text_rt); - MoveWindow(control, (dlg_rt.right - dlg_rt.left) / 2, - edit_rt.bottom - edit_rt.top, - (dlg_rt.right - dlg_rt.left) / 2, - text_rt.bottom - text_rt.top, TRUE); - -#if defined(WIN_CE_SMARTPHONE) - NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, TRUE, FALSE); -#endif - - /* set focus to the edit control */ - SetFocus(GetDlgItem(hWnd, IDC_GETLIN_EDIT)); - - /* tell windows that we've set the focus */ - return FALSE; - break; - - case WM_COMMAND: { - TCHAR wbuf[BUFSZ]; - - switch (LOWORD(wParam)) { - /* OK button was pressed */ - case IDOK: - data = (struct getlin_data *) GetWindowLong(hWnd, GWL_USERDATA); - SendDlgItemMessage(hWnd, IDC_GETLIN_EDIT, WM_GETTEXT, - (WPARAM) sizeof(wbuf), (LPARAM) wbuf); - NH_W2A(wbuf, data->result, data->result_size); - - /* Fall through. */ - - /* cancel button was pressed */ - case IDCANCEL: - EndDialog(hWnd, wParam); - return TRUE; - } - } break; - -#if defined(WIN_CE_SMARTPHONE) - case WM_HOTKEY: - if (VK_TBACK == HIWORD(lParam)) { - SHSendBackToFocusWindow(message, wParam, lParam); - } - break; -#endif - - } /* end switch (message) */ - return FALSE; -} - -/*---------------------------------------------------------------*/ -/* dialog data for the list of extended commands */ -struct extcmd_data { - int *selection; -}; - -LRESULT CALLBACK ExtCmdDlgProc(HWND, UINT, WPARAM, LPARAM); - -int -mswin_ext_cmd_window(int *selection) -{ - int ret; - struct extcmd_data data; - - /* init dialog data */ - ZeroMemory(&data, sizeof(data)); - *selection = -1; - data.selection = selection; - - /* create modal dialog window */ - ret = DialogBoxParam(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_EXTCMD), - GetNHApp()->hMainWnd, ExtCmdDlgProc, (LPARAM) &data); - if (ret == -1) - panic("Cannot create extcmd window"); - return ret; -} - -LRESULT CALLBACK -ExtCmdDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - struct extcmd_data *data; - RECT main_rt, dlg_rt; - SIZE dlg_sz; - int i; - const char *ptr; - TCHAR wbuf[255]; - - switch (message) { - case WM_INITDIALOG: - data = (struct extcmd_data *) lParam; - SetWindowLong(hWnd, GWL_USERDATA, lParam); - - /* center dialog in the main window */ - GetWindowRect(GetNHApp()->hMainWnd, &main_rt); - GetWindowRect(hWnd, &dlg_rt); - dlg_sz.cx = dlg_rt.right - dlg_rt.left; - dlg_sz.cy = dlg_rt.bottom - dlg_rt.top; - - dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2; - dlg_rt.right = dlg_rt.left + dlg_sz.cx; - dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2; - dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; - MoveWindow(hWnd, (main_rt.left + main_rt.right - dlg_sz.cx) / 2, - (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx, - dlg_sz.cy, TRUE); - - /* fill combobox with extended commands */ - for (i = 0; (ptr = extcmdlist[i].ef_txt); i++) { - SendDlgItemMessage(hWnd, IDC_EXTCMD_LIST, LB_ADDSTRING, - (WPARAM) 0, - (LPARAM) NH_A2W(ptr, wbuf, sizeof(wbuf))); - } - -#if defined(WIN_CE_SMARTPHONE) - NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, FALSE, FALSE); - - GetClientRect(hWnd, &dlg_rt); - MoveWindow(GetDlgItem(hWnd, IDC_EXTCMD_LIST), dlg_rt.left, dlg_rt.top, - dlg_rt.right - dlg_rt.left, dlg_rt.bottom - dlg_rt.top, - TRUE); -#endif - - /* set focus to the list control */ - SetFocus(GetDlgItem(hWnd, IDC_EXTCMD_LIST)); - - /* tell windows we set the focus */ - return FALSE; - break; - - case WM_COMMAND: - data = (struct extcmd_data *) GetWindowLong(hWnd, GWL_USERDATA); - switch (LOWORD(wParam)) { - /* OK button ws clicked */ - case IDOK: - *data->selection = SendDlgItemMessage( - hWnd, IDC_EXTCMD_LIST, LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); - if (*data->selection == LB_ERR) - *data->selection = -1; - /* Fall through. */ - - /* CANCEL button ws clicked */ - case IDCANCEL: - EndDialog(hWnd, wParam); - return TRUE; - - /* list control events */ - case IDC_EXTCMD_LIST: - switch (HIWORD(wParam)) { - case LBN_DBLCLK: - /* double click within the list - wParam - The low-order word is the list box identifier. - The high-order word is the notification message. - lParam - Handle to the list box - */ - *data->selection = SendMessage((HWND) lParam, LB_GETCURSEL, - (WPARAM) 0, (LPARAM) 0); - if (*data->selection == LB_ERR) - *data->selection = -1; - EndDialog(hWnd, IDOK); - return TRUE; - } - break; - } - } - return FALSE; -} - -/*---------------------------------------------------------------*/ -/* player selector dialog data */ -struct plsel_data { - int *selection; -}; - -BOOL CALLBACK PlayerSelectorDlgProc(HWND, UINT, WPARAM, LPARAM); -static void plselInitDialog(HWND hWnd); -static void plselAdjustLists(HWND hWnd, int changed_opt); -static int plselFinalSelection(HWND hWnd, int *selection); - -int -mswin_player_selection_window(int *selection) -{ - int ret; - struct plsel_data data; - - /* init dialog data */ - ZeroMemory(&data, sizeof(data)); - data.selection = selection; - - /* create modal dialog */ - ret = DialogBoxParam( - GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR), - GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM) &data); - if (ret == -1) - panic("Cannot create getlin window"); - - return ret; -} - -BOOL CALLBACK -PlayerSelectorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - struct plsel_data *data; - RECT main_rt, dlg_rt; - SIZE dlg_sz; - - switch (message) { - case WM_INITDIALOG: - data = (struct plsel_data *) lParam; - SetWindowLong(hWnd, GWL_USERDATA, lParam); - - /* center dialog in the main window */ - GetWindowRect(GetNHApp()->hMainWnd, &main_rt); - GetWindowRect(hWnd, &dlg_rt); - dlg_sz.cx = dlg_rt.right - dlg_rt.left; - dlg_sz.cy = dlg_rt.bottom - dlg_rt.top; - - dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2; - dlg_rt.right = dlg_rt.left + dlg_sz.cx; - dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2; - dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; - MoveWindow(hWnd, (main_rt.left + main_rt.right - dlg_sz.cx) / 2, - (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx, - dlg_sz.cy, TRUE); - - /* init dialog */ - plselInitDialog(hWnd); - -#if defined(WIN_CE_SMARTPHONE) - NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, FALSE, FALSE); -#endif - /* set focus on the role checkbox (random) field */ - SetFocus(GetDlgItem(hWnd, IDC_PLSEL_ROLE_RANDOM)); - - /* tell windows we set the focus */ - return FALSE; - break; - - case WM_COMMAND: - data = (struct plsel_data *) GetWindowLong(hWnd, GWL_USERDATA); - switch (LOWORD(wParam)) { - /* OK button was clicked */ - case IDOK: - if (plselFinalSelection(hWnd, data->selection)) { - EndDialog(hWnd, wParam); - } else { - MessageBox( - hWnd, TEXT("Cannot match this role. Try something else."), - TEXT("STOP"), MB_OK); - } - return TRUE; - - /* CANCEL button was clicked */ - case IDCANCEL: - *data->selection = -1; - EndDialog(hWnd, wParam); - return TRUE; - - /* following are events from dialog controls: - "random" checkboxes send BN_CLICKED messages; - role/race/... combo-boxes send CBN_SELENDOK - if something was selected; - */ - case IDC_PLSEL_ROLE_RANDOM: - if (HIWORD(wParam) == BN_CLICKED) { - /* enable corresponding list window if "random" - checkbox was "unchecked" */ - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); - } - break; - - case IDC_PLSEL_RACE_RANDOM: - if (HIWORD(wParam) == BN_CLICKED) { - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); - } - break; - - case IDC_PLSEL_GENDER_RANDOM: - if (HIWORD(wParam) == BN_CLICKED) { - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); - } - break; - - case IDC_PLSEL_ALIGN_RANDOM: - if (HIWORD(wParam) == BN_CLICKED) { - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), - SendMessage((HWND) lParam, BM_GETCHECK, 0, 0) - == BST_UNCHECKED); - } - break; - - case IDC_PLSEL_ROLE_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - /* filter out invalid options if - the selection was made */ - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - - case IDC_PLSEL_RACE_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - - case IDC_PLSEL_GENDER_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - - case IDC_PLSEL_ALIGN_LIST: - if (HIWORD(wParam) == CBN_SELENDOK) { - plselAdjustLists(hWnd, LOWORD(wParam)); - } - break; - } - break; - } - return FALSE; -} - -void -setComboBoxValue(HWND hWnd, int combo_box, int value) -{ - int index_max = SendDlgItemMessage(hWnd, combo_box, CB_GETCOUNT, 0, 0); - int index; - int value_to_set = LB_ERR; - for (index = 0; index < index_max; index++) { - if (SendDlgItemMessage(hWnd, combo_box, CB_GETITEMDATA, - (WPARAM) index, 0) == value) { - value_to_set = index; - break; - } - } - SendDlgItemMessage(hWnd, combo_box, CB_SETCURSEL, (WPARAM) value_to_set, - 0); -} - -/* initialize player selector dialog */ -void -plselInitDialog(HWND hWnd) -{ - TCHAR wbuf[BUFSZ]; - - /* set player name */ - SetDlgItemText(hWnd, IDC_PLSEL_NAME, NH_A2W(plname, wbuf, sizeof(wbuf))); - - /* check flags for consistency */ - if (flags.initrole >= 0) { - if (flags.initrace >= 0 - && !validrace(flags.initrole, flags.initrace)) { - flags.initrace = ROLE_NONE; - } - - if (flags.initgend >= 0 - && !validgend(flags.initrole, flags.initrace, flags.initgend)) { - flags.initgend = ROLE_NONE; - } - - if (flags.initalign >= 0 - && !validalign(flags.initrole, flags.initrace, flags.initalign)) { - flags.initalign = ROLE_NONE; - } - } - - /* populate select boxes */ - plselAdjustLists(hWnd, -1); - - /* intialize roles list */ - if (flags.initrole < 0 - || !ok_role(flags.initrole, ROLE_NONE, ROLE_NONE, ROLE_NONE)) { - CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_ROLE_LIST, flags.initrole); - } - - /* intialize races list */ - if (flags.initrace < 0 - || !ok_race(flags.initrole, flags.initrace, ROLE_NONE, ROLE_NONE)) { - CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_RACE_LIST, flags.initrace); - } - - /* intialize genders list */ - if (flags.initgend < 0 - || !ok_gend(flags.initrole, flags.initrace, flags.initgend, - ROLE_NONE)) { - CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_GENDER_LIST, flags.initgend); - } - - /* intialize alignments list */ - if (flags.initalign < 0 - || !ok_align(flags.initrole, flags.initrace, flags.initgend, - flags.initalign)) { - CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_CHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), FALSE); - } else { - CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_UNCHECKED); - EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), TRUE); - setComboBoxValue(hWnd, IDC_PLSEL_ALIGN_LIST, flags.initalign); - } -} - -/* adjust role/race/alignment/gender list - filter out - invalid combinations - changed_sel points to the list where selection occurred - (-1 if unknown) -*/ -void -plselAdjustLists(HWND hWnd, int changed_sel) -{ - HWND control_role, control_race, control_gender, control_align; - int initrole, initrace, initgend, initalign; - int i; - int ind; - int valid_opt; - TCHAR wbuf[255]; - - /* get control handles */ - control_role = GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST); - control_race = GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST); - control_gender = GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST); - control_align = GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST); - - /* get current selections */ - ind = SendMessage(control_role, CB_GETCURSEL, 0, 0); - initrole = (ind == LB_ERR) - ? flags.initrole - : SendMessage(control_role, CB_GETITEMDATA, ind, 0); - - ind = SendMessage(control_race, CB_GETCURSEL, 0, 0); - initrace = (ind == LB_ERR) - ? flags.initrace - : SendMessage(control_race, CB_GETITEMDATA, ind, 0); - - ind = SendMessage(control_gender, CB_GETCURSEL, 0, 0); - initgend = (ind == LB_ERR) - ? flags.initgend - : SendMessage(control_gender, CB_GETITEMDATA, ind, 0); - - ind = SendMessage(control_align, CB_GETCURSEL, 0, 0); - initalign = (ind == LB_ERR) - ? flags.initalign - : SendMessage(control_align, CB_GETITEMDATA, ind, 0); - - /* intialize roles list */ - if (changed_sel == -1) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_role, CB_RESETCONTENT, 0, 0); - for (i = 0; roles[i].name.m; i++) { - if (ok_role(i, initrace, initgend, initalign)) { - if (initgend >= 0 && flags.female && roles[i].name.f) - ind = SendMessage( - control_role, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(roles[i].name.f, wbuf, sizeof(wbuf))); - else - ind = SendMessage( - control_role, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(roles[i].name.m, wbuf, sizeof(wbuf))); - - SendMessage(control_role, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initrole) { - SendMessage(control_role, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - } - - /* set selection to the previously selected role - if it is still valid */ - if (!valid_opt) { - initrole = ROLE_NONE; - initrace = ROLE_NONE; - initgend = ROLE_NONE; - initalign = ROLE_NONE; - SendMessage(control_role, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); - } - - /* trigger change of the races list */ - changed_sel = IDC_PLSEL_ROLE_LIST; - } - - /* intialize races list */ - if (changed_sel == IDC_PLSEL_ROLE_LIST) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_race, CB_RESETCONTENT, 0, 0); - for (i = 0; races[i].noun; i++) - if (ok_race(initrole, i, ROLE_NONE, ROLE_NONE)) { - ind = SendMessage( - control_race, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(races[i].noun, wbuf, sizeof(wbuf))); - SendMessage(control_race, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initrace) { - SendMessage(control_race, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected race - if it is still valid */ - if (!valid_opt) { - initrace = ROLE_NONE; - initgend = ROLE_NONE; - initalign = ROLE_NONE; - SendMessage(control_race, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); - } - - /* trigger change of the genders list */ - changed_sel = IDC_PLSEL_RACE_LIST; - } - - /* intialize genders list */ - if (changed_sel == IDC_PLSEL_RACE_LIST) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_gender, CB_RESETCONTENT, 0, 0); - for (i = 0; i < ROLE_GENDERS; i++) - if (ok_gend(initrole, initrace, i, ROLE_NONE)) { - ind = SendMessage( - control_gender, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(genders[i].adj, wbuf, sizeof(wbuf))); - SendMessage(control_gender, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initgend) { - SendMessage(control_gender, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected gender - if it is still valid */ - if (!valid_opt) { - initgend = ROLE_NONE; - initalign = ROLE_NONE; - SendMessage(control_gender, CB_SETCURSEL, (WPARAM) -1, - (LPARAM) 0); - } - - /* trigger change of the alignments list */ - changed_sel = IDC_PLSEL_GENDER_LIST; - } - - /* intialize alignments list */ - if (changed_sel == IDC_PLSEL_GENDER_LIST) { - valid_opt = 0; - - /* reset content and populate the list */ - SendMessage(control_align, CB_RESETCONTENT, 0, 0); - for (i = 0; i < ROLE_ALIGNS; i++) - if (ok_align(initrole, initrace, initgend, i)) { - ind = SendMessage( - control_align, CB_ADDSTRING, (WPARAM) 0, - (LPARAM) NH_A2W(aligns[i].adj, wbuf, sizeof(wbuf))); - SendMessage(control_align, CB_SETITEMDATA, (WPARAM) ind, - (LPARAM) i); - if (i == initalign) { - SendMessage(control_align, CB_SETCURSEL, (WPARAM) ind, - (LPARAM) 0); - valid_opt = 1; - } - } - - /* set selection to the previously selected alignment - if it is still valid */ - if (!valid_opt) { - initalign = ROLE_NONE; - SendMessage(control_align, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); - } - } -} - -/* player made up his mind - get final selection here */ -int -plselFinalSelection(HWND hWnd, int *selection) -{ - int ind; - - /* get current selections */ - if (SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initrole = ROLE_RANDOM; - } else { - ind = - SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, CB_GETCURSEL, 0, 0); - flags.initrole = (ind == LB_ERR) - ? ROLE_RANDOM - : SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, - CB_GETITEMDATA, ind, 0); - } - - if (SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initrace = ROLE_RANDOM; - } else { - ind = - SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, CB_GETCURSEL, 0, 0); - flags.initrace = (ind == LB_ERR) - ? ROLE_RANDOM - : SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, - CB_GETITEMDATA, ind, 0); - } - - if (SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initgend = ROLE_RANDOM; - } else { - ind = SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, CB_GETCURSEL, 0, - 0); - flags.initgend = (ind == LB_ERR) - ? ROLE_RANDOM - : SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, - CB_GETITEMDATA, ind, 0); - } - - if (SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_RANDOM, BM_GETCHECK, 0, 0) - == BST_CHECKED) { - flags.initalign = ROLE_RANDOM; - } else { - ind = SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, CB_GETCURSEL, 0, - 0); - flags.initalign = (ind == LB_ERR) - ? ROLE_RANDOM - : SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, - CB_GETITEMDATA, ind, 0); - } - - /* check the role */ - if (flags.initrole == ROLE_RANDOM) { - flags.initrole = pick_role(flags.initrace, flags.initgend, - flags.initalign, PICK_RANDOM); - if (flags.initrole < 0) { - MessageBox(hWnd, TEXT("Incompatible role!"), TEXT("STOP"), MB_OK); - return FALSE; - } - } - - /* Select a race, if necessary */ - /* force compatibility with role */ - if (flags.initrace == ROLE_RANDOM - || !validrace(flags.initrole, flags.initrace)) { - /* pre-selected race not valid */ - if (flags.initrace == ROLE_RANDOM) { - flags.initrace = pick_race(flags.initrole, flags.initgend, - flags.initalign, PICK_RANDOM); - } - - if (flags.initrace < 0) { - MessageBox(hWnd, TEXT("Incompatible race!"), TEXT("STOP"), MB_OK); - return FALSE; - } - } - - /* 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)) { - /* pre-selected gender not valid */ - if (flags.initgend == ROLE_RANDOM) { - flags.initgend = pick_gend(flags.initrole, flags.initrace, - flags.initalign, PICK_RANDOM); - } - - if (flags.initgend < 0) { - MessageBox(hWnd, TEXT("Incompatible gender!"), TEXT("STOP"), - MB_OK); - return FALSE; - } - } - - /* Select an alignment, if necessary */ - /* force compatibility with role/race/gender */ - if (flags.initalign < 0 - || !validalign(flags.initrole, flags.initrace, flags.initalign)) { - /* pre-selected alignment not valid */ - if (flags.initalign == ROLE_RANDOM) { - flags.initalign = pick_align(flags.initrole, flags.initrace, - flags.initgend, PICK_RANDOM); - } else { - MessageBox(hWnd, TEXT("Incompatible alignment!"), TEXT("STOP"), - MB_OK); - return FALSE; - } - } - - return TRUE; -} diff --git a/sys/wince/mhdlg.h b/sys/wince/mhdlg.h deleted file mode 100644 index 3cf0ca2c5..000000000 --- a/sys/wince/mhdlg.h +++ /dev/null @@ -1,17 +0,0 @@ -/* NetHack 3.6 mhdlg.h $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINDlgWindow_h -#define MSWINDlgWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -int mswin_getlin_window(const char *question, char *result, - size_t result_size); -int mswin_ext_cmd_window(int *selection); -int mswin_player_selection_window(int *selection); - -#endif /* MSWINDlgWindow_h */ diff --git a/sys/wince/mhfont.c b/sys/wince/mhfont.c deleted file mode 100644 index 80d12ccaa..000000000 --- a/sys/wince/mhfont.c +++ /dev/null @@ -1,195 +0,0 @@ -/* NetHack 3.6 mhfont.c $NHDT-Date: 1432512800 2015/05/25 00:13:20 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -/* font management and such */ - -#include "mhfont.h" - -#define MAXFONTS 64 - -/* font table - 64 fonts ought to be enough */ -static struct font_table_entry { - int code; - HFONT hFont; -} font_table[MAXFONTS]; -static int font_table_size = 0; -HFONT version_splash_font; -HFONT extrainfo_splash_font; - -#define NHFONT_CODE(win, attr) (((attr & 0xFF) << 8) | (win_type & 0xFF)) - -static void __cdecl font_table_cleanup(void); - -/* create font based on window type, charater attributes and - window device context */ -HGDIOBJ -mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace) -{ - HFONT fnt = NULL; - LOGFONT lgfnt; - int font_size; - int font_index; - static BOOL once = FALSE; - - if (!once) { - once = TRUE; - atexit(font_table_cleanup); - } - - ZeroMemory(&lgfnt, sizeof(lgfnt)); - - /* try find font in the table */ - for (font_index = 0; font_index < font_table_size; font_index++) - if (NHFONT_CODE(win_type, attr) == font_table[font_index].code) - break; - - if (!replace && font_index < font_table_size) - return font_table[font_index].hFont; - - switch (win_type) { - case NHW_STATUS: - lgfnt.lfHeight = -iflags.wc_fontsiz_status - * GetDeviceCaps(hdc, LOGPIXELSY) - / 72; // height of font - lgfnt.lfWidth = 0; // average character width - lgfnt.lfEscapement = 0; // angle of escapement - lgfnt.lfOrientation = 0; // base-line orientation angle - lgfnt.lfWeight = FW_NORMAL; // font weight - lgfnt.lfItalic = FALSE; // italic attribute option - lgfnt.lfUnderline = FALSE; // underline attribute option - lgfnt.lfStrikeOut = FALSE; // strikeout attribute option - lgfnt.lfCharSet = mswin_charset(); // character set identifier - lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision - lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision - lgfnt.lfQuality = DEFAULT_QUALITY; // output quality - if (iflags.wc_font_status && *iflags.wc_font_status) { - lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family - NH_A2W(iflags.wc_font_status, lgfnt.lfFaceName, LF_FACESIZE); - } else { - lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family - } - break; - - case NHW_MENU: - lgfnt.lfHeight = -iflags.wc_fontsiz_menu - * GetDeviceCaps(hdc, LOGPIXELSY) - / 72; // height of font - lgfnt.lfWidth = 0; // average character width - lgfnt.lfEscapement = 0; // angle of escapement - lgfnt.lfOrientation = 0; // base-line orientation angle - lgfnt.lfWeight = (attr == ATR_BOLD || attr == ATR_INVERSE) - ? FW_BOLD - : FW_NORMAL; // font weight - lgfnt.lfItalic = - (attr == ATR_BLINK) ? TRUE : FALSE; // italic attribute option - lgfnt.lfUnderline = - (attr == ATR_ULINE) ? TRUE : FALSE; // underline attribute option - lgfnt.lfStrikeOut = FALSE; // strikeout attribute option - lgfnt.lfCharSet = mswin_charset(); // character set identifier - lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision - lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision - lgfnt.lfQuality = DEFAULT_QUALITY; // output quality - if (iflags.wc_font_menu && *iflags.wc_font_menu) { - lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family - NH_A2W(iflags.wc_font_menu, lgfnt.lfFaceName, LF_FACESIZE); - } else { - lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family - } - break; - - case NHW_MESSAGE: - font_size = (attr == ATR_INVERSE) ? iflags.wc_fontsiz_message + 1 - : iflags.wc_fontsiz_message; - lgfnt.lfHeight = -font_size * GetDeviceCaps(hdc, LOGPIXELSY) - / 72; // height of font - lgfnt.lfWidth = 0; // average character width - lgfnt.lfEscapement = 0; // angle of escapement - lgfnt.lfOrientation = 0; // base-line orientation angle - lgfnt.lfWeight = (attr == ATR_BOLD || attr == ATR_INVERSE) - ? FW_BOLD - : FW_NORMAL; // font weight - lgfnt.lfItalic = - (attr == ATR_BLINK) ? TRUE : FALSE; // italic attribute option - lgfnt.lfUnderline = - (attr == ATR_ULINE) ? TRUE : FALSE; // underline attribute option - lgfnt.lfStrikeOut = FALSE; // strikeout attribute option - lgfnt.lfCharSet = mswin_charset(); // character set identifier - lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision - lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision - lgfnt.lfQuality = DEFAULT_QUALITY; // output quality - if (iflags.wc_font_message && *iflags.wc_font_message) { - lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family - NH_A2W(iflags.wc_font_message, lgfnt.lfFaceName, LF_FACESIZE); - } else { - lgfnt.lfPitchAndFamily = VARIABLE_PITCH; // pitch and family - } - break; - - case NHW_TEXT: - lgfnt.lfHeight = -iflags.wc_fontsiz_text - * GetDeviceCaps(hdc, LOGPIXELSY) - / 72; // height of font - lgfnt.lfWidth = 0; // average character width - lgfnt.lfEscapement = 0; // angle of escapement - lgfnt.lfOrientation = 0; // base-line orientation angle - lgfnt.lfWeight = (attr == ATR_BOLD || attr == ATR_INVERSE) - ? FW_BOLD - : FW_NORMAL; // font weight - lgfnt.lfItalic = - (attr == ATR_BLINK) ? TRUE : FALSE; // italic attribute option - lgfnt.lfUnderline = - (attr == ATR_ULINE) ? TRUE : FALSE; // underline attribute option - lgfnt.lfStrikeOut = FALSE; // strikeout attribute option - lgfnt.lfCharSet = mswin_charset(); // character set identifier - lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision - lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision - lgfnt.lfQuality = DEFAULT_QUALITY; // output quality - if (iflags.wc_font_text && *iflags.wc_font_text) { - lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family - NH_A2W(iflags.wc_font_text, lgfnt.lfFaceName, LF_FACESIZE); - } else { - lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family - } - break; - } - - fnt = CreateFontIndirect(&lgfnt); - - /* add font to the table */ - if (font_index == font_table_size) { - if (font_table_size >= MAXFONTS) - panic("font table overflow!"); - font_table_size++; - } else { - DeleteObject(font_table[font_index].hFont); - } - - font_table[font_index].code = NHFONT_CODE(win_type, attr); - font_table[font_index].hFont = fnt; - return fnt; -} - -UINT -mswin_charset() -{ - CHARSETINFO cis; - if (SYMHANDLING(H_IBM)) - if (TranslateCharsetInfo((DWORD *) GetOEMCP(), &cis, TCI_SRCCODEPAGE)) - return cis.ciCharset; - else - return OEM_CHARSET; - else if (TranslateCharsetInfo((DWORD *) GetACP(), &cis, TCI_SRCCODEPAGE)) - return cis.ciCharset; - else - return ANSI_CHARSET; -} - -void __cdecl font_table_cleanup(void) -{ - int i; - for (i = 0; i < font_table_size; i++) { - DeleteObject(font_table[i].hFont); - } - font_table_size = 0; -} diff --git a/sys/wince/mhfont.h b/sys/wince/mhfont.h deleted file mode 100644 index 4156ab5c7..000000000 --- a/sys/wince/mhfont.h +++ /dev/null @@ -1,15 +0,0 @@ -/* NetHack 3.6 mhfont.h $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -/* font management functions */ - -#ifndef MSWINFont_h -#define MSWINFont_h - -#include "winMS.h" - -HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace); -UINT mswin_charset(); - -#endif /* MSWINFont_h */ diff --git a/sys/wince/mhinput.c b/sys/wince/mhinput.c deleted file mode 100644 index a7b169342..000000000 --- a/sys/wince/mhinput.c +++ /dev/null @@ -1,118 +0,0 @@ -/* NetHack 3.6 mhinput.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include -#include "winMS.h" -#include "mhinput.h" - -/* nethack input queue functions */ - -#define NH_INPUT_BUFFER_SIZE 64 - -/* as it stands right now we need only one slot - since events are processed almost the same time as - they occur but I like large round numbers */ - -static MSNHEvent nhi_input_buffer[NH_INPUT_BUFFER_SIZE]; -static int nhi_init_input = 0; -static int nhi_read_pos = 0; -static int nhi_write_pos = 0; - -/* initialize input queue */ -void -mswin_nh_input_init() -{ - if (!nhi_init_input) { - nhi_init_input = 1; - - ZeroMemory(nhi_input_buffer, sizeof(nhi_input_buffer)); - nhi_read_pos = 0; - nhi_write_pos = 0; - } -} - -/* check for input */ -int -mswin_have_input() -{ - return -#ifdef SAFERHANGUP - /* we always have input (ESC) if hangup was requested */ - program_state.done_hup || -#endif - (nhi_read_pos != nhi_write_pos); -} - -/* add event to the queue */ -void -mswin_input_push(PMSNHEvent event) -{ - int new_write_pos; - - if (!nhi_init_input) - mswin_nh_input_init(); - - new_write_pos = (nhi_write_pos + 1) % NH_INPUT_BUFFER_SIZE; - - if (new_write_pos != nhi_read_pos) { - memcpy(nhi_input_buffer + nhi_write_pos, event, sizeof(*event)); - nhi_write_pos = new_write_pos; - } -} - -/* get event from the queue and delete it */ -PMSNHEvent -mswin_input_pop() -{ - PMSNHEvent retval; - -#ifdef SAFERHANGUP - /* always return ESC when hangup was requested */ - if (program_state.done_hup) { - static MSNHEvent hangup_event; - hangup_event.type = NHEVENT_CHAR; - hangup_event.kbd.ch = '\033'; - return &hangup_event; - } -#endif - - if (!nhi_init_input) - mswin_nh_input_init(); - - if (nhi_read_pos != nhi_write_pos) { - retval = &nhi_input_buffer[nhi_read_pos]; - nhi_read_pos = (nhi_read_pos + 1) % NH_INPUT_BUFFER_SIZE; - } else { - retval = NULL; - } - - return retval; -} - -/* get event from the queue but leave it there */ -PMSNHEvent -mswin_input_peek() -{ - PMSNHEvent retval; - -#ifdef SAFERHANGUP - /* always return ESC when hangup was requested */ - if (program_state.done_hup) { - static MSNHEvent hangup_event; - hangup_event.type = NHEVENT_CHAR; - hangup_event.kbd.ch = '\033'; - return &hangup_event; - } -#endif - - if (!nhi_init_input) - mswin_nh_input_init(); - - if (nhi_read_pos != nhi_write_pos) { - retval = &nhi_input_buffer[nhi_read_pos]; - } else { - retval = NULL; - } - return retval; -} diff --git a/sys/wince/mhinput.h b/sys/wince/mhinput.h deleted file mode 100644 index 644e24d47..000000000 --- a/sys/wince/mhinput.h +++ /dev/null @@ -1,50 +0,0 @@ -/* NetHack 3.6 mhinput.h $NHDT-Date: 1432512801 2015/05/25 00:13:21 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINInput_h -#define MSWINInput_h - -/* nethack input queue - store/extract input events */ -#include "winMS.h" - -#define NHEVENT_CHAR 1 -#define NHEVENT_MOUSE 2 -typedef struct mswin_event { - int type; - union { - struct { - int ch; - } kbd; - - struct { - int mod; - int x, y; - } ms; - }; -} MSNHEvent, *PMSNHEvent; - -#define NHEVENT_KBD(c) \ - { \ - MSNHEvent e; \ - e.type = NHEVENT_CHAR; \ - e.kbd.ch = (c); \ - mswin_input_push(&e); \ - } -#define NHEVENT_MS(_mod, _x, _y) \ - { \ - MSNHEvent e; \ - e.type = NHEVENT_MOUSE; \ - e.ms.mod = (_mod); \ - e.ms.x = (_x); \ - e.ms.y = (_y); \ - mswin_input_push(&e); \ - } - -void mswin_nh_input_init(); -int mswin_have_input(); -void mswin_input_push(PMSNHEvent event); -PMSNHEvent mswin_input_pop(); -PMSNHEvent mswin_input_peek(); - -#endif /* MSWINInput_h */ diff --git a/sys/wince/mhmain.c b/sys/wince/mhmain.c deleted file mode 100644 index 98abd0177..000000000 --- a/sys/wince/mhmain.c +++ /dev/null @@ -1,1151 +0,0 @@ -/* NetHack 3.6 mhmain.c $NHDT-Date: 1432512800 2015/05/25 00:13:20 $ $NHDT-Branch: master $:$NHDT-Revision: 1.46 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include "mhmsg.h" -#include "mhinput.h" -#include "mhmain.h" -#include "mhmenu.h" -#include "mhstatus.h" -#include "mhmsgwnd.h" -#include "mhcmd.h" -#include "mhmap.h" -#include "date.h" -#include "patchlevel.h" - -#define MAX_LOADSTRING 100 - -typedef struct mswin_nethack_main_window { - int mapAcsiiModeSave; -} NHMainWindow, *PNHMainWindow; - -TCHAR szMainWindowClass[] = TEXT("MSNHMainWndClass"); -static TCHAR szTitle[MAX_LOADSTRING]; - -LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); -static LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void register_main_window_class(); -static void select_map_mode(int map_mode); -static int menuid2mapmode(int menuid); -static int mapmode2menuid(int map_mode); -static HMENU _get_main_menu(UINT menu_id); -static void mswin_direct_command(); - -HWND -mswin_init_main_window() -{ - static int run_once = 0; - HWND ret; - RECT rc; - - /* register window class */ - if (!run_once) { - LoadString(GetNHApp()->hApp, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - register_main_window_class(); - run_once = 1; - } - - /* create the main window */ - SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); - - ret = CreateWindow(szMainWindowClass, /* registered class name */ - szTitle, /* window name */ - WS_CLIPCHILDREN, /* window style */ - rc.left, /* horizontal position of window */ - rc.top, /* vertical position of window */ - rc.right - rc.left, /* window width */ - rc.bottom - rc.top, /* window height */ - NULL, /* handle to parent or owner window */ - NULL, /* menu handle or child identifier */ - GetNHApp()->hApp, /* handle to application instance */ - NULL /* window-creation data */ - ); - - if (!ret) - panic("Cannot create main window"); - return ret; -} - -void -register_main_window_class() -{ - WNDCLASS wcex; - - ZeroMemory(&wcex, sizeof(wcex)); - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = (WNDPROC) MainWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = GetNHApp()->hApp; - wcex.hIcon = LoadIcon(GetNHApp()->hApp, (LPCTSTR) IDI_WINHACK); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - wcex.lpszMenuName = NULL; - wcex.lpszClassName = szMainWindowClass; - - RegisterClass(&wcex); -} - -/* - * Keypad keys are translated to the normal values below. - * Shifted keypad keys are translated to the - * shift values below. - */ - -enum KEY_INDEXES { - KEY_NW, - KEY_N, - KEY_NE, - KEY_MINUS, - KEY_W, - KEY_GOINTERESTING, - KEY_E, - KEY_PLUS, - KEY_SW, - KEY_S, - KEY_SE, - KEY_INV, - KEY_WAITLOOK, - KEY_LAST -}; - -static const unsigned char - /* normal, shift, control */ - keypad[KEY_LAST][3] = - { - { 'y', 'Y', C('y') }, /* 7 */ - { 'k', 'K', C('k') }, /* 8 */ - { 'u', 'U', C('u') }, /* 9 */ - { 'm', C('p'), C('p') }, /* - */ - { 'h', 'H', C('h') }, /* 4 */ - { 'g', 'G', 'g' }, /* 5 */ - { 'l', 'L', C('l') }, /* 6 */ - { '+', 'P', C('p') }, /* + */ - { 'b', 'B', C('b') }, /* 1 */ - { 'j', 'J', C('j') }, /* 2 */ - { 'n', 'N', C('n') }, /* 3 */ - { 'i', 'I', C('i') }, /* Ins */ - { '.', ':', ':' } /* Del */ - }, - numpad[KEY_LAST][3] = { - { '7', M('7'), '7' }, /* 7 */ - { '8', M('8'), '8' }, /* 8 */ - { '9', M('9'), '9' }, /* 9 */ - { 'm', C('p'), C('p') }, /* - */ - { '4', M('4'), '4' }, /* 4 */ - { 'g', 'G', 'g' }, /* 5 */ - { '6', M('6'), '6' }, /* 6 */ - { '+', 'P', C('p') }, /* + */ - { '1', M('1'), '1' }, /* 1 */ - { '2', M('2'), '2' }, /* 2 */ - { '3', M('3'), '3' }, /* 3 */ - { 'i', 'I', C('i') }, /* Ins */ - { '.', ':', ':' } /* Del */ - }; - -#define STATEON(x) ((GetKeyState(x) & 0xFFFE) != 0) -#define KEYTABLE_REGULAR(x) ((iflags.num_pad ? numpad : keypad)[x][0]) -#define KEYTABLE_SHIFT(x) ((iflags.num_pad ? numpad : keypad)[x][1]) -#define KEYTABLE(x) \ - (STATEON(VK_SHIFT) ? KEYTABLE_SHIFT(x) : KEYTABLE_REGULAR(x)) - -/* map mode macros */ -#define IS_MAP_FIT_TO_SCREEN(mode) \ - ((mode) == MAP_MODE_ASCII_FIT_TO_SCREEN \ - || (mode) == MAP_MODE_TILES_FIT_TO_SCREEN) - -#define IS_MAP_ASCII(mode) \ - ((mode) != MAP_MODE_TILES && (mode) != MAP_MODE_TILES_FIT_TO_SCREEN) - -/* -// FUNCTION: WndProc(HWND, unsigned, WORD, LONG) -// -// PURPOSE: Processes messages for the main window. -*/ -LRESULT CALLBACK -MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - PNHMainWindow data; - - switch (message) { - /*-----------------------------------------------------------------------*/ - case WM_CREATE: { -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - SHMENUBARINFO menubar; -#endif - /* set window data */ - data = (PNHMainWindow) malloc(sizeof(NHMainWindow)); - if (!data) - panic("out of memory"); - ZeroMemory(data, sizeof(NHMainWindow)); - data->mapAcsiiModeSave = MAP_MODE_ASCII12x16; - SetWindowLong(hWnd, GWL_USERDATA, (LONG) data); - - GetNHApp()->hMainWnd = hWnd; - -/* create menu bar */ -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - ZeroMemory(&menubar, sizeof(menubar)); - menubar.cbSize = sizeof(menubar); - menubar.hwndParent = hWnd; - menubar.dwFlags = 0; - menubar.nToolBarId = IDC_WINHACK; - menubar.hInstRes = GetNHApp()->hApp; -#if defined(WIN_CE_POCKETPC) - menubar.nBmpId = IDB_MENUBAR; - menubar.cBmpImages = 2; -#else - menubar.nBmpId = 0; - menubar.cBmpImages = 0; -#endif - if (!SHCreateMenuBar(&menubar)) - panic("cannot create menu"); - GetNHApp()->hMenuBar = menubar.hwndMB; -#else - GetNHApp()->hMenuBar = CommandBar_Create(GetNHApp()->hApp, hWnd, 1); - if (!GetNHApp()->hMenuBar) - panic("cannot create menu"); - CommandBar_InsertMenubar(GetNHApp()->hMenuBar, GetNHApp()->hApp, - IDC_WINHACK, 0); -#endif - CheckMenuItem( - _get_main_menu(ID_VIEW), IDM_VIEW_KEYPAD, - MF_BYCOMMAND | (GetNHApp()->bCmdPad ? MF_CHECKED : MF_UNCHECKED)); - - } break; - - /*-----------------------------------------------------------------------*/ - - case WM_MSNH_COMMAND: - onMSNHCommand(hWnd, wParam, lParam); - break; - - /*-----------------------------------------------------------------------*/ - - case WM_KEYDOWN: - data = (PNHMainWindow) GetWindowLong(hWnd, GWL_USERDATA); - - /* translate arrow keys into nethack commands */ - switch (wParam) { - case VK_LEFT: - if (STATEON(VK_CONTROL)) { - /* scroll map window one line left */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, - MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_W)); - } - return 0; - - case VK_RIGHT: - if (STATEON(VK_CONTROL)) { - /* scroll map window one line right */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, - MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_E)); - } - return 0; - - case VK_UP: - if (STATEON(VK_CONTROL)) { - /* scroll map window one line up */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, - MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_N)); - } - return 0; - - case VK_DOWN: - if (STATEON(VK_CONTROL)) { - /* scroll map window one line down */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, - MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_S)); - } - return 0; - - case VK_HOME: - if (STATEON(VK_CONTROL)) { - /* scroll map window to upper left corner */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, - MAKEWPARAM(SB_THUMBTRACK, 0), (LPARAM) NULL); - - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, - MAKEWPARAM(SB_THUMBTRACK, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_NW)); - } - return 0; - - case VK_END: - if (STATEON(VK_CONTROL)) { - /* scroll map window to lower right corner */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, - MAKEWPARAM(SB_THUMBTRACK, ROWNO), (LPARAM) NULL); - - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, - MAKEWPARAM(SB_THUMBTRACK, COLNO), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_SW)); - } - return 0; - - case VK_PRIOR: - if (STATEON(VK_CONTROL)) { - /* scroll map window one page up */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, - MAKEWPARAM(SB_PAGEUP, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_NE)); - } - return 0; - - case VK_NEXT: - if (STATEON(VK_CONTROL)) { - /* scroll map window one page down */ - SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, - MAKEWPARAM(SB_PAGEDOWN, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD(KEYTABLE(KEY_SE)); - } - return 0; - - case VK_DECIMAL: - case VK_DELETE: - NHEVENT_KBD(KEYTABLE(KEY_WAITLOOK)); - return 0; - - case VK_INSERT: - NHEVENT_KBD(KEYTABLE(KEY_INV)); - return 0; - - case VK_SUBTRACT: - NHEVENT_KBD(KEYTABLE(KEY_MINUS)); - return 0; - - case VK_ADD: - NHEVENT_KBD(KEYTABLE(KEY_PLUS)); - return 0; - - case VK_CLEAR: /* This is the '5' key */ - NHEVENT_KBD(KEYTABLE(KEY_GOINTERESTING)); - return 0; - - case VK_F4: - if (IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) { - mswin_select_map_mode(IS_MAP_ASCII(iflags.wc_map_mode) - ? data->mapAcsiiModeSave - : MAP_MODE_TILES); - } else { - mswin_select_map_mode(IS_MAP_ASCII(iflags.wc_map_mode) - ? MAP_MODE_ASCII_FIT_TO_SCREEN - : MAP_MODE_TILES_FIT_TO_SCREEN); - } - return 0; - - case VK_F5: - if (IS_MAP_ASCII(iflags.wc_map_mode)) { - if (IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) { - mswin_select_map_mode(MAP_MODE_TILES_FIT_TO_SCREEN); - } else { - mswin_select_map_mode(MAP_MODE_TILES); - } - } else { - if (IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) { - mswin_select_map_mode(MAP_MODE_ASCII_FIT_TO_SCREEN); - } else { - mswin_select_map_mode(data->mapAcsiiModeSave); - } - } - return 0; - - case VK_RETURN: { - int x, y; - if (WIN_MAP != WIN_ERR) { - mswin_map_get_cursor(mswin_hwnd_from_winid(WIN_MAP), &x, &y); - } else { - x = u.ux; - y = u.uy; - } - NHEVENT_MS(CLICK_1, x, y); - } - return 0; - } - -#if defined(WIN_CE_SMARTPHONE) - if (GetNHApp()->bCmdPad - && NHSPhoneTranslateKbdMessage(wParam, lParam, TRUE)) - return 0; -#endif - return 1; /* end of WM_KEYDOWN */ - -/*-----------------------------------------------------------------------*/ - -#if defined(WIN_CE_SMARTPHONE) - case WM_KEYUP: - if (GetNHApp()->bCmdPad - && NHSPhoneTranslateKbdMessage(wParam, lParam, FALSE)) - return 0; - return 1; /* end of WM_KEYUP */ -#endif - /*-----------------------------------------------------------------------*/ - - case WM_CHAR: -#if defined(WIN_CE_SMARTPHONE) - /* if smartphone cmdpad is up then translation happens - disable - WM_CHAR processing - to avoid double input */ - if (GetNHApp()->bCmdPad) { - return 1; - } -#endif - - if (wParam == '\n' || wParam == '\r' || wParam == C('M')) - return 0; /* we already processed VK_RETURN */ - - /* all characters go to nethack except Ctrl-P that scrolls message - * window up */ - if (wParam == C('P') || wParam == C('p')) { - SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL, - MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL); - } else { - NHEVENT_KBD((lParam & 1 << 29) ? M(tolower(wParam)) : wParam); - } - return 0; - - /*-----------------------------------------------------------------------*/ - - case WM_COMMAND: - /* process commands - menu commands mostly */ - if (IsWindow(GetNHApp()->hPopupWnd)) { - return SendMessage(GetNHApp()->hPopupWnd, message, wParam, - lParam); - } else if (onWMCommand(hWnd, wParam, lParam)) - return DefWindowProc(hWnd, message, wParam, lParam); - else - return 0; - - /*-----------------------------------------------------------------------*/ - - case WM_ACTIVATE: - if (LOWORD(wParam) != WA_INACTIVE) { -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - if (GetNHApp()->bFullScreen) - SHFullScreen(GetNHApp()->hMainWnd, - SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); - else - SHFullScreen(GetNHApp()->hMainWnd, - SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON); -#endif - mswin_layout_main_window(NULL); - } - break; - - case WM_SETTINGCHANGE: -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - if (GetNHApp()->bFullScreen) - SHFullScreen(GetNHApp()->hMainWnd, - SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); - else - SHFullScreen(GetNHApp()->hMainWnd, - SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON); -#endif - mswin_layout_main_window(NULL); - break; - - case WM_SIZE: - mswin_layout_main_window(NULL); - break; - - /*-----------------------------------------------------------------------*/ - - case WM_SETFOCUS: - /* if there is a menu window out there - - transfer input focus to it */ - if (IsWindow(GetNHApp()->hPopupWnd)) { - SetFocus(GetNHApp()->hPopupWnd); - } - break; - - /*-----------------------------------------------------------------------*/ - - case WM_CLOSE: { -/* exit gracefully */ -#ifdef SAFERHANGUP - /* destroy popup window - it has its own loop and we need to - return control to NetHack core at this point */ - if (IsWindow(GetNHApp()->hPopupWnd)) - SendMessage(GetNHApp()->hPopupWnd, WM_COMMAND, IDCANCEL, 0); - - /* tell NetHack core that "hangup" is requested */ - hangup(1); -#else - dosave0(); - nh_terminate(EXIT_SUCCESS); -#endif - } - return 0; - - /*-----------------------------------------------------------------------*/ - - case WM_DESTROY: { - /* apparently we never get here - TODO: work on exit routines - need to send - WM_QUIT somehow */ - - /* clean up */ - free((PNHMainWindow) GetWindowLong(hWnd, GWL_USERDATA)); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - - nh_terminate(EXIT_SUCCESS); - } break; - - /*-----------------------------------------------------------------------*/ - - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} - -void -onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - switch (wParam) { - /* new window was just added */ - case MSNH_MSG_ADDWND: { - PMSNHMsgAddWnd msg_param = (PMSNHMsgAddWnd) lParam; - HWND child = GetNHApp()->windowlist[msg_param->wid].win; - - if (GetNHApp()->windowlist[msg_param->wid].type == NHW_MAP) - mswin_select_map_mode(iflags.wc_map_mode); - - if (child) - mswin_layout_main_window(child); - } break; - } -} - -/* adjust windows to fit main window layout - --------------------------- - | Status | - +-------------------------+ - | | - | | - | MAP | - | | - | | - +-------------------------+ - | Command pad | - +-------------------------+ - | Messages | - --------------------------- -*/ -void -mswin_layout_main_window(HWND changed_child) -{ - winid i; - RECT client_rt, wnd_rect; - POINT status_org; - SIZE status_size; - POINT msg_org; - SIZE msg_size; - POINT map_org; - SIZE map_size; - POINT cmd_org; - SIZE cmd_size; - HWND wnd_status, wnd_msg; - PNHMainWindow data; -#if defined(WIN_CE_POCKETPC) - SIPINFO sip; - RECT menu_bar; - RECT visible_rt; - POINT pt; -#endif - - GetClientRect(GetNHApp()->hMainWnd, &client_rt); - -#if defined(WIN_CE_POCKETPC) - ZeroMemory(&sip, sizeof(sip)); - sip.cbSize = sizeof(sip); - SHSipInfo(SPI_GETSIPINFO, 0, &sip, 0); - if (GetNHApp()->bFullScreen) - sip.rcVisibleDesktop.top = 0; - - /* adjust client rectangle size */ - GetWindowRect(GetNHApp()->hMenuBar, &menu_bar); - client_rt.bottom -= menu_bar.bottom - menu_bar.top; - - /* calcuate visible rect in client coordinates */ - pt.x = sip.rcVisibleDesktop.left; - pt.y = sip.rcVisibleDesktop.top; - ScreenToClient(GetNHApp()->hMainWnd, &pt); - SetRect(&wnd_rect, pt.x, pt.y, - pt.x + sip.rcVisibleDesktop.right - sip.rcVisibleDesktop.left, - pt.y + sip.rcVisibleDesktop.bottom - sip.rcVisibleDesktop.top); - IntersectRect(&visible_rt, &client_rt, &wnd_rect); -#else -#if !defined(WIN_CE_SMARTPHONE) - client_rt.top += CommandBar_Height(GetNHApp()->hMenuBar); -#else - /* Smartphone only */ - if (GetNHApp()->bFullScreen) { - RECT menu_bar; - GetWindowRect(GetNHApp()->hMenuBar, &menu_bar); - client_rt.bottom -= menu_bar.bottom - menu_bar.top; - } -#endif -#endif - - /* get window data */ - data = (PNHMainWindow) GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA); - - /* get sizes of child windows */ - wnd_status = mswin_hwnd_from_winid(WIN_STATUS); - if (IsWindow(wnd_status)) { - mswin_status_window_size(wnd_status, &status_size); - } else { - status_size.cx = status_size.cy = 0; - } - - wnd_msg = mswin_hwnd_from_winid(WIN_MESSAGE); - if (IsWindow(wnd_msg)) { - mswin_message_window_size(wnd_msg, &msg_size); - } else { - msg_size.cx = msg_size.cy = 0; - } - - cmd_size.cx = cmd_size.cy = 0; - if (GetNHApp()->bCmdPad && IsWindow(GetNHApp()->hCmdWnd)) { - mswin_command_window_size(GetNHApp()->hCmdWnd, &cmd_size); - } - -/* set window positions */ - -/* calculate the application windows size */ -#if defined(WIN_CE_POCKETPC) - SetRect(&wnd_rect, visible_rt.left, visible_rt.top, visible_rt.right, - visible_rt.bottom); - if (sip.fdwFlags & SIPF_ON) - cmd_size.cx = cmd_size.cy = 0; /* hide keypad window */ -#else - SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right, - client_rt.bottom); -#endif - -#if !defined(WIN_CE_SMARTPHONE) - /* other ports have it at the bottom of the screen */ - cmd_size.cx = (wnd_rect.right - wnd_rect.left); - cmd_org.x = wnd_rect.left; - cmd_org.y = wnd_rect.bottom - cmd_size.cy; - wnd_rect.bottom -= cmd_size.cy; -#endif - - /* status window */ - switch (iflags.wc_align_status) { - case ALIGN_LEFT: - status_size.cx = (wnd_rect.right - wnd_rect.left) / 4; - status_size.cy = - (wnd_rect.bottom - wnd_rect.top); // that won't look good - status_org.x = wnd_rect.left; - status_org.y = wnd_rect.top; - wnd_rect.left += status_size.cx; - break; - - case ALIGN_RIGHT: - status_size.cx = (wnd_rect.right - wnd_rect.left) / 4; - status_size.cy = - (wnd_rect.bottom - wnd_rect.top); // that won't look good - status_org.x = wnd_rect.right - status_size.cx; - status_org.y = wnd_rect.top; - wnd_rect.right -= status_size.cx; - break; - - case ALIGN_TOP: - status_size.cx = (wnd_rect.right - wnd_rect.left); - status_org.x = wnd_rect.left; - status_org.y = wnd_rect.top; - wnd_rect.top += status_size.cy; - break; - - case ALIGN_BOTTOM: - default: - status_size.cx = (wnd_rect.right - wnd_rect.left); - status_org.x = wnd_rect.left; - status_org.y = wnd_rect.bottom - status_size.cy; - wnd_rect.bottom -= status_size.cy; - break; - } - - /* message window */ - switch (iflags.wc_align_message) { - case ALIGN_LEFT: -#if defined(WIN_CE_SMARTPHONE) - /* smartphone has a keypad window on the right (bottom) side of the - * message window */ - msg_size.cx = cmd_size.cx = max(msg_size.cx, cmd_size.cx); - msg_size.cy = (wnd_rect.bottom - wnd_rect.top) - cmd_size.cy; - msg_org.x = cmd_org.x = wnd_rect.left; - msg_org.y = wnd_rect.top; - cmd_org.y = msg_org.y + msg_size.cy; -#else - msg_size.cx = (wnd_rect.right - wnd_rect.left) / 4; - msg_size.cy = (wnd_rect.bottom - wnd_rect.top); - msg_org.x = wnd_rect.left; - msg_org.y = wnd_rect.top; -#endif - wnd_rect.left += msg_size.cx; - - break; - - case ALIGN_RIGHT: -#if defined(WIN_CE_SMARTPHONE) - /* smartphone has a keypad window on the right (bottom) side of the - * message window */ - msg_size.cx = cmd_size.cx = max(msg_size.cx, cmd_size.cx); - msg_size.cy = (wnd_rect.bottom - wnd_rect.top) - cmd_size.cy; - msg_org.x = cmd_org.x = wnd_rect.right - msg_size.cx; - msg_org.y = wnd_rect.top; - cmd_org.y = msg_org.y + msg_size.cy; -#else - msg_size.cx = (wnd_rect.right - wnd_rect.left) / 4; - msg_size.cy = (wnd_rect.bottom - wnd_rect.top); - msg_org.x = wnd_rect.right - msg_size.cx; - msg_org.y = wnd_rect.top; -#endif - - wnd_rect.right -= msg_size.cx; - break; - - case ALIGN_TOP: -#if defined(WIN_CE_SMARTPHONE) - /* smartphone has a keypad window on the right side of the message - * window */ - msg_size.cy = cmd_size.cy = max(msg_size.cy, cmd_size.cy); - msg_size.cx = (wnd_rect.right - wnd_rect.left) - cmd_size.cx; - msg_org.x = wnd_rect.left; - cmd_org.x = msg_org.x + msg_size.cx; - msg_org.y = cmd_org.y = wnd_rect.bottom - msg_size.cy; -#else - msg_size.cx = (wnd_rect.right - wnd_rect.left); - msg_org.x = wnd_rect.left; - msg_org.y = wnd_rect.top; -#endif - wnd_rect.top += msg_size.cy; - break; - - case ALIGN_BOTTOM: - default: -#if defined(WIN_CE_SMARTPHONE) - /* smartphone has a keypad window on the right side of the message - * window */ - msg_size.cy = cmd_size.cy = max(msg_size.cy, cmd_size.cy); - msg_size.cx = (wnd_rect.right - wnd_rect.left) - cmd_size.cx; - msg_org.x = wnd_rect.left; - cmd_org.x = msg_org.x + msg_size.cx; - msg_org.y = cmd_org.y = wnd_rect.bottom - msg_size.cy; -#else - msg_size.cx = (wnd_rect.right - wnd_rect.left); - msg_org.x = wnd_rect.left; - msg_org.y = wnd_rect.bottom - msg_size.cy; -#endif - wnd_rect.bottom -= msg_size.cy; - break; - } - - map_org.x = wnd_rect.left; - map_org.y = wnd_rect.top; - map_size.cx = wnd_rect.right - wnd_rect.left; - map_size.cy = wnd_rect.bottom - wnd_rect.top; - - /* go through the windows list and adjust sizes */ - for (i = 0; i < MAXWINDOWS; i++) { - if (GetNHApp()->windowlist[i].win - && !GetNHApp()->windowlist[i].dead) { - switch (GetNHApp()->windowlist[i].type) { - case NHW_MESSAGE: - MoveWindow(GetNHApp()->windowlist[i].win, msg_org.x, - msg_org.y, msg_size.cx, msg_size.cy, TRUE); - break; - case NHW_MAP: - MoveWindow(GetNHApp()->windowlist[i].win, map_org.x, - map_org.y, map_size.cx, map_size.cy, TRUE); - break; - case NHW_STATUS: - MoveWindow(GetNHApp()->windowlist[i].win, status_org.x, - status_org.y, status_size.cx, status_size.cy, - TRUE); - break; - - case NHW_TEXT: - case NHW_MENU: - case NHW_RIP: { - POINT menu_org; - SIZE menu_size; - - menu_org.x = client_rt.left; - menu_org.y = client_rt.top; -#if defined(WIN_CE_POCKETPC) - menu_size.cx = min(sip.rcVisibleDesktop.right - - sip.rcVisibleDesktop.left, - client_rt.right - client_rt.left); - menu_size.cy = min(sip.rcVisibleDesktop.bottom - - sip.rcVisibleDesktop.top, - client_rt.bottom - client_rt.top); -#else - menu_size.cx = client_rt.right - client_rt.left; - menu_size.cy = client_rt.bottom - client_rt.top; -#endif - -#if defined(WIN_CE_SMARTPHONE) - /* leave room for the command window */ - if (GetNHApp()->windowlist[i].type == NHW_MENU) { - menu_size.cy -= cmd_size.cy; - } - - /* dialogs are popup windows unde SmartPhone so we need - to convert to screen coordinates */ - ClientToScreen(GetNHApp()->hMainWnd, &menu_org); -#endif - MoveWindow(GetNHApp()->windowlist[i].win, menu_org.x, - menu_org.y, menu_size.cx, menu_size.cy, TRUE); - } break; - } - ShowWindow(GetNHApp()->windowlist[i].win, SW_SHOW); - InvalidateRect(GetNHApp()->windowlist[i].win, NULL, TRUE); - } - } - - if (IsWindow(GetNHApp()->hCmdWnd)) { - /* show command window only if it exists and - the game is ready (plname is set) */ - if (GetNHApp()->bCmdPad && cmd_size.cx > 0 && cmd_size.cy > 0 - && *plname) { - MoveWindow(GetNHApp()->hCmdWnd, cmd_org.x, cmd_org.y, cmd_size.cx, - cmd_size.cy, TRUE); - ShowWindow(GetNHApp()->hCmdWnd, SW_SHOW); - } else { - ShowWindow(GetNHApp()->hCmdWnd, SW_HIDE); - } - } -} - -LRESULT -onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - int wmId, wmEvent; - PNHMainWindow data; - - data = (PNHMainWindow) GetWindowLong(hWnd, GWL_USERDATA); - wmId = LOWORD(wParam); - wmEvent = HIWORD(wParam); - - // process the menu selections: - switch (wmId) { - case IDM_ABOUT: - DialogBox(GetNHApp()->hApp, (LPCTSTR) IDD_ABOUTBOX, hWnd, - (DLGPROC) About); - break; - - case IDM_EXIT: - done2(); - break; - - case IDM_SAVE: - dosave(); - break; - - case IDM_MAP_TILES: - case IDM_MAP_ASCII4X6: - case IDM_MAP_ASCII6X8: - case IDM_MAP_ASCII8X8: - case IDM_MAP_ASCII16X8: - case IDM_MAP_ASCII7X12: - case IDM_MAP_ASCII8X12: - case IDM_MAP_ASCII12X16: - case IDM_MAP_ASCII16X12: - case IDM_MAP_ASCII10X18: - mswin_select_map_mode(menuid2mapmode(wmId)); - break; - - case IDM_MAP_FIT_TO_SCREEN: - if (IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) { - mswin_select_map_mode(IS_MAP_ASCII(iflags.wc_map_mode) - ? data->mapAcsiiModeSave - : MAP_MODE_TILES); - } else { - mswin_select_map_mode(IS_MAP_ASCII(iflags.wc_map_mode) - ? MAP_MODE_ASCII_FIT_TO_SCREEN - : MAP_MODE_TILES_FIT_TO_SCREEN); - } - break; - - case IDM_VIEW_KEYPAD: - GetNHApp()->bCmdPad = !GetNHApp()->bCmdPad; - CheckMenuItem( - _get_main_menu(ID_VIEW), IDM_VIEW_KEYPAD, - MF_BYCOMMAND | (GetNHApp()->bCmdPad ? MF_CHECKED : MF_UNCHECKED)); - mswin_layout_main_window(GetNHApp()->hCmdWnd); - break; - - case IDM_VIEW_OPTIONS: - doset(); - break; - - case IDM_DIRECT_COMMAND: /* SmartPhone: display dialog to type in arbitary - command text */ - mswin_direct_command(); - break; - - case IDM_HELP_LONG: - display_file(HELP, TRUE); - break; - - case IDM_HELP_COMMANDS: - display_file(SHELP, TRUE); - break; - - case IDM_HELP_HISTORY: - (void) dohistory(); - break; - - case IDM_HELP_INFO_CHAR: - (void) dowhatis(); - break; - - case IDM_HELP_INFO_KEY: - (void) dowhatdoes(); - break; - - case IDM_HELP_OPTIONS: - option_help(); - break; - - case IDM_HELP_OPTIONS_LONG: - display_file(OPTIONFILE, TRUE); - break; - - case IDM_HELP_EXTCMD: - (void) doextlist(); - break; - - case IDM_HELP_LICENSE: - display_file(LICENSE, TRUE); - break; - - case IDM_HELP_MENU: - dohelp(); - break; - - default: - return 1; - } - return 0; -} - -// Mesage handler for about box. -LRESULT CALLBACK -About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - char buf[BUFSZ]; - TCHAR wbuf[NHSTR_BUFSIZE]; - RECT main_rt, dlg_rt; - SIZE dlg_sz; - - switch (message) { - case WM_INITDIALOG: - getversionstring(buf); - SetDlgItemText(hDlg, IDC_ABOUT_VERSION, - NH_A2W(buf, wbuf, NHSTR_BUFSIZE)); - - SetDlgItemText(hDlg, IDC_ABOUT_COPYRIGHT, - NH_A2W(COPYRIGHT_BANNER_A "\n" COPYRIGHT_BANNER_B - "\n" COPYRIGHT_BANNER_C - "\n" COPYRIGHT_BANNER_D, - wbuf, NHSTR_BUFSIZE)); - - /* center dialog in the main window */ - GetWindowRect(GetNHApp()->hMainWnd, &main_rt); - GetWindowRect(hDlg, &dlg_rt); - dlg_sz.cx = dlg_rt.right - dlg_rt.left; - dlg_sz.cy = dlg_rt.bottom - dlg_rt.top; - - dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2; - dlg_rt.right = dlg_rt.left + dlg_sz.cx; - dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2; - dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; - MoveWindow(hDlg, (main_rt.left + main_rt.right - dlg_sz.cx) / 2, - (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx, - dlg_sz.cy, TRUE); - - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - break; - } - return FALSE; -} - -/* Set map display mode */ -void -mswin_select_map_mode(int mode) -{ - HMENU hmenuMap; - PNHMainWindow data; - winid map_id; - - map_id = WIN_MAP; - data = (PNHMainWindow) GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA); -#if defined(WIN_CE_SMARTPHONE) - /* Smartphone manu has only 2 items */ - hmenuMap = _get_main_menu(ID_VIEW); -#else - hmenuMap = _get_main_menu(ID_MAP); -#endif - - /* override for Rogue level */ - if (Is_rogue_level(&u.uz) && !IS_MAP_ASCII(mode)) - return; - - /* set map mode menu mark */ - if (IS_MAP_ASCII(mode)) { - CheckMenuRadioItem(hmenuMap, IDM_MAP_TILES, IDM_MAP_FIT_TO_SCREEN, - mapmode2menuid(IS_MAP_FIT_TO_SCREEN(mode) - ? data->mapAcsiiModeSave - : mode), - MF_BYCOMMAND); - } else { - CheckMenuRadioItem(hmenuMap, IDM_MAP_TILES, IDM_MAP_FIT_TO_SCREEN, - mapmode2menuid(MAP_MODE_TILES), MF_BYCOMMAND); - } - -#if defined(WIN_CE_SMARTPHONE) - /* update "Fit To Screen" item text */ - { - TCHAR wbuf[BUFSZ]; - TBBUTTONINFO tbbi; - - ZeroMemory(wbuf, sizeof(wbuf)); - if (!LoadString(GetNHApp()->hApp, - (IS_MAP_FIT_TO_SCREEN(mode) ? IDS_CAP_NORMALMAP - : IDS_CAP_ENTIREMAP), - wbuf, BUFSZ)) { - panic("cannot load main menu strings"); - } - - ZeroMemory(&tbbi, sizeof(tbbi)); - tbbi.cbSize = sizeof(tbbi); - tbbi.dwMask = TBIF_TEXT; - tbbi.pszText = wbuf; - if (!SendMessage(GetNHApp()->hMenuBar, TB_SETBUTTONINFO, - IDM_MAP_FIT_TO_SCREEN, (LPARAM) &tbbi)) { - error("Cannot update IDM_MAP_FIT_TO_SCREEN menu item."); - } - } -#else - /* set fit-to-screen mode mark */ - CheckMenuItem(hmenuMap, IDM_MAP_FIT_TO_SCREEN, - MF_BYCOMMAND | (IS_MAP_FIT_TO_SCREEN(mode) ? MF_CHECKED - : MF_UNCHECKED)); -#endif - - if (IS_MAP_ASCII(iflags.wc_map_mode) - && !IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) { - data->mapAcsiiModeSave = iflags.wc_map_mode; - } - - iflags.wc_map_mode = mode; - - /* - ** first, check if WIN_MAP has been inialized. - ** If not - attempt to retrieve it by type, then check it again - */ - if (WIN_MAP != WIN_ERR) - mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), mode); -} - -static struct t_menu2mapmode { - int menuID; - int mapMode; -} _menu2mapmode[] = { { IDM_MAP_TILES, MAP_MODE_TILES }, - { IDM_MAP_ASCII4X6, MAP_MODE_ASCII4x6 }, - { IDM_MAP_ASCII6X8, MAP_MODE_ASCII6x8 }, - { IDM_MAP_ASCII8X8, MAP_MODE_ASCII8x8 }, - { IDM_MAP_ASCII16X8, MAP_MODE_ASCII16x8 }, - { IDM_MAP_ASCII7X12, MAP_MODE_ASCII7x12 }, - { IDM_MAP_ASCII8X12, MAP_MODE_ASCII8x12 }, - { IDM_MAP_ASCII12X16, MAP_MODE_ASCII12x16 }, - { IDM_MAP_ASCII16X12, MAP_MODE_ASCII16x12 }, - { IDM_MAP_ASCII10X18, MAP_MODE_ASCII10x18 }, - { IDM_MAP_FIT_TO_SCREEN, MAP_MODE_ASCII_FIT_TO_SCREEN }, - { -1, -1 } }; - -int -menuid2mapmode(int menuid) -{ - struct t_menu2mapmode *p; - for (p = _menu2mapmode; p->mapMode != -1; p++) - if (p->menuID == menuid) - return p->mapMode; - return -1; -} - -int -mapmode2menuid(int map_mode) -{ - struct t_menu2mapmode *p; - for (p = _menu2mapmode; p->mapMode != -1; p++) - if (p->mapMode == map_mode) - return p->menuID; - return -1; -} - -HMENU -_get_main_menu(UINT menu_id) -{ - HMENU hmenuMap; -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - TBBUTTONINFO tbbi; -#endif - -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - tbbi.cbSize = sizeof(tbbi); - tbbi.dwMask = TBIF_LPARAM; - SendMessage(GetNHApp()->hMenuBar, TB_GETBUTTONINFO, menu_id, - (LPARAM) &tbbi); - hmenuMap = (HMENU) tbbi.lParam; -#else - hmenuMap = CommandBar_GetMenu(GetNHApp()->hMenuBar, 0); -#endif - return hmenuMap; -} - -/* SmartPhone: display dialog to type arbitrary command text */ -void -mswin_direct_command() -{ - char cmd[BUFSZ]; - ZeroMemory(cmd, sizeof(cmd)); - mswin_getlin("Type cmd text", cmd); - if (cmd[0]) { - /* feed command to nethack */ - char *p = cmd; - cmd[32] = '\x0'; /* truncate at 32 chars */ - while (*p) { - NHEVENT_KBD(*p); - p++; - } - if (cmd[0] != '\033') - mswin_putstr(WIN_MESSAGE, ATR_NONE, cmd); - } -} diff --git a/sys/wince/mhmain.h b/sys/wince/mhmain.h deleted file mode 100644 index 8e1f774f0..000000000 --- a/sys/wince/mhmain.h +++ /dev/null @@ -1,17 +0,0 @@ -/* NetHack 3.6 mhmain.h $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.15 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINMainWindow_h -#define MSWINMainWindow_h - -/* this is a main appliation window */ - -#include "winMS.h" - -extern TCHAR szMainWindowClass[]; -HWND mswin_init_main_window(); -void mswin_layout_main_window(HWND changed_child); -void mswin_select_map_mode(int map_mode); - -#endif /* MSWINMainWindow_h */ diff --git a/sys/wince/mhmap.c b/sys/wince/mhmap.c deleted file mode 100644 index dbdbb5f0b..000000000 --- a/sys/wince/mhmap.c +++ /dev/null @@ -1,968 +0,0 @@ -/* NetHack 3.6 mhmap.c $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.40 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include "mhmap.h" -#include "mhmsg.h" -#include "mhinput.h" -#include "mhfont.h" - -#include "patchlevel.h" - -#define NHMAP_FONT_NAME TEXT("Terminal") -#define MAXWINDOWTEXT 255 - -extern short glyph2tile[]; - -/* map window data */ -typedef struct mswin_nethack_map_window { - int map[COLNO][ROWNO]; /* glyph map */ - - int mapMode; /* current map mode */ - boolean bAsciiMode; /* switch ASCII/tiled mode */ - boolean bFitToScreenMode; /* switch Fit map to screen mode on/off */ - int xPos, yPos; /* scroll position */ - int xPageSize, yPageSize; /* scroll page size */ - int xCur, yCur; /* position of the cursor */ - int xScrTile, yScrTile; /* size of display tile */ - POINT map_orig; /* map origin point */ - HFONT hMapFont; /* font for ASCII mode */ - int xLastMouseClick, yLastMouseClick; /* last mouse click */ -} NHMapWindow, *PNHMapWindow; - -static TCHAR szNHMapWindowClass[] = TEXT("MSNethackMapWndClass"); -LRESULT CALLBACK MapWndProc(HWND, UINT, WPARAM, LPARAM); -static void register_map_window_class(void); -static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void onPaint(HWND hWnd); -static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut); -#if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) -static void nhglyph2charcolor(short glyph, uchar *ch, int *color); -#endif -static COLORREF nhcolor_to_RGB(int c); - -HWND -mswin_init_map_window() -{ - static int run_once = 0; - HWND ret; - DWORD styles; - - if (!run_once) { - register_map_window_class(); - run_once = 1; - } - - styles = WS_CHILD | WS_CLIPSIBLINGS; - if (!GetNHApp()->bHideScrollBars) - styles |= WS_HSCROLL | WS_VSCROLL; - ret = CreateWindow( - szNHMapWindowClass, /* registered class name */ - NULL, /* window name */ - styles, /* window style */ - 0, /* horizontal position of window - set it later */ - 0, /* vertical position of window - set it later */ - 0, /* window width - set it later */ - 0, /* window height - set it later*/ - GetNHApp()->hMainWnd, /* handle to parent or owner window */ - NULL, /* menu handle or child identifier */ - GetNHApp()->hApp, /* handle to application instance */ - NULL); /* window-creation data */ - if (!ret) { - panic("Cannot create map window"); - } - return ret; -} - -void -mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw) -{ - PNHMapWindow data; - RECT client_rt; - SCROLLINFO si; - SIZE wnd_size; - LOGFONT lgfnt; - - /* check arguments */ - if (!IsWindow(hWnd) || !lpsz || lpsz->cx <= 0 || lpsz->cy <= 0) - return; - - /* calculate window size */ - GetClientRect(hWnd, &client_rt); - wnd_size.cx = client_rt.right - client_rt.left; - wnd_size.cy = client_rt.bottom - client_rt.top; - - /* set new screen tile size */ - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - data->xScrTile = - max(1, (data->bFitToScreenMode ? wnd_size.cx : lpsz->cx) / COLNO); - data->yScrTile = - max(1, (data->bFitToScreenMode ? wnd_size.cy : lpsz->cy) / ROWNO); - - /* set map origin point */ - data->map_orig.x = - max(0, client_rt.left + (wnd_size.cx - data->xScrTile * COLNO) / 2); - data->map_orig.y = - max(0, client_rt.top + (wnd_size.cy - data->yScrTile * ROWNO) / 2); - - data->map_orig.x -= data->map_orig.x % data->xScrTile; - data->map_orig.y -= data->map_orig.y % data->yScrTile; - - /* adjust horizontal scroll bar */ - if (data->bFitToScreenMode) - data->xPageSize = COLNO + 1; /* disable scroll bar */ - else - data->xPageSize = wnd_size.cx / data->xScrTile; - - if (data->xPageSize >= COLNO) { - data->xPos = 0; - GetNHApp()->bNoHScroll = TRUE; - } else { - GetNHApp()->bNoHScroll = FALSE; - data->xPos = max( - 0, min(COLNO - data->xPageSize + 1, u.ux - data->xPageSize / 2)); - } - - if (!GetNHApp()->bHideScrollBars) { - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = 0; - si.nMax = COLNO; - si.nPage = data->xPageSize; - si.nPos = data->xPos; - SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); - } - - /* adjust vertical scroll bar */ - if (data->bFitToScreenMode) - data->yPageSize = ROWNO + 1; /* disable scroll bar */ - else - data->yPageSize = wnd_size.cy / data->yScrTile; - - if (data->yPageSize >= ROWNO) { - data->yPos = 0; - GetNHApp()->bNoVScroll = TRUE; - } else { - GetNHApp()->bNoVScroll = FALSE; - data->yPos = max( - 0, min(ROWNO - data->yPageSize + 1, u.uy - data->yPageSize / 2)); - } - - if (!GetNHApp()->bHideScrollBars) { - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = 0; - si.nMax = ROWNO; - si.nPage = data->yPageSize; - si.nPos = data->yPos; - SetScrollInfo(hWnd, SB_VERT, &si, TRUE); - } - - /* create font */ - if (data->hMapFont) - DeleteObject(data->hMapFont); - ZeroMemory(&lgfnt, sizeof(lgfnt)); - lgfnt.lfHeight = -data->yScrTile; // height of font - lgfnt.lfWidth = -data->xScrTile; // average character width - lgfnt.lfEscapement = 0; // angle of escapement - lgfnt.lfOrientation = 0; // base-line orientation angle - lgfnt.lfWeight = FW_NORMAL; // font weight - lgfnt.lfItalic = FALSE; // italic attribute option - lgfnt.lfUnderline = FALSE; // underline attribute option - lgfnt.lfStrikeOut = FALSE; // strikeout attribute option - lgfnt.lfCharSet = mswin_charset(); // character set identifier - lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision - lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision - lgfnt.lfQuality = DEFAULT_QUALITY; // output quality - if (iflags.wc_font_map && *iflags.wc_font_map) { - lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family - NH_A2W(iflags.wc_font_map, lgfnt.lfFaceName, LF_FACESIZE); - } else { - lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family - _tcsncpy(lgfnt.lfFaceName, NHMAP_FONT_NAME, LF_FACESIZE); - } - data->hMapFont = CreateFontIndirect(&lgfnt); - - mswin_cliparound(data->xCur, data->yCur); - - if (redraw) - InvalidateRect(hWnd, NULL, TRUE); -} - -/* set map mode */ -int -mswin_map_mode(HWND hWnd, int mode) -{ - PNHMapWindow data; - int oldMode; - SIZE mapSize; - - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (mode == data->mapMode) - return mode; - - oldMode = data->mapMode; - data->mapMode = mode; - - switch (data->mapMode) { - case MAP_MODE_ASCII4x6: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 4 * COLNO; - mapSize.cy = 6 * ROWNO; - break; - - case MAP_MODE_ASCII6x8: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 6 * COLNO; - mapSize.cy = 8 * ROWNO; - break; - - case MAP_MODE_ASCII8x8: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 8 * COLNO; - mapSize.cy = 8 * ROWNO; - break; - - case MAP_MODE_ASCII16x8: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 16 * COLNO; - mapSize.cy = 8 * ROWNO; - break; - - case MAP_MODE_ASCII7x12: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 7 * COLNO; - mapSize.cy = 12 * ROWNO; - break; - - case MAP_MODE_ASCII8x12: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 8 * COLNO; - mapSize.cy = 12 * ROWNO; - break; - - case MAP_MODE_ASCII16x12: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 16 * COLNO; - mapSize.cy = 12 * ROWNO; - break; - - case MAP_MODE_ASCII12x16: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 12 * COLNO; - mapSize.cy = 16 * ROWNO; - break; - - case MAP_MODE_ASCII10x18: - data->bAsciiMode = TRUE; - data->bFitToScreenMode = FALSE; - mapSize.cx = 10 * COLNO; - mapSize.cy = 18 * ROWNO; - break; - - case MAP_MODE_ASCII_FIT_TO_SCREEN: { - RECT client_rt; - GetClientRect(hWnd, &client_rt); - mapSize.cx = client_rt.right - client_rt.left; - mapSize.cy = client_rt.bottom - client_rt.top; - - data->bAsciiMode = TRUE; - data->bFitToScreenMode = TRUE; - } break; - - case MAP_MODE_TILES_FIT_TO_SCREEN: { - RECT client_rt; - GetClientRect(hWnd, &client_rt); - mapSize.cx = client_rt.right - client_rt.left; - mapSize.cy = client_rt.bottom - client_rt.top; - - data->bAsciiMode = FALSE; - data->bFitToScreenMode = TRUE; - } break; - - case MAP_MODE_TILES: - default: - data->bAsciiMode = FALSE; - data->bFitToScreenMode = FALSE; - mapSize.cx = GetNHApp()->mapTile_X * COLNO; - mapSize.cy = GetNHApp()->mapTile_Y * ROWNO; - break; - } - - mswin_map_stretch(hWnd, &mapSize, TRUE); - - return oldMode; -} - -/* retrieve cursor position */ -void -mswin_map_get_cursor(HWND hWnd, int *x, int *y) -{ - PNHMapWindow data; - - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (!data) - panic("mswin_map_get_cursor: no window data"); - if (x) - *x = data->xCur; - if (y) - *y = data->yCur; -} - -/* register window class for map window */ -void -register_map_window_class() -{ - WNDCLASS wcex; - ZeroMemory(&wcex, sizeof(wcex)); - - /* window class */ - wcex.style = CS_NOCLOSE | CS_DBLCLKS; - wcex.lpfnWndProc = (WNDPROC) MapWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = GetNHApp()->hApp; - wcex.hIcon = NULL; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = - CreateSolidBrush(RGB(0, 0, 0)); /* set backgroup here */ - wcex.lpszMenuName = NULL; - wcex.lpszClassName = szNHMapWindowClass; - - if (!RegisterClass(&wcex)) { - panic("cannot register Map window class"); - } -} - -/* map window procedure */ -LRESULT CALLBACK -MapWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - PNHMapWindow data; - int x, y; - - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (message) { - case WM_CREATE: - onCreate(hWnd, wParam, lParam); - break; - - case WM_MSNH_COMMAND: - onMSNHCommand(hWnd, wParam, lParam); - break; - - case WM_PAINT: - onPaint(hWnd); - break; - - case WM_SETFOCUS: - /* transfer focus back to the main window */ - SetFocus(GetNHApp()->hMainWnd); - break; - - case WM_HSCROLL: - onMSNH_HScroll(hWnd, wParam, lParam); - break; - - case WM_VSCROLL: - onMSNH_VScroll(hWnd, wParam, lParam); - break; - - case WM_SIZE: { - SIZE size; - - if (data->bFitToScreenMode) { - size.cx = LOWORD(lParam); - size.cy = HIWORD(lParam); - } else { - /* mapping factor is unchaged we just need to adjust scroll bars - */ - size.cx = data->xScrTile * COLNO; - size.cy = data->yScrTile * ROWNO; - } - mswin_map_stretch(hWnd, &size, TRUE); - } break; - - case WM_LBUTTONDOWN: - x = max(0, min(COLNO, data->xPos - + (LOWORD(lParam) - data->map_orig.x) - / data->xScrTile)); - y = max(0, min(ROWNO, data->yPos - + (HIWORD(lParam) - data->map_orig.y) - / data->yScrTile)); - - NHEVENT_MS(CLICK_1, x, y); - - data->xLastMouseClick = x; - data->yLastMouseClick = y; - return 0; - - case WM_LBUTTONDBLCLK: - x = max(0, min(COLNO, data->xPos - + (LOWORD(lParam) - data->map_orig.x) - / data->xScrTile)); - y = max(0, min(ROWNO, data->yPos - + (HIWORD(lParam) - data->map_orig.y) - / data->yScrTile)); - - /* if map has scrolled since the last mouse click - ignore - * double-click message */ - if (data->xLastMouseClick == x && data->yLastMouseClick == y) { - NHEVENT_MS(CLICK_1, x, y); - } - return 0; - - case WM_DESTROY: - if (data->hMapFont) - DeleteObject(data->hMapFont); - free(data); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - break; - - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} - -/* on WM_COMMAND */ -void -onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMapWindow data; - RECT rt; - - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (wParam) { - case MSNH_MSG_PRINT_GLYPH: { - PMSNHMsgPrintGlyph msg_data = (PMSNHMsgPrintGlyph) lParam; - data->map[msg_data->x][msg_data->y] = msg_data->glyph; - - /* invalidate the update area */ - nhcoord2display(data, msg_data->x, msg_data->y, &rt); - InvalidateRect(hWnd, &rt, TRUE); - } break; - - case MSNH_MSG_CLIPAROUND: { - PMSNHMsgClipAround msg_data = (PMSNHMsgClipAround) lParam; - int x, y; - BOOL scroll_x, scroll_y; - int mcam = iflags.wc_scroll_margin; - - /* calculate if you should clip around */ - scroll_x = - !GetNHApp()->bNoHScroll - && (msg_data->x < (data->xPos + mcam) - || msg_data->x > (data->xPos + data->xPageSize - mcam)); - scroll_y = - !GetNHApp()->bNoVScroll - && (msg_data->y < (data->yPos + mcam) - || msg_data->y > (data->yPos + data->yPageSize - mcam)); - - mcam += iflags.wc_scroll_amount - 1; - /* get page size and center horizontally on x-position */ - if (scroll_x) { - if (data->xPageSize <= 2 * mcam) { - x = max(0, min(COLNO, msg_data->x - data->xPageSize / 2)); - } else if (msg_data->x < data->xPos + data->xPageSize / 2) { - x = max(0, min(COLNO, msg_data->x - mcam)); - } else { - x = max(0, min(COLNO, msg_data->x - data->xPageSize + mcam)); - } - SendMessage(hWnd, WM_HSCROLL, (WPARAM) MAKELONG(SB_THUMBTRACK, x), - (LPARAM) NULL); - } - - /* get page size and center vertically on y-position */ - if (scroll_y) { - if (data->yPageSize <= 2 * mcam) { - y = max(0, min(ROWNO, msg_data->y - data->yPageSize / 2)); - } else if (msg_data->y < data->yPos + data->yPageSize / 2) { - y = max(0, min(ROWNO, msg_data->y - mcam)); - } else { - y = max(0, min(ROWNO, msg_data->y - data->yPageSize + mcam)); - } - SendMessage(hWnd, WM_VSCROLL, (WPARAM) MAKELONG(SB_THUMBTRACK, y), - (LPARAM) NULL); - } - } break; - - case MSNH_MSG_CLEAR_WINDOW: { - int i, j; - for (i = 0; i < COLNO; i++) - for (j = 0; j < ROWNO; j++) { - data->map[i][j] = -1; - } - InvalidateRect(hWnd, NULL, TRUE); - } break; - - case MSNH_MSG_CURSOR: { - PMSNHMsgCursor msg_data = (PMSNHMsgCursor) lParam; - HDC hdc; - RECT rt; - - /* move focus rectangle at the cursor postion */ - hdc = GetDC(hWnd); - - nhcoord2display(data, data->xCur, data->yCur, &rt); - if (data->bAsciiMode) { - PatBlt(hdc, rt.left, rt.top, rt.right - rt.left, - rt.bottom - rt.top, DSTINVERT); - } else { - DrawFocusRect(hdc, &rt); - } - - data->xCur = msg_data->x; - data->yCur = msg_data->y; - - nhcoord2display(data, data->xCur, data->yCur, &rt); - if (data->bAsciiMode) { - PatBlt(hdc, rt.left, rt.top, rt.right - rt.left, - rt.bottom - rt.top, DSTINVERT); - } else { - DrawFocusRect(hdc, &rt); - } - - ReleaseDC(hWnd, hdc); - } break; - } -} - -/* on WM_CREATE */ -void -onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMapWindow data; - int i, j; - - /* set window data */ - data = (PNHMapWindow) malloc(sizeof(NHMapWindow)); - if (!data) - panic("out of memory"); - - ZeroMemory(data, sizeof(NHMapWindow)); - for (i = 0; i < COLNO; i++) - for (j = 0; j < ROWNO; j++) { - data->map[i][j] = -1; - } - - data->bAsciiMode = FALSE; - - data->xScrTile = GetNHApp()->mapTile_X; - data->yScrTile = GetNHApp()->mapTile_Y; - - data->xLastMouseClick = data->yLastMouseClick = -1; - - SetWindowLong(hWnd, GWL_USERDATA, (LONG) data); -} - -/* on WM_PAINT */ -void -onPaint(HWND hWnd) -{ - PNHMapWindow data; - PAINTSTRUCT ps; - HDC hDC; - HDC tileDC; - HGDIOBJ saveBmp; - RECT paint_rt; - int i, j; - - /* get window data */ - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - - hDC = BeginPaint(hWnd, &ps); - - /* calculate paint rectangle */ - if (!IsRectEmpty(&ps.rcPaint)) { - /* calculate paint rectangle */ - paint_rt.left = - max(data->xPos - + (ps.rcPaint.left - data->map_orig.x) / data->xScrTile, - 0); - paint_rt.top = max( - data->yPos + (ps.rcPaint.top - data->map_orig.y) / data->yScrTile, - 0); - paint_rt.right = min( - data->xPos - + (ps.rcPaint.right - data->map_orig.x) / data->xScrTile + 1, - COLNO); - paint_rt.bottom = min( - data->yPos - + (ps.rcPaint.bottom - data->map_orig.y) / data->yScrTile + 1, - ROWNO); - - if (data->bAsciiMode || Is_rogue_level(&u.uz)) { - /* You enter a VERY primitive world! */ - HGDIOBJ oldFont; - - oldFont = SelectObject(hDC, data->hMapFont); - SetBkMode(hDC, TRANSPARENT); - - /* draw the map */ - for (i = paint_rt.left; i < paint_rt.right; i++) - for (j = paint_rt.top; j < paint_rt.bottom; j++) - if (data->map[i][j] >= 0) { - char ch; - TCHAR wch; - RECT glyph_rect; - int color; - unsigned special; - int mgch; - HBRUSH back_brush; - COLORREF OldFg; - - nhcoord2display(data, i, j, &glyph_rect); - -#if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) - nhglyph2charcolor(data->map[i][j], &ch, &color); - OldFg = SetTextColor(hDC, nhcolor_to_RGB(color)); -#else - /* rely on NetHack core helper routine */ - (void) mapglyph(data->map[i][j], &mgch, &color, - &special, i, j, 0); - ch = (char) mgch; - if (((special & MG_PET) && iflags.hilite_pet) - || ((special & MG_DETECT) - && iflags.use_inverse)) { - back_brush = - CreateSolidBrush(nhcolor_to_RGB(CLR_GRAY)); - FillRect(hDC, &glyph_rect, back_brush); - DeleteObject(back_brush); - switch (color) { - case CLR_GRAY: - case CLR_WHITE: - OldFg = SetTextColor( - hDC, nhcolor_to_RGB(CLR_BLACK)); - break; - default: - OldFg = - SetTextColor(hDC, nhcolor_to_RGB(color)); - } - } else { - OldFg = SetTextColor(hDC, nhcolor_to_RGB(color)); - } -#endif - - DrawText(hDC, NH_A2W(&ch, &wch, 1), 1, &glyph_rect, - DT_CENTER | DT_VCENTER | DT_NOPREFIX); - SetTextColor(hDC, OldFg); - } - SelectObject(hDC, oldFont); - } else { - /* prepare tiles DC for mapping */ - tileDC = CreateCompatibleDC(hDC); - saveBmp = SelectObject(tileDC, GetNHApp()->bmpMapTiles); - - /* draw the map */ - for (i = paint_rt.left; i < paint_rt.right; i++) - for (j = paint_rt.top; j < paint_rt.bottom; j++) - if (data->map[i][j] >= 0) { - short ntile; - int t_x, t_y; - RECT glyph_rect; - - ntile = glyph2tile[data->map[i][j]]; - t_x = (ntile % GetNHApp()->mapTilesPerLine) - * GetNHApp()->mapTile_X; - t_y = (ntile / GetNHApp()->mapTilesPerLine) - * GetNHApp()->mapTile_Y; - - nhcoord2display(data, i, j, &glyph_rect); - - StretchBlt(hDC, glyph_rect.left, glyph_rect.top, - data->xScrTile, data->yScrTile, tileDC, - t_x, t_y, GetNHApp()->mapTile_X, - GetNHApp()->mapTile_Y, SRCCOPY); - if (glyph_is_pet(data->map[i][j]) - && iflags.wc_hilite_pet) { - /* apply pet mark transparently over - pet image */ - HDC hdcPetMark; - HBITMAP bmPetMarkOld; - - /* this is DC for petmark bitmap */ - hdcPetMark = CreateCompatibleDC(hDC); - bmPetMarkOld = SelectObject( - hdcPetMark, GetNHApp()->bmpPetMark); - - nhapply_image_transparent( - hDC, glyph_rect.left, glyph_rect.top, - data->xScrTile, data->yScrTile, hdcPetMark, 0, - 0, TILE_X, TILE_Y, TILE_BK_COLOR); - SelectObject(hdcPetMark, bmPetMarkOld); - DeleteDC(hdcPetMark); - } - } - SelectObject(tileDC, saveBmp); - DeleteDC(tileDC); - } - - /* draw focus rect */ - nhcoord2display(data, data->xCur, data->yCur, &paint_rt); - if (data->bAsciiMode) { - PatBlt(hDC, paint_rt.left, paint_rt.top, - paint_rt.right - paint_rt.left, - paint_rt.bottom - paint_rt.top, DSTINVERT); - } else { - DrawFocusRect(hDC, &paint_rt); - } - } - EndPaint(hWnd, &ps); -} - -/* on WM_VSCROLL */ -void -onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMapWindow data; - SCROLLINFO si; - int yNewPos; - int yDelta; - - /* get window data */ - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - - switch (LOWORD(wParam)) { - /* User clicked shaft left of the scroll box. */ - case SB_PAGEUP: - yNewPos = data->yPos - data->yPageSize; - break; - - /* User clicked shaft right of the scroll box. */ - case SB_PAGEDOWN: - yNewPos = data->yPos + data->yPageSize; - break; - - /* User clicked the left arrow. */ - case SB_LINEUP: - yNewPos = data->yPos - 1; - break; - - /* User clicked the right arrow. */ - case SB_LINEDOWN: - yNewPos = data->yPos + 1; - break; - - /* User dragged the scroll box. */ - case SB_THUMBTRACK: - yNewPos = HIWORD(wParam); - break; - - default: - yNewPos = data->yPos; - } - - yNewPos = max(0, min(ROWNO - data->yPageSize + 1, yNewPos)); - if (yNewPos == data->yPos) - return; - - yDelta = yNewPos - data->yPos; - data->yPos = yNewPos; - - ScrollWindowEx(hWnd, 0, -data->yScrTile * yDelta, (CONST RECT *) NULL, - (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, - SW_INVALIDATE | SW_ERASE); - - if (!GetNHApp()->bHideScrollBars) { - si.cbSize = sizeof(si); - si.fMask = SIF_POS; - si.nPos = data->yPos; - SetScrollInfo(hWnd, SB_VERT, &si, TRUE); - } -} - -/* on WM_HSCROLL */ -void -onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMapWindow data; - SCROLLINFO si; - int xNewPos; - int xDelta; - - /* get window data */ - data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA); - - switch (LOWORD(wParam)) { - /* User clicked shaft left of the scroll box. */ - case SB_PAGEUP: - xNewPos = data->xPos - data->xPageSize; - break; - - /* User clicked shaft right of the scroll box. */ - case SB_PAGEDOWN: - xNewPos = data->xPos + data->xPageSize; - break; - - /* User clicked the left arrow. */ - case SB_LINEUP: - xNewPos = data->xPos - 1; - break; - - /* User clicked the right arrow. */ - case SB_LINEDOWN: - xNewPos = data->xPos + 1; - break; - - /* User dragged the scroll box. */ - case SB_THUMBTRACK: - xNewPos = HIWORD(wParam); - break; - - default: - xNewPos = data->xPos; - } - - xNewPos = max(0, min(COLNO - data->xPageSize + 1, xNewPos)); - if (xNewPos == data->xPos) - return; - - xDelta = xNewPos - data->xPos; - data->xPos = xNewPos; - - ScrollWindowEx(hWnd, -data->xScrTile * xDelta, 0, (CONST RECT *) NULL, - (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, - SW_INVALIDATE | SW_ERASE); - - if (!GetNHApp()->bHideScrollBars) { - si.cbSize = sizeof(si); - si.fMask = SIF_POS; - si.nPos = data->xPos; - SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); - } -} - -/* map nethack map coordinates to the screen location */ -void -nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut) -{ - lpOut->left = (x - data->xPos) * data->xScrTile + data->map_orig.x; - lpOut->top = (y - data->yPos) * data->yScrTile + data->map_orig.y; - lpOut->right = lpOut->left + data->xScrTile; - lpOut->bottom = lpOut->top + data->yScrTile; -} - -#if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) -/* map glyph to character/color combination */ -void -nhglyph2charcolor(short g, uchar *ch, int *color) -{ - int offset; -#ifdef TEXTCOLOR - -#define zap_color(n) *color = iflags.use_color ? zapcolors[n] : NO_COLOR -#define cmap_color(n) *color = iflags.use_color ? defsyms[n].color : NO_COLOR -#define obj_color(n) \ - *color = iflags.use_color ? objects[n].oc_color : NO_COLOR -#define mon_color(n) *color = iflags.use_color ? mons[n].mcolor : NO_COLOR -#define pet_color(n) *color = iflags.use_color ? mons[n].mcolor : NO_COLOR -#define warn_color(n) \ - *color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR - -#else /* no text color */ - -#define zap_color(n) -#define cmap_color(n) -#define obj_color(n) -#define mon_color(n) -#define pet_color(c) -#define warn_color(c) - *color = CLR_WHITE; -#endif - - if ((offset = (g - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ - *ch = showsyms[offset + SYM_OFF_W]; - warn_color(offset); - } else if ((offset = (g - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ - /* see swallow_to_glyph() in display.c */ - *ch = (uchar) showsyms[(S_sw_tl + (offset & 0x7)) + SYM_OFF_P]; - mon_color(offset >> 3); - } else if ((offset = (g - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ - /* see zapdir_to_glyph() in display.c */ - *ch = showsyms[(S_vbeam + (offset & 0x3)) + SYM_OFF_P]; - zap_color((offset >> 2)); - } else if ((offset = (g - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ - *ch = showsyms[offset + SYM_OFF_P]; - cmap_color(offset); - } else if ((offset = (g - GLYPH_OBJ_OFF)) >= 0) { /* object */ - *ch = showsyms[(int) objects[offset].oc_class + SYM_OFF_O]; - obj_color(offset); - } else if ((offset = (g - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ - *ch = showsyms[(int) objects[CORPSE].oc_class + SYM_OFF_O]; - mon_color(offset); - } else if ((offset = (g - GLYPH_PET_OFF)) >= 0) { /* a pet */ - *ch = showsyms[(int) mons[offset].mlet + SYM_OFF_M]; - pet_color(offset); - } else { /* a monster */ - *ch = showsyms[(int) mons[g].mlet + SYM_OFF_M]; - mon_color(g); - } - // end of wintty code -} -#endif - -/* map nethack color to RGB */ -COLORREF -nhcolor_to_RGB(int c) -{ - switch (c) { - case CLR_BLACK: - return RGB(0x55, 0x55, 0x55); - case CLR_RED: - return RGB(0xFF, 0x00, 0x00); - case CLR_GREEN: - return RGB(0x00, 0x80, 0x00); - case CLR_BROWN: - return RGB(0xA5, 0x2A, 0x2A); - case CLR_BLUE: - return RGB(0x00, 0x00, 0xFF); - case CLR_MAGENTA: - return RGB(0xFF, 0x00, 0xFF); - case CLR_CYAN: - return RGB(0x00, 0xFF, 0xFF); - case CLR_GRAY: - return RGB(0xC0, 0xC0, 0xC0); - case NO_COLOR: - return RGB(0xFF, 0xFF, 0xFF); - case CLR_ORANGE: - return RGB(0xFF, 0xA5, 0x00); - case CLR_BRIGHT_GREEN: - return RGB(0x00, 0xFF, 0x00); - case CLR_YELLOW: - return RGB(0xFF, 0xFF, 0x00); - case CLR_BRIGHT_BLUE: - return RGB(0x00, 0xC0, 0xFF); - case CLR_BRIGHT_MAGENTA: - return RGB(0xFF, 0x80, 0xFF); - case CLR_BRIGHT_CYAN: - return RGB(0x80, 0xFF, 0xFF); /* something close to aquamarine */ - case CLR_WHITE: - return RGB(0xFF, 0xFF, 0xFF); - default: - return RGB(0x00, 0x00, 0x00); /* black */ - } -} - -/* apply bitmap pointed by sourceDc transparently over - bitmap pointed by hDC */ -void -nhapply_image_transparent(HDC hDC, int x, int y, int width, int height, - HDC sourceDC, int s_x, int s_y, int s_width, - int s_height, COLORREF cTransparent) -{ - TransparentImage(hDC, x, y, width, height, sourceDC, s_x, s_y, s_width, - s_height, cTransparent); -} diff --git a/sys/wince/mhmap.h b/sys/wince/mhmap.h deleted file mode 100644 index 908cd7498..000000000 --- a/sys/wince/mhmap.h +++ /dev/null @@ -1,22 +0,0 @@ -/* NetHack 3.6 mhmap.h $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINMapWindow_h -#define MSWINMapWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -HWND mswin_init_map_window(void); -void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw); -int mswin_map_mode(HWND hWnd, int mode); -void mswin_map_get_cursor(HWND hWnd, int *x, int *y); - -#define ROGUE_LEVEL_MAP_MODE MAP_MODE_ASCII12x16 - -#define DEF_CLIPAROUND_MARGIN 5 -#define DEF_CLIPAROUND_AMOUNT 1 - -#endif /* MSWINMapWindow_h */ diff --git a/sys/wince/mhmenu.c b/sys/wince/mhmenu.c deleted file mode 100644 index 4aa5f19f4..000000000 --- a/sys/wince/mhmenu.c +++ /dev/null @@ -1,1613 +0,0 @@ -/* NetHack 3.6 mhmenu.c $NHDT-Date: 1524689398 2018/04/25 20:49:58 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.28 $ */ -/* Copyright (c) 2009 by Michael Allison */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include -#include "mhmenu.h" -#include "mhmain.h" -#include "mhmsg.h" -#include "mhcmd.h" -#include "mhinput.h" -#include "mhfont.h" -#include "mhcolor.h" -#include "mhtxtbuf.h" - -#define MENU_MARGIN 0 -#define NHMENU_STR_SIZE BUFSZ -#define MIN_TABSTOP_SIZE 0 -#define NUMTABS 15 -#define TAB_SEPARATION 10 /* pixels between each tab stop */ - -typedef struct mswin_menu_item { - int glyph; - ANY_P identifier; - CHAR_P accelerator; - CHAR_P group_accel; - int attr; - char str[NHMENU_STR_SIZE]; - BOOLEAN_P presel; - int count; - BOOL has_focus; - BOOL has_tab; -} NHMenuItem, *PNHMenuItem; - -typedef struct mswin_nethack_menu_window { - int type; /* MENU_TYPE_TEXT or MENU_TYPE_MENU */ - int how; /* for menus: PICK_NONE, PICK_ONE, PICK_ANY */ - - union { - struct menu_list { - int size; /* number of items in items[] */ - int allocated; /* number of allocated slots in items[] */ - PNHMenuItem items; /* menu items */ - char gacc[QBUFSZ]; /* group accelerators */ - BOOL counting; /* counting flag */ - char prompt[QBUFSZ]; /* menu prompt */ - int tab_stop_size[NUMTABS]; /* tabstops to align option values */ - } menu; - - struct menu_text { - PNHTextBuffer text; - } text; - }; - int result; - int done; - - HBITMAP bmpChecked; - HBITMAP bmpCheckedCount; - HBITMAP bmpNotChecked; -} NHMenuWindow, *PNHMenuWindow; - -extern short glyph2tile[]; - -static WNDPROC wndProcListViewOrig = NULL; -static WNDPROC editControlWndProc = NULL; - -#define NHMENU_IS_SELECTABLE(item) ((item).identifier.a_obj != NULL) -#define NHMENU_IS_SELECTED(item) ((item).count != 0) - -LRESULT CALLBACK MenuWndProc(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK NHMenuListWndProc(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK NHMenuTextWndProc(HWND, UINT, WPARAM, LPARAM); -static void CheckInputDialog(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam); -static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static LRESULT onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam); -static LRESULT onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void LayoutMenu(HWND hwnd); -static void SetMenuType(HWND hwnd, int type); -static void SetMenuListType(HWND hwnd, int now); -static HWND GetMenuControl(HWND hwnd); -static void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, - int count); -static void reset_menu_count(HWND hwndList, PNHMenuWindow data); -static LRESULT onListChar(HWND hWnd, HWND hwndList, WORD ch); -static char *parse_menu_str(char *dest, const char *src, size_t size); - -HWND -mswin_init_menu_window(int type) -{ - HWND ret; - - ret = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_MENU), - GetNHApp()->hMainWnd, MenuWndProc); - if (!ret) { - panic("Cannot create menu window"); - } - - SetMenuType(ret, type); - return ret; -} - -int -mswin_menu_window_select_menu(HWND hWnd, int how, MENU_ITEM_P **_selected) -{ - PNHMenuWindow data; - int ret_val; - MENU_ITEM_P *selected = NULL; - int i; - char *ap; - char accell_str[256]; - - assert(_selected != NULL); - *_selected = NULL; - ret_val = -1; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - - /* set menu type */ - SetMenuListType(hWnd, how); - - /* Ok, now give items a unique accelerators */ - ZeroMemory(accell_str, sizeof(accell_str)); - ap = accell_str; - -#if defined(WIN_CE_SMARTPHONE) - if (data->menu.size > 10) { - *ap++ = MENU_FIRST_PAGE; - *ap++ = MENU_LAST_PAGE; - *ap++ = MENU_NEXT_PAGE; - *ap++ = MENU_PREVIOUS_PAGE; - if (data->how == PICK_ANY) { - *ap++ = MENU_SELECT_ALL; - *ap++ = MENU_UNSELECT_ALL; - *ap++ = MENU_INVERT_ALL; - *ap++ = MENU_SELECT_PAGE; - *ap++ = MENU_UNSELECT_PAGE; - *ap++ = MENU_INVERT_PAGE; - } - *ap++ = MENU_SEARCH; - } -#endif - - if (data->type == MENU_TYPE_MENU) { - char next_char = 'a'; - - for (i = 0; i < data->menu.size; i++) { - if (data->menu.items[i].accelerator != 0) { - *ap++ = data->menu.items[i].accelerator; - next_char = (char) (data->menu.items[i].accelerator + 1); - } else if (NHMENU_IS_SELECTABLE(data->menu.items[i])) { - if ((next_char >= 'a' && next_char <= 'z') - || (next_char >= 'A' && next_char <= 'Z')) { - data->menu.items[i].accelerator = next_char; - *ap++ = data->menu.items[i].accelerator; - } else { - if (next_char > 'z') - next_char = 'A'; - else if (next_char > 'Z') - break; - - data->menu.items[i].accelerator = next_char; - *ap++ = data->menu.items[i].accelerator; - } - - next_char++; - } - } - - /* collect group accelerators */ - data->menu.gacc[0] = '\0'; - ap = data->menu.gacc; - if (data->how != PICK_NONE) { - for (i = 0; i < data->menu.size; i++) { - if (data->menu.items[i].group_accel - && !strchr(data->menu.gacc, - data->menu.items[i].group_accel)) { - *ap++ = data->menu.items[i].group_accel; - *ap = '\x0'; - } - } - } - - reset_menu_count(NULL, data); - } - -#if defined(WIN_CE_SMARTPHONE) - if (data->type == MENU_TYPE_MENU) - NHSPhoneSetKeypadFromString(accell_str); -#endif - - mswin_popup_display(hWnd, &data->done); - - /* get the result */ - if (data->result != -1) { - if (how == PICK_NONE) { - if (data->result >= 0) - ret_val = 0; - else - ret_val = -1; - } else if (how == PICK_ONE || how == PICK_ANY) { - /* count selected items */ - ret_val = 0; - for (i = 0; i < data->menu.size; i++) { - if (NHMENU_IS_SELECTABLE(data->menu.items[i]) - && NHMENU_IS_SELECTED(data->menu.items[i])) { - ret_val++; - } - } - if (ret_val > 0) { - int sel_ind; - - selected = - (MENU_ITEM_P *) malloc(ret_val * sizeof(MENU_ITEM_P)); - if (!selected) - panic("out of memory"); - - sel_ind = 0; - for (i = 0; i < data->menu.size; i++) { - if (NHMENU_IS_SELECTABLE(data->menu.items[i]) - && NHMENU_IS_SELECTED(data->menu.items[i])) { - selected[sel_ind].item = - data->menu.items[i].identifier; - selected[sel_ind].count = data->menu.items[i].count; - sel_ind++; - } - } - ret_val = sel_ind; - *_selected = selected; - } - } - } - - mswin_popup_destroy(hWnd); - -#if defined(WIN_CE_SMARTPHONE) - if (data->type == MENU_TYPE_MENU) - NHSPhoneSetKeypadDefault(); -#endif - - return ret_val; -} - -LRESULT CALLBACK -MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - PNHMenuWindow data; - - CheckInputDialog(hWnd, message, wParam, lParam); - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (message) { - case WM_INITDIALOG: { - HWND text_control; - HDC hDC; - - text_control = GetDlgItem(hWnd, IDC_MENU_TEXT); - - data = (PNHMenuWindow) malloc(sizeof(NHMenuWindow)); - ZeroMemory(data, sizeof(NHMenuWindow)); - data->type = MENU_TYPE_TEXT; - data->how = PICK_NONE; - data->result = 0; - data->done = 0; - data->bmpChecked = - LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL)); - data->bmpCheckedCount = - LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL_COUNT)); - data->bmpNotChecked = - LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL)); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) data); - - /* subclass edit control */ - editControlWndProc = - (WNDPROC) GetWindowLong(text_control, GWL_WNDPROC); - SetWindowLong(text_control, GWL_WNDPROC, (LONG) NHMenuTextWndProc); - - /* set text window font */ - hDC = GetDC(text_control); - SendMessage(text_control, WM_SETFONT, - (WPARAM) mswin_get_font(NHW_TEXT, ATR_NONE, hDC, FALSE), - (LPARAM) 0); - ReleaseDC(text_control, hDC); - -#if defined(WIN_CE_SMARTPHONE) - /* special initialization for SmartPhone dialogs */ - NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, FALSE, - GetNHApp()->bFullScreen); -#endif - } break; - - case WM_MSNH_COMMAND: - onMSNHCommand(hWnd, wParam, lParam); - break; - - case WM_SIZE: - LayoutMenu(hWnd); - return FALSE; - - case WM_COMMAND: { - switch (LOWORD(wParam)) { - case IDCANCEL: - if (data->type == MENU_TYPE_MENU - && (data->how == PICK_ONE || data->how == PICK_ANY) - && data->menu.counting) { - HWND list; - int i; - - /* reset counter if counting is in progress */ - list = GetMenuControl(hWnd); - i = ListView_GetNextItem(list, -1, LVNI_FOCUSED); - if (i >= 0) { - SelectMenuItem(list, data, i, 0); - } - return FALSE; - } else { - data->result = -1; - data->done = 1; - } - return FALSE; - - case IDOK: - data->done = 1; - data->result = 0; - return FALSE; - } - } break; - - case WM_NOTIFY: { - LPNMHDR lpnmhdr = (LPNMHDR) lParam; - switch (LOWORD(wParam)) { - case IDC_MENU_LIST: { - if (!data || data->type != MENU_TYPE_MENU) - break; - - switch (lpnmhdr->code) { - case LVN_ITEMACTIVATE: { - LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam; - if (data->how == PICK_ONE) { - if (lpnmlv->iItem >= 0 && lpnmlv->iItem < data->menu.size - && NHMENU_IS_SELECTABLE( - data->menu.items[lpnmlv->iItem])) { - SelectMenuItem(lpnmlv->hdr.hwndFrom, data, - lpnmlv->iItem, -1); - data->done = 1; - data->result = 0; - return TRUE; - } - } else if (data->how == PICK_ANY) { - if (lpnmlv->iItem >= 0 && lpnmlv->iItem < data->menu.size - && NHMENU_IS_SELECTABLE( - data->menu.items[lpnmlv->iItem])) { - SelectMenuItem(lpnmlv->hdr.hwndFrom, data, - lpnmlv->iItem, - NHMENU_IS_SELECTED( - data->menu.items[lpnmlv->iItem]) - ? 0 - : -1); - } - } - } break; - - case NM_CLICK: { - LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam; - if (lpnmlv->iItem == -1) - return 0; - if (data->how == PICK_ANY) { - SelectMenuItem( - lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, - NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem]) - ? 0 - : -1); - } - } break; - - case LVN_ITEMCHANGED: { - LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam; - if (lpnmlv->iItem == -1) - return 0; - if (!(lpnmlv->uChanged & LVIF_STATE)) - return 0; - - /* update item that has the focus */ - data->menu.items[lpnmlv->iItem].has_focus = - !!(lpnmlv->uNewState & LVIS_FOCUSED); - ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, - lpnmlv->iItem); - - /* update count for single-selection menu (follow the listview - * selection) */ - if (data->how == PICK_ONE) { - if (lpnmlv->uNewState & LVIS_SELECTED) { - SelectMenuItem(lpnmlv->hdr.hwndFrom, data, - lpnmlv->iItem, -1); - } - } - - /* check item focus */ - data->menu.items[lpnmlv->iItem].has_focus = - !!(lpnmlv->uNewState & LVIS_FOCUSED); - ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, - lpnmlv->iItem); - } break; - - case NM_KILLFOCUS: - reset_menu_count(lpnmhdr->hwndFrom, data); - break; - } - } break; - } - } break; - - case WM_SETFOCUS: - if (hWnd != GetNHApp()->hPopupWnd) { - SetFocus(GetNHApp()->hPopupWnd); - return 0; - } - break; - - case WM_MEASUREITEM: - if (wParam == IDC_MENU_LIST) - return onMeasureItem(hWnd, wParam, lParam); - else - return FALSE; - - case WM_DRAWITEM: - if (wParam == IDC_MENU_LIST) - return onDrawItem(hWnd, wParam, lParam); - else - return FALSE; - - case WM_CTLCOLORBTN: - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ - HDC hdcEdit = (HDC) wParam; - HWND hwndEdit = (HWND) lParam; - if (hwndEdit == GetDlgItem(hWnd, IDC_MENU_TEXT)) { - SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG)); - SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); - return (BOOL) mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG); - } - } - return FALSE; - - case WM_DESTROY: - if (data) { - DeleteObject(data->bmpChecked); - DeleteObject(data->bmpCheckedCount); - DeleteObject(data->bmpNotChecked); - if (data->type == MENU_TYPE_TEXT) { - if (data->text.text) { - mswin_free_text_buffer(data->text.text); - data->text.text = NULL; - } - } - free(data); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - } - return TRUE; - } - return FALSE; -} - -void -CheckInputDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ -#if defined(WIN_CE_POCKETPC) - PNHMenuWindow data; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - - if (!(data && data->type == MENU_TYPE_MENU - && (data->how == PICK_ONE || data->how == PICK_ANY))) - return; - - switch (message) { - case WM_SETFOCUS: - if (GetNHApp()->bUseSIP) - SHSipPreference(hWnd, SIP_UP); - return; - - case WM_DESTROY: - case WM_KILLFOCUS: - if (GetNHApp()->bUseSIP) - SHSipPreference(hWnd, SIP_DOWN); - return; - - case WM_NOTIFY: { - LPNMHDR lpnmhdr = (LPNMHDR) lParam; - switch (lpnmhdr->code) { - case NM_SETFOCUS: - if (GetNHApp()->bUseSIP) - SHSipPreference(hWnd, SIP_UP); - break; - case NM_KILLFOCUS: - if (GetNHApp()->bUseSIP) - SHSipPreference(hWnd, SIP_DOWN); - break; - } - } - return; - - case WM_COMMAND: - switch (HIWORD(wParam)) { - case BN_SETFOCUS: - if (GetNHApp()->bUseSIP) - SHSipPreference(hWnd, SIP_UP); - break; - case BN_KILLFOCUS: - if (GetNHApp()->bUseSIP) - SHSipPreference(hWnd, SIP_DOWN); - break; - } - return; - - } /* end switch */ -#endif -} - -void -onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMenuWindow data; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (wParam) { - case MSNH_MSG_PUTSTR: { - PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr) lParam; - HWND text_view; - - if (data->type != MENU_TYPE_TEXT) - SetMenuType(hWnd, MENU_TYPE_TEXT); - - if (!data->text.text) { - data->text.text = mswin_init_text_buffer( - program_state.gameover ? FALSE : GetNHApp()->bWrapText); - if (!data->text.text) - break; - } - - mswin_add_text(data->text.text, msg_data->attr, msg_data->text); - - text_view = GetDlgItem(hWnd, IDC_MENU_TEXT); - if (!text_view) - panic("cannot get text view window"); - mswin_render_text(data->text.text, text_view); - } break; - - case MSNH_MSG_STARTMENU: { - int i; - - if (data->type != MENU_TYPE_MENU) - SetMenuType(hWnd, MENU_TYPE_MENU); - - if (data->menu.items) - free(data->menu.items); - data->how = PICK_NONE; - data->menu.items = NULL; - data->menu.size = 0; - data->menu.allocated = 0; - data->done = 0; - data->result = 0; - for (i = 0; i < NUMTABS; ++i) - data->menu.tab_stop_size[i] = MIN_TABSTOP_SIZE; - } break; - - case MSNH_MSG_ADDMENU: { - PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu) lParam; - char *p, *p1; - int new_item; - HDC hDC; - int column; - HFONT saveFont; - - if (data->type != MENU_TYPE_MENU) - break; - if (strlen(msg_data->str) == 0) - break; - - if (data->menu.size == data->menu.allocated) { - data->menu.allocated += 10; - data->menu.items = (PNHMenuItem) realloc( - data->menu.items, data->menu.allocated * sizeof(NHMenuItem)); - } - - new_item = data->menu.size; - ZeroMemory(&data->menu.items[new_item], - sizeof(data->menu.items[new_item])); - data->menu.items[new_item].glyph = msg_data->glyph; - data->menu.items[new_item].identifier = *msg_data->identifier; - data->menu.items[new_item].accelerator = msg_data->accelerator; - data->menu.items[new_item].group_accel = msg_data->group_accel; - data->menu.items[new_item].attr = msg_data->attr; - parse_menu_str(data->menu.items[new_item].str, msg_data->str, - NHMENU_STR_SIZE); - data->menu.items[new_item].presel = msg_data->presel; - - /* calculate tabstop size */ - p = strchr(data->menu.items[new_item].str, '\t'); - if (p) { - data->menu.items[new_item].has_tab = TRUE; - hDC = GetDC(hWnd); - saveFont = SelectObject( - hDC, mswin_get_font(NHW_MENU, msg_data->attr, hDC, FALSE)); - p1 = data->menu.items[new_item].str; - column = 0; - for (;;) { - TCHAR wbuf[BUFSZ]; - RECT drawRect; - SetRect(&drawRect, 0, 0, 1, 1); - if (p != NULL) - *p = '\0'; /* for time being, view tab field as zstring */ - DrawText(hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect, - DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS - | DT_SINGLELINE); - data->menu.tab_stop_size[column] = - max(data->menu.tab_stop_size[column], - drawRect.right - drawRect.left); - if (p != NULL) - *p = '\t'; - else /* last string so, */ - break; - - ++column; - p1 = p + 1; - p = strchr(p1, '\t'); - } - SelectObject(hDC, saveFont); - ReleaseDC(hWnd, hDC); - } else { - data->menu.items[new_item].has_tab = FALSE; - } - - /* increment size */ - data->menu.size++; - } break; - - case MSNH_MSG_ENDMENU: { - PMSNHMsgEndMenu msg_data = (PMSNHMsgEndMenu) lParam; - if (msg_data->text) { - strncpy(data->menu.prompt, msg_data->text, - sizeof(data->menu.prompt) - 1); - } else { - ZeroMemory(data->menu.prompt, sizeof(data->menu.prompt)); - } - } break; - - } /* end switch */ -} - -void -LayoutMenu(HWND hWnd) -{ - PNHMenuWindow data; - HWND menu_ok; - HWND menu_cancel; - RECT clrt, rt; - POINT pt_elem, pt_ok, pt_cancel; - SIZE sz_elem, sz_ok, sz_cancel; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - menu_ok = GetDlgItem(hWnd, IDOK); - menu_cancel = GetDlgItem(hWnd, IDCANCEL); - - /* get window coordinates */ - GetClientRect(hWnd, &clrt); - - /* set window placements */ - if (IsWindow(menu_ok)) { - GetWindowRect(menu_ok, &rt); - sz_ok.cx = (clrt.right - clrt.left) / 2 - 2 * MENU_MARGIN; - sz_ok.cy = rt.bottom - rt.top; - pt_ok.x = clrt.left + MENU_MARGIN; - pt_ok.y = clrt.bottom - MENU_MARGIN - sz_ok.cy; - MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE); - } else { - pt_ok.x = 0; - pt_ok.y = clrt.bottom; - sz_ok.cx = sz_ok.cy = 0; - } - - if (IsWindow(menu_cancel)) { - GetWindowRect(menu_cancel, &rt); - sz_cancel.cx = (clrt.right - clrt.left) / 2 - 2 * MENU_MARGIN; - sz_cancel.cy = rt.bottom - rt.top; - pt_cancel.x = (clrt.left + clrt.right) / 2 + MENU_MARGIN; - pt_cancel.y = clrt.bottom - MENU_MARGIN - sz_cancel.cy; - MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, - sz_cancel.cy, TRUE); - } else { - pt_cancel.x = 0; - pt_cancel.y = clrt.bottom; - sz_cancel.cx = sz_cancel.cy = 0; - } - - pt_elem.x = clrt.left + MENU_MARGIN; - pt_elem.y = clrt.top + MENU_MARGIN; - sz_elem.cx = (clrt.right - clrt.left) - 2 * MENU_MARGIN; - sz_elem.cy = min(pt_cancel.y, pt_ok.y) - MENU_MARGIN - pt_elem.y; - MoveWindow(GetMenuControl(hWnd), pt_elem.x, pt_elem.y, sz_elem.cx, - sz_elem.cy, TRUE); - - /* reformat text for the text menu */ - if (data && data->type == MENU_TYPE_TEXT && data->text.text) - mswin_render_text(data->text.text, GetMenuControl(hWnd)); -} - -void -SetMenuType(HWND hWnd, int type) -{ - PNHMenuWindow data; - HWND list, text; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - - data->type = type; - - text = GetDlgItem(hWnd, IDC_MENU_TEXT); - list = GetDlgItem(hWnd, IDC_MENU_LIST); - if (data->type == MENU_TYPE_TEXT) { - ShowWindow(list, SW_HIDE); - EnableWindow(list, FALSE); - EnableWindow(text, TRUE); - ShowWindow(text, SW_SHOW); - SetFocus(text); - } else { - ShowWindow(text, SW_HIDE); - EnableWindow(text, FALSE); - EnableWindow(list, TRUE); - ShowWindow(list, SW_SHOW); - SetFocus(list); - } - LayoutMenu(hWnd); -} - -void -SetMenuListType(HWND hWnd, int how) -{ - PNHMenuWindow data; - RECT rt; - DWORD dwStyles; - char buf[BUFSZ]; - TCHAR wbuf[BUFSZ]; - int nItem; - int i; - HWND control; - LVCOLUMN lvcol; - LRESULT fnt; - SIZE wnd_size; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data->type != MENU_TYPE_MENU) - return; - - data->how = how; - - switch (how) { - case PICK_NONE: - dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL - | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED - | LVS_SINGLESEL; - break; - case PICK_ONE: - dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL - | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED - | LVS_SINGLESEL; - break; - case PICK_ANY: - dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL - | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED - | LVS_SINGLESEL; - break; - default: - panic("how should be one of PICK_NONE, PICK_ONE or PICK_ANY"); - }; - if (strlen(data->menu.prompt) == 0) { - dwStyles |= LVS_NOCOLUMNHEADER; - } - - GetWindowRect(GetDlgItem(hWnd, IDC_MENU_LIST), &rt); - DestroyWindow(GetDlgItem(hWnd, IDC_MENU_LIST)); - control = CreateWindow(WC_LISTVIEW, NULL, dwStyles, rt.left, rt.top, - rt.right - rt.left, rt.bottom - rt.top, hWnd, - (HMENU) IDC_MENU_LIST, GetNHApp()->hApp, NULL); - if (!control) - panic("cannot create menu control"); - - /* install the hook for the control window procedure */ - wndProcListViewOrig = (WNDPROC) GetWindowLong(control, GWL_WNDPROC); - SetWindowLong(control, GWL_WNDPROC, (LONG) NHMenuListWndProc); - - /* set control font */ - fnt = SendMessage(hWnd, WM_GETFONT, (WPARAM) 0, (LPARAM) 0); - SendMessage(control, WM_SETFONT, (WPARAM) fnt, (LPARAM) 0); - - /* set control colors */ - ListView_SetBkColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_BG)); - ListView_SetTextBkColor(control, - mswin_get_color(NHW_MENU, MSWIN_COLOR_BG)); - ListView_SetTextColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_FG)); - - /* add column to the list view */ - mswin_menu_window_size(hWnd, &wnd_size); - - ZeroMemory(&lvcol, sizeof(lvcol)); - lvcol.mask = LVCF_WIDTH | LVCF_TEXT; - lvcol.cx = max(wnd_size.cx, GetSystemMetrics(SM_CXSCREEN)); - lvcol.pszText = NH_A2W(data->menu.prompt, wbuf, BUFSZ); - ListView_InsertColumn(control, 0, &lvcol); - - /* add items to the list view */ - for (i = 0; i < data->menu.size; i++) { - LVITEM lvitem; - ZeroMemory(&lvitem, sizeof(lvitem)); - sprintf(buf, "%c - %s", max(data->menu.items[i].accelerator, ' '), - data->menu.items[i].str); - - lvitem.mask = LVIF_PARAM | LVIF_STATE | LVIF_TEXT; - lvitem.iItem = i; - lvitem.iSubItem = 0; - lvitem.state = data->menu.items[i].presel ? LVIS_SELECTED : 0; - lvitem.pszText = NH_A2W(buf, wbuf, BUFSZ); - lvitem.lParam = (LPARAM) &data->menu.items[i]; - nItem = SendMessage(control, LB_ADDSTRING, (WPARAM) 0, (LPARAM) buf); - if (ListView_InsertItem(control, &lvitem) == -1) { - panic("cannot insert menu item"); - } - } - SetFocus(control); -} - -HWND -GetMenuControl(HWND hWnd) -{ - PNHMenuWindow data; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - - if (data->type == MENU_TYPE_TEXT) { - return GetDlgItem(hWnd, IDC_MENU_TEXT); - } else { - return GetDlgItem(hWnd, IDC_MENU_LIST); - } -} - -LRESULT -onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - LPMEASUREITEMSTRUCT lpmis; - TEXTMETRIC tm; - HGDIOBJ saveFont; - HDC hdc; - PNHMenuWindow data; - RECT list_rect; - - lpmis = (LPMEASUREITEMSTRUCT) lParam; - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - GetClientRect(GetMenuControl(hWnd), &list_rect); - - hdc = GetDC(GetMenuControl(hWnd)); - saveFont = - SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_INVERSE, hdc, FALSE)); - GetTextMetrics(hdc, &tm); - - /* Set the height of the list box items. */ - lpmis->itemHeight = max(tm.tmHeight, TILE_Y) + 2; - lpmis->itemWidth = list_rect.right - list_rect.left; - - SelectObject(hdc, saveFont); - ReleaseDC(GetMenuControl(hWnd), hdc); - return TRUE; -} - -LRESULT -onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - LPDRAWITEMSTRUCT lpdis; - PNHMenuItem item; - PNHMenuWindow data; - TEXTMETRIC tm; - HGDIOBJ saveFont; - HDC tileDC; - short ntile; - int t_x, t_y; - int x, y; - TCHAR wbuf[BUFSZ]; - RECT drawRect; - COLORREF OldBg, OldFg, NewBg; - char *p, *p1; - int column; - - lpdis = (LPDRAWITEMSTRUCT) lParam; - - /* If there are no list box items, skip this message. */ - if (lpdis->itemID == -1) - return FALSE; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - - item = &data->menu.items[lpdis->itemID]; - - tileDC = CreateCompatibleDC(lpdis->hDC); - saveFont = SelectObject( - lpdis->hDC, mswin_get_font(NHW_MENU, item->attr, lpdis->hDC, FALSE)); - NewBg = mswin_get_color(NHW_MENU, MSWIN_COLOR_BG); - OldBg = SetBkColor(lpdis->hDC, NewBg); - OldFg = - SetTextColor(lpdis->hDC, mswin_get_color(NHW_MENU, MSWIN_COLOR_FG)); - - GetTextMetrics(lpdis->hDC, &tm); - - x = lpdis->rcItem.left + 1; - - /* print check mark if it is a "selectable" menu */ - if (data->how != PICK_NONE) { - if (NHMENU_IS_SELECTABLE(*item)) { - HGDIOBJ saveBrush; - HBRUSH hbrCheckMark; - char buf[2]; - - switch (item->count) { - case -1: - hbrCheckMark = CreatePatternBrush(data->bmpChecked); - break; - case 0: - hbrCheckMark = CreatePatternBrush(data->bmpNotChecked); - break; - default: - hbrCheckMark = CreatePatternBrush(data->bmpCheckedCount); - break; - } - - y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; - SetBrushOrgEx(lpdis->hDC, x, y, NULL); - saveBrush = SelectObject(lpdis->hDC, hbrCheckMark); - PatBlt(lpdis->hDC, x, y, TILE_X, TILE_Y, PATCOPY); - SelectObject(lpdis->hDC, saveBrush); - DeleteObject(hbrCheckMark); - - x += TILE_X + 5; - - if (item->accelerator != 0) { - buf[0] = item->accelerator; - buf[1] = '\x0'; - - SetRect(&drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, - lpdis->rcItem.bottom); - DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, - DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); - } - x += tm.tmAveCharWidth + tm.tmOverhang + 5; - } else { - x += TILE_X + tm.tmAveCharWidth + tm.tmOverhang + 10; - } - } - - /* print glyph if present */ - if (item->glyph != NO_GLYPH) { - HGDIOBJ saveBmp; - - saveBmp = SelectObject(tileDC, GetNHApp()->bmpTiles); - ntile = glyph2tile[item->glyph]; - t_x = (ntile % TILES_PER_LINE) * TILE_X; - t_y = (ntile / TILES_PER_LINE) * TILE_Y; - - y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; - - nhapply_image_transparent(lpdis->hDC, x, y, TILE_X, TILE_Y, tileDC, - t_x, t_y, TILE_X, TILE_Y, TILE_BK_COLOR); - SelectObject(tileDC, saveBmp); - } - - x += TILE_X + 5; - - /* draw item text */ - if (item->has_tab) { - p1 = item->str; - p = strchr(item->str, '\t'); - column = 0; - SetRect(&drawRect, x, lpdis->rcItem.top, - min(x + data->menu.tab_stop_size[0], lpdis->rcItem.right), - lpdis->rcItem.bottom); - for (;;) { - TCHAR wbuf[BUFSZ]; - if (p != NULL) - *p = '\0'; /* for time being, view tab field as zstring */ - DrawText(lpdis->hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), - &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE); - if (p != NULL) - *p = '\t'; - else /* last string so, */ - break; - - p1 = p + 1; - p = strchr(p1, '\t'); - drawRect.left = drawRect.right + TAB_SEPARATION; - ++column; - drawRect.right = - min(drawRect.left + data->menu.tab_stop_size[column], - lpdis->rcItem.right); - } - } else { - TCHAR wbuf[BUFSZ]; - SetRect(&drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, - lpdis->rcItem.bottom); - DrawText(lpdis->hDC, NH_A2W(item->str, wbuf, BUFSZ), - strlen(item->str), &drawRect, - DT_LEFT | DT_VCENTER | DT_SINGLELINE); - } - - /* draw focused item */ - if (item->has_focus) { - RECT client_rt; - HBRUSH bkBrush; - - GetClientRect(lpdis->hwndItem, &client_rt); - if (NHMENU_IS_SELECTABLE(*item) - && data->menu.items[lpdis->itemID].count > 0 - && item->glyph != NO_GLYPH) { - if (data->menu.items[lpdis->itemID].count == -1) { - _stprintf(wbuf, TEXT("Count: All")); - } else { - _stprintf(wbuf, TEXT("Count: %d"), - data->menu.items[lpdis->itemID].count); - } - - SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, ATR_BLINK, - lpdis->hDC, FALSE)); - - /* calculate text rectangle */ - SetRect(&drawRect, client_rt.left, lpdis->rcItem.top, - client_rt.right, lpdis->rcItem.bottom); - DrawText(lpdis->hDC, wbuf, _tcslen(wbuf), &drawRect, - DT_CALCRECT | DT_RIGHT | DT_VCENTER | DT_SINGLELINE - | DT_NOPREFIX); - - /* erase text rectangle */ - drawRect.left = - max(client_rt.left + 1, - client_rt.right - (drawRect.right - drawRect.left) - 10); - drawRect.right = client_rt.right - 1; - drawRect.top = lpdis->rcItem.top; - drawRect.bottom = lpdis->rcItem.bottom; - bkBrush = CreateSolidBrush(GetBkColor(lpdis->hDC)); - FillRect(lpdis->hDC, &drawRect, bkBrush); - DeleteObject(bkBrush); - - /* draw text */ - DrawText(lpdis->hDC, wbuf, _tcslen(wbuf), &drawRect, - DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); - } - - /* draw focus rect */ - SetRect(&drawRect, client_rt.left, lpdis->rcItem.top, client_rt.right, - lpdis->rcItem.bottom); - DrawFocusRect(lpdis->hDC, &drawRect); - } - - SetTextColor(lpdis->hDC, OldFg); - SetBkColor(lpdis->hDC, OldBg); - SelectObject(lpdis->hDC, saveFont); - DeleteDC(tileDC); - return TRUE; -} - -BOOL -onListChar(HWND hWnd, HWND hwndList, WORD ch) -{ - int i = 0; - PNHMenuWindow data; - int curIndex, topIndex, pageSize; - boolean is_accelerator = FALSE; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - - switch (ch) { - case MENU_FIRST_PAGE: - i = 0; - ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); - ListView_EnsureVisible(hwndList, i, FALSE); - return -2; - - case MENU_LAST_PAGE: - i = max(0, data->menu.size - 1); - ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); - ListView_EnsureVisible(hwndList, i, FALSE); - return -2; - - case MENU_NEXT_PAGE: - topIndex = ListView_GetTopIndex(hwndList); - pageSize = ListView_GetCountPerPage(hwndList); - curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); - /* Focus down one page */ - i = min(curIndex + pageSize, data->menu.size - 1); - ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); - /* Scrollpos down one page */ - i = min(topIndex + (2 * pageSize - 1), data->menu.size - 1); - ListView_EnsureVisible(hwndList, i, FALSE); - return -2; - - case MENU_PREVIOUS_PAGE: - topIndex = ListView_GetTopIndex(hwndList); - pageSize = ListView_GetCountPerPage(hwndList); - curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); - /* Focus up one page */ - i = max(curIndex - pageSize, 0); - ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); - /* Scrollpos up one page */ - i = max(topIndex - pageSize, 0); - ListView_EnsureVisible(hwndList, i, FALSE); - break; - - case MENU_SELECT_ALL: - if (data->how == PICK_ANY) { - reset_menu_count(hwndList, data); - for (i = 0; i < data->menu.size; i++) { - SelectMenuItem(hwndList, data, i, -1); - } - return -2; - } - break; - - case MENU_UNSELECT_ALL: - if (data->how == PICK_ANY) { - reset_menu_count(hwndList, data); - for (i = 0; i < data->menu.size; i++) { - SelectMenuItem(hwndList, data, i, 0); - } - return -2; - } - break; - - case MENU_INVERT_ALL: - if (data->how == PICK_ANY) { - reset_menu_count(hwndList, data); - for (i = 0; i < data->menu.size; i++) { - SelectMenuItem(hwndList, data, i, - NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 - : -1); - } - return -2; - } - break; - - case MENU_SELECT_PAGE: - if (data->how == PICK_ANY) { - int from, to; - reset_menu_count(hwndList, data); - topIndex = ListView_GetTopIndex(hwndList); - pageSize = ListView_GetCountPerPage(hwndList); - from = max(0, topIndex); - to = min(data->menu.size, from + pageSize); - for (i = from; i < to; i++) { - SelectMenuItem(hwndList, data, i, -1); - } - return -2; - } - break; - - case MENU_UNSELECT_PAGE: - if (data->how == PICK_ANY) { - int from, to; - reset_menu_count(hwndList, data); - topIndex = ListView_GetTopIndex(hwndList); - pageSize = ListView_GetCountPerPage(hwndList); - from = max(0, topIndex); - to = min(data->menu.size, from + pageSize); - for (i = from; i < to; i++) { - SelectMenuItem(hwndList, data, i, 0); - } - return -2; - } - break; - - case MENU_INVERT_PAGE: - if (data->how == PICK_ANY) { - int from, to; - reset_menu_count(hwndList, data); - topIndex = ListView_GetTopIndex(hwndList); - pageSize = ListView_GetCountPerPage(hwndList); - from = max(0, topIndex); - to = min(data->menu.size, from + pageSize); - for (i = from; i < to; i++) { - SelectMenuItem(hwndList, data, i, - NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 - : -1); - } - return -2; - } - break; - - case MENU_SEARCH: - if (data->how == PICK_ANY || data->how == PICK_ONE) { - char buf[BUFSZ]; - int selected_item; - - reset_menu_count(hwndList, data); - mswin_getlin("Search for:", buf); - if (!*buf || *buf == '\033') - return -2; - selected_item = -1; - for (i = 0; i < data->menu.size; i++) { - if (NHMENU_IS_SELECTABLE(data->menu.items[i]) - && strstr(data->menu.items[i].str, buf)) { - if (data->how == PICK_ANY) { - SelectMenuItem( - hwndList, data, i, - NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 : -1); - /* save the first item - we will move focus to it */ - if (selected_item == -1) - selected_item = i; - } else if (data->how == PICK_ONE) { - SelectMenuItem(hwndList, data, i, -1); - selected_item = i; - break; - } - } - } - - if (selected_item > 0) { - ListView_SetItemState(hwndList, selected_item, LVIS_FOCUSED, - LVIS_FOCUSED); - ListView_EnsureVisible(hwndList, selected_item, FALSE); - } - } else { - mswin_nhbell(); - } - return -2; - - case ' ': - /* ends menu for PICK_ONE/PICK_NONE - select item for PICK_ANY */ - if (data->how == PICK_ONE || data->how == PICK_NONE) { - data->done = 1; - data->result = 0; - return -2; - } else if (data->how == PICK_ANY) { - i = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); - if (i >= 0) { - SelectMenuItem(hwndList, data, i, - NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 - : -1); - } - return -2; - } - break; - - default: - if (strchr(data->menu.gacc, ch) - && !(ch == '0' && data->menu.counting)) { - /* matched a group accelerator */ - if (data->how == PICK_ANY || data->how == PICK_ONE) { - reset_menu_count(hwndList, data); - for (i = 0; i < data->menu.size; i++) { - if (NHMENU_IS_SELECTABLE(data->menu.items[i]) - && data->menu.items[i].group_accel == ch) { - if (data->how == PICK_ANY) { - SelectMenuItem( - hwndList, data, i, - NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 - : -1); - } else if (data->how == PICK_ONE) { - SelectMenuItem(hwndList, data, i, -1); - data->result = 0; - data->done = 1; - return -2; - } - } - } - return -2; - } else { - mswin_nhbell(); - return -2; - } - } - - if (isdigit(ch)) { - int count; - i = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); - if (i >= 0) { - count = data->menu.items[i].count; - if (count == -1) - count = 0; - count *= 10L; - count += (int) (ch - '0'); - if (count != 0) /* ignore leading zeros */ { - data->menu.counting = TRUE; - data->menu.items[i].count = min(100000, count); - ListView_RedrawItems(hwndList, i, - i); /* update count mark */ - } - } - return -2; - } - - is_accelerator = FALSE; - for (i = 0; i < data->menu.size; i++) { - if (data->menu.items[i].accelerator == ch) { - is_accelerator = TRUE; - break; - } - } - - if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') - || is_accelerator) { - if (data->how == PICK_ANY || data->how == PICK_ONE) { - for (i = 0; i < data->menu.size; i++) { - if (data->menu.items[i].accelerator == ch) { - if (data->how == PICK_ANY) { - SelectMenuItem( - hwndList, data, i, - NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 - : -1); - ListView_SetItemState(hwndList, i, LVIS_FOCUSED, - LVIS_FOCUSED); - ListView_EnsureVisible(hwndList, i, FALSE); - return -2; - } else if (data->how == PICK_ONE) { - SelectMenuItem(hwndList, data, i, -1); - data->result = 0; - data->done = 1; - return -2; - } - } - } - } - } - break; - } - - reset_menu_count(hwndList, data); - return -1; -} - -void -mswin_menu_window_size(HWND hWnd, LPSIZE sz) -{ - TEXTMETRIC tm; - HWND control; - HGDIOBJ saveFont; - HDC hdc; - PNHMenuWindow data; - int i; - RECT rt, wrt; - int extra_cx; - - GetClientRect(hWnd, &rt); - sz->cx = rt.right - rt.left; - sz->cy = rt.bottom - rt.top; - - GetWindowRect(hWnd, &wrt); - extra_cx = (wrt.right - wrt.left) - sz->cx; - - data = (PNHMenuWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data) { - control = GetMenuControl(hWnd); - hdc = GetDC(control); - - if (data->type == MENU_TYPE_MENU) { - /* Calculate the width of the list box. */ - saveFont = SelectObject( - hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE)); - GetTextMetrics(hdc, &tm); - for (i = 0; i < data->menu.size; i++) { - LONG menuitemwidth = 0; - int column; - char *p, *p1; - - p1 = data->menu.items[i].str; - p = strchr(data->menu.items[i].str, '\t'); - column = 0; - for (;;) { - TCHAR wbuf[BUFSZ]; - RECT tabRect; - SetRect(&tabRect, 0, 0, 1, 1); - if (p != NULL) - *p = '\0'; /* for time being, view tab field as - zstring */ - DrawText(hdc, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), - &tabRect, DT_CALCRECT | DT_LEFT | DT_VCENTER - | DT_SINGLELINE); - /* it probably isn't necessary to recompute the tab width - * now, but do so - * just in case, honoring the previously computed value - */ - menuitemwidth += max(data->menu.tab_stop_size[column], - tabRect.right - tabRect.left); - if (p != NULL) - *p = '\t'; - else /* last string so, */ - break; - /* add the separation only when not the last item */ - /* in the last item, we break out of the loop, in the - * statement just above */ - menuitemwidth += TAB_SEPARATION; - ++column; - p1 = p + 1; - p = strchr(p1, '\t'); - } - - sz->cx = max(sz->cx, (LONG)(2 * TILE_X + menuitemwidth - + tm.tmAveCharWidth * 12 - + tm.tmOverhang)); - } - SelectObject(hdc, saveFont); - } else { - /* do not change size for text output - the text will be formatted - to - fit any window */ - } - sz->cx += extra_cx; - - ReleaseDC(control, hdc); - } -} - -void -SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count) -{ - int i; - - if (item < 0 || item >= data->menu.size) - return; - - if (data->how == PICK_ONE && count != 0) { - for (i = 0; i < data->menu.size; i++) - if (item != i && data->menu.items[i].count != 0) { - data->menu.items[i].count = 0; - ListView_RedrawItems(hwndList, i, i); - }; - } - - data->menu.items[item].count = count; - ListView_RedrawItems(hwndList, item, item); - reset_menu_count(hwndList, data); -} - -void -reset_menu_count(HWND hwndList, PNHMenuWindow data) -{ - int i; - data->menu.counting = FALSE; - if (IsWindow(hwndList)) { - i = ListView_GetNextItem((hwndList), -1, LVNI_FOCUSED); - if (i >= 0) - ListView_RedrawItems(hwndList, i, i); - } -} - -/* List window Proc */ -LRESULT CALLBACK -NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - BOOL bUpdateFocusItem = FALSE; - - switch (message) { -/* filter keyboard input for the control */ -#if !defined(WIN_CE_SMARTPHONE) - case WM_KEYDOWN: - case WM_KEYUP: { - MSG msg; - - if (PeekMessage(&msg, hWnd, WM_CHAR, WM_CHAR, PM_REMOVE)) { - if (onListChar(GetParent(hWnd), hWnd, (char) msg.wParam) == -2) { - return 0; - } - } - - if (wParam == VK_LEFT || wParam == VK_RIGHT) - bUpdateFocusItem = TRUE; - } break; - - /* tell Windows not to process arrow keys */ - case WM_GETDLGCODE: - return DLGC_WANTARROWS; - -#else /* defined(WIN_CE_SMARTPHONE) */ - case WM_KEYDOWN: - if (wParam == VK_TACTION) { - if (onListChar(GetParent(hWnd), hWnd, ' ') == -2) { - return 0; - } - } else if (NHSPhoneTranslateKbdMessage(wParam, lParam, TRUE)) { - PMSNHEvent evt; - BOOL processed = FALSE; - if (mswin_have_input()) { - evt = mswin_input_pop(); - if (evt->type == NHEVENT_CHAR - && onListChar(GetParent(hWnd), hWnd, evt->kbd.ch) == -2) { - processed = TRUE; - } - - /* eat the rest of the events */ - if (mswin_have_input()) - mswin_input_pop(); - } - if (processed) - return 0; - } - - if (wParam == VK_LEFT || wParam == VK_RIGHT) - bUpdateFocusItem = TRUE; - break; - - case WM_KEYUP: - /* translate SmartPhone keyboard message */ - if (NHSPhoneTranslateKbdMessage(wParam, lParam, FALSE)) - return 0; - break; - - /* tell Windows not to process default button on VK_RETURN */ - case WM_GETDLGCODE: - return DLGC_DEFPUSHBUTTON | DLGC_WANTALLKEYS - | (wndProcListViewOrig - ? CallWindowProc(wndProcListViewOrig, hWnd, message, - wParam, lParam) - : 0); -#endif - - case WM_SIZE: - case WM_HSCROLL: - bUpdateFocusItem = TRUE; - break; - } - - if (bUpdateFocusItem) { - int i; - RECT rt; - - /* invalidate the focus rectangle */ - i = ListView_GetNextItem(hWnd, -1, LVNI_FOCUSED); - if (i != -1) { - ListView_GetItemRect(hWnd, i, &rt, LVIR_BOUNDS); - InvalidateRect(hWnd, &rt, TRUE); - } - } - - if (wndProcListViewOrig) - return CallWindowProc(wndProcListViewOrig, hWnd, message, wParam, - lParam); - else - return 0; -} - -/* Text control window proc - implements close on space */ -LRESULT CALLBACK -NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_KEYUP: - switch (wParam) { - case VK_SPACE: - case VK_RETURN: - /* close on space */ - PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0); - return 0; - - case VK_UP: - /* scoll up */ - PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), - (LPARAM) NULL); - return 0; - - case VK_DOWN: - /* scoll down */ - PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), - (LPARAM) NULL); - return 0; - - case VK_LEFT: - /* scoll left */ - PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINELEFT, 0), - (LPARAM) NULL); - return 0; - - case VK_RIGHT: - /* scoll right */ - PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT, 0), - (LPARAM) NULL); - return 0; - } - break; /* case WM_KEYUP: */ - } - - if (editControlWndProc) - return CallWindowProc(editControlWndProc, hWnd, message, wParam, - lParam); - else - return 0; -} -/*----------------------------------------------------------------------------*/ -char * -parse_menu_str(char *dest, const char *src, size_t size) -{ - char *p1, *p2; - if (!dest || size == 0) - return NULL; - - strncpy(dest, src, size); - dest[size - 1] = '\x0'; - - /* replace "[ ]*\[" with "\t\[" */ - p1 = p2 = strstr(dest, " ["); - if (p1) { - while (p1 != dest && *p1 == ' ') - p1--; - p1++; /* backup to space */ - *p2 = '\t'; - memmove(p1, p2, strlen(p2)); - p1[strlen(p2)] = '\x0'; - } - return dest; -} diff --git a/sys/wince/mhmenu.h b/sys/wince/mhmenu.h deleted file mode 100644 index 21a12a335..000000000 --- a/sys/wince/mhmenu.h +++ /dev/null @@ -1,20 +0,0 @@ -/* NetHack may be freely redistributed. See license for details. */ -/* - * $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.5 $ - */ - -#ifndef MSWINMenuWindow_h -#define MSWINMenuWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -#define MENU_TYPE_TEXT 1 -#define MENU_TYPE_MENU 2 - -HWND mswin_init_menu_window(int type); -int mswin_menu_window_select_menu(HWND hwnd, int how, MENU_ITEM_P **); -void mswin_menu_window_size(HWND hwnd, LPSIZE sz); - -#endif /* MSWINTextWindow_h */ diff --git a/sys/wince/mhmsg.h b/sys/wince/mhmsg.h deleted file mode 100644 index 55e0d3ce9..000000000 --- a/sys/wince/mhmsg.h +++ /dev/null @@ -1,61 +0,0 @@ -/* NetHack 3.6 mhmsg.h $NHDT-Date: 1432512800 2015/05/25 00:13:20 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MHNethackMessages_H -#define MHNethackMessages_H - -/* nethack messages */ -#define WM_MSNH_COMMAND (WM_APP + 1) - -#define MSNH_MSG_ADDWND 100 -#define MSNH_MSG_PUTSTR 101 -#define MSNH_MSG_PRINT_GLYPH 102 -#define MSNH_MSG_CLEAR_WINDOW 103 -#define MSNH_MSG_CLIPAROUND 104 -#define MSNH_MSG_STARTMENU 105 -#define MSNH_MSG_ADDMENU 106 -#define MSNH_MSG_CURSOR 107 -#define MSNH_MSG_ENDMENU 108 - -typedef struct mswin_nhmsg_add_wnd { - winid wid; -} MSNHMsgAddWnd, *PMSNHMsgAddWnd; - -typedef struct mswin_nhmsg_putstr { - int attr; - const char *text; - boolean append; -} MSNHMsgPutstr, *PMSNHMsgPutstr; - -typedef struct mswin_nhmsg_print_glyph { - XCHAR_P x; - XCHAR_P y; - int glyph; -} MSNHMsgPrintGlyph, *PMSNHMsgPrintGlyph; - -typedef struct mswin_nhmsg_cliparound { - int x; - int y; -} MSNHMsgClipAround, *PMSNHMsgClipAround; - -typedef struct mswin_nhmsg_add_menu { - int glyph; - const ANY_P *identifier; - CHAR_P accelerator; - CHAR_P group_accel; - int attr; - const char *str; - BOOLEAN_P presel; -} MSNHMsgAddMenu, *PMSNHMsgAddMenu; - -typedef struct mswin_nhmsg_cursor { - int x; - int y; -} MSNHMsgCursor, *PMSNHMsgCursor; - -typedef struct mswin_nhmsg_end_menu { - const char *text; -} MSNHMsgEndMenu, *PMSNHMsgEndMenu; - -#endif diff --git a/sys/wince/mhmsgwnd.c b/sys/wince/mhmsgwnd.c deleted file mode 100644 index 1c8976564..000000000 --- a/sys/wince/mhmsgwnd.c +++ /dev/null @@ -1,619 +0,0 @@ -/* NetHack 3.6 mhmsgwnd.c $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.20 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include "mhmsgwnd.h" -#include "mhmsg.h" -#include "mhcmd.h" -#include "mhfont.h" -#include "mhcolor.h" - -#define MSG_WRAP_TEXT - -#define MSG_VISIBLE_LINES max(iflags.wc_vary_msgcount, 2) -#define MAX_MSG_LINES 32 -#define MSG_LINES (int) min(iflags.msg_history, MAX_MSG_LINES) -#define MAXWINDOWTEXT 200 - -struct window_line { - int attr; - char text[MAXWINDOWTEXT]; -}; - -typedef struct mswin_nethack_message_window { - size_t max_text; - struct window_line window_text[MAX_MSG_LINES]; - - int xChar; /* horizontal scrolling unit */ - int yChar; /* vertical scrolling unit */ - int xUpper; /* average width of uppercase letters */ - int xPos; /* current horizontal scrolling position */ - int yPos; /* current vertical scrolling position */ - int xMax; /* maximum horizontal scrolling position */ - int yMax; /* maximum vertical scrolling position */ - int xPage; /* page size of horizontal scroll bar */ - int lines_last_turn; /* lines added during the last turn */ - int dont_care; /* flag the user does not care if messages are lost */ -} NHMessageWindow, *PNHMessageWindow; - -static TCHAR szMessageWindowClass[] = TEXT("MSNHMessageWndClass"); -LRESULT CALLBACK NHMessageWndProc(HWND, UINT, WPARAM, LPARAM); -static void register_message_window_class(); -static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); -#ifndef MSG_WRAP_TEXT -static void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); -#endif -static COLORREF setMsgTextColor(HDC hdc, int gray); -static void onPaint(HWND hWnd); -static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); - -#ifdef USER_SOUNDS -extern void play_sound_for_message(const char *str); -#endif - -HWND -mswin_init_message_window() -{ - static int run_once = 0; - HWND ret; - DWORD style; - - if (!run_once) { - register_message_window_class(); - run_once = 1; - } - -#ifdef MSG_WRAP_TEXT - style = WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL; -#else - style = WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL; -#endif - - ret = CreateWindow( - szMessageWindowClass, /* registered class name */ - NULL, /* window name */ - style, /* window style */ - 0, /* horizontal position of window */ - 0, /* vertical position of window */ - 0, /* window width */ - 0, /* window height - set it later */ - GetNHApp()->hMainWnd, /* handle to parent or owner window */ - NULL, /* menu handle or child identifier */ - GetNHApp()->hApp, /* handle to application instance */ - NULL); /* window-creation data */ - - if (!ret) - panic("Cannot create message window"); - - return ret; -} - -void -register_message_window_class() -{ - WNDCLASS wcex; - ZeroMemory(&wcex, sizeof(wcex)); - - wcex.style = CS_NOCLOSE; - wcex.lpfnWndProc = (WNDPROC) NHMessageWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = GetNHApp()->hApp; - wcex.hIcon = NULL; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = mswin_get_brush(NHW_MESSAGE, MSWIN_COLOR_BG); - wcex.lpszMenuName = NULL; - wcex.lpszClassName = szMessageWindowClass; - - RegisterClass(&wcex); -} - -LRESULT CALLBACK -NHMessageWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_CREATE: - onCreate(hWnd, wParam, lParam); - break; - - case WM_MSNH_COMMAND: - onMSNHCommand(hWnd, wParam, lParam); - break; - - case WM_PAINT: - onPaint(hWnd); - break; - - case WM_SETFOCUS: - SetFocus(GetNHApp()->hMainWnd); - break; - -#ifndef MSG_WRAP_TEXT - case WM_HSCROLL: - onMSNH_HScroll(hWnd, wParam, lParam); - break; -#endif - - case WM_VSCROLL: - onMSNH_VScroll(hWnd, wParam, lParam); - break; - - case WM_DESTROY: { - PNHMessageWindow data; - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - free(data); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - } break; - - case WM_SIZE: { - SCROLLINFO si; - int xNewSize; - int yNewSize; - PNHMessageWindow data; - - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - - xNewSize = LOWORD(lParam); - yNewSize = HIWORD(lParam); - - if (xNewSize > 0 || yNewSize > 0) { -#ifndef MSG_WRAP_TEXT - data->xPage = xNewSize / data->xChar; - data->xMax = max(0, (int) (1 + data->max_text - data->xPage)); - data->xPos = min(data->xPos, data->xMax); - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = 0; - si.nMax = data->max_text; - si.nPage = data->xPage; - si.nPos = data->xPos; - SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); -#endif - - data->yMax = MSG_LINES - 1; - data->yPos = min(data->yPos, data->yMax); - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = MSG_VISIBLE_LINES; - si.nMax = data->yMax + MSG_VISIBLE_LINES - 1; - si.nPage = MSG_VISIBLE_LINES; - si.nPos = data->yPos; - SetScrollInfo(hWnd, SB_VERT, &si, TRUE); - } - } break; - - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} - -void -onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMessageWindow data; - - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (wParam) { - case MSNH_MSG_PUTSTR: { - PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr) lParam; - SCROLLINFO si; - char *p; - - if (msg_data->append) { - strncat(data->window_text[MSG_LINES - 1].text, msg_data->text, - MAXWINDOWTEXT - - strlen(data->window_text[MSG_LINES - 1].text)); - } else { - /* check if the string is empty */ - for (p = data->window_text[MSG_LINES - 1].text; *p && isspace(*p); - p++) - ; - - if (*p) { - /* last string is not empty - scroll up */ - memmove(&data->window_text[0], &data->window_text[1], - (MSG_LINES - 1) * sizeof(data->window_text[0])); - } - - /* append new text to the end of the array */ - data->window_text[MSG_LINES - 1].attr = msg_data->attr; - strncpy(data->window_text[MSG_LINES - 1].text, msg_data->text, - MAXWINDOWTEXT); - } - - /* reset V-scroll position to display new text */ - data->yPos = data->yMax; - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_POS; - si.nPos = data->yPos; - SetScrollInfo(hWnd, SB_VERT, &si, TRUE); - - /* deal with overflows */ - data->lines_last_turn++; - if (!data->dont_care && data->lines_last_turn >= MSG_LINES - 2) { - char c; - BOOL done; - - /* append "--More--" to the message window text (cannot call - putstr - here - infinite recursion) */ - memmove(&data->window_text[0], &data->window_text[1], - (MSG_LINES - 1) * sizeof(data->window_text[0])); - data->window_text[MSG_LINES - 1].attr = ATR_NONE; - strncpy(data->window_text[MSG_LINES - 1].text, "--More--", - MAXWINDOWTEXT); - - /* update window content */ - InvalidateRect(hWnd, NULL, TRUE); - -#if defined(WIN_CE_SMARTPHONE) - NHSPhoneSetKeypadFromString("\033- <>"); -#endif - - done = FALSE; - while (!done) { - int x, y, mod; - c = mswin_nh_poskey(&x, &y, &mod); - switch (c) { - /* ESC indicates that we can safely discard any further - * messages during this turn */ - case '\033': - data->dont_care = 1; - done = TRUE; - break; - - case '<': - SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), - (LPARAM) NULL); - break; - - case '>': - SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), - (LPARAM) NULL); - break; - - /* continue scrolling on any key */ - default: - data->lines_last_turn = 0; - done = TRUE; - break; - } - } - -#if defined(WIN_CE_SMARTPHONE) - NHSPhoneSetKeypadDefault(); -#endif - /* remove "--More--" from the message window text */ - data->window_text[MSG_LINES - 1].attr = ATR_NONE; - strncpy(data->window_text[MSG_LINES - 1].text, " ", - MAXWINDOWTEXT); - } - - /* update window content */ - InvalidateRect(hWnd, NULL, TRUE); - -#ifdef USER_SOUNDS - play_sound_for_message(msg_data->text); -#endif - } break; - - case MSNH_MSG_CLEAR_WINDOW: - data->lines_last_turn = 0; - data->dont_care = 0; - break; - } -} - -void -onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMessageWindow data; - SCROLLINFO si; - int yInc; - - /* get window data */ - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_PAGE | SIF_POS; - GetScrollInfo(hWnd, SB_VERT, &si); - - switch (LOWORD(wParam)) { - // User clicked the shaft above the scroll box. - - case SB_PAGEUP: - yInc = -(int) si.nPage; - break; - - // User clicked the shaft below the scroll box. - - case SB_PAGEDOWN: - yInc = si.nPage; - break; - - // User clicked the top arrow. - - case SB_LINEUP: - yInc = -1; - break; - - // User clicked the bottom arrow. - - case SB_LINEDOWN: - yInc = 1; - break; - - // User dragged the scroll box. - - case SB_THUMBTRACK: - yInc = HIWORD(wParam) - data->yPos; - break; - - default: - yInc = 0; - } - - // If applying the vertical scrolling increment does not - // take the scrolling position out of the scrolling range, - // increment the scrolling position, adjust the position - // of the scroll box, and update the window. UpdateWindow - // sends the WM_PAINT message. - - if (yInc = max(MSG_VISIBLE_LINES - data->yPos, - min(yInc, data->yMax - data->yPos))) { - data->yPos += yInc; - /* ScrollWindowEx(hWnd, 0, -data->yChar * yInc, - (CONST RECT *) NULL, (CONST RECT *) NULL, - (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE | SW_ERASE); - */ - InvalidateRect(hWnd, NULL, TRUE); - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_POS; - si.nPos = data->yPos; - SetScrollInfo(hWnd, SB_VERT, &si, TRUE); - - UpdateWindow(hWnd); - } -} - -#ifndef MSG_WRAP_TEXT -void -onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHMessageWindow data; - SCROLLINFO si; - int xInc; - - /* get window data */ - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_PAGE; - GetScrollInfo(hWnd, SB_HORZ, &si); - - switch (LOWORD(wParam)) { - // User clicked shaft left of the scroll box. - - case SB_PAGEUP: - xInc = -(int) si.nPage; - break; - - // User clicked shaft right of the scroll box. - - case SB_PAGEDOWN: - xInc = si.nPage; - break; - - // User clicked the left arrow. - - case SB_LINEUP: - xInc = -1; - break; - - // User clicked the right arrow. - - case SB_LINEDOWN: - xInc = 1; - break; - - // User dragged the scroll box. - - case SB_THUMBTRACK: - xInc = HIWORD(wParam) - data->xPos; - break; - - default: - xInc = 0; - } - - // If applying the horizontal scrolling increment does not - // take the scrolling position out of the scrolling range, - // increment the scrolling position, adjust the position - // of the scroll box, and update the window. - - if (xInc = max(-data->xPos, min(xInc, data->xMax - data->xPos))) { - data->xPos += xInc; - ScrollWindowEx(hWnd, -data->xChar * xInc, 0, (CONST RECT *) NULL, - (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, - SW_INVALIDATE | SW_ERASE); - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_POS; - si.nPos = data->xPos; - SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); - UpdateWindow(hWnd); - } -} -#endif // MSG_WRAP_TEXT - -COLORREF -setMsgTextColor(HDC hdc, int gray) -{ - COLORREF fg, color1, color2; - if (gray) { - color1 = mswin_get_color(NHW_MESSAGE, MSWIN_COLOR_BG); - color2 = mswin_get_color(NHW_MESSAGE, MSWIN_COLOR_FG); - /* Make a "gray" color by taking the average of the individual R,G,B - components of two colors. Thanks to Jonathan del Strother */ - fg = RGB((GetRValue(color1) + GetRValue(color2)) / 2, - (GetGValue(color1) + GetGValue(color2)) / 2, - (GetBValue(color1) + GetBValue(color2)) / 2); - } else { - fg = mswin_get_color(NHW_MESSAGE, MSWIN_COLOR_FG); - } - - return SetTextColor(hdc, fg); -} - -void -onPaint(HWND hWnd) -{ - PAINTSTRUCT ps; - HDC hdc; - PNHMessageWindow data; - RECT client_rt, draw_rt; - int FirstLine, LastLine; - int i, x, y; - HGDIOBJ oldFont; - TCHAR wbuf[MAXWINDOWTEXT + 2]; - size_t wlen; - COLORREF OldBg, OldFg; - - hdc = BeginPaint(hWnd, &ps); - - OldBg = SetBkColor(hdc, mswin_get_color(NHW_MESSAGE, MSWIN_COLOR_BG)); - OldFg = setMsgTextColor(hdc, 0); - - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - - GetClientRect(hWnd, &client_rt); - - if (!IsRectEmpty(&ps.rcPaint)) { - FirstLine = max( - 0, data->yPos - (client_rt.bottom - ps.rcPaint.top) / data->yChar - + 1); - LastLine = - min(MSG_LINES - 1, - data->yPos - - (client_rt.bottom - ps.rcPaint.bottom) / data->yChar); - y = min(ps.rcPaint.bottom, client_rt.bottom - 2); - for (i = LastLine; i >= FirstLine; i--) { - if (i == MSG_LINES - 1) { - x = data->xChar * (2 - data->xPos); - } else { - x = data->xChar * (4 - data->xPos); - } - - if (strlen(data->window_text[i].text) > 0) { - /* convert to UNICODE */ - NH_A2W(data->window_text[i].text, wbuf, sizeof(wbuf)); - wlen = _tcslen(wbuf); - - /* calculate text height */ - draw_rt.left = x; - draw_rt.right = client_rt.right; - draw_rt.top = y - data->yChar; - draw_rt.bottom = y; - - oldFont = SelectObject( - hdc, - mswin_get_font(NHW_MESSAGE, data->window_text[i].attr, - hdc, FALSE)); - - setMsgTextColor(hdc, i < (MSG_LINES - data->lines_last_turn)); -#ifdef MSG_WRAP_TEXT - DrawText(hdc, wbuf, wlen, &draw_rt, - DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT); - draw_rt.top = y - (draw_rt.bottom - draw_rt.top); - draw_rt.bottom = y; - DrawText(hdc, wbuf, wlen, &draw_rt, - DT_NOPREFIX | DT_WORDBREAK); -#else - DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX); -#endif - SelectObject(hdc, oldFont); - - y -= draw_rt.bottom - draw_rt.top; - } else { - y -= data->yChar; - } - } - } - - SetTextColor(hdc, OldFg); - SetBkColor(hdc, OldBg); - EndPaint(hWnd, &ps); -} - -void -onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - HDC hdc; - TEXTMETRIC tm; - PNHMessageWindow data; - HGDIOBJ saveFont; - - /* set window data */ - data = (PNHMessageWindow) malloc(sizeof(NHMessageWindow)); - if (!data) - panic("out of memory"); - ZeroMemory(data, sizeof(NHMessageWindow)); - data->max_text = MAXWINDOWTEXT; - SetWindowLong(hWnd, GWL_USERDATA, (LONG) data); - - /* Get the handle to the client area's device context. */ - hdc = GetDC(hWnd); - saveFont = - SelectObject(hdc, mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, FALSE)); - - /* Extract font dimensions from the text metrics. */ - GetTextMetrics(hdc, &tm); - data->xChar = tm.tmAveCharWidth; - data->xUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * data->xChar / 2; - data->yChar = tm.tmHeight + tm.tmExternalLeading; - data->xPage = 1; - - /* Free the device context. */ - SelectObject(hdc, saveFont); - ReleaseDC(hWnd, hdc); - - /* create command pad (keyboard emulator) */ - if (!GetNHApp()->hCmdWnd) - GetNHApp()->hCmdWnd = mswin_init_command_window(); -} - -void -mswin_message_window_size(HWND hWnd, LPSIZE sz) -{ - PNHMessageWindow data; - RECT rt, client_rt; - - GetWindowRect(hWnd, &rt); - - sz->cx = rt.right - rt.left; - sz->cy = rt.bottom - rt.top; - - data = (PNHMessageWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data) { - /* set size to accomodate MSG_VISIBLE_LINES, highligh rectangle and - horizontal scroll bar (difference between window rect and client - rect */ - GetClientRect(hWnd, &client_rt); - sz->cy = sz->cy - (client_rt.bottom - client_rt.top) - + data->yChar * MSG_VISIBLE_LINES + 4; - } -} diff --git a/sys/wince/mhmsgwnd.h b/sys/wince/mhmsgwnd.h deleted file mode 100644 index 51a04142d..000000000 --- a/sys/wince/mhmsgwnd.h +++ /dev/null @@ -1,15 +0,0 @@ -/* NetHack 3.6 mhmsgwnd.h $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINMessageWindow_h -#define MSWINMessageWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -HWND mswin_init_message_window(); -void mswin_message_window_size(HWND hWnd, LPSIZE sz); - -#endif /* MSWINMessageWindow_h */ diff --git a/sys/wince/mhrip.c b/sys/wince/mhrip.c deleted file mode 100644 index 128cec3e5..000000000 --- a/sys/wince/mhrip.c +++ /dev/null @@ -1,19 +0,0 @@ -/* NetHack 3.6 mhrip.c $NHDT-Date: 1432512801 2015/05/25 00:13:21 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include "mhrip.h" -#include "mhtext.h" - -HWND -mswin_init_RIP_window() -{ - return mswin_init_text_window(); -} - -void -mswin_display_RIP_window(HWND hWnd) -{ - mswin_display_text_window(hWnd); -} diff --git a/sys/wince/mhrip.h b/sys/wince/mhrip.h deleted file mode 100644 index fa78992c1..000000000 --- a/sys/wince/mhrip.h +++ /dev/null @@ -1,15 +0,0 @@ -/* NetHack 3.6 mhrip.h $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINRIPWindow_h -#define MSWINRIPWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -HWND mswin_init_RIP_window(); -void mswin_display_RIP_window(HWND hwnd); - -#endif /* MSWINRIPWindow_h */ diff --git a/sys/wince/mhstatus.c b/sys/wince/mhstatus.c deleted file mode 100644 index ec9ed14af..000000000 --- a/sys/wince/mhstatus.c +++ /dev/null @@ -1,280 +0,0 @@ -/* NetHack 3.6 mhstatus.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.17 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include "mhstatus.h" -#include "mhmsg.h" -#include "mhfont.h" -#include "mhcolor.h" - -#define MAXWINDOWTEXT 255 - -#define NHSTAT_LINES_2 2 -#define NHSTAT_LINES_4 4 -typedef struct mswin_nethack_status_window { - int nhstat_format; - char window_text[MAXWINDOWTEXT]; -} NHStatusWindow, *PNHStatusWindow; - -static TCHAR szStatusWindowClass[] = TEXT("MSNHStatusWndClass"); -LRESULT CALLBACK StatusWndProc(HWND, UINT, WPARAM, LPARAM); -static void register_status_window_class(void); -static void FormatStatusString(char *text, int format); - -HWND -mswin_init_status_window() -{ - static int run_once = 0; - HWND ret; - NHStatusWindow *data; - - if (!run_once) { - register_status_window_class(); - run_once = 1; - } - - ret = CreateWindow(szStatusWindowClass, NULL, - WS_CHILD | WS_DISABLED | WS_CLIPSIBLINGS, - 0, /* x position */ - 0, /* y position */ - 0, /* x-size - we will set it later */ - 0, /* y-size - we will set it later */ - GetNHApp()->hMainWnd, NULL, GetNHApp()->hApp, NULL); - if (!ret) - panic("Cannot create status window"); - - EnableWindow(ret, FALSE); - - data = (PNHStatusWindow) malloc(sizeof(NHStatusWindow)); - if (!data) - panic("out of memory"); - - ZeroMemory(data, sizeof(NHStatusWindow)); - data->nhstat_format = NHSTAT_LINES_4; - SetWindowLong(ret, GWL_USERDATA, (LONG) data); - return ret; -} - -void -register_status_window_class() -{ - WNDCLASS wcex; - - ZeroMemory(&wcex, sizeof(wcex)); - wcex.style = CS_NOCLOSE; - wcex.lpfnWndProc = (WNDPROC) StatusWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = GetNHApp()->hApp; - wcex.hIcon = NULL; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = mswin_get_brush(NHW_STATUS, MSWIN_COLOR_BG); - wcex.lpszMenuName = NULL; - wcex.lpszClassName = szStatusWindowClass; - - RegisterClass(&wcex); -} - -LRESULT CALLBACK -StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - RECT rt; - PAINTSTRUCT ps; - HDC hdc; - PNHStatusWindow data; - - data = (PNHStatusWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (message) { - case WM_MSNH_COMMAND: { - switch (wParam) { - case MSNH_MSG_PUTSTR: - case MSNH_MSG_CLEAR_WINDOW: - ZeroMemory(data->window_text, sizeof(data->window_text)); - FormatStatusString(data->window_text, data->nhstat_format); - break; - - case MSNH_MSG_CURSOR: { - PMSNHMsgCursor msg_data = (PMSNHMsgCursor) lParam; - if (msg_data->y == 0) { - InvalidateRect(hWnd, NULL, TRUE); - } - } break; - } - } break; - - case WM_PAINT: { - HGDIOBJ oldFont; - TCHAR wbuf[MAXWINDOWTEXT]; - COLORREF OldBg, OldFg; - - hdc = BeginPaint(hWnd, &ps); - GetClientRect(hWnd, &rt); - - oldFont = SelectObject( - hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE)); - OldBg = SetBkColor(hdc, mswin_get_color(NHW_STATUS, MSWIN_COLOR_BG)); - OldFg = - SetTextColor(hdc, mswin_get_color(NHW_STATUS, MSWIN_COLOR_FG)); - - DrawText(hdc, NH_A2W(data->window_text, wbuf, MAXWINDOWTEXT), - strlen(data->window_text), &rt, DT_LEFT | DT_NOPREFIX); - - SetTextColor(hdc, OldFg); - SetBkColor(hdc, OldBg); - SelectObject(hdc, oldFont); - EndPaint(hWnd, &ps); - } break; - - case WM_DESTROY: - free(data); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - break; - - case WM_SETFOCUS: - SetFocus(GetNHApp()->hMainWnd); - break; - - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} - -void -mswin_status_window_size(HWND hWnd, LPSIZE sz) -{ - TEXTMETRIC tm; - HGDIOBJ saveFont; - HDC hdc; - PNHStatusWindow data; - RECT rt; - GetWindowRect(hWnd, &rt); - sz->cx = rt.right - rt.left; - sz->cy = rt.bottom - rt.top; - - data = (PNHStatusWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data) { - hdc = GetDC(hWnd); - saveFont = SelectObject( - hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE)); - GetTextMetrics(hdc, &tm); - - /* see if the status window can fit 80 characters per line */ - if ((80 * tm.tmMaxCharWidth) >= sz->cx) - data->nhstat_format = NHSTAT_LINES_4; - else - data->nhstat_format = NHSTAT_LINES_2; - - /* set height of the status box */ - sz->cy = tm.tmHeight * data->nhstat_format; - - SelectObject(hdc, saveFont); - ReleaseDC(hWnd, hdc); - } -} -extern const char *hu_stat[]; /* defined in eat.c */ -extern const char *enc_stat[]; /* define in botl.c */ -void -FormatStatusString(char *text, int format) -{ - register char *nb; - int hp, hpmax; - int cap = near_capacity(); - - Strcpy(text, plname); - if ('a' <= text[0] && text[0] <= 'z') - text[0] += 'A' - 'a'; - text[10] = 0; - Sprintf(nb = eos(text), " the "); - - if (Upolyd) { - char mbot[BUFSZ]; - int k = 0; - - Strcpy(mbot, mons[u.umonnum].mname); - while (mbot[k] != 0) { - if ((k == 0 || (k > 0 && mbot[k - 1] == ' ')) && 'a' <= mbot[k] - && mbot[k] <= 'z') - mbot[k] += 'A' - 'a'; - k++; - } - Sprintf(nb = eos(nb), mbot); - } else - Sprintf(nb = eos(nb), rank_of(u.ulevel, Role_switch, flags.female)); - - if (format == NHSTAT_LINES_4) - Sprintf(nb = eos(nb), "\r\n"); - - if (ACURR(A_STR) > 18) { - if (ACURR(A_STR) > STR18(100)) - Sprintf(nb = eos(nb), "St:%2d ", ACURR(A_STR) - 100); - else if (ACURR(A_STR) < STR18(100)) - Sprintf(nb = eos(nb), "St:18/%02d ", ACURR(A_STR) - 18); - else - Sprintf(nb = eos(nb), "St:18/** "); - } else - Sprintf(nb = eos(nb), "St:%-1d ", ACURR(A_STR)); - Sprintf(nb = eos(nb), "Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d", - ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS), - ACURR(A_CHA)); - Sprintf(nb = eos(nb), - (u.ualign.type == A_CHAOTIC) - ? " Chaotic" - : (u.ualign.type == A_NEUTRAL) ? " Neutral" : " Lawful"); -#ifdef SCORE_ON_BOTL - if (flags.showscore) - Sprintf(nb = eos(nb), " S:%ld", botl_score()); -#endif - if (format == NHSTAT_LINES_4 || format == NHSTAT_LINES_2) - strcat(text, "\r\n"); - - /* third line */ - hp = Upolyd ? u.mh : u.uhp; - hpmax = Upolyd ? u.mhmax : u.uhpmax; - - if (hp < 0) - hp = 0; - (void) describe_level(nb = eos(nb)); - Sprintf(nb = eos(nb), "%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", - showsyms[COIN_CLASS + SYM_OFF_O], money_cnt(invent), hp, hpmax, - u.uen, u.uenmax, u.uac); - - if (Upolyd) - Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel); - else if (flags.showexp) - Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel, u.uexp); - else - Sprintf(nb = eos(nb), " Exp:%u", u.ulevel); - if (format == NHSTAT_LINES_4) - strcat(text, "\r\n"); - else - strcat(text, " "); - - /* forth line */ - if (flags.time) - Sprintf(nb = eos(nb), "T:%ld ", moves); - - if (strcmp(hu_stat[u.uhs], " ")) { - Strcat(text, hu_stat[u.uhs]); - Sprintf(nb = eos(nb), " "); - } - if (Confusion) - Sprintf(nb = eos(nb), "Conf"); - if (Sick) { - if (u.usick_type & SICK_VOMITABLE) - Sprintf(nb = eos(nb), " FoodPois"); - if (u.usick_type & SICK_NONVOMITABLE) - Sprintf(nb = eos(nb), " Ill"); - } - if (Blind) - Sprintf(nb = eos(nb), " Blind"); - if (Stunned) - Sprintf(nb = eos(nb), " Stun"); - if (Hallucination) - Sprintf(nb = eos(nb), " Hallu"); - if (Slimed) - Sprintf(nb = eos(nb), " Slime"); - if (cap > UNENCUMBERED) - Sprintf(nb = eos(nb), " %s", enc_stat[cap]); -} diff --git a/sys/wince/mhstatus.h b/sys/wince/mhstatus.h deleted file mode 100644 index 80dfb89ca..000000000 --- a/sys/wince/mhstatus.h +++ /dev/null @@ -1,15 +0,0 @@ -/* NetHack 3.6 mhstatus.h $NHDT-Date: 1432512800 2015/05/25 00:13:20 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINStatusWindow_h -#define MSWINStatusWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -HWND mswin_init_status_window(); -void mswin_status_window_size(HWND hWnd, LPSIZE sz); - -#endif /* MSWINStatusWindow_h */ diff --git a/sys/wince/mhtext.c b/sys/wince/mhtext.c deleted file mode 100644 index a6b813507..000000000 --- a/sys/wince/mhtext.c +++ /dev/null @@ -1,305 +0,0 @@ -/* NetHack 3.6 mhtext.c $NHDT-Date: 1432512802 2015/05/25 00:13:22 $ $NHDT-Branch: master $:$NHDT-Revision: 1.22 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "winMS.h" -#include "mhtext.h" -#include "mhmsg.h" -#include "mhfont.h" -#include "mhcolor.h" -#include "mhtxtbuf.h" - -typedef struct mswin_nethack_text_window { - PNHTextBuffer window_text; - int done; -} NHTextWindow, *PNHTextWindow; - -static WNDPROC editControlWndProc = NULL; - -LRESULT CALLBACK TextWndProc(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK NHTextControlWndProc(HWND, UINT, WPARAM, LPARAM); -static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static void LayoutText(HWND hwnd); -static void ToggleWrapStatus(HWND hDlg, BOOL bWrap); - -HWND -mswin_init_text_window() -{ - HWND ret; - PNHTextWindow data; - - ret = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_NHTEXT), - GetNHApp()->hMainWnd, TextWndProc); - if (!ret) - panic("Cannot create text window"); - - data = (PNHTextWindow) malloc(sizeof(NHTextWindow)); - if (!data) - panic("out of memory"); - - ZeroMemory(data, sizeof(NHTextWindow)); - data->window_text = mswin_init_text_buffer( - program_state.gameover ? FALSE : GetNHApp()->bWrapText); - SetWindowLong(ret, GWL_USERDATA, (LONG) data); - return ret; -} - -void -mswin_display_text_window(HWND hWnd) -{ - PNHTextWindow data; - - data = (PNHTextWindow) GetWindowLong(hWnd, GWL_USERDATA); - if (data) { - ToggleWrapStatus(hWnd, mswin_get_text_wrap(data->window_text)); - data->done = 0; - mswin_popup_display(hWnd, &data->done); - mswin_popup_destroy(hWnd); - } -} - -LRESULT CALLBACK -TextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - HWND control; - HDC hdc; - PNHTextWindow data; - - data = (PNHTextWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (message) { - case WM_INITDIALOG: - /* set text control font */ - control = GetDlgItem(hWnd, IDC_TEXT_CONTROL); - if (!control) { - panic("cannot get text view window"); - } - - hdc = GetDC(control); - SendMessage(control, WM_SETFONT, - (WPARAM) mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), - 0); - ReleaseDC(control, hdc); - -#if defined(WIN_CE_SMARTPHONE) - /* special initialization for SmartPhone dialogs */ - NHSPhoneDialogSetup(hWnd, IDC_SPHONE_TEXTDIALOGBAR, FALSE, - GetNHApp()->bFullScreen); -#endif - /* subclass edit control */ - editControlWndProc = (WNDPROC) GetWindowLong(control, GWL_WNDPROC); - SetWindowLong(control, GWL_WNDPROC, (LONG) NHTextControlWndProc); - - SetFocus(control); - return FALSE; - - case WM_MSNH_COMMAND: - onMSNHCommand(hWnd, wParam, lParam); - break; - - case WM_SIZE: - LayoutText(hWnd); - return FALSE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - case IDCANCEL: - data->done = 1; - return TRUE; - case IDC_TEXT_TOGGLE_WRAP: - ToggleWrapStatus(hWnd, !mswin_get_text_wrap(data->window_text)); - return TRUE; - } - break; - - case WM_CTLCOLORBTN: - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ - HDC hdcEdit = (HDC) wParam; - HWND hwndEdit = (HWND) lParam; - if (hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL)) { - SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG)); - SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); - return (BOOL) mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG); - } - } - return FALSE; - - case WM_DESTROY: - if (data) { - mswin_free_text_buffer(data->window_text); - free(data); - SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0); - } - break; - } - return FALSE; -} - -void -onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - PNHTextWindow data; - - data = (PNHTextWindow) GetWindowLong(hWnd, GWL_USERDATA); - switch (wParam) { - case MSNH_MSG_PUTSTR: { - PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr) lParam; - mswin_add_text(data->window_text, msg_data->attr, msg_data->text); - break; - } - } -} - -void -ToggleWrapStatus(HWND hDlg, BOOL bWrap) -{ - DWORD styles; - PNHTextWindow data; - HWND control; - TCHAR wbuf[BUFSZ]; - - data = (PNHTextWindow) GetWindowLong(hDlg, GWL_USERDATA); - - control = GetDlgItem(hDlg, IDC_TEXT_CONTROL); - if (!control) { - panic("cannot get text view window"); - } - - /* set horizontal scrollbar status */ - styles = GetWindowLong(control, GWL_STYLE); - if (styles) { - SetWindowLong(control, GWL_STYLE, (bWrap ? (styles & (~WS_HSCROLL)) - : (styles | WS_HSCROLL))); - SetWindowPos(control, NULL, 0, 0, 0, 0, - SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE - | SWP_NOSIZE); - } - - /* set text wrap mode */ - mswin_set_text_wrap(data->window_text, bWrap); - mswin_render_text(data->window_text, control); - - /* change button status */ - ZeroMemory(wbuf, sizeof(wbuf)); - if (!LoadString(GetNHApp()->hApp, - (bWrap ? IDS_TEXT_UNWRAP : IDS_TEXT_WRAP), wbuf, BUFSZ)) { - panic("cannot load text window strings"); - } - -#if defined(WIN_CE_SMARTPHONE) - { - TBBUTTONINFO tbbi; - - ZeroMemory(&tbbi, sizeof(tbbi)); - tbbi.cbSize = sizeof(tbbi); - tbbi.dwMask = TBIF_TEXT; - tbbi.pszText = wbuf; - if (!SendMessage(SHFindMenuBar(hDlg), TB_SETBUTTONINFO, - IDC_TEXT_TOGGLE_WRAP, (LPARAM) &tbbi)) { - error("Cannot update IDC_TEXT_TOGGLE_WRAP menu item."); - } - } -#else - SendDlgItemMessage(hDlg, IDC_TEXT_TOGGLE_WRAP, WM_SETTEXT, (WPARAM) 0, - (LPARAM) wbuf); -#endif -} - -void -LayoutText(HWND hWnd) -{ - HWND btn_ok, btn_wrap; - HWND text; - RECT clrt, rt; - POINT pt_elem, pt_ok, pt_wrap; - SIZE sz_elem, sz_ok, sz_wrap; - - text = GetDlgItem(hWnd, IDC_TEXT_CONTROL); - btn_ok = GetDlgItem(hWnd, IDOK); - btn_wrap = GetDlgItem(hWnd, IDC_TEXT_TOGGLE_WRAP); - - /* get window coordinates */ - GetClientRect(hWnd, &clrt); - - /* set window placements */ - if (IsWindow(btn_ok)) { - GetWindowRect(btn_ok, &rt); - sz_ok.cx = (clrt.right - clrt.left) / 2; - sz_ok.cy = rt.bottom - rt.top; - pt_ok.x = clrt.left; - pt_ok.y = clrt.bottom - sz_ok.cy; - MoveWindow(btn_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE); - - sz_wrap.cx = (clrt.right - clrt.left) / 2; - sz_wrap.cy = rt.bottom - rt.top; - pt_wrap.x = clrt.left + sz_ok.cx; - pt_wrap.y = clrt.bottom - sz_ok.cy; - MoveWindow(btn_wrap, pt_wrap.x, pt_wrap.y, sz_wrap.cx, sz_wrap.cy, - TRUE); - - pt_elem.x = clrt.left; - pt_elem.y = clrt.top; - sz_elem.cx = clrt.right - clrt.left; - sz_elem.cy = pt_ok.y; - MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE); - } else { - pt_elem.x = clrt.left; - pt_elem.y = clrt.top; - sz_elem.cx = clrt.right - clrt.left; - sz_elem.cy = clrt.bottom - clrt.top; - MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE); - } -} - -/* Text control window proc - implements close on space and scrolling on - * arrows */ -LRESULT CALLBACK -NHTextControlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - /* tell Windows not to process arrow keys (we want them) */ - case WM_GETDLGCODE: - return DLGC_WANTARROWS; - - case WM_KEYDOWN: - switch (wParam) { - case VK_SPACE: - case VK_RETURN: - /* close on space */ - PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0); - return 0; - - case VK_UP: - /* scoll up */ - PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), - (LPARAM) NULL); - return 0; - - case VK_DOWN: - /* scoll down */ - PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), - (LPARAM) NULL); - return 0; - - case VK_LEFT: - /* scoll left */ - PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINELEFT, 0), - (LPARAM) NULL); - return 0; - - case VK_RIGHT: - /* scoll right */ - PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT, 0), - (LPARAM) NULL); - return 0; - } - break; /* case WM_KEYDOWN: */ - } - - if (editControlWndProc) - return CallWindowProc(editControlWndProc, hWnd, message, wParam, - lParam); - else - return 0; -} diff --git a/sys/wince/mhtext.h b/sys/wince/mhtext.h deleted file mode 100644 index 0d458e546..000000000 --- a/sys/wince/mhtext.h +++ /dev/null @@ -1,15 +0,0 @@ -/* NetHack 3.6 mhtext.h $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINTextWindow_h -#define MSWINTextWindow_h - -#include "winMS.h" -#include "config.h" -#include "global.h" - -HWND mswin_init_text_window(); -void mswin_display_text_window(HWND hwnd); - -#endif /* MSWINTextWindow_h */ diff --git a/sys/wince/mhtxtbuf.c b/sys/wince/mhtxtbuf.c deleted file mode 100644 index e5ac46f2d..000000000 --- a/sys/wince/mhtxtbuf.c +++ /dev/null @@ -1,269 +0,0 @@ -/* NetHack 3.6 mhtxtbuf.c $NHDT-Date: 1432512803 2015/05/25 00:13:23 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ -/* Copyright (C) 2003 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "mhtxtbuf.h" - -/* Collect Nethack text messages and render text into edit box. - Wrap text if necessary. - Recognize formatted lines as having more that 4 consecutive. - spaces inside the string. - Strip leading and trailing spaces. - Always break at the original line end (do not merge text that comes - from NetHack engine) -*/ - -/*----------------------------------------------------------------*/ -#define NHTEXT_BUFFER_INCREMENT 10 -/*----------------------------------------------------------------*/ -struct text_buffer_line { - int attr; - short beg_padding; - short end_padding; - BOOL formatted; - char *text; -}; -/*----------------------------------------------------------------*/ -typedef struct mswin_nethack_text_buffer { - BOOL b_wrap_text; - int n_size; - int n_used; - struct text_buffer_line *text_buffer_line; -} NHTextBuffer, *PNHTextBuffer; -/*----------------------------------------------------------------*/ -#define NHTextLine(pb, i) ((pb)->text_buffer_line[(i)]) -static TCHAR *nh_append(TCHAR *s, int *size, const char *ap); -/*----------------------------------------------------------------*/ -PNHTextBuffer -mswin_init_text_buffer(BOOL wrap_text) -{ - PNHTextBuffer pb = (PNHTextBuffer) malloc(sizeof(NHTextBuffer)); - if (!pb) - panic("Out of memory"); - - ZeroMemory(pb, sizeof(NHTextBuffer)); - pb->b_wrap_text = wrap_text; - pb->n_size = 0; - pb->n_used = 0; - pb->text_buffer_line = NULL; - return pb; -} -/*----------------------------------------------------------------*/ -void -mswin_free_text_buffer(PNHTextBuffer pb) -{ - int i; - - if (!pb) - return; - - for (i = 0; i < pb->n_used; i++) { - free(pb->text_buffer_line[i].text); - } - free(pb->text_buffer_line); - free(pb); -} -/*----------------------------------------------------------------*/ -void -mswin_add_text(PNHTextBuffer pb, int attr, const char *text) -{ - char *p; - struct text_buffer_line *new_line; - - /* grow buffer */ - if (pb->n_used >= pb->n_size) { - pb->n_size += NHTEXT_BUFFER_INCREMENT; - pb->text_buffer_line = (struct text_buffer_line *) realloc( - pb->text_buffer_line, - pb->n_size * sizeof(struct text_buffer_line)); - if (!pb->text_buffer_line) - panic("Memory allocation error"); - } - - /* analyze the new line of text */ - new_line = &NHTextLine(pb, pb->n_used); - new_line->attr = attr; - new_line->beg_padding = 0; - new_line->text = strdup(text); - for (p = new_line->text; *p && isspace(*p); p++) { - new_line->beg_padding++; - } - if (*p) { - memmove(new_line->text, new_line->text + new_line->beg_padding, - strlen(new_line->text) - new_line->beg_padding + 1); - for (p = new_line->text + strlen(new_line->text); - p >= new_line->text && isspace(*p); p--) { - new_line->end_padding++; - *p = 0; - } - - /* if there are 3 (or more) consecutive spaces inside the string - consider it formatted */ - new_line->formatted = (strstr(new_line->text, " ") != NULL) - || (new_line->beg_padding > 8); - } else { - new_line->end_padding = 0; - new_line->text[0] = 0; - new_line->formatted = FALSE; - } - pb->n_used++; -} -/*----------------------------------------------------------------*/ -void -mswin_set_text_wrap(PNHTextBuffer pb, BOOL wrap_text) -{ - pb->b_wrap_text = wrap_text; -} -/*----------------------------------------------------------------*/ -BOOL -mswin_get_text_wrap(PNHTextBuffer pb) -{ - return pb->b_wrap_text; -} -/*----------------------------------------------------------------*/ -static TCHAR * -nh_append(TCHAR *s, int *size, const char *ap) -{ - int tlen, tnewlen; - - if (!(ap && *ap)) - return s; - - /* append the calculated line to the text buffer */ - tlen = s ? _tcslen(s) : 0; - tnewlen = tlen + strlen(ap); - if (tnewlen >= *size) { - *size = max(tnewlen, *size + BUFSZ); - s = (TCHAR *) realloc(s, *size * sizeof(TCHAR)); - if (!s) - panic("Out of memory"); - ZeroMemory(s + tlen, (*size - tlen) * sizeof(TCHAR)); - } - if (strcmp(ap, "\r\n") == 0) { - _tcscat(s, TEXT("\r\n")); - } else { - NH_A2W(ap, s + tlen, strlen(ap)); - s[tnewlen] = 0; - } - return s; -} -/*----------------------------------------------------------------*/ -void -mswin_render_text(PNHTextBuffer pb, HWND edit_control) -{ - RECT rt_client; /* boundaries of the client area of the edit control */ - SIZE size_text; /* size of the edit control */ - RECT rt_text; /* calculated text rectangle for the visible line */ - char buf[BUFSZ]; /* buffer for the visible line */ - TCHAR tbuf[BUFSZ]; /* temp buffer for DrawText */ - TCHAR *pText = NULL; /* resulting text (formatted) */ - int pTextSize = 0; /* resulting text size */ - char *p_cur = NULL; /* current position in the - NHTextBuffer->text_buffer_line->text */ - char *p_buf_cur = NULL; /* current position in the visible line buffer */ - int i; - HDC hdcEdit; /* device context for the edit control */ - HFONT hFont, hOldFont; /* edit control font */ - - GetClientRect(edit_control, &rt_client); - size_text.cx = rt_client.right - rt_client.left; - size_text.cy = rt_client.bottom - rt_client.top; - size_text.cx -= - GetSystemMetrics(SM_CXVSCROLL); /* add a slight right margin - the - text looks better that way */ - hdcEdit = GetDC(edit_control); - hFont = (HFONT) SendMessage(edit_control, WM_GETFONT, 0, 0); - if (hFont) - hOldFont = SelectObject(hdcEdit, hFont); - - /* loop through each line (outer loop) and wrap it around (inner loop) */ - ZeroMemory(buf, sizeof(buf)); - p_buf_cur = buf; - for (i = 0; i < pb->n_used; i++) { - if (pb->b_wrap_text) { - p_cur = NHTextLine(pb, i).text; - - /* insert an line break for the empty string */ - if (!NHTextLine(pb, i).text[0]) { - pText = nh_append(pText, &pTextSize, "\r\n"); - continue; - } - - /* add margin to the "formatted" line of text */ - if (NHTextLine(pb, i).formatted) { - strcpy(buf, " "); - p_buf_cur += 3; - } - - /* scroll thourgh the current line of text and wrap it - so it fits to width of the edit control */ - while (*p_cur) { - char *p_word_pos = p_buf_cur; - - /* copy one word into the buffer */ - while (*p_cur && isspace(*p_cur)) - if (p_buf_cur != buf) - *p_buf_cur++ = *p_cur++; - else - p_cur++; - - while (*p_cur && !isspace(*p_cur)) - *p_buf_cur++ = *p_cur++; - - /* check if it fits */ - SetRect(&rt_text, 0, 0, size_text.cx, size_text.cy); - DrawText(hdcEdit, NH_A2W(buf, tbuf, p_buf_cur - buf), - p_buf_cur - buf, &rt_text, - DT_CALCRECT | DT_LEFT | DT_SINGLELINE | DT_NOCLIP); - if ((rt_text.right - rt_text.left) >= size_text.cx) { - /* Backtrack. - Only backtrack if the last word caused the overflow - - do not backtrack if the entire current line does not - fit the visible area. - Otherwise it is a infinite loop. - */ - if (p_word_pos > buf) { - p_cur -= (p_buf_cur - p_word_pos); - p_buf_cur = p_word_pos; - } - *p_buf_cur = 0; /* break the line */ - - /* append the calculated line to the text buffer */ - pText = nh_append(pText, &pTextSize, buf); - pText = nh_append(pText, &pTextSize, "\r\n"); - ZeroMemory(buf, sizeof(buf)); - p_buf_cur = buf; - } - } - - /* always break the line at the end of the buffer text */ - if (p_buf_cur != buf) { - /* flush the current buffrer */ - *p_buf_cur = 0; /* break the line */ - pText = nh_append(pText, &pTextSize, buf); - pText = nh_append(pText, &pTextSize, "\r\n"); - ZeroMemory(buf, sizeof(buf)); - p_buf_cur = buf; - } - } else { /* do not wrap text */ - int j; - for (j = 0; j < NHTextLine(pb, i).beg_padding; j++) - pText = nh_append(pText, &pTextSize, " "); - pText = nh_append(pText, &pTextSize, NHTextLine(pb, i).text); - pText = nh_append(pText, &pTextSize, "\r\n"); - } - } - - /* cleanup */ - if (hFont) - SelectObject(hdcEdit, hOldFont); - ReleaseDC(edit_control, hdcEdit); - - /* update edit control text */ - if (pText) { - SendMessage(edit_control, EM_FMTLINES, 1, 0); - SetWindowText(edit_control, pText); - free(pText); - } -} -/*----------------------------------------------------------------*/ diff --git a/sys/wince/mhtxtbuf.h b/sys/wince/mhtxtbuf.h deleted file mode 100644 index aef0913de..000000000 --- a/sys/wince/mhtxtbuf.h +++ /dev/null @@ -1,18 +0,0 @@ -/* NetHack 3.6 mhtxtbuf.h $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef MSWINTextBuffer_h -#define MSWINTextBuffer_h - -#include "winMS.h" - -typedef struct mswin_nethack_text_buffer *PNHTextBuffer; -PNHTextBuffer mswin_init_text_buffer(BOOL wrap_text); -void mswin_free_text_buffer(PNHTextBuffer pb); -void mswin_add_text(PNHTextBuffer pb, int attr, const char *text); -void mswin_set_text_wrap(PNHTextBuffer pb, BOOL wrap_text); -BOOL mswin_get_text_wrap(PNHTextBuffer pb); -void mswin_render_text(PNHTextBuffer pb, HWND edit_control); - -#endif /* MSWINTextBuffer_h */ diff --git a/sys/wince/mswproc.c b/sys/wince/mswproc.c deleted file mode 100644 index acc0ec463..000000000 --- a/sys/wince/mswproc.c +++ /dev/null @@ -1,1996 +0,0 @@ -/* NetHack 3.6 mswproc.c $NHDT-Date: 1433806606 2015/06/08 23:36:46 $ $NHDT-Branch: master $:$NHDT-Revision: 1.60 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * This file implements the interface between the window port specific - * code in the mswin port and the rest of the nethack game engine. -*/ - -#include "hack.h" -#include "dlb.h" -#include "winMS.h" -#include "mhmap.h" -#include "mhstatus.h" -#include "mhtext.h" -#include "mhmsgwnd.h" -#include "mhmenu.h" -#include "mhmsg.h" -#include "mhcmd.h" -#include "mhinput.h" -#include "mhaskyn.h" -#include "mhdlg.h" -#include "mhrip.h" -#include "mhmain.h" -#include "mhfont.h" -#include "mhcolor.h" - -#define LLEN 128 - -#ifdef _DEBUG -extern void logDebug(const char *fmt, ...); -#else -void -logDebug(const char *fmt, ...) -{ -} -#endif - -static void mswin_main_loop(); -static BOOL initMapTiles(void); -static void prompt_for_player_selection(void); - -/* Interface definition, for windows.c */ -struct window_procs mswin_procs = { - "MSWIN", - WC_COLOR | WC_HILITE_PET | WC_ALIGN_MESSAGE | WC_ALIGN_STATUS | WC_INVERSE - | WC_SCROLL_MARGIN | WC_MAP_MODE | WC_FONT_MESSAGE | WC_FONT_STATUS - | WC_FONT_MENU | WC_FONT_TEXT | WC_FONT_MAP | WC_FONTSIZ_MESSAGE - | WC_FONTSIZ_STATUS | WC_FONTSIZ_MENU | WC_FONTSIZ_TEXT - | WC_TILE_WIDTH | WC_TILE_HEIGHT | WC_TILE_FILE | WC_VARY_MSGCOUNT - | WC_WINDOWCOLORS | WC_PLAYER_SELECTION, - WC2_FULLSCREEN | WC2_SOFTKEYBOARD | WC2_WRAPTEXT, mswin_init_nhwindows, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* color availability */ - mswin_player_selection, mswin_askname, mswin_get_nh_event, - mswin_exit_nhwindows, mswin_suspend_nhwindows, mswin_resume_nhwindows, - mswin_create_nhwindow, mswin_clear_nhwindow, mswin_display_nhwindow, - mswin_destroy_nhwindow, mswin_curs, mswin_putstr, genl_putmixed, - mswin_display_file, mswin_start_menu, mswin_add_menu, mswin_end_menu, - mswin_select_menu, - genl_message_menu, /* no need for X-specific handling */ - mswin_update_inventory, mswin_mark_synch, mswin_wait_synch, -#ifdef CLIPPING - mswin_cliparound, -#endif -#ifdef POSITIONBAR - donull, -#endif - mswin_print_glyph, mswin_raw_print, mswin_raw_print_bold, mswin_nhgetch, - mswin_nh_poskey, mswin_nhbell, mswin_doprev_message, mswin_yn_function, - mswin_getlin, mswin_get_ext_cmd, mswin_number_pad, mswin_delay_output, -#ifdef CHANGE_COLOR /* only a Mac option currently */ - mswin, mswin_change_background, -#endif - /* other defs that really should go away (they're tty specific) */ - mswin_start_screen, mswin_end_screen, mswin_outrip, - mswin_preference_update, genl_getmsghistory, genl_putmsghistory, - genl_status_init, genl_status_finish, genl_status_enablefield, - genl_status_update, - genl_can_suspend_no, -}; - -/* -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 -mswin_init_nhwindows(int *argc, char **argv) -{ - HWND hWnd; - logDebug("mswin_init_nhwindows()\n"); - -#ifdef _DEBUG - { - /* truncate trace file */ - FILE *dfp = fopen("nhtrace.log", "w"); - fclose(dfp); - } -#endif - - /* intialize input subsystem */ - mswin_nh_input_init(); - - /* read registry settings */ - mswin_read_reg(); - - /* set it to WIN_ERR so we can detect attempts to - use this ID before it is inialized */ - WIN_MAP = WIN_ERR; - - /* check default values */ - if (iflags.wc_fontsiz_status < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_status > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_status = NHFONT_STATUS_DEFAULT_SIZE; - - if (iflags.wc_fontsiz_message < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_message > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_message = NHFONT_DEFAULT_SIZE; - - if (iflags.wc_fontsiz_text < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_text > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_text = NHFONT_DEFAULT_SIZE; - - if (iflags.wc_fontsiz_menu < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_menu > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_menu = NHFONT_DEFAULT_SIZE; - - if (iflags.wc_align_message == 0) - iflags.wc_align_message = ALIGN_BOTTOM; - if (iflags.wc_align_status == 0) - iflags.wc_align_status = ALIGN_TOP; - if (iflags.wc_scroll_margin == 0) - iflags.wc_scroll_margin = DEF_CLIPAROUND_MARGIN; - if (iflags.wc_tile_width == 0) - iflags.wc_tile_width = TILE_X; - if (iflags.wc_tile_height == 0) - iflags.wc_tile_height = TILE_Y; - - if (iflags.wc_vary_msgcount == 0) - iflags.wc_vary_msgcount = 3; - - /* force tabs in menus */ - iflags.menu_tab_sep = 1; - - /* force toptenwin to be true. toptenwin is the option that decides - * whether to - * write output to a window or stdout. stdout doesn't make sense on - * Windows - * non-console applications - */ - iflags.toptenwin = 1; - set_option_mod_status("toptenwin", SET_IN_FILE); - - /* initialize map tiles bitmap */ - initMapTiles(); - - /* set tile-related options to readonly */ - set_wc_option_mod_status(WC_TILE_WIDTH | WC_TILE_HEIGHT | WC_TILE_FILE, - DISP_IN_GAME); - - /* init color table */ - mswin_init_color_table(); - - /* set font-related options to change in the game */ - set_wc_option_mod_status( - WC_HILITE_PET | WC_ALIGN_MESSAGE | WC_ALIGN_STATUS | WC_SCROLL_MARGIN - | WC_MAP_MODE | WC_FONT_MESSAGE | WC_FONT_STATUS | WC_FONT_MENU - | WC_FONT_TEXT | WC_FONTSIZ_MESSAGE | WC_FONTSIZ_STATUS - | WC_FONTSIZ_MENU | WC_FONTSIZ_TEXT | WC_VARY_MSGCOUNT, - SET_IN_GAME); - - /* WC2 options */ - set_wc2_option_mod_status(WC2_FULLSCREEN | WC2_SOFTKEYBOARD, SET_IN_FILE); - GetNHApp()->bFullScreen = iflags.wc2_fullscreen; - GetNHApp()->bUseSIP = iflags.wc2_softkeyboard; - - set_wc2_option_mod_status(WC2_WRAPTEXT, SET_IN_GAME); - GetNHApp()->bWrapText = iflags.wc2_wraptext; - - /* create the main nethack window */ - hWnd = mswin_init_main_window(); - if (!hWnd) - panic("Cannot create the main window."); - ShowWindow(hWnd, GetNHApp()->nCmdShow); - UpdateWindow(hWnd); - GetNHApp()->hMainWnd = hWnd; - - /* set Full screen if requested */ - mswin_set_fullscreen(GetNHApp()->bFullScreen); - - /* let nethack code know that the window subsystem is ready */ - iflags.window_inited = TRUE; -} - -/* 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 -mswin_player_selection(void) -{ - logDebug("mswin_player_selection()\n"); - -#if defined(WIN_CE_SMARTPHONE) - /* SmartPhone does not supprt combo-boxes therefor we cannot - use dialog for player selection */ - prompt_for_player_selection(); -#else - if (iflags.wc_player_selection == VIA_DIALOG) { - int nRole; - - /* pick player type randomly (use pre-selected - * role/race/gender/alignment) */ - if (flags.randomall) { - if (flags.initrole < 0) { - flags.initrole = pick_role(flags.initrace, flags.initgend, - flags.initalign, PICK_RANDOM); - if (flags.initrole < 0) { - raw_print("Incompatible role!"); - flags.initrole = randrole(FALSE); - } - } - - if (flags.initrace < 0 - || !validrace(flags.initrole, flags.initrace)) { - flags.initrace = pick_race(flags.initrole, flags.initgend, - flags.initalign, PICK_RANDOM); - if (flags.initrace < 0) { - raw_print("Incompatible race!"); - flags.initrace = randrace(flags.initrole); - } - } - - if (flags.initgend < 0 - || !validgend(flags.initrole, flags.initrace, - flags.initgend)) { - flags.initgend = pick_gend(flags.initrole, flags.initrace, - flags.initalign, PICK_RANDOM); - if (flags.initgend < 0) { - raw_print("Incompatible gender!"); - flags.initgend = randgend(flags.initrole, flags.initrace); - } - } - - if (flags.initalign < 0 - || !validalign(flags.initrole, flags.initrace, - flags.initalign)) { - flags.initalign = pick_align(flags.initrole, flags.initrace, - flags.initgend, PICK_RANDOM); - if (flags.initalign < 0) { - raw_print("Incompatible alignment!"); - flags.initalign = - randalign(flags.initrole, flags.initrace); - } - } - } else { - /* select a role */ - if (mswin_player_selection_window(&nRole) == IDCANCEL) { - bail(0); - } - } - } else { /* iflags.wc_player_selection == VIA_PROMPTS */ - prompt_for_player_selection(); - } -#endif /* defined(WIN_CE_SMARTPHONE) */ -} - -void -prompt_for_player_selection(void) -{ - int i, k, n; - char pick4u = 'n', thisch, lastch = 0; - char pbuf[QBUFSZ], plbuf[QBUFSZ]; - winid win; - anything any; - menu_item *selected = 0; - int box_result; - TCHAR wbuf[BUFSZ]; - - logDebug("prompt_for_player_selection()\n"); - - /* prevent an unnecessary prompt */ - rigid_role_checks(); - - /* Should we randomly pick for the player? */ - if (!flags.randomall - && (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE - || flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE)) { - /* int echoline; */ - char *prompt = build_plselection_prompt( - pbuf, QBUFSZ, flags.initrole, flags.initrace, flags.initgend, - flags.initalign); - - /* tty_putstr(BASE_WINDOW, 0, ""); */ - /* echoline = wins[BASE_WINDOW]->cury; */ - box_result = MessageBox(NULL, NH_A2W(prompt, wbuf, BUFSZ), - TEXT("NetHack for Windows"), -#if defined(WIN_CE_SMARTPHONE) - MB_YESNO | MB_DEFBUTTON1 -#else - MB_YESNOCANCEL | MB_DEFBUTTON1 -#endif - ); - - pick4u = - (box_result == IDYES) ? 'y' : (box_result == IDNO) ? 'n' : '\033'; - /* tty_putstr(BASE_WINDOW, 0, prompt); */ - do { - /* pick4u = lowc(readchar()); */ - if (index(quitchars, pick4u)) - pick4u = 'y'; - } while (!index(ynqchars, pick4u)); - if ((int) strlen(prompt) + 1 < CO) { - /* Echo choice and move back down line */ - /* tty_putsym(BASE_WINDOW, (int)strlen(prompt)+1, echoline, - * pick4u); */ - /* tty_putstr(BASE_WINDOW, 0, ""); */ - } else - /* Otherwise it's hard to tell where to echo, and things are - * wrapping a bit messily anyway, so (try to) make sure the next - * question shows up well and doesn't get wrapped at the - * bottom of the window. - */ - /* tty_clear_nhwindow(BASE_WINDOW) */; - - if (pick4u != 'y' && pick4u != 'n') { - give_up: /* Quit */ - if (selected) - free((genericptr_t) selected); - bail((char *) 0); - /*NOTREACHED*/ - return; - } - } - - (void) root_plselection_prompt(plbuf, QBUFSZ - 1, flags.initrole, - flags.initrace, flags.initgend, - flags.initalign); - - /* Select a role, if necessary */ - /* we'll try to be compatible with pre-selected race/gender/alignment, - * but may not succeed */ - if (flags.initrole < 0) { - char rolenamebuf[QBUFSZ]; - /* Process the choice */ - if (pick4u == 'y' || flags.initrole == ROLE_RANDOM - || flags.randomall) { - /* Pick a random role */ - flags.initrole = pick_role(flags.initrace, flags.initgend, - flags.initalign, PICK_RANDOM); - if (flags.initrole < 0) { - /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ - flags.initrole = randrole(FALSE); - } - } else { - /* tty_clear_nhwindow(BASE_WINDOW); */ - /* tty_putstr(BASE_WINDOW, 0, "Choosing Character's Role"); */ - /* Prompt for a role */ - win = create_nhwindow(NHW_MENU); - start_menu(win); - any.a_void = 0; /* zero out all bits */ - for (i = 0; roles[i].name.m; i++) { - if (ok_role(i, flags.initrace, flags.initgend, - flags.initalign)) { - any.a_int = i + 1; /* must be non-zero */ - thisch = lowc(roles[i].name.m[0]); - if (thisch == lastch) - thisch = highc(thisch); - if (flags.initgend != ROLE_NONE - && flags.initgend != ROLE_RANDOM) { - if (flags.initgend == 1 && roles[i].name.f) - Strcpy(rolenamebuf, roles[i].name.f); - else - Strcpy(rolenamebuf, roles[i].name.m); - } else { - if (roles[i].name.f) { - Strcpy(rolenamebuf, roles[i].name.m); - Strcat(rolenamebuf, "/"); - Strcat(rolenamebuf, roles[i].name.f); - } else - Strcpy(rolenamebuf, roles[i].name.m); - } - add_menu(win, NO_GLYPH, &any, thisch, 0, ATR_NONE, - an(rolenamebuf), MENU_UNSELECTED); - lastch = thisch; - } - } - any.a_int = pick_role(flags.initrace, flags.initgend, - flags.initalign, PICK_RANDOM) + 1; - if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole(FALSE) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); - any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); - Sprintf(pbuf, "Pick a role for your %s", plbuf); - end_menu(win, pbuf); - n = select_menu(win, PICK_ONE, &selected); - destroy_nhwindow(win); - - /* Process the choice */ - if (n != 1 || selected[0].item.a_int == any.a_int) - goto give_up; /* Selected quit */ - - flags.initrole = selected[0].item.a_int - 1; - free((genericptr_t) selected), selected = 0; - } - (void) root_plselection_prompt(plbuf, QBUFSZ - 1, flags.initrole, - flags.initrace, flags.initgend, - flags.initalign); - } - - /* 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)) { - /* pre-selected race not valid */ - if (pick4u == 'y' || flags.initrace == ROLE_RANDOM - || flags.randomall) { - flags.initrace = pick_race(flags.initrole, flags.initgend, - flags.initalign, PICK_RANDOM); - if (flags.initrace < 0) { - /* tty_putstr(BASE_WINDOW, 0, "Incompatible race!"); */ - flags.initrace = randrace(flags.initrole); - } - } else { /* pick4u == 'n' */ - /* Count the number of valid races */ - n = 0; /* number valid */ - k = 0; /* valid race */ - for (i = 0; races[i].noun; i++) { - if (ok_race(flags.initrole, i, flags.initgend, - flags.initalign)) { - n++; - k = i; - } - } - if (n == 0) { - for (i = 0; races[i].noun; i++) { - if (validrace(flags.initrole, i)) { - n++; - k = i; - } - } - } - - /* Permit the user to pick, if there is more than one */ - if (n > 1) { - /* tty_clear_nhwindow(BASE_WINDOW); */ - /* tty_putstr(BASE_WINDOW, 0, "Choosing Race"); */ - win = create_nhwindow(NHW_MENU); - start_menu(win); - any.a_void = 0; /* zero out all bits */ - for (i = 0; races[i].noun; i++) - if (ok_race(flags.initrole, i, flags.initgend, - flags.initalign)) { - any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, races[i].noun[0], 0, - ATR_NONE, races[i].noun, MENU_UNSELECTED); - } - any.a_int = pick_race(flags.initrole, flags.initgend, - flags.initalign, PICK_RANDOM) + 1; - if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrace(flags.initrole) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); - any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); - Sprintf(pbuf, "Pick the race of your %s", plbuf); - end_menu(win, pbuf); - n = select_menu(win, PICK_ONE, &selected); - destroy_nhwindow(win); - if (n != 1 || selected[0].item.a_int == any.a_int) - goto give_up; /* Selected quit */ - - k = selected[0].item.a_int - 1; - free((genericptr_t) selected), selected = 0; - } - flags.initrace = k; - } - (void) root_plselection_prompt(plbuf, QBUFSZ - 1, flags.initrole, - flags.initrace, flags.initgend, - flags.initalign); - } - - /* 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)) { - /* pre-selected gender not valid */ - if (pick4u == 'y' || flags.initgend == ROLE_RANDOM - || flags.randomall) { - flags.initgend = pick_gend(flags.initrole, flags.initrace, - flags.initalign, PICK_RANDOM); - if (flags.initgend < 0) { - /* tty_putstr(BASE_WINDOW, 0, "Incompatible gender!"); */ - flags.initgend = randgend(flags.initrole, flags.initrace); - } - } else { /* pick4u == 'n' */ - /* Count the number of valid genders */ - n = 0; /* number valid */ - k = 0; /* valid gender */ - for (i = 0; i < ROLE_GENDERS; i++) { - if (ok_gend(flags.initrole, flags.initrace, i, - flags.initalign)) { - n++; - k = i; - } - } - if (n == 0) { - for (i = 0; i < ROLE_GENDERS; i++) { - if (validgend(flags.initrole, flags.initrace, i)) { - n++; - k = i; - } - } - } - - /* Permit the user to pick, if there is more than one */ - if (n > 1) { - /* tty_clear_nhwindow(BASE_WINDOW); */ - /* tty_putstr(BASE_WINDOW, 0, "Choosing Gender"); */ - win = create_nhwindow(NHW_MENU); - start_menu(win); - any.a_void = 0; /* zero out all bits */ - for (i = 0; i < ROLE_GENDERS; i++) - if (ok_gend(flags.initrole, flags.initrace, i, - flags.initalign)) { - any.a_int = i + 1; - add_menu(win, NO_GLYPH, &any, genders[i].adj[0], 0, - ATR_NONE, genders[i].adj, MENU_UNSELECTED); - } - any.a_int = pick_gend(flags.initrole, flags.initrace, - flags.initalign, PICK_RANDOM) + 1; - if (any.a_int == 0) /* must be non-zero */ - any.a_int = randgend(flags.initrole, flags.initrace) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); - any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); - Sprintf(pbuf, "Pick the gender of your %s", plbuf); - end_menu(win, pbuf); - n = select_menu(win, PICK_ONE, &selected); - destroy_nhwindow(win); - if (n != 1 || selected[0].item.a_int == any.a_int) - goto give_up; /* Selected quit */ - - k = selected[0].item.a_int - 1; - free((genericptr_t) selected), selected = 0; - } - flags.initgend = k; - } - (void) root_plselection_prompt(plbuf, QBUFSZ - 1, flags.initrole, - flags.initrace, flags.initgend, - flags.initalign); - } - - /* Select an alignment, if necessary */ - /* force compatibility with role/race/gender */ - if (flags.initalign < 0 - || !validalign(flags.initrole, flags.initrace, flags.initalign)) { - /* pre-selected alignment not valid */ - if (pick4u == 'y' || flags.initalign == ROLE_RANDOM - || flags.randomall) { - flags.initalign = pick_align(flags.initrole, flags.initrace, - flags.initgend, PICK_RANDOM); - if (flags.initalign < 0) { - /* tty_putstr(BASE_WINDOW, 0, "Incompatible alignment!"); */ - flags.initalign = randalign(flags.initrole, flags.initrace); - } - } else { /* pick4u == 'n' */ - /* Count the number of valid alignments */ - n = 0; /* number valid */ - k = 0; /* valid alignment */ - for (i = 0; i < ROLE_ALIGNS; i++) { - if (ok_align(flags.initrole, flags.initrace, flags.initgend, - i)) { - n++; - k = i; - } - } - if (n == 0) { - for (i = 0; i < ROLE_ALIGNS; i++) { - if (validalign(flags.initrole, flags.initrace, i)) { - n++; - k = i; - } - } - } - - /* Permit the user to pick, if there is more than one */ - if (n > 1) { - /* tty_clear_nhwindow(BASE_WINDOW); */ - /* tty_putstr(BASE_WINDOW, 0, "Choosing Alignment"); */ - win = create_nhwindow(NHW_MENU); - start_menu(win); - any.a_void = 0; /* zero out all bits */ - for (i = 0; i < ROLE_ALIGNS; i++) - if (ok_align(flags.initrole, flags.initrace, - flags.initgend, i)) { - any.a_int = i + 1; - add_menu(win, NO_GLYPH, &any, aligns[i].adj[0], 0, - ATR_NONE, aligns[i].adj, MENU_UNSELECTED); - } - any.a_int = pick_align(flags.initrole, flags.initrace, - flags.initgend, PICK_RANDOM) + 1; - if (any.a_int == 0) /* must be non-zero */ - any.a_int = randalign(flags.initrole, flags.initrace) + 1; - add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", - MENU_UNSELECTED); - any.a_int = i + 1; /* must be non-zero */ - add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit", - MENU_UNSELECTED); - Sprintf(pbuf, "Pick the alignment of your %s", plbuf); - end_menu(win, pbuf); - n = select_menu(win, PICK_ONE, &selected); - destroy_nhwindow(win); - if (n != 1 || selected[0].item.a_int == any.a_int) - goto give_up; /* Selected quit */ - - k = selected[0].item.a_int - 1; - free((genericptr_t) selected), selected = 0; - } - flags.initalign = k; - } - } - /* Success! */ - /* tty_display_nhwindow(BASE_WINDOW, FALSE); */ -} - -/* Ask the user for a player name. */ -void -mswin_askname(void) -{ - logDebug("mswin_askname()\n"); - - if (mswin_getlin_window("who are you?", plname, PL_NSIZ) == IDCANCEL) { - bail("bye-bye"); - /* not reached */ - } -} - -/* Does window event processing (e.g. exposure events). - A noop for the tty and X window-ports. -*/ -void -mswin_get_nh_event(void) -{ - logDebug("mswin_get_nh_event()\n"); - return; -} - -/* Exits the window system. This should dismiss all windows, - except the "window" used for raw_print(). str is printed if possible. -*/ -void -mswin_exit_nhwindows(const char *str) -{ - logDebug("mswin_exit_nhwindows(%s)\n", str); - - /* Write Window settings to the registry */ - mswin_write_reg(); - - // Don't do any of this (?) - exit_nhwindows does not terminate - // the application - // DestroyWindow(GetNHApp()->hMainWnd); - // nh_terminate(EXIT_SUCCESS); -} - -/* Prepare the window to be suspended. */ -void -mswin_suspend_nhwindows(const char *str) -{ - logDebug("mswin_suspend_nhwindows(%s)\n", str); - return; -} - -/* Restore the windows after being suspended. */ -void -mswin_resume_nhwindows() -{ - logDebug("mswin_resume_nhwindows()\n"); - return; -} - -/* 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 -mswin_create_nhwindow(int type) -{ - winid i = 0; - MSNHMsgAddWnd data; - - logDebug("mswin_create_nhwindow(%d)\n", type); - - /* Return the next available winid - */ - - for (i = 1; i < MAXWINDOWS; i++) - if (GetNHApp()->windowlist[i].win == NULL - && !GetNHApp()->windowlist[i].dead) - break; - if (i == MAXWINDOWS) - panic("ERROR: No windows available...\n"); - - switch (type) { - case NHW_MAP: { - GetNHApp()->windowlist[i].win = mswin_init_map_window(); - GetNHApp()->windowlist[i].type = type; - GetNHApp()->windowlist[i].dead = 0; - break; - } - case NHW_MESSAGE: { - GetNHApp()->windowlist[i].win = mswin_init_message_window(); - GetNHApp()->windowlist[i].type = type; - GetNHApp()->windowlist[i].dead = 0; - break; - } - case NHW_STATUS: { - GetNHApp()->windowlist[i].win = mswin_init_status_window(); - GetNHApp()->windowlist[i].type = type; - GetNHApp()->windowlist[i].dead = 0; - break; - } - case NHW_MENU: { - GetNHApp()->windowlist[i].win = NULL; // will create later - GetNHApp()->windowlist[i].type = type; - GetNHApp()->windowlist[i].dead = 1; - break; - } - case NHW_TEXT: { - GetNHApp()->windowlist[i].win = mswin_init_text_window(); - GetNHApp()->windowlist[i].type = type; - GetNHApp()->windowlist[i].dead = 0; - break; - } - } - - ZeroMemory(&data, sizeof(data)); - data.wid = i; - SendMessage(GetNHApp()->hMainWnd, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_ADDWND, (LPARAM) &data); - return i; -} - -/* Clear the given window, when asked to. */ -void -mswin_clear_nhwindow(winid wid) -{ - logDebug("mswin_clear_nhwindow(%d)\n", wid); - - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - if (GetNHApp()->windowlist[wid].type == NHW_MAP) { - if (Is_rogue_level(&u.uz)) - mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), - ROGUE_LEVEL_MAP_MODE); - else - mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), - iflags.wc_map_mode); - } - - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_CLEAR_WINDOW, (LPARAM) NULL); - } -} - -/* -- 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 -mswin_display_nhwindow(winid wid, BOOLEAN_P block) -{ - logDebug("mswin_display_nhwindow(%d, %d)\n", wid, block); - if (GetNHApp()->windowlist[wid].win != NULL) { - if (GetNHApp()->windowlist[wid].type == NHW_MENU) { - MENU_ITEM_P *p; - mswin_menu_window_select_menu(GetNHApp()->windowlist[wid].win, - PICK_NONE, &p); - } - if (GetNHApp()->windowlist[wid].type == NHW_TEXT) { - mswin_display_text_window(GetNHApp()->windowlist[wid].win); - } - if (GetNHApp()->windowlist[wid].type == NHW_RIP) { - mswin_display_RIP_window(GetNHApp()->windowlist[wid].win); - } else { - if (!block) { - UpdateWindow(GetNHApp()->windowlist[wid].win); - } else { - if (GetNHApp()->windowlist[wid].type == NHW_MAP) { - (void) mswin_nhgetch(); - } - } - } - SetFocus(GetNHApp()->hMainWnd); - } -} - -HWND -mswin_hwnd_from_winid(winid wid) -{ - if (wid >= 0 && wid < MAXWINDOWS) { - return GetNHApp()->windowlist[wid].win; - } else { - return NULL; - } -} - -winid -mswin_winid_from_handle(HWND hWnd) -{ - winid i = 0; - - for (i = 1; i < MAXWINDOWS; i++) - if (GetNHApp()->windowlist[i].win == hWnd) - return i; - return -1; -} - -winid -mswin_winid_from_type(int type) -{ - winid i = 0; - - for (i = 1; i < MAXWINDOWS; i++) - if (GetNHApp()->windowlist[i].type == type) - return i; - return -1; -} - -void -mswin_window_mark_dead(winid wid) -{ - if (wid >= 0 && wid < MAXWINDOWS) { - GetNHApp()->windowlist[wid].win = NULL; - GetNHApp()->windowlist[wid].dead = 1; - } -} - -/* Destroy will dismiss the window if the window has not - * already been dismissed. -*/ -void -mswin_destroy_nhwindow(winid wid) -{ - logDebug("mswin_destroy_nhwindow(%d)\n", wid); - - if ((GetNHApp()->windowlist[wid].type == NHW_MAP) - || (GetNHApp()->windowlist[wid].type == NHW_MESSAGE) - || (GetNHApp()->windowlist[wid].type == NHW_STATUS)) { - /* main windows is going to take care of those */ - return; - } - - if (wid != -1) { - if (!GetNHApp()->windowlist[wid].dead - && GetNHApp()->windowlist[wid].win != NULL) - DestroyWindow(GetNHApp()->windowlist[wid].win); - GetNHApp()->windowlist[wid].win = NULL; - GetNHApp()->windowlist[wid].type = 0; - GetNHApp()->windowlist[wid].dead = 0; - } -} - -/* 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 -mswin_curs(winid wid, int x, int y) -{ - logDebug("mswin_curs(%d, %d, %d)\n", wid, x, y); - - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - MSNHMsgCursor data; - data.x = x; - data.y = y; - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_CURSOR, (LPARAM) &data); - } -} - -/* -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 -mswin_putstr(winid wid, int attr, const char *text) -{ - logDebug("mswin_putstr(%d, %d, %s)\n", wid, attr, text); - - mswin_putstr_ex(wid, attr, text, 0); -} - -void -mswin_putstr_ex(winid wid, int attr, const char *text, boolean app) -{ - if ((wid >= 0) && (wid < MAXWINDOWS)) { - if (GetNHApp()->windowlist[wid].win == NULL - && GetNHApp()->windowlist[wid].type == NHW_MENU) { - GetNHApp()->windowlist[wid].win = - mswin_init_menu_window(MENU_TYPE_TEXT); - GetNHApp()->windowlist[wid].dead = 0; - } - - if (GetNHApp()->windowlist[wid].win != NULL) { - MSNHMsgPutstr data; - ZeroMemory(&data, sizeof(data)); - data.attr = attr; - data.text = text; - data.append = app; - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_PUTSTR, (LPARAM) &data); - } - } -} - -/* Display the file named str. Complain about missing files - iff complain is TRUE. -*/ -void -mswin_display_file(const char *filename, BOOLEAN_P must_exist) -{ - dlb *f; - TCHAR wbuf[BUFSZ]; - - logDebug("mswin_display_file(%s, %d)\n", filename, must_exist); - - f = dlb_fopen(filename, RDTMODE); - if (!f) { - if (must_exist) { - TCHAR message[90]; - _stprintf(message, TEXT("Warning! Could not find file: %s\n"), - NH_A2W(filename, wbuf, sizeof(wbuf))); - MessageBox(GetNHApp()->hMainWnd, message, TEXT("ERROR"), - MB_OK | MB_ICONERROR); - } - } else { - winid text; - char line[LLEN]; - - text = mswin_create_nhwindow(NHW_TEXT); - - while (dlb_fgets(line, LLEN, f)) { - size_t len; - len = strlen(line); - if (line[len - 1] == '\n') - line[len - 1] = '\x0'; - mswin_putstr(text, ATR_NONE, line); - } - (void) dlb_fclose(f); - - mswin_display_nhwindow(text, 1); - mswin_destroy_nhwindow(text); - } -} - -/* 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 -mswin_start_menu(winid wid) -{ - logDebug("mswin_start_menu(%d)\n", wid); - if ((wid >= 0) && (wid < MAXWINDOWS)) { - if (GetNHApp()->windowlist[wid].win == NULL - && GetNHApp()->windowlist[wid].type == NHW_MENU) { - GetNHApp()->windowlist[wid].win = - mswin_init_menu_window(MENU_TYPE_MENU); - GetNHApp()->windowlist[wid].dead = 0; - } - - if (GetNHApp()->windowlist[wid].win != NULL) { - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_STARTMENU, (LPARAM) NULL); - } - } -} - -/* -add_menu(windid window, 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 aliases), 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 -mswin_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) -{ - logDebug("mswin_add_menu(%d, %d, %p, %c, %c, %d, %s, %d)\n", wid, glyph, - identifier, (char) accelerator, (char) group_accel, attr, str, - presel); - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - MSNHMsgAddMenu data; - ZeroMemory(&data, sizeof(data)); - data.glyph = glyph; - data.identifier = identifier; - data.accelerator = accelerator; - data.group_accel = group_accel; - data.attr = attr; - data.str = str; - data.presel = presel; - - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_ADDMENU, (LPARAM) &data); - } -} - -/* -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 -mswin_end_menu(winid wid, const char *prompt) -{ - logDebug("mswin_end_menu(%d, %s)\n", wid, prompt); - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - MSNHMsgEndMenu data; - ZeroMemory(&data, sizeof(data)); - data.text = prompt; - - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_ENDMENU, (LPARAM) &data); - } -} - -/* -int select_menu(windid 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 -mswin_select_menu(winid wid, int how, MENU_ITEM_P **selected) -{ - int nReturned = -1; - - logDebug("mswin_select_menu(%d, %d)\n", wid, how); - - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - nReturned = mswin_menu_window_select_menu( - GetNHApp()->windowlist[wid].win, how, selected); - } - return nReturned; -} - -/* - -- Indicate to the window port that the inventory has been changed. - -- Merely calls display_inventory() for window-ports that leave the - window up, otherwise empty. -*/ -void -mswin_update_inventory() -{ - logDebug("mswin_update_inventory()\n"); -} - -/* -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 -mswin_mark_synch() -{ - logDebug("mswin_mark_synch()\n"); -} - -/* -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 -mswin_wait_synch() -{ - logDebug("mswin_wait_synch()\n"); -} - -/* -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 -mswin_cliparound(int x, int y) -{ - winid wid = WIN_MAP; - - logDebug("mswin_cliparound(%d, %d)\n", x, y); - - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - MSNHMsgClipAround data; - data.x = x; - data.y = y; - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_CLIPAROUND, (LPARAM) &data); - } -} - -/* -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). -*/ -void -mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph) -{ - logDebug("mswin_print_glyph(%d, %d, %d, %d, %d)\n", wid, x, y, glyph, bkglyph); - - if ((wid >= 0) && (wid < MAXWINDOWS) - && (GetNHApp()->windowlist[wid].win != NULL)) { - MSNHMsgPrintGlyph data; - - ZeroMemory(&data, sizeof(data)); - data.x = x; - data.y = y; - data.glyph = glyph; - SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, - (WPARAM) MSNH_MSG_PRINT_GLYPH, (LPARAM) &data); - } -} - -/* -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 -mswin_raw_print(const char *str) -{ - TCHAR wbuf[255]; - logDebug("mswin_raw_print(%s)\n", str); - if (str && *str) - MessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), - TEXT("NetHack"), MB_OK); -} - -/* -raw_print_bold(str) - -- Like raw_print(), but prints in bold/standout (if -possible). -*/ -void -mswin_raw_print_bold(const char *str) -{ - TCHAR wbuf[255]; - logDebug("mswin_raw_print_bold(%s)\n", str); - if (str && *str) - MessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), - TEXT("NetHack"), MB_OK); -} - -/* -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 -mswin_nhgetch() -{ - PMSNHEvent event; - int key = 0; - - logDebug("mswin_nhgetch()\n"); - - while ((event = mswin_input_pop()) == NULL || event->type != NHEVENT_CHAR) - mswin_main_loop(); - - key = event->kbd.ch; - return (key); -} - -/* -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 -mswin_nh_poskey(int *x, int *y, int *mod) -{ - PMSNHEvent event; - int key; - - logDebug("mswin_nh_poskey()\n"); - - while ((event = mswin_input_pop()) == NULL) - mswin_main_loop(); - - if (event->type == NHEVENT_MOUSE) { - *mod = event->ms.mod; - *x = event->ms.x; - *y = event->ms.y; - key = 0; - } else { - key = event->kbd.ch; - } - return (key); -} - -/* -nhbell() -- Beep at user. [This will exist at least until sounds are - redone, since sounds aren't attributable to windows -anyway.] -*/ -void -mswin_nhbell() -{ - logDebug("mswin_nhbell()\n"); -} - -/* -doprev_message() - -- Display previous messages. Used by the ^P command. - -- On the tty-port this scrolls WIN_MESSAGE back one line. -*/ -int -mswin_doprev_message() -{ - logDebug("mswin_doprev_message()\n"); - SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL, - MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL); - 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 -mswin_yn_function(const char *question, const char *choices, CHAR_P def) -{ - int result = -1; - char ch; - char yn_esc_map = '\033'; - char message[BUFSZ]; - char res_ch[2]; - - logDebug("mswin_yn_function(%s, %s, %d)\n", question, choices, def); - - if (choices) { - char *cb, choicebuf[QBUFSZ]; - Strcpy(choicebuf, choices); - if ((cb = index(choicebuf, '\033')) != 0) { - /* anything beyond is hidden */ - *cb = '\0'; - } - (void) strncpy(message, question, QBUFSZ - 1); - message[QBUFSZ - 1] = '\0'; - sprintf(eos(message), " [%s]", choicebuf); - if (def) - sprintf(eos(message), " (%c)", def); - Strcat(message, " "); - /* escape maps to 'q' or 'n' or default, in that order */ - yn_esc_map = - (index(choices, 'q') ? 'q' : (index(choices, 'n') ? 'n' : def)); - } else { - Strcpy(message, question); - } - -#if defined(WIN_CE_SMARTPHONE) - { - char buf[BUFSZ]; - ZeroMemory(buf, sizeof(buf)); - if (choices) { - if (!index(choices, '\033')) - buf[0] = '\033'; /* make sure ESC is always available */ - strncat(buf, choices, sizeof(buf) - 2); - NHSPhoneSetKeypadFromString(buf); - } else { - /* sometimes choices are included in the message itself, e.g. - * "what? [abcd]" */ - char *p1, *p2; - p1 = strchr(question, '['); - p2 = strrchr(question, ']'); - if (p1 && p2 && p1 < p2) { - buf[0] = '\033'; /* make sure ESC is always available */ - strncat(buf, p1 + 1, p2 - p1 - 1); - NHSPhoneSetKeypadFromString(buf); - } else if (strstr(question, "direction")) { - /* asking for direction here */ - NHSPhoneSetKeypadDirection(); - } else { - /* anything goes */ - NHSPhoneSetKeypadFromString("\0330-9a-zA-Z"); - } - } - } -#endif /* defined(WIN_CE_SMARTPHONE) */ - - mswin_putstr(WIN_MESSAGE, ATR_BOLD, message); - - /* Only here if main window is not present */ - while (result < 0) { - ch = mswin_nhgetch(); - if (ch == '\033') { - result = yn_esc_map; - } else if (choices && !index(choices, ch)) { - /* FYI: ch==-115 is for KP_ENTER */ - if (def - && (ch == ' ' || ch == '\r' || ch == '\n' || ch == -115)) { - result = def; - } else { - mswin_nhbell(); - /* and try again... */ - } - } else { - result = ch; - } - } - - /* display selection in the message window */ - if (isprint(ch)) { - res_ch[0] = ch; - res_ch[1] = '\x0'; - mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, res_ch, 1); - } - - /* prevent "--more--" prompt from appearing when several - questions being asked in the same loop (like selling - something in the shop) - It does not really clears the window - mhmsgwnd.c */ - mswin_clear_nhwindow(WIN_MESSAGE); - -#if defined(WIN_CE_SMARTPHONE) - NHSPhoneSetKeypadDefault(); -#endif - return result; -} - -/* -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 -mswin_getlin(const char *question, char *input) -{ - logDebug("mswin_getlin(%s, %p)\n", question, input); - if (mswin_getlin_window(question, input, BUFSZ) == IDCANCEL) { - strcpy(input, "\033"); - } -} - -/* -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 -mswin_get_ext_cmd() -{ - int ret; - logDebug("mswin_get_ext_cmd()\n"); - - if (mswin_ext_cmd_window(&ret) == IDCANCEL) - return -1; - else - return ret; -} - -/* -number_pad(state) - -- Initialize the number pad to the given state. -*/ -void -mswin_number_pad(int state) -{ - /* Do Nothing */ - logDebug("mswin_number_pad(%d)\n", 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 -mswin_delay_output() -{ - logDebug("mswin_delay_output()\n"); - Sleep(50); -} - -void -mswin_change_color() -{ - logDebug("mswin_change_color()\n"); -} - -char * -mswin_get_color_string() -{ - logDebug("mswin_get_color_string()\n"); - return (""); -} - -/* -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 -mswin_start_screen() -{ - /* Do Nothing */ - logDebug("mswin_start_screen()\n"); -} - -/* -end_screen() -- Only used on Unix tty ports, but must be declared for - completeness. The complement of start_screen(). -*/ -void -mswin_end_screen() -{ - /* Do Nothing */ - logDebug("mswin_end_screen()\n"); -} - -/* -outrip(winid, int, when) - -- The tombstone code. If you want the traditional code use - genl_outrip for the value and check the #if in rip.c. -*/ -void -mswin_outrip(winid wid, int how, time_t when) -{ - logDebug("mswin_outrip(%d, %d, %ld)\n", wid, how, (long) when); - if ((wid >= 0) && (wid < MAXWINDOWS)) { - DestroyWindow(GetNHApp()->windowlist[wid].win); - GetNHApp()->windowlist[wid].win = mswin_init_RIP_window(); - GetNHApp()->windowlist[wid].type = NHW_RIP; - GetNHApp()->windowlist[wid].dead = 0; - } - genl_outrip(wid, how, when); -} - -/* handle options updates here */ -void -mswin_preference_update(const char *pref) -{ - HDC hdc; - - if (_stricmp(pref, "font_menu") == 0 - || _stricmp(pref, "font_size_menu") == 0) { - if (iflags.wc_fontsiz_menu < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_menu > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_menu = NHFONT_DEFAULT_SIZE; - - hdc = GetDC(GetNHApp()->hMainWnd); - mswin_get_font(NHW_MENU, ATR_NONE, hdc, TRUE); - mswin_get_font(NHW_MENU, ATR_BOLD, hdc, TRUE); - mswin_get_font(NHW_MENU, ATR_DIM, hdc, TRUE); - mswin_get_font(NHW_MENU, ATR_ULINE, hdc, TRUE); - mswin_get_font(NHW_MENU, ATR_BLINK, hdc, TRUE); - mswin_get_font(NHW_MENU, ATR_INVERSE, hdc, TRUE); - ReleaseDC(GetNHApp()->hMainWnd, hdc); - - mswin_layout_main_window(NULL); - return; - } - - if (_stricmp(pref, "font_status") == 0 - || _stricmp(pref, "font_size_status") == 0) { - if (iflags.wc_fontsiz_status < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_status > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_status = NHFONT_DEFAULT_SIZE; - - hdc = GetDC(GetNHApp()->hMainWnd); - mswin_get_font(NHW_STATUS, ATR_NONE, hdc, TRUE); - mswin_get_font(NHW_STATUS, ATR_BOLD, hdc, TRUE); - mswin_get_font(NHW_STATUS, ATR_DIM, hdc, TRUE); - mswin_get_font(NHW_STATUS, ATR_ULINE, hdc, TRUE); - mswin_get_font(NHW_STATUS, ATR_BLINK, hdc, TRUE); - mswin_get_font(NHW_STATUS, ATR_INVERSE, hdc, TRUE); - ReleaseDC(GetNHApp()->hMainWnd, hdc); - - mswin_layout_main_window(NULL); - return; - } - - if (_stricmp(pref, "font_message") == 0 - || _stricmp(pref, "font_size_message") == 0) { - if (iflags.wc_fontsiz_message < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_message > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_message = NHFONT_DEFAULT_SIZE; - - hdc = GetDC(GetNHApp()->hMainWnd); - mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, TRUE); - mswin_get_font(NHW_MESSAGE, ATR_BOLD, hdc, TRUE); - mswin_get_font(NHW_MESSAGE, ATR_DIM, hdc, TRUE); - mswin_get_font(NHW_MESSAGE, ATR_ULINE, hdc, TRUE); - mswin_get_font(NHW_MESSAGE, ATR_BLINK, hdc, TRUE); - mswin_get_font(NHW_MESSAGE, ATR_INVERSE, hdc, TRUE); - ReleaseDC(GetNHApp()->hMainWnd, hdc); - - mswin_layout_main_window(NULL); - return; - } - - if (_stricmp(pref, "font_text") == 0 - || _stricmp(pref, "font_size_text") == 0) { - if (iflags.wc_fontsiz_text < NHFONT_SIZE_MIN - || iflags.wc_fontsiz_text > NHFONT_SIZE_MAX) - iflags.wc_fontsiz_text = NHFONT_DEFAULT_SIZE; - - hdc = GetDC(GetNHApp()->hMainWnd); - mswin_get_font(NHW_TEXT, ATR_NONE, hdc, TRUE); - mswin_get_font(NHW_TEXT, ATR_BOLD, hdc, TRUE); - mswin_get_font(NHW_TEXT, ATR_DIM, hdc, TRUE); - mswin_get_font(NHW_TEXT, ATR_ULINE, hdc, TRUE); - mswin_get_font(NHW_TEXT, ATR_BLINK, hdc, TRUE); - mswin_get_font(NHW_TEXT, ATR_INVERSE, hdc, TRUE); - ReleaseDC(GetNHApp()->hMainWnd, hdc); - - mswin_layout_main_window(NULL); - return; - } - - if (_stricmp(pref, "scroll_margin") == 0) { - mswin_cliparound(u.ux, u.uy); - return; - } - - if (_stricmp(pref, "map_mode") == 0) { - mswin_select_map_mode(iflags.wc_map_mode); - return; - } - - if (_stricmp(pref, "hilite_pet") == 0) { - InvalidateRect(mswin_hwnd_from_winid(WIN_MAP), NULL, TRUE); - return; - } - - if (_stricmp(pref, "align_message") == 0 - || _stricmp(pref, "align_status") == 0) { - mswin_layout_main_window(NULL); - return; - } - - if (_stricmp(pref, "vary_msgcount") == 0) { - InvalidateRect(mswin_hwnd_from_winid(WIN_MESSAGE), NULL, TRUE); - mswin_layout_main_window(NULL); - return; - } - - if (_stricmp(pref, "fullscreen") == 0) { - mswin_set_fullscreen(iflags.wc2_fullscreen); - return; - } - - if (_stricmp(pref, "softkeyboard") == 0) { - GetNHApp()->bUseSIP = iflags.wc2_softkeyboard; - return; - } - - if (_stricmp(pref, "wraptext") == 0) { - GetNHApp()->bWrapText = iflags.wc2_wraptext; - return; - } -} - -void -mswin_main_loop() -{ - MSG msg; - - while (!mswin_have_input() && GetMessage(&msg, NULL, 0, 0) != 0) { - if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } -} - -/* clean up and quit */ -void -bail(const char *mesg) -{ - clearlocks(); - mswin_exit_nhwindows(mesg); - nh_terminate(EXIT_SUCCESS); - /*NOTREACHED*/ -} - -BOOL -initMapTiles(void) -{ - HBITMAP hBmp; - BITMAP bm; - TCHAR wbuf[MAX_PATH]; - int tl_num; - SIZE map_size; - extern int total_tiles_used; - - /* no file - no tile */ - if (!(iflags.wc_tile_file && *iflags.wc_tile_file)) - return TRUE; - - /* load bitmap */ - hBmp = SHLoadDIBitmap(NH_A2W(iflags.wc_tile_file, wbuf, MAX_PATH)); - if (hBmp == NULL) { - raw_print( - "Cannot load tiles from the file. Reverting back to default."); - return FALSE; - } - - /* calculate tile dimensions */ - GetObject(hBmp, sizeof(BITMAP), (LPVOID) &bm); - if (bm.bmWidth % iflags.wc_tile_width - || bm.bmHeight % iflags.wc_tile_height) { - DeleteObject(hBmp); - raw_print("Tiles bitmap does not match tile_width and tile_height " - "options. Reverting back to default."); - return FALSE; - } - - tl_num = (bm.bmWidth / iflags.wc_tile_width) - * (bm.bmHeight / iflags.wc_tile_height); - if (tl_num < total_tiles_used) { - DeleteObject(hBmp); - raw_print("Number of tiles in the bitmap is less than required by " - "the game. Reverting back to default."); - return FALSE; - } - - /* set the tile information */ - if (GetNHApp()->bmpMapTiles != GetNHApp()->bmpTiles) { - DeleteObject(GetNHApp()->bmpMapTiles); - } - - GetNHApp()->bmpMapTiles = hBmp; - GetNHApp()->mapTile_X = iflags.wc_tile_width; - GetNHApp()->mapTile_Y = iflags.wc_tile_height; - GetNHApp()->mapTilesPerLine = bm.bmWidth / iflags.wc_tile_width; - - map_size.cx = GetNHApp()->mapTile_X * COLNO; - map_size.cy = GetNHApp()->mapTile_Y * ROWNO; - mswin_map_stretch(mswin_hwnd_from_winid(WIN_MAP), &map_size, TRUE); - return TRUE; -} - -void -mswin_popup_display(HWND hWnd, int *done_indicator) -{ - MSG msg; - HWND hChild; - - /* activate the menu window */ - GetNHApp()->hPopupWnd = hWnd; - - mswin_layout_main_window(hWnd); - - /* disable game windows */ - for (hChild = GetWindow(GetNHApp()->hMainWnd, GW_CHILD); hChild; - hChild = GetWindow(hChild, GW_HWNDNEXT)) { - if (hChild != hWnd) - EnableWindow(hChild, FALSE); - } -#if defined(WIN_CE_SMARTPHONE) - ShowWindow(GetNHApp()->hMenuBar, SW_HIDE); - ShowWindow(SHFindMenuBar(hWnd), SW_SHOW); -#else - EnableWindow(GetNHApp()->hMenuBar, FALSE); -#endif - - /* bring menu window on top */ - SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); - - /* go into message loop */ - if (done_indicator) - *done_indicator = 0; - while (IsWindow(hWnd) && (done_indicator == NULL || !*done_indicator) - && GetMessage(&msg, NULL, 0, 0) != 0) { - if (!IsDialogMessage(hWnd, &msg)) { - if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, - &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - } -} - -void -mswin_popup_destroy(HWND hWnd) -{ - HWND hChild; - - /* enable game windows */ - for (hChild = GetWindow(GetNHApp()->hMainWnd, GW_CHILD); hChild; - hChild = GetWindow(hChild, GW_HWNDNEXT)) { - if (hChild != hWnd) { - EnableWindow(hChild, TRUE); - } - } -#if defined(WIN_CE_SMARTPHONE) - ShowWindow(SHFindMenuBar(hWnd), SW_HIDE); - ShowWindow(GetNHApp()->hMenuBar, SW_SHOW); -#else - EnableWindow(GetNHApp()->hMenuBar, TRUE); -#endif - - SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); - GetNHApp()->hPopupWnd = NULL; - mswin_window_mark_dead(mswin_winid_from_handle(hWnd)); - DestroyWindow(hWnd); - - mswin_layout_main_window(hWnd); - - SetFocus(GetNHApp()->hMainWnd); -} - -void -mswin_set_fullscreen(BOOL is_fullscreen) -{ -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - SetForegroundWindow(GetNHApp()->hMainWnd); - if (is_fullscreen) { - SHFullScreen(GetNHApp()->hMainWnd, - SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); - MoveWindow(GetNHApp()->hMainWnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), FALSE); - } else { - RECT rc; - SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); - SHFullScreen(GetNHApp()->hMainWnd, - SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON); - MoveWindow(GetNHApp()->hMainWnd, rc.left, rc.top, rc.right - rc.left, - rc.bottom - rc.top, FALSE); - } - GetNHApp()->bFullScreen = is_fullscreen; -#else - GetNHApp()->bFullScreen = FALSE; -#endif -} - -#if defined(WIN_CE_SMARTPHONE) -void -NHSPhoneDialogSetup(HWND hDlg, UINT nToolBarId, BOOL is_edit, - BOOL is_fullscreen) -{ - SHMENUBARINFO mbi; - HWND hOK, hCancel; - RECT rtOK, rtDlg; - - // Create our MenuBar - ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); - mbi.cbSize = sizeof(mbi); - mbi.hwndParent = hDlg; - mbi.nToolBarId = nToolBarId; - mbi.hInstRes = GetNHApp()->hApp; - if (!SHCreateMenuBar(&mbi)) { - error("cannot create dialog menu"); - } - - if (is_fullscreen) { - SHINITDLGINFO shidi; - RECT main_wnd_rect; - shidi.dwMask = SHIDIM_FLAGS; - shidi.dwFlags = SHIDIF_SIZEDLGFULLSCREEN; - shidi.hDlg = hDlg; - SHInitDialog(&shidi); - - GetWindowRect(GetNHApp()->hMainWnd, &main_wnd_rect); - MoveWindow(hDlg, main_wnd_rect.left, main_wnd_rect.top, - main_wnd_rect.right - main_wnd_rect.left, - main_wnd_rect.bottom - main_wnd_rect.top, FALSE); - } - - /* hide OK and CANCEL buttons */ - hOK = GetDlgItem(hDlg, IDOK); - hCancel = GetDlgItem(hDlg, IDCANCEL); - - if (IsWindow(hCancel)) - ShowWindow(hCancel, SW_HIDE); - if (IsWindow(hOK)) { - GetWindowRect(hOK, &rtOK); - GetWindowRect(hDlg, &rtDlg); - - rtDlg.bottom -= rtOK.bottom - rtOK.top; - ShowWindow(hOK, SW_HIDE); - SetWindowPos(hDlg, HWND_TOP, 0, 0, rtDlg.right - rtDlg.left, - rtDlg.bottom - rtDlg.top, - SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOZORDER); - } - - /* override "Back" button for edit box dialogs */ - if (is_edit) - SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK, - MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, - SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); -} -#endif /* defined(WIN_CE_SMARTPHONE) */ - -void -mswin_read_reg(void) -{ -} - -void -mswin_destroy_reg(void) -{ -} - -void -mswin_write_reg(void) -{ -} - -/* check HKCU\Software\\Microsoft\\Shell\HasKeyboard for keyboard presence, - if the key is not there assume older device and no keyboard */ -BOOL -mswin_has_keyboard(void) -{ - DWORD dwHasKB = 0; -#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) - HKEY hKey; - DWORD dwType; - DWORD dwSize = sizeof(dwHasKB); - if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Shell"), 0, - 0, &hKey) == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey, _T("HasKeyboard"), NULL, &dwType, - (LPBYTE) &dwHasKB, &dwSize) != ERROR_SUCCESS) { - dwHasKB = 0; - } - RegCloseKey(hKey); - } -#endif - return (dwHasKB == 1); -} - -#ifdef _DEBUG -#include - -void -logDebug(const char *fmt, ...) -{ - FILE *dfp = fopen("nhtrace.log", "a"); - - if (dfp) { - va_list args; - - va_start(args, fmt); - vfprintf(dfp, fmt, args); - va_end(args); - fclose(dfp); - } -} - -#endif diff --git a/sys/wince/newres.h b/sys/wince/newres.h deleted file mode 100644 index 917fa39a5..000000000 --- a/sys/wince/newres.h +++ /dev/null @@ -1,43 +0,0 @@ -/* NetHack 3.6 newres.h $NHDT-Date: 1524689383 2018/04/25 20:49:43 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.3 $ */ -/* Copyright (c) 2003 by Michael Allison */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef __NEWRES_H__ -#define __NEWRES_H__ - -#if !defined(UNDER_CE) -#define UNDER_CE _WIN32_WCE -#endif - -#if defined(_WIN32_WCE) -#if !defined(WCEOLE_ENABLE_DIALOGEX) -#define DIALOGEX DIALOG DISCARDABLE -#endif -#include -#define SHMENUBAR RCDATA -#if (defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)) \ - && (_WIN32_WCE >= 300) -#include -#else -#define I_IMAGENONE (-2) -#define NOMENU 0xFFFF -#define IDS_SHNEW 1 - -#define IDM_SHAREDNEW 10 -#define IDM_SHAREDNEWDEFAULT 11 -#endif -#endif // _WIN32_WCE - -#ifdef RC_INVOKED -#ifndef _INC_WINDOWS -#define _INC_WINDOWS -#include "winuser.h" // extract from windows header -#endif -#endif - -#ifdef IDC_STATIC -#undef IDC_STATIC -#endif -#define IDC_STATIC (-1) - -#endif //__NEWRES_H__ diff --git a/sys/wince/nhico.uu b/sys/wince/nhico.uu deleted file mode 100644 index d8f7e7764..000000000 --- a/sys/wince/nhico.uu +++ /dev/null @@ -1,555 +0,0 @@ -begin 700 nethack.ico -M```!``8`("``````"`"H"```9@```!`0``````@`:`4```X)```L+``````( -M`!@-``!V#@``0$``````"``H%@``CAL``%I:``````@`N"@``+8Q```6%@`` -M```(`)`&``!N6@``*````"````!``````0`(````````!``````````````` -M`0````$``````````(```(````"`@`"`````@`"``("```#`P,``P-S``/#* -MI@`$!`0`"`@(``P,#``1$1$`%A86`!P<'``B(B(`*2DI`%5550!-34T`0D)" -M`#DY.0"`?/\`4%#_`),`U@#_[,P`QM;O`-;GYP"0J:T````S````9@```)D` -M``#,```S````,S,``#-F```SF0``,\P``#/_``!F````9C,``&9F``!FF0`` -M9LP``&;_``"9````F3,``)EF``"9F0``F\\O,*"@H* -M"@H*"@H*"O3J1._R\`=&1P<'(&_OO`H'!_.\"@H*"@H*"@H*"@H*"O!$[+R3 -M("!'!Y,@($6\O`?S\/(*"@H*"@H*"@H*"@H*"N\''"`@($<'DR`@'T6\\/#Q -M"@H*"@H*"@H*"@H*"@KR!QP?("`@1P?O("`?'T7PO`H*"@H*"@H*"@H*"@H* -M"@<''Q\@("!&[.M%Z1\?`6[Q]`H*"@H*"@H*"@H*"@KR[VX!'^GL[`<'!P=M -M'Q\!`;SQ"@H*"@H*"@H*"@H*"O$'10%%!P<';_>2;D4?'P$!!_`*"@H*"@H* -M"@H*"@H*\`\!^N\!P?Q\_(';0?W!^R\!PH*"@H*"@H*"@H*"@KQ -MO+P';;SO!_+T\KSK\.\'[`<'"@H*"@H*"@H*"@H*"O*\`0?MZ6[W\/'P]^L? -M[`=$DP<*"@H*"@H*"@H*"@H*\O`![`=$(._O[^WO[!^2[`&3!PH*"@H*"@H* -M"@H*"@KR\`$!!_=%(&[W]^UN;0=$`9/O"@H*"@H*"@H*"@H*"O/Q`0%%!^]M -M1>WMZNL'$@$!'.\'!_(*"@H*"@H*"@H*\_$!`1_I'`<'[P<'[T4?`0$<[_$' -M[[P*"@H*"@H*"@KS\0$!'R`@(&^2]T8@'Q\!`>WW\`?O!_(*"@H*"@H*"O/Q -M`0$?("`@1@<'("`?'P$![9+P!^^2[_,*"@H*"@H*\_`!`1\?("!&!P<@(!\! -M`0%N[?`'[Y+L[PH*"@H*"@KS\._O!P?O[P<'\/"\O+P'!^V2O`?ODNP'"@H* -M"@H*"@?M[._R\+SP\?+R\O"\O`?O[^R\!^_M[.\*"@H*"@KQ1$1N"@H*"@H* -M"@KQ\_/Q!^\'[^V2!_`'[`H*"@H*"FU$ZO,*"@H*"@H*"@?S\_`'[Y*\[/(* -M"@KS"@H*"@KL1$0'"@H*"@H*"@H*\_/S\`?O[._Q[PH*"@H*"@H*[T1$'`H* -M"@H*"@H*"@H*\_/P!_<'"O0*"@H*"@H*"@KL'.P*"@H*"@H*"@H*"@KP!_`' -M]PH*"@H*"@H*"@H*"@H'\@H*"@H*"@H*"@H*"@KRO`?O"@H*"@H*"@H*"@H* -M"@H*"@H*"@H*"@H*"@H*"@H*\_#S"@H*"@H*"@H*^?C_?_#P/#_XP!@_^``( -M?_P``'_^``#__``!__P``/_X``#_^```__@``/_X``#_^```__@``/_X``#_ -M^```__@``/_X``#_^```'_@```_X```'^````_@```/X```#^````_#_``/P -M_P`[X?\`/\/_@7_'_X/_Y__#____\?\H````$````"`````!``@````````! -M```````````````!`````0``````````@```@````("``(````"``(``@(`` -M`,#`P`#`W,``\,JF``0$!``("`@`#`P,`!$1$0`6%A8`'!P<`"(B(@`I*2D` -M5555`$U-30!"0D(`.3DY`(!\_P!04/\`DP#6`/_LS`#&UN\`UN?G`)"IK0`` -M`#,```!F````F0```,P``#,````S,P``,V8``#.9```SS```,_\``&8```!F -M,P``9F8``&:9``!FS```9O\``)D```"9,P``F68``)F9``"9S```F?\``,P` -M``#,,P``S&8``,R9``#,S```S/\``/]F``#_F0``_\P`,P```#,`,P`S`&8` -M,P"9`#,`S``S`/\`,S,``#,S,P`S,V8`,S.9`#,SS``S,_\`,V8``#-F,P`S -M9F8`,V:9`#-FS``S9O\`,YD``#.9,P`SF68`,YF9`#.9S``SF?\`,\P``#/, -M,P`SS&8`,\R9`#/,S``SS/\`,_\S`#/_9@`S_YD`,__,`#/__P!F````9@`S -M`&8`9@!F`)D`9@#,`&8`_P!F,P``9C,S`&8S9@!F,YD`9C/,`&8S_P!F9@`` -M9F8S`&9F9@!F9ID`9F;,`&:9``!FF3,`9IEF`&:9F0!FF\ -M[_````#T[VXN\\O+T\O`'![SOD@``!T0<`````/'R -M[Y+W`````.MN``````#S\._S\@````#T`````````//P]`````#,9P``P`<` -M`.`/``#@#P``P`\``,`/``#`#P``P`\``,`/``#``P``P`$``,`!``#``0`` -MCP<``)\'``"_CP``*````"P```!8`````0`(``````"0!P`````````````` -M`0````$``````````(```(````"`@`"`````@`"``("```#`P,``P-S``/#* -MI@`$!`0`"`@(``P,#``1$1$`%A86`!P<'``B(B(`*2DI`%5550!-34T`0D)" -M`#DY.0"`?/\`4%#_`),`U@#_[,P`QM;O`-;GYP"0J:T````S````9@```)D` -M``#,```S````,S,``#-F```SF0``,\P``#/_``!F````9C,``&9F``!FF0`` -M9LP``&;_``"9````F3,``)EF``"9F0``F\;^_W[_$```#S!P?S\O(````````````````````` -M[T1$[0#T\/'N1OD6![P@(&_O[_$```<'\?.\```````````````````````` -M^$1$!_#PDR`@^18'[B`@($8'!_*\![SS\/````````````````````````#S -M;6T'O),@("#Y%@<'("`@'T7PO`<'\_&\```````````````````````````' -M[P>3("`@(/F3!P<@("`?'T7N\+SQ]```````````````````````````\P<' -MDQ\@("`@^9,'!R`@(!\?'T6\\0?T```````````````````````````'[^\? -M'R`@("#YD^_O("`@'Q\?`47Q\/0`````````````````````````\N\'11\? -M("`@($9N;6U$1>D?'Q\!`1SQ\?0````````````````````````'[^\!'Q\@ -MZ6UM]P<'!P<'ZQ\?'P$!1?"\]`````````````````````````<';@$?'T4' -M!P>\[^\'!P?L'Q\?`0$!![ST````````````````````````[^X!`1_M!P<' -M;OD6[^\@("`?'Q\!`0&3!_,```````````````````````#OO`$!10<'$B`@ -M(&YM^$7JZNKJZA,!`1P'\@```````````````````````.^\`0'O!^OI($7K -M[.WLZP<'O+P'[T0!DP?R````````````````````````!^X!10<'1"!%[>V2 -M]_?O[/=%'P<'$@&3!_(````````````````````````'!P'W!_=%Z0?W!_#P -MO`?O[44![P=M`1P'\0````````````````````````>\\.\'Z[SO[^_P\O+Q -MO._K[[SO!^R\O._Q````````````````````````![SP!P=MO._WO/'S]//P -M[^SO\>\'[>\'[_$````````````````````````'O.\'!^N3'.\'\?/T\O#O -M[.V3]P?M'`?O\0```````````````````````+SN`6X'[T4@!Y*\\?'PO)*2 -M'Q_O!^H!D^_P````````````````````````O+P!10<'$B!&!_<'!^_M[_\````````````````````````\/`!`1]%!P<';41N[_=%$NL'[T0! -M`0$_P!P?O[_+R``````````````#Q\`$!'Q\?("`@^6\'O"`@("`?'P$!`>WM -M[_`'!^^2D@<``````````````/+P`0$?'Q\@("#Y;P>\("`@(!\?`0$!;NSO -M\`?O[Y+L[/$`````````````\;QN;FYN;FYN;V^3!_"3;VYN;I,<[6[L[`>\ -M!^_ODNSM!P````````````#Q\;P'!P?O[^_O[P<'O/#Q\O"\!^_ODNWL![P' -M[_>2[.SQ``````````````?WDO?N\;P'!P>\\/'Q\?"\O+R\!^_O[^SOO`?O -M]^WL^+P```````````#O%$1$[P````````````#T]/3SO`<'!_?P[Q+O!^SM -M[>SX]P``````````O!)#1.T``````````````/'P]/3R\+P'[_?SDOB2]``` -M`/#M`````````/)M%41N]```````````````\;ST]/+P!^_ODN_O^/`````` -M`/0`````````^!5$;?$`````````````````\/3T\O`'[_?M[`<'D@`````` -M`````````!Q$1$H'````````````````````]/3R\`?O]^ST`.^2```````` -M``````#O$D-$'`````````````````````#P\_'P!^^2\@```/#Q```````` -M`````.T'[/@``````````````````````/#O\;P'[^\````````````````` -M`````)+M\P```````````````````````/('O`?O!P`````````````````` -M`````````````````````````````````/3Q\`?O```````````````````` -M``````````````````````````````````#T\O#S````````````````_C_C -M___P``#\/X#_#_```/P?`#X/\```_@P`'`_P``#_"``,'_```/^````?\``` -M_X```#_P``#_P```?_```/^```!_\```_X```'_P``#_````/_```/\````_ -M\```_P```#_P``#_````/_```/\````_\```_P```#_P``#_````/_```/\` -M```_\```_P```#_P``#_````/_```/\````_\```_P```#_P``#_````/_`` -M`/\````_\```_P```#_P``#_`````_```/\````!\```_P````#P``#_```` -M`'```/\`````<```_P`````P``#_`````#```/\`````,```_P`````P``#^ -M#_P``#```/P?_``',```^!_\``^P``#X/_X`#_```/!__P!/\```X/__`.?P -M``#A__\!__```/'__X'_\```____P?_P``#____P__```"@```!`````@``` -M``$`"````````!````````````````$````!``````````"```"`````@(`` -M@````(``@`"`@```P,#``,#\ -M]`````````````#S\;P'\O0`````````````````````````````!VU$0VWQ -M``````````#Q\/'PO+P'!P?O[^_P``````````#TO`<'O/3S```````````` -M``````````````````#O2D05^/0``````/3P\O+Q!Y.\!P>3[^_W]P?T```` -M``#T\.\'!_3R\0```````````````````````````````.Q$1$0<`````/+P -M\O+PDT<7O`<';T:3]_?O!_,`````\^\'!_3SO/,````````````````````` -M``````````#S;D1#$NX``/+P\?+N;R#Y%P<'!V\@(&_W[^\'\@``]`<'!_+S -M\0<```````````````````````````````````?J1$/K\O*\\/&31B`@^1<' -M!P=O("`@1ASO!P?R``<'!_#T\KSP```````````````````````````````` -M````'$1#1`<'O/!O("`@(/D7!P<';R`@("#IDP<'O+SO![ST\O`']``````` -M``````````````````````````````!N1.\'O/!O("`@("#Y%P<'!V\@("`@ -M'Q^3\;R\!P?S\_`'\P``````````````````````````````````````\?<' -M!P=O("`@("`@^1<'!P=O("`@(!\?Z6^\\/"\\_&\\@`````````````````` -M`````````````````````/#O!P=N'R`@("`@(/D7!P<';R`@("`?'Q\!;O#Q -M\`>\\0```````````````````````````````````````/+O!P>3'Q\@("`@ -M("#Y%P?O[V\@("`@'Q\?`0$<\?&\\``````````````````````````````` -M```````````'[P>3'Q\?("`@("`@^1<'[^]O("`@(!\?'P$!`1SR\KP````` -M``````````````````````````````````#Q[^\'`1\?'R`@("`@(/D7!^_O -M;B`@("`?'Q\!`0%%O/+P\P`````````````````````````````````````` -M!^\''`$?'Q\@("`@("!%$A(3$Q-$1$7I'Q\?`0$!`6[Q\?`````````````` -M````````````````````````\>_O!P$!'Q\?("#I1!/K]^\'!P<'!^_W%!\? -M'P$!`0$![O"\`````````````````````````````````````+SO[^\!`1\? -M'^GMO`<'!P<'!P<'!P<'!Q0?'Q\!`0$!`1SPO/,````````````````````` -M```````````````'[P?M`0$?'^F\!P<'!_`'')+O[^\'!P<3'Q\?`0$!`0%N -M\+SR````````````````````````````````````!^^\10$!'^F\!P<'O!P@ -M^1?O[_=N("`@(!\?'P$!`0$!1;P'\0`````````````````````````````` -M``````?OO`$!`1_N!P?OZT8@(/D7[^_W;NE$1$1$1$1$1`$!`0&\!_$````` -M```````````````````````````````'[[P!`0%N!P<';>D@("!%$A(3$NKM -M]_?O[^_O[^Q$`0$!O`?Q````````````````````````````````````!P>\ -M`0$!\`<'[$4@("`3[/CL^&WKD@<'!P<'!P?O$P$!`>X'\0`````````````` -M``````````````````````<'O`$!;@<'[T0@("`4DNR2DO?O[VWO!^MN;@<' -M!VT!`0'N!_`````````````````````````````````````'![P!`0<'!Y)% -M("#K[Y*2[^_O]P<';0<2'Q]N!P?W1`%%!P?P```````````````````````` -M````````````!P<'`0&\!P?K'Q]%O/?OO+SP\+P'O._L$Q\?1;P'[Q0!10<' -M\`````````````````````````````````````<'O.X'\`<'$@<'!P?OO/#Q -M\?'P\`<'ZQ+O[P>\!P<2[NX'[_`````````````````````````````````` -M``"\![SP!_`'!^KPO`?O[_#Q\O/S\O`'[>T2\/#Q!P<'$KP'!^^\```````` -M````````````````````````````O`>\\`?P!P?JO+R\]P?P\O/T]/+QO)*2 -M$O#Q\;P'!^J\!P?OO````````````````````````````````````+R\O+P' -M\`<'$P<'!^\'\/+S]/3R\;R2[1*\[NZ\!P?J!P<'[[P````````````````` -M``````````````````#PO`21`$!1>_W!P`````````` -M`````````````````````````/'PO`$!`1^3!P?OZD4@(/E&[?<';R`@Z>D4 -M]P?O%`$!`47O]P<```````````````````````````````````#Q\?`!`0$? -M'^X'!P?M$T;Y1N\'!V\@($03[P?O$@$!`0%%[Y+O[P>\]``````````````` -M````````````````\?'P`0$!'Q\?[[P'!^_L$Q)M[/@2%.J2!P<'$@$!`0$! -M1>^2!_#O[.R2\0```````````````````````````/'Q\`$!`1\?'Q]OO`<' -M!P<'[_?W[P<'!P>\DQ\?`0$!`47OD@?Q\+P'[_<'```````````````````` -M``````#Q\?$!`0$?'Q\?($:3![P'!P<'!P<'O+SO11\?'P$!`0%%[Y+O\/"\ -M!P<'O+P`````````````````````````\?+Q`0$!'Q\?'R`@("!&D^\'![P' -MDT8@(!\?'Q\!`0$!1??M[[SPO`?O[P?S\@```````````````````````/'R -M\`$!`1\?'Q\@("`@(/E&!P<';R`@("`?'Q\?`0$!`47W[>_P\+P'[^_W[_/Q -M``````````````````````#Q\O`!`0$?'Q\?("`@("#Y1@<'O&\@("`@'Q\? -M'P$!`0%%]^WW\?`'!^_O]Y+OO/(`````````````````````\?*\`0$!'Q\? -M'R`@("`@^48'![QO("`@(!\?'Q\!`0$!1??LDO&\!P?O[_>2[>_O```````` -M`````````````/'RO`$!`1\?'Q\@("`@(/D7!P>\;R`@("`?'Q\?`0$!`462 -M[._PO`<'[^_W[>SLDO,```````````````````#Q\@2[>SL[_(```````````````````"\\+P' -M!P<'O`?O[^_O[^\'![R\\/#P\?&\O`<'!P?O[_>2[>WW\+P'[^_WDNWL[/?Q -M``````````````````#Q$D1$1$3L]`````````````````#T\O/S!P?O[^_O -M!P?O\+SL;?>\!^_O]Y+M[/CM!P````````````````#T;1%#1$3J]``````` -M`````````````+ST]/3T\_'PO`?O[^_S!VWL]P?LZ^WW[Y+L[)(````````` -M````````["(10T1$\`````````````````````#W\O3T]//Q\+P'[^_W[_+O -M$NUM!P``````\NWL````````````````[T,B0T1$[P`````````````````` -M````[?#T]/3R\?"\!^_ODI('!^T3\@``````````!P``````````````\401 -M(D1$;@````````````````````````?P]/3T\O'P!P?O[Y+M]_`'[/<````` -M````````````````````]!)#0T1$2O0```````````````````````#RO/3T -M]/+Q\`<'[_>2[&WO\VWX`````````````````````````/A#0T-$1+P````` -M`````````````````````//T]//R\;P'!^_W[6WT\N_RZO,````````````` -M`````````.]#0T-$1!P```````````````````````````#T\_3S\O&\!P?O -M]_@`````O/3O`````````````````````._O0T-$1.P````````````````` -M`````````````/#R\_+PO`<'[Y('``````#R``````````````````````#M -M$A)$1&WT``````````````````````````````#P[_#R\+P'[^^2```````` -M`/0`````````````````````\Y+Q\NWQ```````````````````````````` -M``````?M!_"\!^_O]P````````````````````````````````#R[._Q```` -M````````````````````````````````O.\'O`?O[^\````````````````` -M``````````````````````````````````````````````````````````#S -M\/"\!^_O```````````````````````````````````````````````````` -M``````````````````````````#S]/+R!_(````````````````````````` -M``````````````````````````````````````````````````````#S\?#P -M`````````````````````````/____'______\?_P'_^7___@_\`'_@?__^! -M_@`/\!___\#X``/@'___X/```>`?___@8```P#____````!`/___^``````_ -M___\`````'____P`````_____`````'____X`````_____@````#____\``` -M``'____P`````?___^`````!____X`````#____@`````/___^``````____ -MX`````#____@`````/___^``````____X`````#____@`````/___^`````` -M____X`````#____@`````/___^``````____X`````#____@`````/___^`` -M````____X`````#____@`````/___^``````____X`````#____@``````__ -M_^```````___X``````!___@``````#__^```````'__X```````/__@```` -M```?_^```````!__X```````#__@```````/_^````````__X```````#__@ -M```````/_\`__@````__@'__````#_^`__\```^/_P'__P``'^_^`___```? -M__P#__\``!___`?__X``#__X#___@`>/__`?___`!]__\!___\`/[__P/___ -MX`____A____P#_________@/_________@?_________A___*````%H```"T -M`````0`(``````!8(````````````````0````$``````````(```(````"` -M@`"`````@`"``("```#`P,``P-S``/#*I@`$!`0`"`@(``P,#``1$1$`%A86 -M`!P<'``B(B(`*2DI`%5550!-34T`0D)"`#DY.0"`?/\`4%#_`),`U@#_[,P` -MQM;O`-;GYP"0J:T````S````9@```)D```#,```S````,S,``#-F```SF0`` -M,\P``#/_``!F````9C,``&9F``!FF0``9LP``&;_``"9````F3,``)EF``"9 -MF0``FSQ```` -M`````````````````````/*\O+P'\/(````````````````````````````` -M````````````````````````````````````````````````````\?/O$I(` -M`````````````````````/,'O/"\O`<'![SQ```````````````````````` -M`//S\_3S\P```````````````````````````````````````````/+P\1,5 -M$>\```````````````````"\!_'P\+R\!P<'!^^\\P`````````````````` -M`/3R\`<'!_3T````````````````````````````````````````````\/!M -M1$,B$_$```````````````#T!_#Q\?#PO+P'!P<'[^_OO``````````````` -M``#T\0?O!P?R]/,```````````````````````````````````````````#T -M[T1$0R)#;?0`````````````\0?R\?'PO`>\!P<'[N_O[^_O[_,````````` -M````]/('[P<'\`#S\0`````````````````````````````````````````` -M``#T;41$0T,B[0```````````+SP\O+Q\0=OD[P'!P?OD^_O[_?W[_`````` -M``````#S!^\'![P`]/'P```````````````````````````````````````` -M``````#S2D1$0R)$!P```````//P\?+R\O"31OF3O`<'!^\@;^_O]_?O[[ST -M````````]`?O!P<']/3R!_,````````````````````````````````````` -M``````````#O1$1#(D,3\@````#R\/'Q\O(';R#Y^9,'!P<'[R`@1I/W[^_O -M[P?S``````#Q[P<'!_/T\_'O```````````````````````````````````` -M``````````````#L1$1#0Q'K````\KSP\?+R[T8@(/GYDP<'!P>3("`@(&_W -M[^_O![SS````\N\'!P?Q]//Q![P````````````````````````````````` -M`````````````````/1M1$1#(D/M`/*\\/#QO&\@("`@^?F3!P<'!Y,@("`@ -M($8<[^\'![SS`/,'[P<'O/3S\O#O\P`````````````````````````````` -M`````````````````````/!$1$0B$>KPO+SP\>Y&("`@("#Y^9,'!P<'DR`@ -M("`@(!]O[P<'![SQ!^\'!P?T\_+P!P<````````````````````````````` -M`````````````````````````.]$1$-$[P>\O/`'1B`@("`@(/GYDP<'!P?O -M("`@("`@'Q]O![P'O+P'!P<'\_3R\;P']``````````````````````````` -M`````````````````````````````&Y$1.\'![SP!^D@("`@("`@^?F3!P<' -M!Y,@("`@("`?'Q]O\[R\O/`'!_+T\O&\!_,````````````````````````` -M````````````````````````````````].KW!P<'O`?I("`@("`@("#Y^9,' -M!P<'[R`@("`@(!\?'Q]O![R\\+P']//Q\`?Q```````````````````````` -M````````````````````````````````````!P<'![SOZ1\@("`@("`@(/GY -MDP<'[^^3("`@("`@'Q\?'Q]%!_#P\;R\\?`'\``````````````````````` -M`````````````````````````````````````/`'!P<'!^D?'R`@("`@("`@ -M^?F3!P?O[Y,@("`@("`?'Q\?'P%%!_#Q\0<'O/`````````````````````` -M``````````````````````````````````````#R!^\'!P=%'Q\?("`@("`@ -M("#Y^9,'!^_O'"`@("`@(!\?'Q\?`0%NO/'Q\N_P```````````````````` -M``````````````````````````````````````````?O[P<';A\?'Q\@("`@ -M("`@(/GYDP?O[^\<("`@("`@'Q\?'Q\!`0%N\/'R\;P````````````````` -M``````````````````````````````````````````#Q[^\'!Y,?'Q\?'R`@ -M("`@("`@^?F3!^_O[Y(@("`@("`?'Q\?'P$!`0'M\?+R!P`````````````` -M``````````````````````````````````````````````?O[P<'`1\?'Q\? -M("`@("`@("#Y^9,'[^_O[2`@("`@(!\?'Q\?`0$!`44'\O+Q\``````````` -M``````````````````````````````````````````````#P[^_O!VX!'Q\? -M'Q\@("`@("`@("!&;FUM;6WJ147I("`@'Q\?'Q\!`0$!`6[R\?&\]``````` -M``````````````````````````````````````````````````?O[^\'`0$? -M'Q\?'R`@("`@1403;>OL[.SL[.SL^&WJ$T0?'Q\?'P$!`0$!`>_Q\/#P```` -M``````````````````````````````````````````````````#R[^_O!T4! -M`1\?'Q\?("`@;FWKDN_O[^_O[^_O[^_O[^_L1!\?'Q\?`0$!`0$!;O#PO/`` -M``````````````````````````````````````````````````````?O[^_N -M`0$!'Q\?'Q\@1;R\[^\'!P<'!P<'!P<'!P<'!Y)$'Q\?'Q\!`0$!`0$!!_"\ -MO/0`````````````````````````````````````````````````````!^_O -M[P_P!P<'!P<'O/#P!P<'!P>\\?"\]T0?'Q\?'P$!`0$!`0'O -M\+P'\@`````````````````````````````````````````````````````' -M[^\'[P$!`1\?'Q\'O`<'!P>\\.]O1I/O[^_O;B`@1F[M1!\?'Q\?`0$!`0$! -M`9+PO`?R```````````````````````````````````````````````````` -M`._O[[QN`0$!'Q\?![P'!P<'\.]&(/GYD^_O[_?L("`@("`@'Q\?'Q\!`0$! -M`0$!;KR\!_(````````````````````````````````````````````````` -M````[^_O\$4!`0$?'P>\!P?O]_=&("`@^?F3[^_O]^P@("`@("`?'Q\?'P$! -M`0$!`0%%O`<'\@`````````````````````````````````````````````` -M``````#O[^_P10$!`1]N\`<'!^T3("`@("#Y^9/L^.SW["#KZA(2ZNKJZNKJ -MZA,!`0$!`46\!P?Q```````````````````````````````````````````` -M``````````?O!_!%`0$!1?`'!P?W$^D@("`@($43ZFWX;1(2(._O[^_O[^_O -M[^_O[1,!`0$!1;P'!_$````````````````````````````````````````` -M````````````!^\'O$4!`0'OO`<'[VU%("`@("`3^)+L;>IM^/CK[P<'!P<' -M!P<'!P?O;0$!`0%%O`<'\0`````````````````````````````````````` -M```````````````'[P>\10$!`?`'!P?M$R`@("#I$^WL[)+O[P?O^.KO!P?O -MDN\'[KP'!^_L1`$!`44'!P?Q```````````````````````````````````` -M``````````````````<'![Q%`0%N\`<'[VT?("`@(!+M[)+M[.SL[)('[Q+W -M!^_J'Q\?;KP'!_<3`0$!10<'!_$````````````````````````````````` -M````````````````````!P<'O$4!`0<'!P?W$R`@("#L]_?W[??O[^_W]P?P -M!Q+O[Q(?'Q]%\`<'[VT>`0%N!P<'\0`````````````````````````````` -M```````````````````````'!P>\1`$!\0<'[^Q$("`@;KSO[Y+O![R\O`<' -M![SQ[VWO$Q\?'Q^\!P?O[$0!`6X'!^_P```````````````````````````` -M``````````````````````````<'![QN143Q!P?OZT1%147N!P?W![SP\/#P -M\+R\O+R\Z_<2145%1>\'!P?W$T5%;@<'[_`````````````````````````` -M````````````````````````````!P<'O+R\[_$'!^]M!P<'[_$'[P>\\/'Q -M\?'Q\+R\!^_W[!('!P<'[[P'!_<2O+R\!P?O\``````````````````````` -M```````````````````````````````'!P>\\/#W\0<'[^KP\+SW\`?OO/#Q -M\O+S\O+Q\+SODN]M$KSP\/'O\`<'[Q*\O`<'[^_P```````````````````` -M``````````````````````````````````<'O+SP\9+P!P?OZO"\O.^\[^^\ -M\/+S\_3S\_+QO`?M[VT2\/#Q\0?P!P?O$[P'!P?O[_`````````````````` -M````````````````````````````````````O`>\O/#Q[_`'!^]M\+R\[_#O -M[_#Q\O/T]/3S\O'P!^T'[!+P\/'Q![P'!^\2O`<'!^_OO``````````````` -M``````````````````````````````````````"\![R\\/`'\`<'[VWO!P<' -M\`?W\/'R\_3T]//R\?`'[>_W$KR\O+P'O`<'[Q('!P<'[^^\```````````` -M`````````````````````````````````````````+P'O`=%147Q!P?O[$5& -M1D:\!Y*\\/'R\_3S\O+PO._M]^\31D5%1>V\!P?O$T5%;P?O[[P````````` -M````````````````````````````````````````````O+R\!T0!`;P'!P>2 -M$R`@(.V\[^_P\?+R\O+R\?"\[^_W[Q,?'Q\?[P<'!_<4`0%N!^_OO``````` -M``````````````````````````````````````````````#PO/`'1`$![P<' -M!^_JZ2`@1O$']P?P\?'Q\?'PO`?W[0?O$Q\?'Q_P!P?O[$0!`6X'[_>\```` -M`````````````````````````````````````````````````/"\\`=$`0%% -M\`<'[^Q$("`@;_`'[^_P\/#P\+P'DNT'!^\3'Q\?1;P'!^]M`0$!;N_O][P` -M````````````````````````````````````````````````````\+SP!T0! -M`0&\!P<']Q,@("`@[[P'!^\'!P?O]Y*2!P<'[Q,?'Q\2[P<']Q0!`0%N[^_W -M!P````````````````````````````````````````````````````#PO/"\ -M1`$!`6[P!P?O[!,@("`@[_&\!_+P!^\'![P'!P?O$B`?1/CO!^_K1`$!`6[O -M[_<'`````````````````````````````````````````````````````/#P -M\+Q$`0$!`?>\!P?O^$0@("`@1N_Q\+R\O/`'[_'PO`?J(!_J[P<'DA,!`0$! -M;N_W]P<````````````````````````````````````````````````````` -M\?#QO$0!`0$!`;P'!P?OZT0@("`@^482!P`````````````````````````````````````````````````` -M``#Q\/&\1`$!`0$?1?`'!P?O^!/I("#Y^6_O[P<''"`@("`@11*2!P?OZT0! -M`0$!`6[O]Y('\P`````````````````````````````````````````````` -M`````/'P\;Q$`0$!`1\?[?$'!P?ODFT31OGY;^_O!P<<("`@11-M]P<'[^M$ -M`0$!`0$!;N_WD@?O[^\'\0`````````````````````````````````````` -M````````\?#Q\$0!`0$!'Q\?;O"\!P<'[^WJ$T1NDN\'!_A%1!/KDN\'!P?X -M1`$!`0$!`0%N[_>2!_$']^WL[0?T```````````````````````````````` -M``````````#Q\?'P1`$!`0$?'Q\?10?P!P<'!^_W[>SK;>KJ;?CL]^\'!P>\ -M!T0?`0$!`0$!`6[ODI('\?'PO.^2[9('```````````````````````````` -M`````````````/'Q\O!%`0$!`1\?'Q\@'^WQO`<'!P<'[^_O[^_O[P<'!P>\ -M\/2[0?Q\?"\!P?O[^\']``````````````````````` -M````````````````\?'R\$4!`0$!'Q\?'R`@($;MO/"\!P<'!P<'!P<'!P?P -M\0=%'Q\?'P$!`0$!`0%N]Y+M!_#Q\+P'!P?O![R\]``````````````````` -M``````````````````#Q\?+P10$!`0$?'Q\?("`@("`@19.\\/'Q\/#P\/&\ -M[V[I("`?'Q\?`0$!`0$!`6[WDNT'O/#PO`<'[^_OO/+Q]``````````````` -M`````````````````````/'R\O!%`0$!`1\?'Q\@("`@("`@(/GY;Y*2]^_M -M("`@("`@(!\?'Q\!`0$!`0$!;O?M[>\'\/"\!P?O[^_W\0#T```````````` -M````````````````````````\?+R\$4!`0$!'Q\?'R`@("`@("`@^?EO!P<' -MO!P@("`@("`@'Q\?'P$!`0$!`0%N]^WM[_#PO+P'!^_O[_>2\//Q```````` -M``````````````````````````#Q\O+P10$!`0$?'Q\?("`@("`@("#Y^6\' -M!P>\'"`@("`@("`?'Q\?`0$!`0$!`462[>SW\?"\O`<'[^_O]Y+MO/#R```` -M`````````````````````````````/'R\KQ%`0$!`1\?'Q\@("`@("`@(/GY -M;P<'![P<("`@("`@(!\?'Q\!`0$!`0$!19+M[)+Q\+P'!P?O[_?WDNV2!^\` -M````````````````````````````````\?+RO$4!`0$!'Q\?'R`@("`@("`@ -M^?EO!P<'O),@("`@("`@'Q\?'P$!`0$!`0%%DNWL]_'PO`<'!^_O]_>2[>R2 -M][P```````````````````````````````#Q\O*\10$!`0$?'Q\?("`@("`@ -M("#Y^6\'!P>\DR`@("`@("`?'Q\?`0$!`0$!`462[.SO\?"\!P<'[^_WDI+M -M[.SMD@```````````````````````````````/'R\0=%`0$!`1\?'Q\?("`@ -M("`@(/GYDP<'O+SO("`@("`@(!\?'Q\!`0$!`0$!19+L[._Q\+P'!P?O[_>2 -MDNWL[/?O````````````````````````````````\?+Q!T4>(T0C(R-$145$ -M`45%145%1463!P>\\.]%145%145%145%145$1$1$1$1N[>SL[_#PO`<'[^_O -M]Y+M[>SL]P?P``````````````````````````````#P\O$'[^\'!P<'!P<' -M!^_W]_?O[^\'![P'![SP\+R\!P?O[^\'!P>\\/'P\+P'[_?M[.SO\/"\!P?O -M[^_WDNWM[.SM\;P``````````````````````````````/#Q\?#PO+P'!P<' -M[^_O[_?W[^_O[P<'!P<'O+SP\/'Q\O+Q\/"\!P<'[^_O]Y*2[>SL[._PO+P' -M!^_O[_>2[>SL[.SS\0````````````````````````````#T\/'Q\/"\O`<' -M!P<'[^_O]_?O[^_O!P<'![R\\/#Q\?+R\O'P\+P'!P?O[^_WDI+M[.SL[_"\ -MO`<'[^_O]Y+M[.SL^//R```````````````````````````````'!P<'[^\' -M!P>\\?`'!^_O[^_O[^\'!P>\\/#Q\/#P\+P'!P<'!P<'!P<'[^_O]_?M[>WO -M![P'!P?O[_?WDNWL[.SX!_``````````````````````````````O!(4%41$ -M1$1N\/0```````````````````````#T\_+S\_('[_>2DI*2[P<'!^\'\KR2 -M;?B2!P<'!^_O]_>2[>SL^/CO!P```````````````````````````/+J$")# -M(D1$1`<```````````````````````````#S\/3T]/3T]//R\?"\!P?O[Y*\ -M``?L$^R2!P<'DFUMZ_CK[.SX^)+O````````````````````````````^!`1 -M(D-$1$0<`````````````````````````````/$']/3T]/3S\O+Q\+P'!^_O -M]_?P]._K$Y*2[^KX!P````#Q!_?X[.T``````````````````````````!Q$ -M$")#(D1$;O0`````````````````````````````\/?T]/3T]//R\?'PO`<' -M[^_W]^_R\O=MZO@2\```````````]._L[0````````````````````````"\ -M$Q`10T-$1$KT``````````````````````````````#P[/'T]/3T\_+Q\/"\ -M!P?O[_>2D@?T!^SJZ_0```````````````?O```````````````````````` -M`!(1(B)#1$1$\````````````````````````````````/+MO/3T]/3S\O'P -MO+P'!^_O]Y+MDKP'^.P3]P`````````````````````````````````````` -M`/3K0Q!#0T1$1!P`````````````````````````````````].\']/3T]//R -M\?"\!P<'[^_WDNWM]_#T[^N2```````````````````````````````````` -M````[1`10R)$1$3L````````````````````````````````````\+ST]/3T -M\_+Q\+P'!^_O[_>2[!+L[_*\%6T````````````````````````````````` -M``````=$$2)#1$1$;?(```````````````````````````````````#T\O3T -M]/3S\O'PO`<'[^_O]^T3[`#O[0?O%/$````````````````````````````` -M``````#P$A`10T-$1$J\```````````````````````````````````````` -M]/3T]//R\?"\!P?O[_?WZNT`````]_#W[0`````````````````````````` -M`````````.LB$2)#1$1$[P`````````````````````````````````````` -M``#S]/3T\_+Q\+P'!^_O]^SL````````!_*2```````````````````````` -M`````````/`'$B(B0T1$1/CU```````````````````````````````````` -M`````/'P]//S\O'PO`<'[^_W^/0`````````\?/P```````````````````` -M````````````[.\20R)$1$1N```````````````````````````````````` -M````````\0>\\_+R\?"\!P?O[_>2````````````]``````````````````` -M``````````````#W$FUM1$1$2O(````````````````````````````````` -M````````````!^\'\O'P\+P'!^_ODO`````````````````````````````` -M``````````````````"2!_'Q'&WO```````````````````````````````` -M``````````````#T]^WO\?"\O`<'[^_M\P`````````````````````````` -M`````````````````````/22O/+R\0`````````````````````````````` -M``````````````````#T[^_O\+P'!P?O[Y+T```````````````````````` -M``````````````````````````"\[`?Q```````````````````````````` -M``````````````````````#TO`<'O`<'!^_O]_0````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````\O#Q\`?O[^_W\@`````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````````````//S]/*\[_<'```````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````#S]/3T\@<````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````````````````````]/'P\/(````````` -M``````````````````````````#______X_______\#__P___@/______\#_ -M_@__^`#__^!__\#__`?_\``__X!__\#__`/_P``?_P!__\#__`'_@``'_@)_ -M_\#__@'_```#_@1__\#__P#\````_`!__\#__X!X````?`#__\#__\!P```` -M.`#__\#__\`@````$`#__\#__^````````'__\#___````````'__\#___@` -M``````/__\#___@```````?__\#___P```````___\#___@``````!___\#_ -M__```````#___\#___```````#___\#__^```````#___\#__^```````!__ -M_\#__\````````___\#__\````````___\#__X````````___\#__X`````` -M``?__\#__X````````?__\#__X````````?__\#__X````````?__\#__X`` -M``````?__\#__X````````?__\#__X````````?__\#__X````````?__\#_ -M_X````````?__\#__X````````?__\#__X````````?__\#__X````````?_ -M_\#__X````````?__\#__X````````?__\#__X````````?__\#__X`````` -M``?__\#__X````````?__\#__X````````?__\#__X````````?__\#__X`` -M``````?__\#__X````````?__\#__X````````?__\#__X````````?__\#_ -M_X````````?__\#__X````````?__\#__X````````?__\#__X````````/_ -M_\#__X`````````__\#__X`````````'_\#__X`````````#_\#__X`````` -M````_\#__X``````````?\#__X``````````/\#__X``````````O\#__X`` -M````````'\#__X``````````#\#__X``````````#\#__X``````````!\#_ -M_X``````````!\#__X``````````!\#__X```````````\#__X`````````` -M`\#__X```````````\#__P```````````\#__X```````````\#__P`?__@` -M`````\#__@!___P``$```\#__@#___P````/`\#__`#___P````_P\#_^`'_ -M__P```!_\\#_^`/___P```!__\#_X`?___P```!__\#_X`____X```!__\#_ -MP`____X``!`__\#_@!____^``#P__\#_@#____^``'X__\#^`#____^``'\? -M_\#^`/____^``/^__\#^`/_____``/___\#_`?_____``/___\#_`______@ -M`/___\#_P______P`/___\#________\`/___\#_________`/___\#_____ -M____P/___\#_________\'___\`H````%@```"P````!``@``````!`"```` -M```````````!`````0``````````@```@````("``(````"``(``@(```,#` -MP`#`W,``\,JF``0$!``("`@`#`P,`!$1$0`6%A8`'!P<`"(B(@`I*2D`5555 -M`$U-30!"0D(`.3DY`(!\_P!04/\`DP#6`/_LS`#&UN\`UN?G`)"IK0```#,` -M``!F````F0```,P``#,````S,P``,V8``#.9```SS```,_\``&8```!F,P`` -M9F8``&:9``!FS```9O\``)D```"9,P``F68``)F9``"9S```F?\``,P```#, -M,P``S&8``,R9``#,S```S/\``/]F``#_F0``_\P`,P```#,`,P`S`&8`,P"9 -M`#,`S``S`/\`,S,``#,S,P`S,V8`,S.9`#,SS``S,_\`,V8``#-F,P`S9F8` -M,V:9`#-FS``S9O\`,YD``#.9,P`SF68`,YF9`#.9S``SF?\`,\P``#/,,P`S -MS&8`,\R9`#/,S``SS/\`,_\S`#/_9@`S_YD`,__,`#/__P!F````9@`S`&8` -M9@!F`)D`9@#,`&8`_P!F,P``9C,S`&8S9@!F,YD`9C/,`&8S_P!F9@``9F8S -M`&9F9@!F9ID`9F;,`&:9``!FF3,`9IEF`&:9F0!FF]O(/D';R!% -MO/'P````````````````!VX?(/D';R`?1?#T``````````````#T!Q\?16[X -MZT0?`0?S``````````````#P[Q_L!QR2;D4?`6[Q``````````````"\'&[M -MZ47KZ^SLZD6\``````````````#P'.\2;O?P!^M%[$6\``````````````#P -M\`?M]_#T\>R\[^\'``````````````#QD^]M[0?QO/AN[VX'```````````` -M``#Q'&[M1??W]^MM^$4'``````````````#R'`'M[$7W;FV21$7O\?,````` -M``````#R'`$?;O?O!^Q%`47O\`?P``````````#S'`$?("`';R`?`47WO._O -M\0````````#S[45%1D;NDT9%16Z2O._M[P````````#N[^\'[P?P\?"\!^_M -MO._M[P```````/-$$O,`````\O3R!_<'[^\'[0```````!)$[@``````\O3R -M!_>2D@``````````DD3M`````````/3Q!^WR!_,`````````[Y(````````` -M`/('!P<`````````````````````````````\KP``````````/.//`#S`CP` -M\``\`/@`?`#X`'P`\`!\`/``?`#P`'P`\`!\`/``?`#P`'P`\`!\`/``'`#P -C``P`\``$`/``!`#P``0`X>`$`./@/`#'\!P`S_#\`/_\_``` -` -end diff --git a/sys/wince/resource.h b/sys/wince/resource.h deleted file mode 100644 index d214c9866..000000000 --- a/sys/wince/resource.h +++ /dev/null @@ -1,164 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by winhcksp.rc -// -#define IDC_MYICON 2 -#define IDD_WINHACK_DIALOG 102 -#define IDD_ABOUTBOX 103 -#define IDS_APP_TITLE 103 -#define IDM_ABOUT 104 -#define IDM_EXIT 105 -#define IDS_HELLO 106 -#define IDI_WINHACK 107 -#define IDC_WINHACK 109 -#define IDC_SPHONE_DIALOGBAR 111 -#define IDC_SPHONE_TEXTDIALOGBAR 112 -#define IDR_MAINFRAME 128 -#define IDB_TILES 129 -#define IDD_TEXT 130 -#define IDD_NHTEXT 130 -#define IDD_MENU 132 -#define IDB_MENU_SEL 133 -#define IDB_MENU_UNSEL 134 -#define IDD_COMMANDS 136 -#define IDD_GETLIN 138 -#define IDD_EXTCMD 139 -#define IDD_PLAYER_SELECTOR 141 -#define IDB_PETMARK 145 -#define IDB_MENU_SEL_COUNT 146 -#define IDB_KEYPAD 147 -#define IDB_MENUBAR 154 -#define IDC_TEXT_VIEW 1001 -#define IDC_CMD_MOVE_NW 1001 -#define IDC_CMD_MOVE_N 1002 -#define IDC_MENU_LIST 1003 -#define IDC_CMD_MOVE_NE 1003 -#define IDC_MENU_TEXT 1004 -#define IDC_CMD_MOVE_W 1004 -#define IDC_CMD_MOVE_SELF 1005 -#define IDC_CMD_MOVE_E 1006 -#define IDC_CMD_MOVE_SW 1007 -#define IDC_CMD_MOVE_S 1008 -#define IDC_CMD_MOVE_SE 1009 -#define IDC_CMD_MOVE_UP 1010 -#define IDC_CMD_MOVE_DOWN 1011 -#define IDC_CMD_5 1012 -#define IDC_CMD_A 1013 -#define IDC_CMD_B 1014 -#define IDC_CMD_C 1015 -#define IDC_CMD_D 1016 -#define IDC_CMD_E 1017 -#define IDC_CMD_F 1018 -#define IDC_CMD_G 1019 -#define IDC_CMD_H 1020 -#define IDC_CMD_I 1021 -#define IDC_CMD_J 1022 -#define IDC_CMD_K 1023 -#define IDC_CMD_L 1024 -#define IDC_CMD_M 1025 -#define IDC_CMD_N 1026 -#define IDC_CMD_O 1027 -#define IDC_CMD_P 1028 -#define IDC_CMD_Q 1029 -#define IDC_CMD_R 1030 -#define IDC_CMD_S 1031 -#define IDC_CMD_T 1032 -#define IDC_CMD_U 1033 -#define IDC_CMD_V 1034 -#define IDC_CMD_W 1035 -#define IDC_CMD_X 1036 -#define IDC_CMD_Y 1037 -#define IDC_CMD_Z 1038 -#define IDC_CMD_AA 1039 -#define IDC_CMD_BB 1040 -#define IDC_CMD_CC 1041 -#define IDC_CMD_DD 1042 -#define IDC_CMD_EE 1043 -#define IDC_CMD_FF 1044 -#define IDC_CMD_GG 1045 -#define IDC_CMD_HH 1046 -#define IDC_CMD_II 1047 -#define IDC_CMD_JJ 1048 -#define IDC_CMD_KK 1049 -#define IDC_CMD_LL 1050 -#define IDC_CMD_MM 1051 -#define IDC_CMD_NN 1052 -#define IDC_CMD_OO 1053 -#define IDC_CMD_PP 1054 -#define IDC_CMD_QQ 1055 -#define IDC_CMD_RR 1056 -#define IDC_CMD_SS 1057 -#define IDC_CMD_TT 1058 -#define IDC_CMD_UU 1059 -#define IDC_CMD_VV 1060 -#define IDC_CMD_WW 1061 -#define IDC_CMD_XX 1062 -#define IDC_CMD_YY 1063 -#define IDC_CMD_ZZ 1064 -#define IDC_CMD_FIRST 1100 -#define IDC_CMD_LAST 1300 -#define IDC_GETLIN_EDIT 1309 -#define IDC_EXTCMD_LIST 1310 -#define IDC_PLSEL_NAME 1314 -#define IDC_PLSEL_ROLE_RANDOM 1315 -#define IDC_PLSEL_RACE_RANDOM 1318 -#define IDC_PLSEL_GENDER_RANDOM 1319 -#define IDC_PLSEL_ALIGN_RANDOM 1320 -#define IDC_PLSEL_ROLE_LIST 1323 -#define IDC_PLSEL_RACE_LIST 1324 -#define IDC_PLSEL_ALIGN_LIST 1325 -#define IDC_PLSEL_GENDER_LIST 1326 -#define IDC_ABOUT_VERSION 1327 -#define IDC_TEXT_CONTROL 1331 -#define IDC_ABOUT_COPYRIGHT 1332 -#define IDC_TEXT_TOGGLE_WRAP 1333 -#define IDM_SAVE 32771 -#define IDM_HELP_LONG 32772 -#define IDM_HELP_COMMANDS 32773 -#define IDM_HELP_HISTORY 32774 -#define IDM_HELP_INFO_CHAR 32775 -#define IDM_HELP_INFO_KEY 32776 -#define IDM_HELP_OPTIONS 32777 -#define IDM_HELP_OPTIONS_LONG 32778 -#define IDM_HELP_EXTCMD 32779 -#define IDM_HELP_LICENSE 32780 -#define IDM_MAP_TILES 32781 -#define IDM_MAP_ASCII4X6 32782 -#define IDM_MAP_ASCII6X8 32783 -#define IDM_MAP_ASCII8X8 32784 -#define IDM_MAP_ASCII16X8 32785 -#define IDM_MAP_ASCII7X12 32786 -#define IDM_MAP_ASCII8X12 32787 -#define IDM_MAP_ASCII16X12 32788 -#define IDM_MAP_ASCII12X16 32789 -#define IDM_MAP_ASCII10X18 32790 -#define IDM_MAP_FIT_TO_SCREEN 32791 -#define ID_FILE 32792 -#define IDS_CAP_FILE 32793 -#define ID_HELP 32794 -#define IDS_CAP_HELP 32795 -#define IDS_CAP_TEMP 32796 -#define ID_MAP 32797 -#define IDS_CAP_AMP 32798 -#define IDS_CAP_MAP 32799 -#define IDM_VIEW_KEYPAD 32800 -#define ID_VIEW 32801 -#define IDS_CAP_VIEW 32802 -#define IDS_CAP_ENTIREMAP 32826 -#define IDS_CAP_NORMALMAP 32827 -#define IDM_HELP_MENU 32828 -#define IDM_VIEW_OPTIONS 32829 -#define IDM_DIRECT_COMMAND 32830 -#define IDS_TEXT_WRAP 32831 -#define IDS_TEXT_UNWRAP 32832 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 155 -#define _APS_NEXT_COMMAND_VALUE 32833 -#define _APS_NEXT_CONTROL_VALUE 1334 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/sys/wince/winMS.h b/sys/wince/winMS.h deleted file mode 100644 index e9b78bd99..000000000 --- a/sys/wince/winMS.h +++ /dev/null @@ -1,187 +0,0 @@ -/* NetHack 3.6 winMS.h $NHDT-Date: 1433806609 2015/06/08 23:36:49 $ $NHDT-Branch: master $:$NHDT-Revision: 1.29 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef WINMS_H -#define WINMS_H - -#pragma warning(disable : 4142) /* benign redefinition of type */ - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include "resource.h" -#include "hack.h" - -#if defined(WIN_CE_POCKETPC) -#include -#include -#endif - -#if defined(WIN_CE_SMARTPHONE) -#include -#include -#include -#include -#include -#include -#include -#endif - -#if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) -#include -#endif - -/* Taskbar Menu height */ -#define MENU_HEIGHT 26 - -/* Create an array to keep track of the various windows */ - -#ifndef MAXWINDOWS -#define MAXWINDOWS 15 -#endif - -/* RIP window ID */ -#define NHW_RIP 32 -#define NHW_KEYPAD 33 - -/* size of tiles */ -#ifndef TILE_X -#define TILE_X 16 -#endif -#define TILE_Y 16 - -/* tiles per line in the bitmap */ -#define TILES_PER_LINE 40 - -/* tile background color */ -#define TILE_BK_COLOR RGB(71, 108, 108) - -/* minimum/maximum font size (in points - 1/72 inch) */ -#define NHFONT_DEFAULT_SIZE 9 -#define NHFONT_STATUS_DEFAULT_SIZE 6 -#define NHFONT_SIZE_MIN 3 -#define NHFONT_SIZE_MAX 20 - -typedef struct mswin_nhwindow_data { - HWND win; - int type; - int dead; -} MSNHWinData, *PMSNHWinData; - -/* global application data - alailable thour GetNHApp() */ -typedef struct mswin_nhwindow_app { - HINSTANCE hApp; /* hInstance from WinMain */ - int nCmdShow; /* main window mode flag */ - HWND hMainWnd; /* main window handle */ - HACCEL hAccelTable; /* accelerator table */ - HWND hPopupWnd; /* active dialog window (nethack menu, text, etc) */ - HWND hMenuBar; /* menu bar */ - - MSNHWinData windowlist[MAXWINDOWS]; /* nethack windows array */ - - HBITMAP bmpTiles; /* nethack tiles */ - HBITMAP bmpPetMark; /* pet mark Bitmap */ - HBITMAP bmpMapTiles; /* alternative map tiles */ - int mapTile_X; /* alt. tiles width */ - int mapTile_Y; /* alt. tiles height */ - int mapTilesPerLine; /* number of tile per row in the bitmap */ - - boolean bNoHScroll; /* disable cliparound for horizontal grid (map) */ - boolean bNoVScroll; /* disable cliparound for vertical grid (map) */ - - int mapDisplayModeSave; /* saved map display mode */ - - int bCmdPad; /* command pad - on-screen keyboard */ - HWND hCmdWnd; /* handle of on-screen keyboard window */ - - /* options */ - boolean bWrapText; /* format text to fit the window */ - boolean bFullScreen; /* run nethack in full-screen mode */ - boolean bHideScrollBars; /* hide scroll bars */ - boolean bUseSIP; /* use SIP (built-in software keyboard) for menus - (PocketPC only) */ -} NHWinApp, *PNHWinApp; -extern PNHWinApp GetNHApp(); - -#define E extern - -E struct window_procs mswin_procs; - -#undef E - -/* Some prototypes */ -void mswin_init_nhwindows(int *argc, char **argv); -void mswin_player_selection(void); -void mswin_askname(void); -void mswin_get_nh_event(void); -void mswin_exit_nhwindows(const char *); -void mswin_suspend_nhwindows(const char *); -void mswin_resume_nhwindows(void); -winid mswin_create_nhwindow(int type); -void mswin_clear_nhwindow(winid wid); -void mswin_display_nhwindow(winid wid, BOOLEAN_P block); -void mswin_destroy_nhwindow(winid wid); -void mswin_curs(winid wid, int x, int y); -void mswin_putstr(winid wid, int attr, const char *text); -void mswin_putstr_ex(winid wid, int attr, const char *text, boolean append); -void mswin_display_file(const char *filename, BOOLEAN_P must_exist); -void mswin_start_menu(winid wid); -void mswin_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); -void mswin_end_menu(winid wid, const char *prompt); -int mswin_select_menu(winid wid, int how, MENU_ITEM_P **selected); -void mswin_update_inventory(void); -void mswin_mark_synch(void); -void mswin_wait_synch(void); -void mswin_cliparound(int x, int y); -void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph); -void mswin_raw_print(const char *str); -void mswin_raw_print_bold(const char *str); -int mswin_nhgetch(void); -int mswin_nh_poskey(int *x, int *y, int *mod); -void mswin_nhbell(void); -int mswin_doprev_message(void); -char mswin_yn_function(const char *question, const char *choices, CHAR_P def); -void mswin_getlin(const char *question, char *input); -int mswin_get_ext_cmd(void); -void mswin_number_pad(int state); -void mswin_delay_output(void); -void mswin_change_color(void); -char *mswin_get_color_string(void); -void mswin_start_screen(void); -void mswin_end_screen(void); -void mswin_outrip(winid wid, int how, time_t when); -void mswin_preference_update(const char *pref); - -/* helper function */ -HWND mswin_hwnd_from_winid(winid wid); -winid mswin_winid_from_type(int type); -winid mswin_winid_from_handle(HWND hWnd); -void mswin_window_mark_dead(winid wid); -void bail(const char *mesg); -void nhapply_image_transparent(HDC hDC, int x, int y, int width, int height, - HDC sourceDC, int s_x, int s_y, int s_width, - int s_height, COLORREF cTransparent); -void mswin_popup_display(HWND popup, int *done_indicator); -void mswin_popup_destroy(HWND popup); - -#if defined(WIN_CE_SMARTPHONE) -void NHSPhoneDialogSetup(HWND hDlg, UINT nToolBarId, BOOL is_edit, - BOOL is_fullscreen); -#endif - -void mswin_read_reg(void); -void mswin_destroy_reg(void); -void mswin_write_reg(void); - -BOOL mswin_has_keyboard(void); - -void mswin_set_fullscreen(BOOL is_fullscreen); - -extern winid WIN_STATUS; - -#endif /* WINmswin_H */ diff --git a/sys/wince/winhack.c b/sys/wince/winhack.c deleted file mode 100644 index 252fc9c84..000000000 --- a/sys/wince/winhack.c +++ /dev/null @@ -1,352 +0,0 @@ -/* NetHack 3.6 winhack.c $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */ -/* Copyright (C) 2001 by Alex Kompel */ -// winhack.cpp : Defines the entry point for the application. -// - -#include "winMS.h" -#include "hack.h" -#include "dlb.h" -#include "mhmain.h" -#include "mhmap.h" - -extern char orgdir[PATHLEN]; /* also used in pcsys.c, amidos.c */ - -extern void FDECL(nethack_exit, (int)); -static TCHAR *_get_cmd_arg(TCHAR *pCmdLine); - -// Global Variables: -NHWinApp _nethack_app; - -// Foward declarations of functions included in this code module: -BOOL InitInstance(HINSTANCE, int); - -static void win_hack_init(int, char **); -static void __cdecl mswin_moveloop(void *); -static BOOL setMapTiles(const char *fname); - -extern boolean FDECL(pcmain, (int, char **)); - -#define MAX_CMDLINE_PARAM 255 - -int APIENTRY -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, - int nCmdShow) -{ - INITCOMMONCONTROLSEX InitCtrls; - HWND nethackWnd; - int argc; - char *argv[MAX_CMDLINE_PARAM]; - size_t len; - TCHAR *p; - TCHAR wbuf[NHSTR_BUFSIZE]; - char buf[NHSTR_BUFSIZE]; - boolean resuming; - - sys_early_init(); - - /* ensure that we don't access violate on a panic() */ - windowprocs.win_raw_print = mswin_raw_print; - windowprocs.win_raw_print_bold = mswin_raw_print_bold; - - /* init applicatio structure */ - _nethack_app.hApp = hInstance; - _nethack_app.nCmdShow = nCmdShow; - _nethack_app.hAccelTable = - LoadAccelerators(hInstance, (LPCTSTR) IDC_WINHACK); - _nethack_app.hMainWnd = NULL; - _nethack_app.hPopupWnd = NULL; - _nethack_app.hMenuBar = NULL; - _nethack_app.bmpTiles = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TILES)); - if (_nethack_app.bmpTiles == NULL) - panic("cannot load tiles bitmap"); - _nethack_app.bmpPetMark = - LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_PETMARK)); - if (_nethack_app.bmpPetMark == NULL) - panic("cannot load pet mark bitmap"); - _nethack_app.bmpMapTiles = _nethack_app.bmpTiles; - _nethack_app.mapTile_X = TILE_X; - _nethack_app.mapTile_Y = TILE_Y; - _nethack_app.mapTilesPerLine = TILES_PER_LINE; - _nethack_app.bNoHScroll = FALSE; - _nethack_app.bNoVScroll = FALSE; - - _nethack_app.bCmdPad = !mswin_has_keyboard(); - - _nethack_app.bWrapText = TRUE; - _nethack_app.bFullScreen = TRUE; - -#if defined(WIN_CE_SMARTPHONE) - _nethack_app.bHideScrollBars = TRUE; -#else - _nethack_app.bHideScrollBars = FALSE; -#endif - - _nethack_app.bUseSIP = TRUE; - - // check for running nethack programs - nethackWnd = FindWindow(szMainWindowClass, NULL); - if (nethackWnd) { - // bring on top - SetForegroundWindow(nethackWnd); - return FALSE; - } - - // init controls - ZeroMemory(&InitCtrls, sizeof(InitCtrls)); - InitCtrls.dwSize = sizeof(InitCtrls); - InitCtrls.dwICC = ICC_LISTVIEW_CLASSES; - if (!InitCommonControlsEx(&InitCtrls)) { - MessageBox(NULL, TEXT("Cannot init common controls"), TEXT("ERROR"), - MB_OK | MB_ICONSTOP); - return FALSE; - } - - // Perform application initialization: - if (!InitInstance(hInstance, nCmdShow)) { - return FALSE; - } - - /* get command line parameters */ - p = _get_cmd_arg( -#if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) - lpCmdLine -#else - GetCommandLine() -#endif - ); - for (argc = 1; p && argc < MAX_CMDLINE_PARAM; argc++) { - len = _tcslen(p); - if (len > 0) { - argv[argc] = _strdup(NH_W2A(p, buf, BUFSZ)); - } else { - argv[argc] = ""; - } - p = _get_cmd_arg(NULL); - } - GetModuleFileName(NULL, wbuf, BUFSZ); - argv[0] = _strdup(NH_W2A(wbuf, buf, BUFSZ)); - - resuming = pcmain(argc, argv); - - moveloop(resuming); - - return 0; -} - -// -// FUNCTION: InitInstance(HANDLE, int) -// -// PURPOSE: Saves instance handle and creates main window -// -// COMMENTS: -// -// In this function, we save the instance handle in a global variable -// and -// create and display the main program window. -// -BOOL -InitInstance(HINSTANCE hInstance, int nCmdShow) -{ - return TRUE; -} - -PNHWinApp -GetNHApp() -{ - return &_nethack_app; -} - -static int -eraseoldlocks() -{ - register int i; - - /* cannot use maxledgerno() here, because we need to find a lock name - * before starting everything (including the dungeon initialization - * that sets astral_level, needed for maxledgerno()) up - */ - for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) { - /* try to remove all */ - set_levelfile_name(lock, i); - (void) unlink(fqname(lock, LEVELPREFIX, 0)); - } - set_levelfile_name(lock, 0); - if (unlink(fqname(lock, LEVELPREFIX, 0))) - return 0; /* cannot remove it */ - return (1); /* success! */ -} - -void -getlock() -{ - const char *fq_lock; - char tbuf[BUFSZ]; - TCHAR wbuf[BUFSZ]; - HANDLE f; - int fd; - int choice; - - /* regularize(lock); */ /* already done in pcmain */ - Sprintf(tbuf, "%s", fqname(lock, LEVELPREFIX, 0)); - set_levelfile_name(lock, 0); - fq_lock = fqname(lock, LEVELPREFIX, 1); - - f = CreateFile(NH_A2W(fq_lock, wbuf, BUFSZ), GENERIC_READ, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (f == INVALID_HANDLE_VALUE) { - if (GetLastError() == ERROR_FILE_NOT_FOUND) - goto gotlock; /* no such file */ - error("Cannot open %s", fq_lock); - } - - CloseHandle(f); - - /* prompt user that the game alredy exist */ - choice = MessageBox(GetNHApp()->hMainWnd, - TEXT("There are files from a game in progress under " - "your name. Recover?"), - TEXT("Nethack"), MB_YESNO | MB_DEFBUTTON1); - switch (choice) { - case IDYES: - if (recover_savefile()) { - goto gotlock; - } else { - error("Couldn't recover old game."); - } - break; - - case IDNO: - unlock_file(HLOCK); - error("%s", "Cannot start a new game."); - break; - }; - -gotlock: - fd = creat(fq_lock, FCMASK); - if (fd == -1) { - error("cannot creat lock file (%s.)", fq_lock); - } else { - if (write(fd, (char *) &hackpid, sizeof(hackpid)) - != sizeof(hackpid)) { - error("cannot write lock (%s)", fq_lock); - } - if (close(fd) == -1) { - error("cannot close lock (%s)", fq_lock); - } - } -} - -/* misc functions */ -void error -VA_DECL(const char *, s) -{ - TCHAR wbuf[1024]; - char buf[1024]; - DWORD last_error = GetLastError(); - - VA_START(s); - VA_INIT(s, const char *); - /* error() may get called before tty is initialized */ - if (iflags.window_inited) - end_screen(); - - vsprintf(buf, s, VA_ARGS); - NH_A2W(buf, wbuf, sizeof(wbuf) / sizeof(wbuf[0])); - if (last_error > 0) { - LPVOID lpMsgBuf; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, last_error, - 0, // Default language - (LPTSTR) &lpMsgBuf, 0, NULL)) { - _tcsncat(wbuf, TEXT("\nSystem Error: "), - sizeof(wbuf) / sizeof(wbuf[0]) - _tcslen(wbuf)); - _tcsncat(wbuf, lpMsgBuf, - sizeof(wbuf) / sizeof(wbuf[0]) - _tcslen(wbuf)); - - // Free the buffer. - LocalFree(lpMsgBuf); - } - } - MessageBox(NULL, wbuf, TEXT("Error"), MB_OK | MB_ICONERROR); - VA_END(); - exit(EXIT_FAILURE); -} - -TCHAR * -_get_cmd_arg(TCHAR *pCmdLine) -{ - static TCHAR *pArgs = NULL; - TCHAR *pRetArg; - BOOL bQuoted; - - if (!pCmdLine && !pArgs) - return NULL; - if (!pArgs) - pArgs = pCmdLine; - - /* skip whitespace */ - for (pRetArg = pArgs; *pRetArg && _istspace(*pRetArg); - pRetArg = CharNext(pRetArg)) - ; - if (!*pRetArg) { - pArgs = NULL; - return NULL; - } - - /* check for quote */ - if (*pRetArg == TEXT('"')) { - bQuoted = TRUE; - pRetArg = CharNext(pRetArg); - pArgs = _tcschr(pRetArg, TEXT('"')); - } else { - /* skip to whitespace */ - for (pArgs = pRetArg; *pArgs && !_istspace(*pArgs); - pArgs = CharNext(pArgs)) - ; - } - - if (pArgs && *pArgs) { - TCHAR *p; - p = pArgs; - pArgs = CharNext(pArgs); - *p = (TCHAR) 0; - } else { - pArgs = NULL; - } - - return pRetArg; -} - -/* - * Strip out troublesome file system characters. - */ - -void nt_regularize(s) /* normalize file name */ -register char *s; -{ - register unsigned char *lp; - - for (lp = s; *lp; lp++) - if (*lp == '?' || *lp == '"' || *lp == '\\' || *lp == '/' - || *lp == '>' || *lp == '<' || *lp == '*' || *lp == '|' - || *lp == ':' || (*lp > 127)) - *lp = '_'; -} - -void -win32_abort() -{ - if (wizard) - DebugBreak(); - abort(); -} - -void -append_port_id(buf) -char *buf; -{ - char *portstr = PORT_CE_PLATFORM " " PORT_CE_CPU; - Sprintf(eos(buf), " %s", portstr); -} diff --git a/sys/wince/winhack.rc b/sys/wince/winhack.rc deleted file mode 100644 index 9357a89f1..000000000 --- a/sys/wince/winhack.rc +++ /dev/null @@ -1,373 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "newres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_WINHACK ICON DISCARDABLE "..\\..\\wince\\NETHACK.ICO" - -///////////////////////////////////////////////////////////////////////////// -// -// Menubar -// - -IDC_WINHACK MENU DISCARDABLE -BEGIN - POPUP "File" - BEGIN - MENUITEM "&Save", IDM_SAVE - MENUITEM SEPARATOR - MENUITEM "&Quit", IDM_EXIT - END - POPUP "Map" - BEGIN - MENUITEM "&0 - Use Tiles", IDM_MAP_TILES - MENUITEM "&1 - ASCII (4x6)", IDM_MAP_ASCII4X6 - MENUITEM "&2 - ASCII (6x8)", IDM_MAP_ASCII6X8 - MENUITEM "&3 - ASCII (8x8)", IDM_MAP_ASCII8X8 - MENUITEM "&4 - ASCII (16x8)", IDM_MAP_ASCII16X8 - MENUITEM "&5 - ASCII (7x12)", IDM_MAP_ASCII7X12 - MENUITEM "&6 - ASCII (8x12)", IDM_MAP_ASCII8X12 - MENUITEM "&7 - ASCII (16x12)", IDM_MAP_ASCII16X12 - MENUITEM "&8 - ASCII (12x16)", IDM_MAP_ASCII12X16 - MENUITEM "&9 - ASCII (10x18)", IDM_MAP_ASCII10X18 - MENUITEM SEPARATOR - MENUITEM "&Fit To Screen", IDM_MAP_FIT_TO_SCREEN - END - POPUP "View" - BEGIN - MENUITEM "&Keypad", IDM_VIEW_KEYPAD - MENUITEM "&Options", IDM_VIEW_OPTIONS - END - POPUP "Help" - BEGIN - MENUITEM "&About ...", IDM_ABOUT - MENUITEM "&Long description of the game", IDM_HELP_LONG - MENUITEM "List of &commands", IDM_HELP_COMMANDS - MENUITEM "&History of NetHack", IDM_HELP_HISTORY - MENUITEM "&Info on a character", IDM_HELP_INFO_CHAR - MENUITEM "Info on what a given &key does", IDM_HELP_INFO_KEY - MENUITEM "List of game &options", IDM_HELP_OPTIONS - MENUITEM "&Longer list of game options", IDM_HELP_OPTIONS_LONG - MENUITEM "List of e&xtended commands", IDM_HELP_EXTCMD - MENUITEM "The &NetHack license", IDM_HELP_LICENSE - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDC_WINHACK ACCELERATORS MOVEABLE PURE -BEGIN - "?", IDM_ABOUT, ASCII, ALT - "/", IDM_ABOUT, ASCII, ALT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 123, 87 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "System" -BEGIN - LTEXT "NetHack",IDC_ABOUT_VERSION,0,2,120,15,SS_NOPREFIX - LTEXT "Copyright",IDC_ABOUT_COPYRIGHT,0,20,120,50 - DEFPUSHBUTTON "OK",IDOK,45,75,30,11,WS_GROUP -END - -IDD_MENU DIALOG DISCARDABLE 0, 0, 109, 153 -STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,5,130,50,14,BS_NOTIFY - PUSHBUTTON "Cancel",IDCANCEL,55,130,50,14,BS_NOTIFY - CONTROL "List1",IDC_MENU_LIST,"SysListView32",WS_BORDER | - WS_TABSTOP,5,5,100,60 - EDITTEXT IDC_MENU_TEXT,5,70,100,55,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL -END - -IDD_GETLIN DIALOG DISCARDABLE 0, 0, 115, 30 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Question?" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,0,16,55,14 - PUSHBUTTON "Cancel",IDCANCEL,55,16,60,14 - EDITTEXT IDC_GETLIN_EDIT,0,0,115,15,ES_AUTOHSCROLL -END - -IDD_PLAYER_SELECTOR DIALOG DISCARDABLE 0, 0, 105, 124 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "What are you?" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_PLSEL_NAME,35,0,70,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "Name:",IDC_STATIC,0,0,25,10 - CONTROL "Random",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | - BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,20,40,10 - COMBOBOX IDC_PLSEL_ROLE_LIST,50,20,50,50,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - CONTROL "Random",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | - BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,45,40,10 - COMBOBOX IDC_PLSEL_RACE_LIST,50,45,50,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - CONTROL "Random",IDC_PLSEL_GENDER_RANDOM,"Button", - BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,70, - 40,10 - COMBOBOX IDC_PLSEL_GENDER_LIST,50,70,50,40,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - CONTROL "Random",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | - BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,95,40,10 - COMBOBOX IDC_PLSEL_ALIGN_LIST,50,95,50,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - GROUPBOX "Role",IDC_STATIC,0,10,105,25,WS_GROUP - GROUPBOX "Race",IDC_STATIC,0,35,105,25 - GROUPBOX "Gender",IDC_STATIC,0,60,105,25 - GROUPBOX "Alignment",IDC_STATIC,0,85,105,25 - DEFPUSHBUTTON "Play",IDOK,0,110,55,14 - PUSHBUTTON "Quit",IDCANCEL,55,110,50,14 -END - -IDD_NHTEXT DIALOG DISCARDABLE 0, 0, 100, 97 -STYLE WS_CHILD | WS_BORDER -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "OK",IDOK,0,80,50,14 - PUSHBUTTON "Wrap",IDC_TEXT_TOGGLE_WRAP,50,80,50,14 - EDITTEXT IDC_TEXT_CONTROL,5,0,70,75,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL -END - -IDD_EXTCMD DIALOG DISCARDABLE 0, 0, 109, 114 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Extended Commands" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,75,5,30,14 - PUSHBUTTON "Cancel",IDCANCEL,75,20,30,14 - LISTBOX IDC_EXTCMD_LIST,5,5,65,105,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""newres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_TILES BITMAP DISCARDABLE "..\\..\\wince\\tiles.bmp" -IDB_MENU_SEL BITMAP DISCARDABLE "..\\..\\wince\\mnsel.bmp" -IDB_MENU_UNSEL BITMAP DISCARDABLE "..\\..\\wince\\mnunsel.bmp" -IDB_PETMARK BITMAP DISCARDABLE "..\\..\\wince\\petmark.bmp" -IDB_MENU_SEL_COUNT BITMAP DISCARDABLE "..\\..\\wince\\mnselcnt.bmp" -IDB_KEYPAD BITMAP DISCARDABLE "..\\..\\wince\\keypad.bmp" -IDB_MENUBAR BITMAP DISCARDABLE "..\\..\\wince\\menubar.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_PLAYER_SELECTOR, DIALOG - BEGIN - RIGHTMARGIN, 98 - BOTTOMMARGIN, 117 - END - - IDD_NHTEXT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 76 - TOPMARGIN, 7 - BOTTOMMARGIN, 94 - END - - IDD_EXTCMD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 102 - TOPMARGIN, 7 - BOTTOMMARGIN, 107 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Data -// - -IDC_WINHACK SHMENUBAR DISCARDABLE -BEGIN - IDC_WINHACK, 6, - I_IMAGENONE, ID_FILE, TBSTATE_ENABLED, - TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_FILE, 0, 0, - I_IMAGENONE, ID_MAP, TBSTATE_ENABLED, - TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_MAP, 0, 1, - I_IMAGENONE, ID_VIEW, TBSTATE_ENABLED, - TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_VIEW, 0, 2, - I_IMAGENONE, ID_HELP, TBSTATE_ENABLED, - TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_HELP, 0, 3, - 0, IDM_MAP_FIT_TO_SCREEN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, - IDM_MAP_FIT_TO_SCREEN, NOMENU, - 1, IDM_VIEW_KEYPAD, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, - IDM_VIEW_KEYPAD, NOMENU, -END - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,6,6,0 - PRODUCTVERSION 3,6,6,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x9L -#else - FILEFLAGS 0x8L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "NetHack 3.6.6 for Windows CE\0" - VALUE "CompanyName", " \0" - VALUE "FileDescription", "nethackm\0" - VALUE "FileVersion", "3, 6, 6, 0\0" - VALUE "InternalName", "nethackm\0" - VALUE "LegalCopyright", "Copyright © 1985-2020\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "nethackm.exe\0" - VALUE "PrivateBuild", "090914\0" - VALUE "ProductName", "NetHack\0" - VALUE "ProductVersion", "3, 6, 6, 0\0" - VALUE "SpecialBuild", "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "NetHack" - IDC_WINHACK "NETHACK" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDM_MAP_FIT_TO_SCREEN "Fit to Screen" - IDS_CAP_FILE "File" - IDS_CAP_HELP "Help" - IDS_CAP_MAP "Map" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDM_VIEW_KEYPAD "Show/Hide keypad." - IDS_CAP_VIEW "View" - IDS_TEXT_WRAP "Wrap" - IDS_TEXT_UNWRAP "Unwrap" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDOK "Done" - IDCANCEL "Cancel" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sys/wince/winhcksp.rc b/sys/wince/winhcksp.rc deleted file mode 100644 index aec8838a9..000000000 --- a/sys/wince/winhcksp.rc +++ /dev/null @@ -1,356 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "newres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_WINHACK ICON DISCARDABLE "..\\..\\wince\\NETHACK.ICO" - -///////////////////////////////////////////////////////////////////////////// -// -// Menubar -// - -IDC_WINHACK MENU DISCARDABLE -BEGIN - MENUITEM "Entire Map", IDM_MAP_FIT_TO_SCREEN - POPUP "Menu" - BEGIN - MENUITEM "Options", IDM_VIEW_OPTIONS - MENUITEM "Keypad", IDM_VIEW_KEYPAD - MENUITEM "Cmd", IDM_DIRECT_COMMAND - MENUITEM SEPARATOR - MENUITEM "ASCII", IDM_MAP_ASCII8X8 - MENUITEM "Tiles", IDM_MAP_TILES - MENUITEM SEPARATOR - MENUITEM "Help", IDM_HELP_MENU - MENUITEM "Save", IDM_SAVE - MENUITEM "Quit", IDM_EXIT - END -END - -IDC_SPHONE_DIALOGBAR MENU DISCARDABLE -BEGIN - MENUITEM "Done", IDOK - MENUITEM "Cancel", IDCANCEL -END - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDC_WINHACK ACCELERATORS MOVEABLE PURE -BEGIN - "?", IDM_ABOUT, ASCII, ALT - "/", IDM_ABOUT, ASCII, ALT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 123, 87 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "System" -BEGIN - LTEXT "NetHack",IDC_ABOUT_VERSION,0,2,120,15,SS_NOPREFIX - LTEXT "Copyright",IDC_ABOUT_COPYRIGHT,0,20,120,50 - DEFPUSHBUTTON "OK",IDOK,45,75,30,11,WS_GROUP -END - -IDD_MENU DIALOG DISCARDABLE 0, 0, 109, 131 -STYLE DS_SETFOREGROUND | DS_CONTROL | WS_POPUP | WS_CLIPSIBLINGS | WS_BORDER -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "List1",IDC_MENU_LIST,"SysListView32",WS_BORDER | - WS_TABSTOP,5,5,100,60 - EDITTEXT IDC_MENU_TEXT,5,70,100,55,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL -END - -IDD_NHTEXT DIALOG DISCARDABLE 0, 0, 83, 83 -STYLE WS_POPUP | WS_BORDER -FONT 8, "System" -BEGIN - EDITTEXT IDC_TEXT_CONTROL,5,0,70,75,ES_MULTILINE | ES_READONLY | - WS_VSCROLL | WS_HSCROLL -END - -IDD_EXTCMD DIALOG DISCARDABLE 0, 0, 88, 82 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Extended Commands" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_EXTCMD_LIST,7,5,75,69,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP -END - -IDD_GETLIN DIALOG DISCARDABLE 0, 0, 115, 16 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Question?" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_GETLIN_EDIT,0,0,115,15,ES_AUTOHSCROLL -END - -IDD_PLAYER_SELECTOR DIALOG DISCARDABLE 0, 0, 105, 124 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "What are you?" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT IDC_PLSEL_NAME,35,0,70,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "Name:",IDC_STATIC,0,0,25,10 - CONTROL "Random",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | - BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,20,40,10 - COMBOBOX IDC_PLSEL_ROLE_LIST,50,20,50,50,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - CONTROL "Random",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | - BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,45,40,10 - COMBOBOX IDC_PLSEL_RACE_LIST,50,45,50,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - CONTROL "Random",IDC_PLSEL_GENDER_RANDOM,"Button", - BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,70, - 40,10 - COMBOBOX IDC_PLSEL_GENDER_LIST,50,70,50,40,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - CONTROL "Random",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | - BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,95,40,10 - COMBOBOX IDC_PLSEL_ALIGN_LIST,50,95,50,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_GROUP | WS_TABSTOP - GROUPBOX "Role",IDC_STATIC,0,10,105,25,WS_GROUP - GROUPBOX "Race",IDC_STATIC,0,35,105,25 - GROUPBOX "Gender",IDC_STATIC,0,60,105,25 - GROUPBOX "Alignment",IDC_STATIC,0,85,105,25 - DEFPUSHBUTTON "Play",IDOK,0,110,55,14 - PUSHBUTTON "Quit",IDCANCEL,55,110,50,14 -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""newres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_TILES BITMAP DISCARDABLE "..\\..\\wince\\tiles.bmp" -IDB_MENU_SEL BITMAP DISCARDABLE "..\\..\\wince\\mnsel.bmp" -IDB_MENU_UNSEL BITMAP DISCARDABLE "..\\..\\wince\\mnunsel.bmp" -IDB_PETMARK BITMAP DISCARDABLE "..\\..\\wince\\petmark.bmp" -IDB_MENU_SEL_COUNT BITMAP DISCARDABLE "..\\..\\wince\\mnselcnt.bmp" -IDB_KEYPAD BITMAP DISCARDABLE "..\\..\\wince\\keypad.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_NHTEXT, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 76 - TOPMARGIN, 7 - END - - IDD_EXTCMD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 82 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_PLAYER_SELECTOR, DIALOG - BEGIN - RIGHTMARGIN, 98 - BOTTOMMARGIN, 117 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Data -// - -IDC_WINHACK SHMENUBAR DISCARDABLE -BEGIN - IDC_WINHACK, 2, - I_IMAGENONE, IDM_MAP_FIT_TO_SCREEN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDM_MAP_FIT_TO_SCREEN, 0, NOMENU, - I_IMAGENONE, ID_VIEW, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_VIEW, 0, 1, -END - -IDC_SPHONE_DIALOGBAR SHMENUBAR DISCARDABLE -BEGIN - IDC_SPHONE_DIALOGBAR, 2, - I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDOK, 0, NOMENU, - I_IMAGENONE, IDCANCEL, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDCANCEL, 0, - NOMENU, -END - -IDC_SPHONE_TEXTDIALOGBAR SHMENUBAR DISCARDABLE -BEGIN - IDC_SPHONE_DIALOGBAR, 2, - I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDOK, 0, NOMENU, - I_IMAGENONE, IDC_TEXT_TOGGLE_WRAP, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDS_TEXT_WRAP, 0, - NOMENU, -END - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,6,6,0 - PRODUCTVERSION 3,6,6,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x9L -#else - FILEFLAGS 0x8L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "NetHack 3.6.6 for Smartphone 2002\0" - VALUE "CompanyName", " \0" - VALUE "FileDescription", "nethackm\0" - VALUE "FileVersion", "3, 6, 6, 0\0" - VALUE "InternalName", "nethackm\0" - VALUE "LegalCopyright", "Copyright © 1985-2020\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "nethackm.exe\0" - VALUE "PrivateBuild", "090914\0" - VALUE "ProductName", "NetHack For Smartphone\0" - VALUE "ProductVersion", "3, 6, 6, 0\0" - VALUE "SpecialBuild", "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "NetHack" - IDC_WINHACK "NETHACK" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDM_MAP_FIT_TO_SCREEN "Entire Map" - IDS_CAP_FILE "File" - IDS_CAP_HELP "Help" - IDS_CAP_MAP "Map" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDM_VIEW_KEYPAD "Show/Hide keypad." - IDS_CAP_VIEW "Menu" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDOK "Done" - IDCANCEL "Cancel" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CAP_ENTIREMAP "Entire Map" - IDS_CAP_NORMALMAP "Normal Map" - IDM_HELP_MENU "Help Menu" - IDS_TEXT_WRAP "Wrap" - IDS_TEXT_UNWRAP "Unwrap" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sys/wince/winmain.c b/sys/wince/winmain.c deleted file mode 100644 index 7007166e3..000000000 --- a/sys/wince/winmain.c +++ /dev/null @@ -1,119 +0,0 @@ -// winmain.cpp : Defines the entry point for the application. -// -// $NHDT-Date: 1432512799 2015/05/25 00:13:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.5 $ - -#include "winMS.h" -#include - -#define MAX_CMDLINE_PARAM 255 - -extern int FDECL(main, (int, char **)); -static TCHAR *_get_cmd_arg(TCHAR *pCmdLine); - -int APIENTRY -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, - int nCmdShow) -{ - int argc; - char *argv[MAX_CMDLINE_PARAM]; - size_t len; - TCHAR *p; - TCHAR wbuf[NHSTR_BUFSIZE]; - char buf[NHSTR_BUFSIZE]; - - /* get command line parameters */ - p = _get_cmd_arg( -#if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) - lpCmdLine -#else - GetCommandLine() -#endif - ); - for (argc = 1; p && argc < MAX_CMDLINE_PARAM; argc++) { - len = _tcslen(p); - if (len > 0) { - argv[argc] = _strdup(NH_W2A(p, buf, BUFSZ)); - } else { - argv[argc] = ""; - } - p = _get_cmd_arg(NULL); - } - GetModuleFileName(NULL, wbuf, BUFSZ); - argv[0] = _strdup(NH_W2A(wbuf, buf, BUFSZ)); - - main(argc, argv); - - return 0; -} - -TCHAR * -_get_cmd_arg(TCHAR *pCmdLine) -{ - static TCHAR *pArgs = NULL; - TCHAR *pRetArg; - BOOL bQuoted; - - if (!pCmdLine && !pArgs) - return NULL; - if (!pArgs) - pArgs = pCmdLine; - - /* skip whitespace */ - for (pRetArg = pArgs; *pRetArg && _istspace(*pRetArg); - pRetArg = CharNext(pRetArg)) - ; - if (!*pRetArg) { - pArgs = NULL; - return NULL; - } - - /* check for quote */ - if (*pRetArg == TEXT('"')) { - bQuoted = TRUE; - pRetArg = CharNext(pRetArg); - pArgs = _tcschr(pRetArg, TEXT('"')); - } else { - /* skip to whitespace */ - for (pArgs = pRetArg; *pArgs && !_istspace(*pArgs); - pArgs = CharNext(pArgs)) - ; - } - - if (pArgs && *pArgs) { - TCHAR *p; - p = pArgs; - pArgs = CharNext(pArgs); - *p = (TCHAR) 0; - } else { - pArgs = NULL; - } - - return pRetArg; -} - -#ifndef STRNCMPI -char lowc(c) /* force 'c' into lowercase */ -char c; -{ - return ((char) (('A' <= c && c <= 'Z') ? (c | 040) : c)); -} - -int strncmpi(s1, s2, n) /* case insensitive counted string comparison */ -register const char *s1, *s2; -register int n; /*(should probably be size_t, which is usually unsigned)*/ -{ /*{ aka strncasecmp }*/ - register char t1, t2; - - while (n--) { - if (!*s2) - return (*s1 != 0); /* s1 >= s2 */ - else if (!*s1) - return -1; /* s1 < s2 */ - t1 = lowc(*s1++); - t2 = lowc(*s2++); - if (t1 != t2) - return (t1 > t2) ? 1 : -1; - } - return 0; /* s1 == s2 */ -} -#endif /* STRNCMPI */ diff --git a/sys/winnt/.gitattributes b/sys/windows/.gitattributes similarity index 74% rename from sys/winnt/.gitattributes rename to sys/windows/.gitattributes index d52abfcb5..86544ef62 100644 --- a/sys/winnt/.gitattributes +++ b/sys/windows/.gitattributes @@ -1,10 +1,10 @@ -Install.nt NHSUBST +Install.windows NHSUBST Makefile.* NHSUBST defaults.nh NHSUBST sysconf NHSUBST *.rc NHSUBST *.bat NHSUBST *.def NH_header=no -* NH_filestag=(file%s_for_Windows_7/8.x/10_version) +* NH_filestag=(file%s_for_Windows_10/11_version) ..files NH_filegenerated=nethack.ico nethack.ico NH_filesgentag=(file%s_generated_by_uudecode_at_compile_time) diff --git a/sys/winnt/.gitignore b/sys/windows/.gitignore similarity index 100% rename from sys/winnt/.gitignore rename to sys/windows/.gitignore diff --git a/sys/windows/GNUmakefile b/sys/windows/GNUmakefile new file mode 100644 index 000000000..cfbcead9e --- /dev/null +++ b/sys/windows/GNUmakefile @@ -0,0 +1,1545 @@ +# NetHack 5.0 GNUmakefile +# Copyright (c) 2022 by Feiyun Wang +#-Copyright (c) 2022 by Michael Allison +# NetHack may be freely redistributed. See license for details. +# +#============================================================================== +# +# Win32 Compilers Tested with this GNUmakefile: +# mingw-w64 +# from: +# https://sourceforge.net/p/mingw-w64/wiki2/GeneralUsageInstructions/ +# Toolchain for 32 and 64 bit Windows target +# +#============================================================================== +# This is used for building two versions of NetHack: +# +# A tty port utilizing the Win32 Console I/O subsystem, Console +# NetHack. +# +# A Win32 native port built on the Windows API, Graphical NetHack or +# NetHackW. +# +# If you have any questions read the sys/windows/Install.windows file included +# with the distribution. +# +#============================================================================== +# +# The default make target (so just typing 'mingw32-make'). +# + +default: package + +#--------------------------------------------------------------- +# Where do you want the game to be built (which folder)? +# If not present prior to compilation it gets created. +# + +GAMEDIR = ../binary + +# +#--------------------------------------------------------------- +# Do you want to include integration with any sound libraries that work with +# this Makefile? Add the list below. If you change the list do 'nmake clean'. +# +# There is glue in here for the following: windsound fmod +# Obtaining the 3rd party library, including its .h files, is up to you. +# +# windsound uses built-in Microsoft API's, no 3rd party download is required. + +SOUND_LIBRARIES = windsound + +# +#--------------------------------------------------------------- +# Do you want debug information in the executable? +# + +DEBUGINFO = Y + +# +#--------------------------------------------------------------- +# Required for CRASHREPORT (but doesn't work yet, so off). + +CRASHREPORT = N + +# +#--------------------------------------------------------------- +# Do you have a connection to the internet available that you want +# to utilize for obtaining prerequisite Lua source code and pdcursesmod +# source code. Defaults to Y. + +INTERNET_AVAILABLE = Y + +# +#--------------------------------------------------------------- +# Do you have git commands available and NetHack in a git repository? +# + +GIT_AVAILABLE = N + +# +#--------------------------------------------------------------- +# Do you want to turn on the same gcc warnings as on Unix builds? +# + +GCC_EXTRA_WARNINGS = N + +# +#=============================================== +#======= End of Modification Section =========== +#=============================================== +# +################################################ +# # +# Nothing below here should have to be changed.# +# # +################################################ +# +#============================================================================== + +$(info Using $(lastword $(MAKEFILE_LIST))) + +SKIP_NETHACKW = N +USE_LUADLL = Y +WANT_LUAC = N + +ifndef LUA_VERSION +LUAVER=5.4.8 +else +LUAVER=$(LUA_VERSION) +endif + +# if GIT=1 is passed on the make command, allow use of git and internet +ifeq "$(GIT)" "1" +INTERNET_AVAILABLE=Y +GIT_AVAILABLE=Y +endif +ifeq "$(git)" "1" +INTERNET_AVAILABLE=Y +GIT_AVAILABLE=Y +endif + +PDCURSES=pdcursesmod +PDCURSESFLAGS = -DPDC_WIDE -DPDC_RGB + +# +#============================================================================== +# Sanity checks for prerequisite Lua and pdcurses +# +LUA_MAY_PROCEED=N +ADD_CURSES=N +PDCURSES_TOP= + +# First, Lua +ifeq "$(INTERNET_AVAILABLE)" "Y" +ifeq "$(GIT_AVAILABLE)" "Y" +LUATOP=../submodules/lua +LUASRC=$(LUATOP) +LUA_MAY_PROCEED=Y +else # GIT_AVAILABLE +LUATOP = ../lib/lua-$(LUAVER) +LUASRC = $(LUATOP)/src +LUA_MAY_PROCEED=Y +endif # GIT_AVAILABLE +else # INTERNET_AVAILABLE not +# The internet is not available for obtaining Lua using either +# method (git or download). Check to see if it is available already, with +# precedence given to ../submodules, then ../lib. +# +ifneq ("$(wildcard ../submodules/lua/lua.h)", "") +LUATOP=../submodules/lua +LUASRC=$(LUATOP) +LUA_MAY_PROCEED=Y +else ifneq ("$(wildcard ../lib/lua-$(LUAVER)/src/lua.h)", "") +LUATOP = ../lib/lua-$(LUAVER) +LUASRC = $(LUATOP)/src +LUA_MAY_PROCEED=Y +else +endif # Lua sources +ifeq "$(LUA_MAY_PROCEED)" "Y" +$(info No internet connection was authorized in the Makefile,) +$(info but a copy of lua-$(LUAVER) was found in $(LUASRC), so that will be used.) +endif # LUA_MAY_PROCEED +endif # INTERNET_AVAILABLE + +ifneq "$(LUA_MAY_PROCEED)" "Y" +ifneq "$(INTERNET_AVAILABLE)" "Y" +$(info Your Makefile settings do not allow use of the internet to obtain Lua) +endif # INTERNET_AVAILABLE +$(info and no copy of Lua was found in either ../submodules/lua or ../lib/lua-$(LUAVER).) +$(info Change your make command line to include:) +$(info GIT=1) +$(info or modify your Makefile to set the following:) +$(info INTERNET_AVAILABLE=Y) +$(info GIT_AVAILABLE=Y) +$(error Stopping because NetHack 5.0 requires Lua for its build.) +endif # LUA_MAY_PROCEED + +# Now, pdcurses +ifeq "$(INTERNET_AVAILABLE)" "Y" +ifeq "$(GIT_AVAILABLE)" "Y" +PDCURSES_TOP=../submodules/$(PDCURSES) +ADD_CURSES=Y +else # GIT_AVAILABLE +PDCURSES_TOP=../lib/$(PDCURSES) +ADD_CURSES=Y +endif # GIT_AVAILABLE +else # INTERNET_AVAILABLE is not Y below +# Your Makefile settings to not allow $(PDCURSES) to be obtained by +# git or by download). Check to see if it is available at one of +# the expected locations already, with precedence given to ../submodules, +# then ../lib. +# +ifneq ("$(wildcard ../submodules/$(PDCURSES)/curses.h)", "") +PDCURSES_TOP=../submodules/$(PDCURSES) +ADD_CURSES=Y +else ifneq ("$(wildcard ../lib/$(PDCURSES)/curses.h)", "") +PDCURSES_TOP=../lib/$(PDCURSES) +ADD_CURSES=Y +endif # $(PDCURSES) sources available somewhere + +ifeq "$(ADD_CURSES)" "Y" +$(info Your Makefile settings do not allow $(PDCURSES) to be obtained by) +$(info git or by download, but a copy of $(PDCURSES) was found in $(PDCURSES_TOP),) +$(info so that will be used.) +endif # ADD_CURSES == Y +endif # INTERNET_AVAILABLE + +ifneq "$(ADD_CURSES)" "Y" +$(info NetHack 5.0 will be built without support for the curses window-port.) +endif + +ifeq "$(INTERNET_AVAILABLE)" "Y" +ifeq "$(GIT_AVAILABLE)" "Y" +GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) +GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) +GIT_PREFIX := $(shell echo `git config nethack.substprefix` 2>&1) +ifdef GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +endif +ifdef GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +endif +ifdef GIT_PREFIX +GITPREFIX = -DNETHACK_GIT_PREFIX=\"$(GIT_PREFIX)\" +endif +endif +endif + +#============================================================================== + +# The version of the game this Makefile was designed for +NETHACK_VERSION="5.0.0" + +# A brief version for use in macros +NHV1=$(subst .,,$(NETHACK_VERSION)) +NHV=$(subst ",,$(NHV1)) + +# +# Source directories. Makedefs hardcodes these, don't change them. +# + +# INCL - NetHack include files +# DAT - NetHack data files +# DOC - NetHack documentation files +# UTIL - Utility source +# SRC - Main source +# SSYS - Shared system files +# MSWSYS - mswin specific files +# TTY - window port files (tty) +# MSWIN - window port files (win32) +# WCURSES - window port files (curses) +# WCHAIN - window port files (chain) +# WSHR - Tile support files +# SNDSYS - sound support files for win32 +# QT - QT window support files + +INCL =../include +DAT =../dat +DOC =../doc +UTIL =../util +SRC =../src +SSYS =../sys/share +SNDSYS =../sound/windsound +MSWSYS =../sys/windows +TTY =../win/tty +MSWIN =../win/win32 +WCHAIN =../win/chain +WCURSES =../win/curses +WSHR =../win/share +QT =../win/Qt +SNDWAVDIR = ../sound/wav +BinDir = ../binary +PkgDir = ../package + +# +# Object directory. +# + +OBJ = o + +# +# Shorten up the location for some files +# + +O = $(OBJ)/ + +U = $(UTIL)/ + +# To store all the level files, +# help files, etc. in a single library file. +# USE_DLB = Y is left uncommented + +USE_DLB = Y + +#========================================== +#========================================== +# Setting up the compiler and linker +# macros. All builds include the base ones. +#========================================== +#========================================== + +ifeq "$(MSYSTEM)" "MINGW32" +arch = x86 +else +arch = x64 +endif +MACH := $(shell echo $$PROCESSOR_IDENTIFIER | cut -f1 -d ' ') +MACH := $(strip $(MACH)) +# Print the detected architecture (for debugging) +#$(info Detected Architecture:$(MACH).) +ifeq "$(MACH)" "ARMv8" +arch=arm64 +endif +ifdef CI_COMPILER +cc = gcc -c +cxx = g++ -c +ld = gcc +DEBUGINFO = N +else +cc = gcc -c +cxx = g++ -c +ld = gcc +endif +ifeq "$(MSYSTEM)" "MINGW32" +rc = windres --target=pe-i386 +else # MINGW64 or arm64 +ifeq "$(arch)" "arm64" +#rc = windres --target=pe-arm64 +rc = windres +else +rc = windres --target=pe-x86-64 +endif +endif + + + +# +# Handle user settings +# +CFLAGS = -mms-bitfields -I../include -I../sys/windows +LDFLAGS = +ifeq "$(DEBUGINFO)" "Y" +CFLAGS += -g -D_DEBUG +LIBUCRT = -lucrtbased +else +CFLAGS += -DNDEBUG +LDFLAGS += -s +LIBUCRT= +endif + +ifeq "$(USE_DLB)" "Y" +DLBFLG = -DDLB +else +DLBFLG = +endif + + +ifeq "$(GCC_EXTRA_WARNINGS)" "Y" +# +# These match the warnings enabled on the linux.500 and macOS.500 hints builds +# +CFLAGSXTRA = -Wall -Wextra -Wreturn-type -Wunused -Wswitch -Wshadow \ + -Wwrite-strings -pedantic -Wmissing-declarations \ + -Wunreachable-code -Wimplicit \ + -Wimplicit-function-declaration -Wimplicit-int \ + -Wmissing-prototypes -Wold-style-definition \ + -Wstrict-prototypes -Wnonnull -Wformat-overflow \ + -Wmissing-parameter-type -Wimplicit-fallthrough \ + -Wno-cast-function-type -Wno-format + +CPPFLAGSXTRA = -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type \ + -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -pedantic \ + -Wmissing-declarations -Wformat-nonliteral -Wunreachable-code +endif + +COMMONDEF = -DWIN32 -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 +DLLDEF = $(COMMONDEF) -D_WINDOWS -D_USRDLL -D_WINDLL +CONSOLEDEF = $(COMMONDEF) -D_CONSOLE + +# To build util targets +CFLAGSU = $(CFLAGS) $(CONSOLEDEF) $(DLBFLG) + +LIBS = -lcomctl32 -lgdi32 -lole32 -lshell32 -luserenv -luuid -lwinmm \ + -lrpcrt4 -lbcrypt $(LIBUCRT) + +$(GAMEDIR): + @mkdir -p $@ + +$(OBJ): + @mkdir -p $@ + +CLEAN_DIR = $(GAMEDIR) $(OBJ) + +#================================================================= +# LUA library +# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz +#================================================================= + +OLUA = $(O)lua +LUAOBJS = $(addprefix $(OLUA)/, $(addsuffix .o, lapi lauxlib lbaselib lcode lcorolib lctype \ + ldblib ldebug ldo ldump lfunc lgc linit liolib llex lmathlib lmem \ + loadlib lobject lopcodes loslib lparser lstate lstring lstrlib ltable ltablib ltm \ + lundump lutf8lib lvm lzio)) +LUADLL = $(GAMEDIR)/lua-$(LUAVER).dll +LUAIMP = $(OLUA)/lua-$(LUAVER).dll.a +ULUADLL = $(U)$(notdir $(LUADLL)) +LUASTATIC = $(OLUA)/lua-$(LUAVER).a +LUATARGETS = $(U)lua.exe + +ifeq "$(USE_LUADLL)" "Y" +LUALIB = $(LUAIMP) +LUATARGETS += $(LUADLL) $(ULUADLL) $(LUAIMP) +else +LUALIB = $(LUASTATIC) +LUATARGETS += $(LUASTATIC) +endif + +ifeq "$(WANT_LUAC)" "Y" +LUATARGETS += $(U)luac.exe +endif + +lua: $(LUATARGETS) + +$(U)lua.exe: $(OLUA)/lua.o $(LUALIB) + $(ld) $(LDFLAGS) $^ -o$@ + +$(LUADLL): $(ULUADLL) + cp $< $@ + + +ifeq "$(arch)" "arm64" +lparam=-Wl,--export-all-symbols +else +lparam=-Wl,--export-all-symbols -Wl,--add-stdcall-alias +endif + +$(ULUADLL) $(LUAIMP): $(LUAOBJS) | $(OLUA) + $(ld) $(LDFLAGS) -fPIC -shared $(lparam) \ + -Wl,--out-implib=$(LUAIMP) $^ -o$(ULUADLL) + +$(LUASTATIC): $(LUAOBJS) | $(OLUA) + ar rcs $@ $^ + +$(OLUA)/%.o: $(LUASRC)/%.c | $(OLUA) + $(cc) $(CFLAGS) $< -o$@ + +$(U)luac.exe: $(OLUA)/luac.o $(LUALIB) + $(ld) $(LDFLAGS) $^ -o$@ + +$(OLUA): + @mkdir -p $@ + +CLEAN_DIR += $(OLUA) +CLEAN_FILE += $(LUATARGETS) $(LUAOBJS) $(OLUA)/lua.o $(OLUA)/luac.o + +#========================================== +# nhlua.h +#========================================== +NHLUAH = $(INCL)/nhlua.h + +$(NHLUAH): + echo "/* nhlua.h - generated by GNUmakefile */" > $@ + @echo "#include \"$(LUASRC)/lua.h\"" >> $@ + @echo "ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN;" >>$@ + @echo "#include \"$(LUASRC)/lualib.h\"" >> $@ + @echo "#include \"$(LUASRC)/lauxlib.h\"" >> $@ + @echo "/*nhlua.h*/" >> $@ + +CLEAN_FILE += $(NHLUAH) + +#=========================================== +# Lua level files, dungeon file, quest files +#=========================================== + +LUALIST = air Arc-fila Arc-filb Arc-goal Arc-loca Arc-strt \ + asmodeus astral baalz Bar-fila Bar-filb Bar-goal \ + Bar-loca Bar-strt bigrm-1 bigrm-10 bigrm-11 bigrm-2 \ + bigrm-12 bigrm-13 \ + bigrm-3 bigrm-4 bigrm-5 bigrm-6 bigrm-7 bigrm-8 \ + bigrm-9 castle Cav-fila Cav-filb Cav-goal Cav-loca \ + Cav-strt dungeon earth fakewiz1 fakewiz2 fire \ + Hea-fila Hea-filb Hea-goal Hea-loca Hea-strt hellfill \ + juiblex Kni-fila Kni-filb Kni-goal Kni-loca Kni-strt \ + knox medusa-1 medusa-2 medusa-3 medusa-4 minefill \ + minend-1 minend-2 minend-3 minetn-1 minetn-2 minetn-3 \ + minetn-4 minetn-5 minetn-6 minetn-7 Mon-fila Mon-filb \ + Mon-goal Mon-loca Mon-strt nhcore nhlib oracle \ + orcus Pri-fila Pri-filb Pri-goal Pri-loca Pri-strt \ + quest Ran-fila Ran-filb Ran-goal Ran-loca Ran-strt \ + Rog-fila Rog-filb Rog-goal Rog-loca Rog-strt Sam-fila \ + Sam-filb Sam-goal Sam-loca Sam-strt sanctum soko1-1 \ + soko1-2 soko2-1 soko2-2 soko3-1 soko3-2 soko4-1 \ + soko4-2 themerms Tou-fila Tou-filb Tou-goal Tou-loca \ + Tou-strt tower1 tower2 tower3 Val-fila Val-filb \ + Val-goal Val-loca Val-strt valley water Wiz-fila \ + Wiz-filb Wiz-goal Wiz-loca Wiz-strt wizard1 wizard2 \ + wizard3 tut-1 tut-2 + +LUAFILES = $(addprefix $(DAT)/, $(addsuffix .lua, $(LUALIST))) + +#========================================== +# Hacklib +#========================================== +HACKLIBLIST = hacklib +HACKLIBSRC = $(addprefix ../src/,$(addsuffix .c, $(HACKLIBLIST))) +HL = $(O)hacklib +HLHACKLIB = $(HL)/hacklib.a +HLHACKLIBOBJS = $(addprefix $(HL)/, $(addsuffix .o, $(HACKLIBLIST))) +HLTARGETS = $(HLHACKLIB) $(HLHACKLIBOBJS) + +$(HL)/hacklib.a: $(HLHACKLIBOBJS) + ar rcs $@ $^ + +$(HL)/hacklib.o: $(HACKLIBSRC) | $(HL) + +$(HL)/%.o: $(SRC)/%.c | $(HL) + $(cc) $(CFLAGSU) $< -o$@ +$(HL): + @mkdir -p $@ + +CLEAN_DIR += $(HL) +CLEAN_FILE += $(HLTARGETS) + +#========================================== +# Makedefs +#========================================== +OM = $(O)makedefs +MOBJS = $(addprefix $(OM)/, alloc.o date.o makedefs.o monst.o objects.o panic.o) +MTARGETS = $(U)makedefs.exe + +makedefs: $(MTARGETS) + +$(U)makedefs.exe: $(MOBJS) $(HLHACKLIB) + $(ld) $(LDFLAGS) $^ -o$@ + +$(OM)/%.o: $(SRC)/%.c $(NHLUAH) | $(OM) + $(cc) $(CFLAGSU) -DENUM_PM $< -o$@ + +$(OM)/%.o: $(U)%.c $(NHLUAH) | $(OM) + $(cc) $(CFLAGSU) -DENUM_PM $< -o$@ + +$(OM): + @mkdir -p $@ + +CLEAN_DIR += $(OM) +CLEAN_FILE += $(MTARGETS) $(MOBJS) + +#========================================== +# Recover +#========================================== +OR = $(OBJ) +ROBJS = $(OR)/recover.o $(OR)/rversion.o +RTARGETS = $(GAMEDIR)/recover.txt $(GAMEDIR)/recover.exe + +recover: $(RTARGETS) + +$(GAMEDIR)/recover.txt: $(DOC)/recover.txt | $(GAMEDIR) + cp $< $@ + +$(GAMEDIR)/recover.exe: $(ROBJS) $(HLHACKLIB) | $(GAMEDIR) + $(ld) $(LDFLAGS) $^ -o$@ + +$(OR)/recover.o: $(U)recover.c | $(OR) + $(cc) $(CFLAGSU) $< -o$@ + +$(OR)/rversion.o: $(SRC)/version.c | $(OR) + $(cc) $(CFLAGSU) -DMINIMAL_FOR_RECOVER $< -o$@ + +# $(OR): +# @mkdir -p $@ + +CLEAN_FILE += $(RTARGETS) $(ROBJS) + +#========================================== +# PDCurses +#========================================== +ifeq "$(ADD_CURSES)" "Y" + +#https://github.com/Bill-Gray/PDCursesMod/issues/333 +PDCMOD_WORKAROUND = -std=gnu17 + +PDCCOMMONSRC = addch addchstr addstr attr beep bkgd border clear \ + color debug delch deleteln getch getstr getyx inch \ + inchstr initscr inopts insch insstr kernel keyname \ + mouse move outopts overlay pad panel printw refresh \ + scanw scr_dump scroll slk termattr touch util window +PDCCOMMONOBJS = $(addsuffix .o, $(PDCCOMMONSRC)) + +OP = $(O)$(PDCURSES) +PDCOBJS = $(addprefix $(OP)/, $(PDCCOMMONOBJS) \ + pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o pdcutil.o) +PDCSRC = $(PDCURSES_TOP)/pdcurses +PDCWINCON = $(PDCURSES_TOP)/wincon +PDCINCL = -I$(PDCURSES_TOP) -I$(PDCSRC) +PDCLIB = $(O)$(PDCURSES).a +PDCDEP = $(PDCURSES_TOP)/curses.h + +$(PDCURSES): $(PDCLIB) + +$(PDCLIB): $(PDCOBJS) + ar rcs $@ $^ + +$(OP)/%.o: $(PDCSRC)/%.c | $(OP) + $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -D_LIB $< -o$@ + +$(OP)/%.o: $(PDCWINCON)/%.c | $(OP) + $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -I$(PDCWINCON) -D_LIB $< -o$@ + +$(OP): + @mkdir -p $@ + +CLEAN_DIR += $(OP) +CLEAN_FILE += $(PDCLIB) $(PDCOBJS) + +ifneq ("$(wildcard $(PDCURSES_TOP)/wingui/pdcwin.h)", "") +# $(PDCURSES) in use; enable Curses graphics on NetHackW +OPW = $(O)$(PDCURSES)w +PDCWOBJS = $(addprefix $(OPW)/, $(PDCCOMMONOBJS) \ + pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o pdcutil.o) +PDCWINGUI = $(PDCURSES_TOP)/wingui +PDCWLIB = $(O)$(PDCURSES)w.a + +$(PDCURSES)w: $(PDCWLIB) + +$(PDCWLIB): $(PDCWOBJS) + ar rcs $@ $^ + +$(OPW)/%.o: $(PDCSRC)/%.c | $(OPW) + $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -D_LIB $< -o$@ + +$(OPW)/%.o: $(PDCWINGUI)/%.c | $(OPW) + $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -I$(PDCWINGUI) -D_LIB $< -o$@ + +$(OPW): + @mkdir -p $@ + +CLEAN_DIR += $(OPW) +CLEAN_FILE += $(PDCWLIB) $(PDCWOBJS) +endif + +endif + +#========================================== +# tile2bmp +#========================================== +OT = $(O)tile2bmp +TOBJS = $(addprefix $(OT)/, drawing.o monst.o objects.o tile2bmp.o tiletext.o tiletxt.o) +TTARGETS = $(U)tile2bmp.exe + +tile2bmp: $(TTARGETS) + +$(U)tile2bmp.exe: $(TOBJS) $(HLHACKLIB) + $(ld) $(LDFLAGS) $(HLHACKLIB) $^ -o$@ + +$(OT)/tiletxt.o: $(WSHR)/tilemap.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) -DTILETEXT $< -o$@ + +$(OT)/%.o: $(WSHR)/%.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) $< -o$@ + +$(OT)/%.o: $(SRC)/%.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) $< -o$@ + +$(OT): + @mkdir -p $@ + +CLEAN_DIR += $(OT) +CLEAN_FILE += $(TTARGETS) $(TOBJS) + +#========================================== +# Optional Tile Utilities +#========================================== +TEXT_IO = $(addprefix $(OT)/, drawing.o monst.o objects.o tiletext.o tiletxt.o) +TUCOMMON = $(OT)/alloc.o $(OT)/panic.o +TUOBJS = $(TUCOMMON) $(TEXT_IO) + +T32OBJS = $(OT)/tilete32.o $(OT)/tiletx32.o +TEXT_IO32 = $(addprefix $(OT)/, drawing.o monst.o objects.o) $(T32OBJS) +TU32OBJS = $(TUCOMMON) $(TEXT_IO32) + +GIFOBJ = $(OT)/gifread.o +GIF32OBJ = $(OT)/gifrd32.o +PPMOBJ = $(OT)/ppmwrite.o +BMP32OBJ = $(OT)/til2bm32.o +TILEFILES32 = $(addprefix $(WSHR)/, mon32.txt obj32.txt oth32.txt) +TUTARGETS = $(U)gif2txt.exe $(U)gif2tx32.exe $(U)txt2ppm.exe $(U)til2bm32.exe + +tileutil: $(TUTARGETS) + +$(U)gif2txt.exe: $(GIFOBJ) $(TUOBJS) + $(ld) $(LDFLAGS) $^ -o$@ + +$(U)gif2tx32.exe: $(GIF32OBJ) $(TU32OBJS) + $(ld) $(LDFLAGS) $^ -o$@ + +$(U)txt2ppm.exe: $(PPMOBJ) $(TUOBJS) + $(ld) $(LDFLAGS) $^ -o$@ + +$(U)til2bm32.exe: $(BMP32OBJ) $(TEXT_IO32) + $(ld) $(LDFLAGS) $^ -o$@ + +$(OT)/tilete32.o: $(WSHR)/tiletext.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(OT)/tiletx32.o: $(WSHR)/tilemap.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) -DTILETEXT -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(GIF32OBJ): $(WSHR)/gifread.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(BMP32OBJ): $(WSHR)/tile2bmp.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(OT)/panic.o: $(UTIL)/panic.c $(NHLUAH) | $(OT) + $(cc) $(CFLAGSU) $< -o$@ + +$(MSWIN)/tiles32.bmp: $(U)til2bm32.exe $(TILEFILES32) + $< $@ + +CLEAN_FILE += $(TUTARGETS) $(GIFOBJ) $(GIF32OBJ) $(PPMOBJ) $(BMP32OBJ) \ + $(T32OBJS) $(TUCOMMON) + +#========================================== +# tilemap +#========================================== +OTM = $(OBJ)/tilemap +TMOBJS = $(addprefix $(OTM)/, drawing.o monst.o objects.o tilemap.o) +TMTARGETS = $(SRC)/tile.c $(U)tilemap.exe + +tilemap: $(SRC)/tile.c + +$(SRC)/tile.c: $(U)tilemap.exe + $< + +$(U)tilemap.exe: $(TMOBJS) $(HLHACKLIB) + $(ld) $(LDFLAGS) $(HLHACKLIB) $^ -o$@ + +$(OTM)/tilemap.o: $(WSHR)/tilemap.c $(NHLUAH) | $(OTM) + $(cc) $(CFLAGSU) $< -o$@ + +$(OTM)/%.o: $(SRC)/%.c $(NHLUAH) | $(OTM) + $(cc) $(CFLAGSU) $< -o$@ + +$(OTM): + @mkdir -p $@ + +CLEAN_DIR += $(OTM) +# tilemap.exe will create tilemappings.lst +CLEAN_FILE += $(TMTARGETS) $(TMOBJS) $(SRC)/tilemappings.lst + +#========================================== +# uudecode +#========================================== +OU = $(OBJ) +UOBJS = $(OU)/uudecode.o +UTARGETS = $(U)uudecode.exe $(MSWIN)/NetHack.ico + +uudecode: $(UTARGETS) + +$(U)uudecode.exe: $(UOBJS) + $(ld) $(LDFLAGS) $^ -o$@ + +$(OU)/uudecode.o: $(SSYS)/uudecode.c | $(OU) + $(cc) $(CFLAGS) $(CONSOLEDEF) $< -o$@ + +# $(OU): +# @mkdir -p $@ + +$(MSWIN)/NetHack.ico: $(U)uudecode.exe $(MSWSYS)/nhico.uu + $^ + mv nethack.ico $@ + +CLEAN_FILE += $(UTARGETS) $(UOBJS) + +#========================================== +# sfctool +#========================================== +# +# Requires universal-ctags. +# pacman -S ctags +# + +.PHONY: sfctool + +CONFIG_H = ../include/color.h ../include/config.h ../include/config1.h \ + ../include/coord.h ../include/cstd.h ../include/fnamesiz.h \ + ../include/global.h ../include/integer.h ../include/micro.h \ + ../include/patchlevel.h ../include/pcconf.h \ + ../include/tradstdc.h ../include/unixconf.h \ + ../include/vmsconf.h ../include/warnings.h \ + ../include/windconf.h +HACK_H = $(CONFIG_H) ../include/align.h ../include/artilist.h \ + ../include/attrib.h ../include/botl.h ../include/context.h \ + ../include/decl.h ../include/defsym.h ../include/display.h \ + ../include/dungeon.h ../include/engrave.h ../include/flag.h \ + ../include/hack.h ../include/lint.h ../include/mextra.h \ + ../include/mcastu.h \ + ../include/mkroom.h ../include/monattk.h ../include/mondata.h \ + ../include/monflag.h ../include/monst.h ../include/monsters.h \ + ../include/nhlua.h ../include/obj.h ../include/objclass.h \ + ../include/objects.h ../include/permonst.h ../include/prop.h \ + ../include/quest.h ../include/rect.h ../include/region.h \ + ../include/rm.h ../include/savefile.h ../include/sfprocs.h \ + ../include/seffects.h ../include/selvar.h \ + ../include/skills.h ../include/sndprocs.h ../include/spell.h \ + ../include/stairs.h ../include/sym.h ../include/sys.h \ + ../include/timeout.h ../include/trap.h ../include/vision.h \ + ../include/weight.h ../include/winprocs.h \ + ../include/wintype.h ../include/you.h ../include/youprop.h + +OSFC = $(O)sfctool +SFCTARGETS = $(U)sftags.exe $(GAMEDIR)/sfctool.exe +SFCCOREOBJS = +SFCCOREOBJS = sfctool sf-alloc sf-artifact sf-calendar sf-cfgfiles sfdata \ + sf-date sf-decl sf-dungeon sf-end sf-engrave \ + sf-files sf-light sf-mdlib sf-mkmaze sf-mkroom sf-monst \ + sf-nhlua sf-objects sf-o_init panic sf-region sf-restore \ + sf-rumors sfbase sfexpasc sf-struct strutil sf-sys \ + sf-timeout sf-track sf-version sf-worm sf-windsys +SFCTOOLOBJS = $(addprefix $(OSFC)/, $(addsuffix .o, $(SFCCOREOBJS))) +SFCTOOLBIN = $(GAMEDIR)/sfctool.exe +SFFLAGS = -DSFCTOOL -DNOPANICTRACE -DNOCRASHREPORT -DNO_CHRONICLE + +sfctool: $(SFCTARGETS) + +#$(info SFCTOOLOBJS=$(SFCTOOLOBJS)) + +$(SFCTOOLBIN): $(HLHACKLIB) $(SFCTOOLOBJS) + $(ld) $(LDFLAGS) $^ $(HLHACKLIB) $(LIBS) -o$@ + +$(OSFC)/sfctool.o: $(U)sfctool.c $(HACK_H) $(INCL)/sfprocs.h | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)sfctool.c -o$@ +$(OSFC)/sf-alloc.o: $(SRC)/alloc.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/alloc.c -o$@ +$(OSFC)/sf-artifact.o: $(SRC)/artifact.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/artifact.c -o$@ +$(OSFC)/sf-calendar.o: $(SRC)/calendar.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/calendar.c -o$@ +$(OSFC)/sf-cfgfiles.o: $(SRC)/cfgfiles.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/cfgfiles.c -o$@ +$(OSFC)/sfdata.o: $(U)sfdata.c $(HACK_H) $(INCL)/sfprocs.h $(INCL)/sfproto.h | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)sfdata.c -o$@ +$(OSFC)/sf-date.o: $(SRC)/date.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/date.c -o$@ +$(OSFC)/sf-decl.o: $(SRC)/decl.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/decl.c -o$@ +$(OSFC)/sf-dungeon.o: $(SRC)/dungeon.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/dungeon.c -o$@ +$(OSFC)/sf-end.o: $(SRC)/end.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/end.c -o$@ +$(OSFC)/sf-engrave.o: $(SRC)/engrave.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/engrave.c -o$@ +$(OSFC)/sf-files.o: $(SRC)/files.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/files.c -o$@ +$(OSFC)/sf-light.o: $(SRC)/light.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/light.c -o$@ +$(OSFC)/sf-mdlib.o: $(SRC)/mdlib.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/mdlib.c -o$@ +$(OSFC)/sf-mkmaze.o: $(SRC)/mkmaze.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/mkmaze.c -o$@ +$(OSFC)/sf-mkroom.o: $(SRC)/mkroom.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/mkroom.c -o$@ +$(OSFC)/sf-monst.o: $(SRC)/monst.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/monst.c -o$@ +$(OSFC)/sf-nhlua.o: $(SRC)/nhlua.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/nhlua.c -o$@ +$(OSFC)/sf-objects.o: $(SRC)/objects.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/objects.c -o$@ +$(OSFC)/sf-o_init.o: $(SRC)/o_init.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/o_init.c -o$@ +$(OSFC)/panic.o: $(U)panic.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)panic.c -o$@ +$(OSFC)/sf-region.o: $(SRC)/region.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/region.c -o$@ +$(OSFC)/sf-restore.o: $(SRC)/restore.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/restore.c -o$@ +$(OSFC)/sf-rumors.o: $(SRC)/\rumors.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/rumors.c -o$@ +$(OSFC)/sfbase.o: $(SRC)/sfbase.c $(HACK_H) $(INCL)/sfprocs.h $(INCL)/sfmacros.h | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/sfbase.c -o$@ +$(OSFC)/sfexpasc.o: $(U)sfexpasc.c $(HACK_H) $(INCL)/sfprocs.h $(INCL)/sfproto.h $(INCL)/sfmacros.h | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)sfexpasc.c -o$@ +$(OSFC)/sf-struct.o: $(SRC)/sfstruct.c $(HACK_H) $(INCL)/sfprocs.h $(INCL)/sfmacros.h | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/sfstruct.c -o$@ +$(OSFC)/strutil.o: $(SRC)/strutil.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/strutil.c -o$@ +$(OSFC)/sf-sys.o: $(SRC)/sys.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/sys.c -o$@ +$(OSFC)/sf-timeout.o: $(SRC)/timeout.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/timeout.c -o$@ +$(OSFC)/sf-track.o: $(SRC)/track.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/track.c -o$@ +$(OSFC)/sf-version.o: $(SRC)/version.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/version.c -o$@ +$(OSFC)/sf-worm.o: $(SRC)/worm.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/worm.c -o$@ +$(OSFC)/sf-windsys.o: $(MSWSYS)/windsys.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) $(SFFLAGS) -c $(MSWSYS)/windsys.c -o$@ + +CTAGSCMD = ctags +CTAGSOPT = --language-force=c --sort=no -D"Bitfield(x,n)=unsigned x : n" --excmd=pattern + +$(U)sftags.exe: $(HLHACKLIB) $(OSFC)/sftags.o + $(ld) $(LDFLAGS) -mwindows $(OSFC)/sftags.o $(HLHACKLIB) $(LIBS) -o$@ +$(OSFC)/sftags.o: $(U)sftags.c $(HACK_H) | $(OSFC) + $(cc) $(CFLAGSU) -c $(U)sftags.c -o$@ +$(INCL)/sfproto.h: $(U)sf.tags $(U)sftags.exe + $(U)sftags +$(U)sfdata.c: $(U)sf.tags $(U)sftags.exe + $(U)sftags + +# dependencies for sftags +# +CTAGDEP = $(INCL)/align.h $(INCL)/artifact.h $(SRC)/artifact.c \ + $(INCL)/artilist.h $(INCL)/attrib.h $(SRC)/bones.c \ + $(INCL)/context.h $(INCL)/coord.h $(INCL)/decl.h \ + $(SRC)/decl.c $(INCL)/dungeon.h $(INCL)/engrave.h \ + $(SRC)/engrave.c $(INCL)/flag.h $(INCL)/func_tab.h \ + $(INCL)/global.h $(INCL)/hack.h $(INCL)/mextra.h \ + $(INCL)/mkroom.h $(INCL)/monst.h $(INCL)/defsym.h \ + $(INCL)/obj.h $(INCL)/objclass.h $(INCL)/prop.h \ + $(INCL)/quest.h $(INCL)/rect.h $(INCL)/region.h \ + $(INCL)/rm.h $(INCL)/skills.h $(INCL)/spell.h \ + $(INCL)/stairs.h $(INCL)/sys.h $(INCL)/timeout.h \ + $(INCL)/trap.h $(INCL)/you.h $(INCL)/wintype.h + +$(U)sf.tags: $(CTAGDEP) + $(CTAGSCMD) $(CTAGSOPT) -f $@ $(INCL)/align.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/artifact.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/artifact.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/artilist.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/attrib.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/bones.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/context.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/coord.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/decl.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/decl.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/dungeon.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/engrave.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/engrave.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/flag.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/func_tab.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/global.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/hack.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/mextra.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/mkroom.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/monst.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/defsym.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/obj.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/objclass.h +# $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/permonst.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/prop.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/quest.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/rect.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/region.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/rm.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/skills.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/spell.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/stairs.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/sys.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/timeout.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/trap.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/you.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/wintype.h + +$(OSFC): + @mkdir -p $@ + +CLEAN_DIR += $(OSFC) +CLEAN_FILE += $(SFCTARGETS) $(SFCTOOLOBJS) $(U)sf.tags $(U)sfdata.c $(INCL)/sfproto.h + + +#========================================== +# Data librarian +#========================================== +ODLB = $(O)dlb +DLBOBJS = $(addprefix $(ODLB)/, alloc.o dlb.o dlb_main.o panic.o) +DAT_CLEAN = $(addprefix $(DAT)/, data oracles options porthelp rumors engrave epitaph bogusmon) +DAT_NOCLEAN = $(addprefix $(DAT)/, help hh cmdhelp keyhelp history opthelp optmenu \ + wizhelp license engrave epitaph bogusmon tribute) +DLBLST = $(DAT)/dlb.lst +DLB = $(GAMEDIR)/nhdat$(NHV) +DTARGETS = $(U)dlb.exe $(DAT_CLEAN) $(DLBLST) $(DLB) + +dlb: $(DTARGETS) + +$(U)dlb.exe: $(DLBOBJS) $(HLHACKLIB) + $(ld) $(LDFLAGS) $(HLHACKLIB) $^ -o$@ + +$(ODLB)/%.o: $(SRC)/%.c $(NHLUAH) | $(ODLB) + $(cc) $(CFLAGSU) $< -o$@ + +$(ODLB)/%.o: $(U)%.c $(NHLUAH) | $(ODLB) + $(cc) $(CFLAGSU) $< -o$@ + +$(ODLB): + @mkdir -p $@ + +$(DAT)/data: $(U)makedefs.exe $(DAT)/data.base + $< -d + +$(DAT)/oracles: $(U)makedefs.exe $(DAT)/oracles.txt + $< -h + +$(DAT)/options $(INCL)/date.h: $(U)makedefs.exe + $< -v + +$(DAT)/porthelp: $(MSWSYS)/porthelp + cp $< $@ + +$(DAT)/rumors: $(U)makedefs.exe $(DAT)/rumors.tru $(DAT)/rumors.fal + $< -r + +$(DAT)/engrave: $(DAT)/bogusmon + +$(DAT)/epitaph: $(DAT)/bogusmon + +$(DAT)/bogusmon: $(U)makedefs.exe $(DAT)/bogusmon.txt $(DAT)/engrave.txt $(DAT)/epitaph.txt + $< -s + +$(DLBLST): $(LUAFILES) | $(DAT_CLEAN) $(DAT_NOCLEAN) + echo data > $(DLBLST) + echo oracles >> $(DLBLST) + echo options >> $(DLBLST) + if [ -f $(DAT)/ttyoptions ] ; then echo ttyoptions >> $(DLBLST) ; fi + if [ -f $(DAT)/guioptions ] ; then echo guioptions >> $(DLBLST) ; fi + echo porthelp >> $(DLBLST) + echo rumors >> $(DLBLST) + echo help >> $(DLBLST) + echo hh >> $(DLBLST) + echo cmdhelp >> $(DLBLST) + echo keyhelp >> $(DLBLST) + echo history >> $(DLBLST) + echo opthelp >> $(DLBLST) + echo optmenu >> $(DLBLST) + echo wizhelp >> $(DLBLST) + echo license >> $(DLBLST) + echo engrave >> $(DLBLST) + echo epitaph >> $(DLBLST) + echo bogusmon >> $(DLBLST) + echo tribute >> $(DLBLST) + cd $(DAT) ; ls -1 *.lua >> $(DLBLST) + +$(DLB): $(U)dlb.exe $(DLBLST) | $(GAMEDIR) + $(U)dlb.exe CcIf $(dir $(DLBLST)) $(notdir $(DLBLST)) $(SRC)/nhdat + mv $(SRC)/nhdat$(NHV) $@ + +CLEAN_DIR += $(ODLB) +CLEAN_FILE += $(DTARGETS) $(DLBOBJS) $(INCL)/date.h + +#============================================ +# Fetching other source files that are needed +#============================================ + +ifeq "$(INTERNET_AVAILABLE)" "Y" +ifeq "$(GIT_AVAILABLE)" "Y" + +fetchlua: + @if [ ! -f $(LUASRC)/lua.h ] ; then \ + git submodule init ../submodules/lua && \ + git submodule update ../submodules/lua ; fi +# git submodule update --remote ../submodules/lua ; fi +fetchpdcurses: + @if [ ! -f $(PDCURSES_TOP)/curses.h ] ; then \ + git submodule init ../submodules/$(PDCURSES) && \ + git submodule update ../submodules/$(PDCURSES) ; fi +# git submodule update --remote ../submodules/$(PDCURSES) ; fi +else # GIT_AVAILABLE no +CURLLUASRC=http://www.lua.org/ftp/lua-5.4.8.tar.gz +CURLLUADST=lua-5.4.8.tar.gz + +CURLPDCSRC=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v4.5.1.zip +CURLPDCDST=$(PDCURSES).zip + +fetchlua: + @if [ ! -f $(LUASRC)/lua.h ] ; then \ + mkdir -p ../lib ; \ + cd ../lib ; \ + curl -L $(CURLLUASRC) -o $(CURLLUADST) ; \ + /c/Windows/System32/tar -xvf $(CURLLUADST) ; \ + cd ../src ; \ + fi +fetchpdcurses: + mkdir -p ../lib + @if [ ! -f $(PDCURSES_TOP)/curses.h ] ; then \ + cd ../lib ; \ + curl -L $(CURLPDCSRC) -o $(CURLPDCDST) ; \ + mkdir -p $(PDCURSES) ; \ + /c/Windows/System32/tar -C $(PDCURSES) --strip-components=1 -xvf $(CURLPDCDST) ; \ + cd ../src ; \ + fi +endif # GIT_AVAILABLE +endif # INTERNET_AVAILABLE + +#========================================== +# Soundlib Choices +#========================================== + +SNDLIBCHOICES = $(strip $(SOUND_LIBRARIES)) + +# +# windsound +# +WINDSOUND = $(findstring windsound, $(SNDLIBCHOICES)) +ifeq "$(WINDSOUND)" "windsound" +$(info Including windsound integration) +SOUND_WINDSOUND=Y +HAVE_SOUNDLIB=Y +NEED_USERSOUNDS=Y +NEED_SEAUTOMAP=Y +NEED_WAV=Y +#SOUNDLIBINCL += +SOUNDLIBDEFS += -DSND_LIB_WINDSOUND +SOUNDLIBOBJS += windsound +#WINDSOUNDLIBDIR = +#SOUNDLIBLIBS += +#WINDSOUNDLIBDLL = +#GAMEDIRDLLS += +endif + +# +# fmod +# +FMOD = $(findstring fmod, $(SNDLIBCHOICES)) +ifeq "$(FMOD)" "fmod" +$(info Including fmod integration) +SOUND_FMOD=Y +HAVE_SOUNDLIB=Y +NEED_USERSOUNDS=Y +NEED_SEAUTOMAP=Y +NEED_WAV=Y +FMODROOT = ../lib/fmod/api/core +SOUNDLIBINCL += -I$(FMODROOT)/inc +SOUNDLIBDEFS += -DSND_LIB_FMOD +SOUNDLIBOBJS += fmod +FMODLIBDIR = $(FMODROOT)/lib/$(arch) +ifeq "$(arch)" "x86" +SOUNDLIBLIBS += -L $(FMODLIBDIR) +FMODLIBDLL = fmod_vc.dll +SOUNDLIBLIBS += -lfmod +else +SOUNDLIBLIBS += -L $(FMODLIBDIR) +FMODLIBDLL = fmod_vc.dll +SOUNDLIBLIBS += $(FMODLIBDIR)/$(FMODLIBDLL) +endif +FMODDIR = ../sound/fmod +GAMEDIRDLLS += $(GAMEDIR)/$(FMODLIBDLL) +ifeq "$(arch)" "x86" +FMODLINKLIB = $(FMODLIBDIR)/fmod_vc.lib +else +#x64 mingw32-x64 builds supposedly can link right with the DLL, no import lib +FMODLINKLIB = $(FMODLIBDIR)/$(FMODLIBDLL) +endif +$(info ---------------------------------------------------------------------) +$(info ** NOTES for fmod sound library integration **) +$(info For fmod integration, this Makefile expects:) +$(info fmod include directory : $(FMODROOT)/inc) +$(info fmod library directory : $(FMODLIBDIR)) +$(info fmod library to link with : $(FMODLINKLIB)) +$(info fmod library dll : $(FMODLIBDIR)/$(FMODLIBDLL)) +$(info ---------------------------------------------------------------------) +FMOD_MISSING= +ifeq (,$(wildcard $(FMODROOT)/inc)) +FMOD_MISSING += $(FMODROOT)\inc +$(info Error: missing $(FMODROOT)/inc) +endif +ifeq (,$(wildcard $(FMODLIBDIR))) +FMOD_MISSING += $(FMODLIBDIR) +$(info Error: missing $(FMODLIBDIR)) +endif +ifeq (,$(wildcard $(FMODLINKLIB))) +FMOD_MISSING += $(FMODLINKLIB) +$(info Error: missing $(FMODLINKLIB)) +endif +ifeq (,$(wildcard $(FMODLIBDIR)/$(FMODLIBDLL))) +FMOD_MISSING += $(FMODLIBDIR)/$(FMODLIBDLL) +$(info Error: missing $(FMODLIBDIR)/$(FMODLIBDLL)) +endif +ifneq "$(FMOD_MISSING)" "" +$(error Error: Cannot proceed with fmod integration included) +endif +endif + +#========================================== +# Soundlib Support +#========================================== + +WAVLIST = se_squeak_A se_squeak_B se_squeak_B_flat se_squeak_C \ + se_squeak_D se_squeak_D_flat se_squeak_E \ + se_squeak_E_flat se_squeak_F se_squeak_F_sharp \ + se_squeak_G se_squeak_G_sharp sound_Bell sound_Bugle_A \ + sound_Bugle_B sound_Bugle_C sound_Bugle_D sound_Bugle_E \ + sound_Bugle_F sound_Bugle_G sound_Drum_Of_Earthquake \ + sound_Fire_Horn sound_Frost_Horn sound_Leather_Drum \ + sound_Magic_Harp_A sound_Magic_Harp_B sound_Magic_Harp_C \ + sound_Magic_Harp_D sound_Magic_Harp_E sound_Magic_Harp_F \ + sound_Magic_Harp_G sound_Magic_Flute_A sound_Magic_Flute_B \ + sound_Magic_Flute_C sound_Magic_Flute_D sound_Magic_Flute_E \ + sound_Magic_Flute_F sound_Magic_Flute_G sound_Tooled_Horn_A \ + sound_Tooled_Horn_B sound_Tooled_Horn_C sound_Tooled_Horn_D \ + sound_Tooled_Horn_E sound_Tooled_Horn_F sound_Tooled_Horn_G \ + sound_Wooden_Flute_A sound_Wooden_Flute_B sound_Wooden_Flute_C \ + sound_Wooden_Flute_D sound_Wooden_Flute_E \ + sound_Wooden_Flute_F sound_Wooden_Flute_G \ + sound_Wooden_Harp_A sound_Wooden_Harp_B \ + sound_Wooden_Harp_C sound_Wooden_Harp_D \ + sound_Wooden_Harp_E sound_Wooden_Harp_F \ + sound_Wooden_Harp_G sa2_xplevelup sa2_xpleveldown + +WAVS = $(addprefix $(SNDWAVDIR)/, $(addsuffix .wav, $(WAVLIST))) + +ifeq "$(HAVE_SOUNDLIB)" "Y" +ifeq "$(NEED_USERSOUNDS)" "Y" +SOUNDLIBDEFS += -DUSER_SOUNDS +endif +ifeq "$(NEED_SEAUTOMAP)" "Y" +SOUNDLIBDEFS += -DSND_SOUNDEFFECTS_AUTOMAP +endif +ifeq "$(NEED_WAV)" "Y" +$(info Built-in sound file integration included) +#RCFLAGS = --include-dir=$(SNDWAVDIR) --define RCWAV +WAV = $(WAVS) +endif # NEED_WAV +else +$(info No soundlib integration) +endif # HAVE_SOUNDLIB + +#========================================== +# nethackw +#========================================== +COREOBJS = $(addsuffix .o, allmain alloc apply artifact attrib ball bones botl \ + calendar cfgfiles cmd coloratt cppregex \ + dbridge decl detect dig display dlb do do_name do_wear \ + dog dogmove dokick dothrow drawing dungeon \ + earlyarg eat end engrave exper explode extralev files fountain \ + getpos glyphs hack iactions insight invent isaac64 light lock \ + mail makemon mcastu mdlib mhitm mhitu minion mklev mkmap mkmaze mkobj mkroom \ + mon mondata monmove monst mplayer mthrowu muse music \ + nhlobj nhlsel nhlua windsound o_init objects objnam options \ + pager pickup pline polyself potion pray priest quest questpgr \ + random read rect region report restore rip rnd role rumors \ + save sfbase sfstruct shk shknam sit selvar sounds sp_lev \ + spell stairs steal steed strutil \ + symbols sys teleport timeout topten track trap u_init uhitm utf8map \ + vault version vision weapon were wield windmain windows windsys wizard \ + wizcmds worm worn write zap $(SOUNDLIBOBJS)) + +CFLAGSW = $(CFLAGS) $(CFLAGSXTRA) $(SOUNDLIBINCL) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(SOUNDLIBDEFS) +CPPFLAGSW = $(CFLAGS) $(CPPFLAGSXTRA) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(SOUNDLIBDEFS) + +ONHW = $(O)nethackw +NHWONLY = $(addsuffix .o, mhaskyn mhdlg mhfont mhinput mhmain mhmap mhmenu \ + mhmsgwnd mhrip mhsplash mhstatus mhtext mswproc tile NetHackW win10) +NHWOBJS = $(addprefix $(ONHW)/, $(COREOBJS) $(NHWONLY)) +DATEW_O = $(addsuffix .o, $(addprefix $(ONHW)/, date)) +TILEFILES = $(addprefix $(WSHR)/, monsters.txt objects.txt other.txt) +BMPS = $(addprefix $(MSWIN)/, $(addsuffix .bmp, mnsel mnselcnt mnunsel petmark pilemark rip splash tiles)) +NHWRES = $(ONHW)/winres.o +NHWTARGETS = $(GAMEDIR)/NetHackW.exe + +ifneq "$(PDCWINGUI)" "" +CFLAGSW += $(NHCURSESFLAGS) +NHWONLY += $(addsuffix .o, cursdial cursinit cursinvt cursmain cursmesg cursmisc cursstat curswins guitty) +endif + +# uncomment for WINCHAIN +#COREOBJS += $(addsuffix .o, wc_chainin wc_chainout wc_trace) + +# XXX mess for testing libbacktrace +ifeq "$(CRASHREPORT)" "Y" +CFLAGS += -I/mingw64/include -g -static -gdwarf +LIBS += -L/mingw64/lib -lbacktrace +endif + +nethackw: $(NHWTARGETS) + +$(GAMEDIR)/NetHackW.exe: $(NHWOBJS) $(NHWRES) $(DATEW_O) \ + $(LUALIB) $(HLHACKLIB) $(PDCWLIB) | $(GAMEDIR) + $(ld) $(LDFLAGS) -mwindows $^ $(HLHACKLIB) $(LIBS) -static -lstdc++ \ + $(SOUNDLIBLIBS) -o$@ + +$(ONHW)/%.o: $(SRC)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ + +# In NetHack 5.0, date.c must be recompiled after any other file is compiled, +# otherwise the game internal build timestamp (and potentially git hash) +# will not be accurate. +# Therefore, date must not be included in COREOBJS (and by extension +# NHWOBJS, NHWONLY). That allows those to be listed as explicit dependencies +# to ensure that date.c is always recompiled again after anything else that +# was just recompiled. date.h is not used in the build of NetHack 5.0. +# +$(ONHW)/date.o: $(SRC)/date.c $(NHWOBJS) | $(ONHW) + $(cc) $(CFLAGSW) $(GITHASH) $(GITBRANCH) $(GITPREFIX) $< -o$@ + +$(ONHW)/cppregex.o: $(SSYS)/cppregex.cpp $(NHLUAH) | $(ONHW) + $(cc) $(CPPFLAGSW) $< -o$@ + +$(ONHW)/%.o: $(SSYS)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ + +ifeq "$(SOUND_WINDSOUND)" "Y" +$(ONHW)/%.o: ../sound/windsound/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ +endif + +ifeq "$(SOUND_FMOD)" "Y" +$(ONHW)/%.o: ../sound/fmod/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ +endif + +$(ONHW)/%.o: $(MSWSYS)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.o: $(MSWIN)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.o: $(WCHAIN)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.o: $(WSHR)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.o: $(WCURSES)/%.c $(NHLUAH) | $(ONHW) + $(cc) $(CFLAGSW) $(PDCINCL) $< -o$@ + +$(NHWRES): $(MSWIN)/NetHackW.rc $(MSWIN)/NetHackW.exe.manifest \ + $(BMPS) $(WAV) $(MSWIN)/NetHack.ico | $(ONHW) + $(rc) --include-dir=$(MSWIN) $(RCFLAGS) -DVIA_MAKE --input=$< -o$@ + +$(MSWIN)/tiles.bmp: $(U)tile2bmp.exe $(TILEFILES) + $< $@ + +$(MSWIN)/%.bmp: $(U)uudecode.exe $(MSWIN)/%.uu + $^ + mv $(notdir $@) $@ + +$(SNDWAVDIR)/%.wav: $(U)uudecode.exe $(SNDWAVDIR)/%.uu + $^ + mv $(notdir $@) $@ + +$(ONHW): + @mkdir -p $@ + +CLEAN_DIR += $(ONHW) +CLEAN_FILE += $(NHWTARGETS) $(NHWOBJS) $(NHWRES) $(BMPS) $(WAV) + +#========================================== +# nethack +#========================================== +CFLAGSNH = $(CFLAGSU) $(CFLAGSXTRA) $(SOUNDLIBINCL) -DNO_TILE_C -D_LIB -DWIN32CON $(SOUNDLIBDEFS) +CPPFLAGSNH = $(CFLAGSU) $(CPPFLAGSXTRA) -DNO_TILE_C -D_LIB -DWIN32CON $(SOUNDLIBDEFS) + +ONH = $(O)nethack + +NHONLY = consoletty.o getline.o topl.o wintty.o +ifeq "$(ADD_CURSES)" "Y" +NHCURSESFLAGS = -DCURSES_GRAPHICS -DCURSES_UNICODE $(PDCURSESFLAGS) -DPDC_NCMOUSE +CFLAGSNH += $(NHCURSESFLAGS) +NHONLY += $(addsuffix .o, cursdial cursinit cursinvt cursmain cursmesg cursmisc cursstat curswins) +endif + +DATE_O = $(addsuffix .o, $(addprefix $(ONH)/, date)) + +NHOBJS = $(addprefix $(ONH)/, $(COREOBJS) $(NHONLY)) +NHRES = $(ONH)/conres.o +NHTARGET = $(GAMEDIR)/NetHack.exe + +nethack: $(NHTARGET) + +$(GAMEDIR)/NetHack.exe: $(NHOBJS) $(NHRES) $(DATE_O) $(LUALIB) $(PDCLIB) $(HLHACKLIB) \ + $(SOUNDLIBLIBS) | $(GAMEDIR) + $(ld) $(LDFLAGS) -mconsole $^ $(HLHACKLIB) $(LIBS) -static -lstdc++ -o$@ + +$(ONH)/%.o: $(SRC)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +#========================================== +# package +#========================================== +ifeq "$(arch)" "x64" +TARGET_CPU = x64 +else +ifeq "$(arch)" "arm64" +TARGET_CPU = arm64 +else +TARGET_CPU = x86 +endif +endif + +PKGFILES = nethackrc.template Guidebook.txt license NetHack.exe NetHack.txt \ + NetHackW.exe opthelp nhdat$(NHV) record symbols sysconf.template $(notdir $(LUADLL)) + +FILESTOZIP = $(addprefix $(GAMEDIR)/, $(PKGFILES)) +MAINZIP = $(PkgDir)/nethack-$(NHV)-win-$(TARGET_CPU)-msys2.zip + +package: binary $(FILESTOZIP) $(MAINZIP) + @echo NetHack Windows package created: $(MAINZIP) + +$(MAINZIP): $(FILESTOZIP) | $(PkgDir) + /c/Windows/System32/tar -a -cf $(MAINZIP) -C $(GAMEDIR) $(PKGFILES) + @echo NetHack Windows package created: $(MAINZIP) + +$(PkgDir): + @mkdir -p $@ + +CLEAN_DIR += $(PkgDir) +CLEAN_FILE += $(MAINZIP) + +# In NetHack 5.0, date.c must be recompiled after any other file is compiled, +# otherwise the game internal build timestamp (and potentially git hash) +# will not be accurate. +# Therefore, date must not be included in COREOBJS (and by extension +# NHOBJS). That allows those to be listed as explicit dependencies of date.o +# to ensure that date.c is always recompiled again after anything else that +# was just recompiled. date.h is not used in the build of NetHack 5.0. +# +$(ONH)/date.o: $(SRC)/date.c $(NHOBJS) $(NHRES) | $(ONH) + $(cc) $(CFLAGSNH) $(GITHASH) $(GITBRANCH) $(GITPREFIX) $< -o$@ + +$(ONH)/cppregex.o: $(SSYS)/cppregex.cpp $(NHLUAH) | $(ONH) + $(cc) $(CPPFLAGSNH) $< -o$@ + +$(ONH)/%.o: $(SSYS)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +ifeq "$(SOUND_WINDSOUND)" "Y" +$(ONH)/%.o: ../sound/windsound/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ +endif + +ifeq "$(SOUND_FMOD)" "Y" +$(ONH)/%.o: ../sound/fmod/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ +endif + +$(ONH)/%.o: $(MSWSYS)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.o: $(MSWIN)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.o: $(WCHAIN)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.o: $(WSHR)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.o: $(TTY)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.o: $(WCURSES)/%.c $(NHLUAH) | $(ONH) + $(cc) $(CFLAGSNH) $(PDCINCL) $< -o$@ + +$(NHRES): $(MSWIN)/NetHack.rc $(WAV) $(MSWIN)/NetHack.ico | $(ONH) + $(rc) --include-dir=$(MSWIN) $(RCFLAGS) --input=$< -o$@ + +$(ONH): + @mkdir -p $@ + +CLEAN_DIR += $(ONH) +CLEAN_FILE += $(NHTARGET) $(NHOBJS) $(NHRES) + +#========================================== +#=============== TARGETS ================== +#========================================== + +.PHONY: all clean default binary lua makedefs recover $(PDCURSES) $(PDCURSES)w \ + tile2bmp tilemap uudecode dlb nethackw nethack tileutil \ + fetchlua fetchpdcurses + +# +# Everything +# + +all: package + +TO_BINARY = $(GAMEDIR)/NetHack.exe $(RTARGETS) $(GAMEDIRDLLS) \ + $(addprefix $(GAMEDIR)/, \ + $(addsuffix .template, sysconf nethackrc symbols) \ + Guidebook.txt NetHack.txt license opthelp record) + +ifeq "$(HAVE_SOUNDLIB)" "Y" +TO_BINARY += $(addprefix $(GAMEDIR)/, $(addsuffix .wav, $(WAVLIST))) +endif + +ifeq "$(USE_LUADLL)" "Y" +TO_BINARY += $(LUADLL) +endif + +ifneq "$(SKIP_NETHACKW)" "Y" +TO_BINARY += $(GAMEDIR)/NetHackW.exe +endif + +ifeq "$(USE_DLB)" "Y" +TO_BINARY += $(DLB) +endif + +binary: fetchlua fetchpdcurses $(TO_BINARY) +ifdef CI_COMPILER + ls -l $(SRC) + ls -l $(DAT) + ls -l $(UTIL) +endif +ifneq "$(USE_DLB)" "Y" + cp $(DAT)/*.dat $(GAMEDIR)/ +endif + @echo NetHack is up to date. + +ifdef SOUND_FMOD +$(GAMEDIR)/$(FMODLIBDLL): $(FMODLIBDIR)/$(FMODLIBDLL) + cp $< $@ +endif + +$(GAMEDIR)/symbols.template: $(DAT)/symbols + cp $< $@ + +$(GAMEDIR)/NetHack.txt: $(DOC)/nethack.txt + cp $< $@ + +$(GAMEDIR)/record: + touch $@ + +$(GAMEDIR)/%: $(DAT)/% + cp $< $@ + +$(GAMEDIR)/%: $(DOC)/% + cp $< $@ + +$(GAMEDIR)/%: $(MSWSYS)/% + cp $< $@ + +$(GAMEDIR)/%: $(SNDWAVDIR)/% + cp $< $@ + +CLEAN_FILE += $(TO_BINARY) + +clean: + @-rm -f $(CLEAN_FILE) + @$(foreach dir, $(CLEAN_DIR), \ + if [ -d $(dir) ] ; then rmdir -p --ignore $(dir) ; fi ; ) + +-include GNUmakefile.depend +-include .depend +# end of file diff --git a/sys/windows/GNUmakefile.depend b/sys/windows/GNUmakefile.depend new file mode 100644 index 000000000..c28f9eb1b --- /dev/null +++ b/sys/windows/GNUmakefile.depend @@ -0,0 +1,129 @@ +.PHONY: depend cleandep + +cce = gcc -E -MM -MT "$(@:d=o) $@" + +# Copy all $(cc) commands w/ their targets from GNUmakefile, 3rd party code unnecessary +# Replace .o w/ .d, $(cc) w/ $(cce) +# Check extraordinary "OBJ): " and handle them properly +# Check all CLEAN_FILE lines, add obj files to $(OBJS4DEP) +# Run +# make depend + +$(HL)/%.d: $(SRC)/%.c | $(HL) + $(cce) $(CFLAGSU) $< -o$@ + +$(OM)/%.d: $(SRC)/%.c $(NHLUAH) | $(OM) + $(cce) $(CFLAGSU) -DENUM_PM $< -o$@ + +$(OM)/%.d: $(U)%.c $(NHLUAH) | $(OM) + $(cce) $(CFLAGSU) -DENUM_PM $< -o$@ + +$(OR)/recover.d: $(U)recover.c | $(OR) + $(cce) $(CFLAGSU) $< -o$@ + +$(OR)/rversion.d: $(SRC)/version.c | $(OR) + $(cce) $(CFLAGSU) -DMINIMAL_FOR_RECOVER $< -o$@ + +$(OT)/tiletxt.d: $(WSHR)/tilemap.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) -DTILETEXT $< -o$@ + +$(OT)/%.d: $(WSHR)/%.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) $< -o$@ + +$(OT)/%.d: $(SRC)/%.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) $< -o$@ + +$(OT)/tilete32.d: $(WSHR)/tiletext.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(OT)/tiletx32.d: $(WSHR)/tilemap.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) -DTILETEXT -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(GIF32OBJ:o=d): $(WSHR)/gifread.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(BMP32OBJ:o=d): $(WSHR)/tile2bmp.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ + +$(OT)/panic.d: $(UTIL)/panic.c $(NHLUAH) | $(OT) + $(cce) $(CFLAGSU) $< -o$@ + +$(OTM)/tilemap.d: $(WSHR)/tilemap.c $(NHLUAH) | $(OTM) + $(cce) $(CFLAGSU) $< -o$@ + +$(OTM)/%.d: $(SRC)/%.c $(NHLUAH) | $(OTM) + $(cce) $(CFLAGSU) $< -o$@ + +$(OU)/uudecode.d: $(SSYS)/uudecode.c | $(OU) + $(cce) $(CFLAGS) $(CONSOLEDEF) $< -o$@ + +$(ODLB)/%.d: $(SRC)/%.c $(NHLUAH) | $(ODLB) + $(cce) $(CFLAGSU) $< -o$@ + +$(ODLB)/%.d: $(U)%.c $(NHLUAH) | $(ODLB) + $(cce) $(CFLAGSU) $< -o$@ + +$(ONHW)/%.d: $(SRC)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSW) $< -o$@ + +$(ONHW)/cppregex.d: $(SSYS)/cppregex.cpp $(NHLUAH) | $(ONHW) + $(cce) $(CPPFLAGSW) $< -o$@ + +$(ONHW)/%.d: $(SSYS)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.d: $(SNDSYS)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.d: $(MSWSYS)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.d: $(MSWIN)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.d: $(WSHR)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSW) $< -o$@ + +$(ONHW)/%.d: $(WCURSES)/%.c $(NHLUAH) | $(ONHW) + $(cce) $(CFLAGSNH) $(PDCINCL) $< -o$@ + +$(ONH)/%.d: $(SRC)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/cppregex.d: $(SSYS)/cppregex.cpp $(NHLUAH) | $(ONH) + $(cce) $(CPPFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(SSYS)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(SNDSYS)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(MSWSYS)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(MSWIN)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(WSHR)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(TTY)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $< -o$@ + +$(ONH)/%.d: $(WCURSES)/%.c $(NHLUAH) | $(ONH) + $(cce) $(CFLAGSNH) $(PDCINCL) $< -o$@ + +OBJS4DEP = $(MOBJS) $(ROBJS) $(HLHACKLIBOBJS) \ + $(TOBJS) $(GIFOBJ) $(GIF32OBJ) $(PPMOBJ) $(BMP32OBJ) $(T32OBJS) $(TUCOMMON) \ + $(TMOBJS) $(UOBJS) $(DLBOBJS) $(NHWOBJS) $(NHOBJS) +DEP_TARGETS = $(OBJS4DEP:o=d) + +depend: fetchlua fetchpdcurses $(DEP_TARGETS) + @cat $(DEP_TARGETS) > .depend + +cleandep: + @-rm -f $(DEP_TARGETS) .depend + +clean: cleandep +# end of file diff --git a/sys/windows/Install.windows b/sys/windows/Install.windows new file mode 100644 index 000000000..207ec5f5d --- /dev/null +++ b/sys/windows/Install.windows @@ -0,0 +1,91 @@ +Copyright (c) NetHack Development Team 1990-2024 +NetHack may be freely redistributed. See license for details. +============================================================== + Instructions for compiling NetHack 5.0 on a Windows system + (only tested on Windows 10/11 or later) +============================================================== +Last revision: $NHDT-Date: 1594155895 2020/07/07 21:04:55 $ + +See file dat\History for credits and history of NetHack for Windows. + +/-----------------------------------------------------------------------\ +| Download a prebuilt package of NetHack for Windows from NetHack.org | +\----------------------------------------------------------- -----------/ + + FIXME: + + +/-----------------------------------------------------------------------\ +| Build and package NetHack for Windows yourself | +\----------------------------------------------------------- -----------/ + +We provide documentation for the follow three different approaches +and tool suites that may be used to compile and package +NetHack for Windows: + + 1. With the Visual Studio Integrated Development Environment (IDE). + The steps are documented in sys/windows/build-vs.txt. + + 2. At the Windows command line, using Visual Studio's nmake.exe. + The steps are documented in sys/windows/build-nmake.txt. + + 3. At the bash shell using MSYS2. + The steps are documented in sys/windows/build-msys2.txt. + +/--------------------------------------------------------------\ +| Executing NetHack from zip file | +\--------------------------------------------------------------/ + +Executing NetHack on your machine + + Unzip the files to a folder on your machine, from + Windows explorer right-click | Extract all... + or by using tar: + Windows command prompt: + tar -xf nethack-370-win-x64.zip + + MSYS2 bash shell: + /c/Windows/System32/tar -xf nethack-370-win-x64.zip + + Run NetHack.exe or NetHackW.exe from the folder where you unzipped. + + Your personal config file, if it doesn't exist, will be created + from a template file the first time you fire up NetHack. + + If you want to edit your actual personal config file you can + reference the file as follows: + + From Windows cmd command prompt: + %USERPROFILE%\nethack\.nethackrc + + From Windows powershell: + $env:USERPROFILE\nethack\.nethackrc + + From MSYS2 bash shell: + $USERPROFILE/nethack/.nethackrc + + + If you want to see where NetHack expects to find the other files it + utilizes, you can issue the following command: + nethack --showpaths + + +Play NetHack. + +/--------------------------------------------------------------\ +| If you experience a problem | +\--------------------------------------------------------------/ + + If you discover a bug and wish to report it, or if you have comments + or suggestions we recommend using our "Contact Us" web page at: + https://www.nethack.org/common/contact.html + + If you don't have access to the web, or you want to send us a patch + to the NetHack source code feel free to drop us a line c/o: + DevTeam (at) nethack.org + + The development team also monitors the NetHack issues page on GitHub: + https://github.com/NetHack/NetHack/issues + + + Happy NetHacking! diff --git a/sys/windows/Makefile.nmake b/sys/windows/Makefile.nmake new file mode 100644 index 000000000..080e530be --- /dev/null +++ b/sys/windows/Makefile.nmake @@ -0,0 +1,3779 @@ +# NetHack 5.0 Makefile.nmake +# Copyright (c) NetHack Development Team 1993-2026 +# +#============================================================================== +# Build Tools Environment +# +# NetHack 5.0 Work-in-progress Makefile for +# MS Visual Studio Visual C++ compiler +# +# Visual Studio Compilers Tested: +# - Microsoft Visual Studio Community 2022 v 17.14.31 +# - Microsoft Visual Studio Community 2026 v 18.5.2 +# +#============================================================================== +# This is used for building two distinct executables of NetHack: +# +# A tty port utilizing the Win32 Console I/O subsystem, Console +# NetHack.exe +# +# A Win32 native port built on the Windows API, Graphical NetHack or +# NetHackW.exe +# +# If you have any questions about building NetHack for the Windows platform +# please read sys/windows/Install.windows file included in the distribution. +# +#============================================================================== +# +# The default make target (so just typing 'nmake' is useful). +# + +default : package + +# +#------------------------------------------------------------------------------ +# Where do you want the game to be built (which folder)? +# + +R_GAMEDIR = ..\binary # Default game build directory + +# +# +#------------------------------------------------------------------------------ +# Do you want to include integration with any sound libraries that work with +# this Makefile? Add the list below. If you change the list do 'nmake clean'. +# +# There is glue in here for the following: windsound fmod +# Obtaining the 3rd party library, including its .h files, is up to you. +# +# windsound uses built-in Microsoft API's, no 3rd party download is required. + +SOUND_LIBRARIES = windsound +#SOUND_LIBRARIES = windsound fmod + +#------------------------------------------------------------------------------ +# Curses options. +# +# Do you want console curses included? + +CURSES_CONSOLE = Y + +# Do you want graphical curses included? + +CURSES_GRAPHICAL = Y + +# +#------------------------------------------------------------------------------ +# Do you want debug information available to the executable? +# + +DEBUGINFO = Y + +# +#------------------------------------------------------------------------------ +# Do you want to include the address sanitizer? +# + +#WANT_ASAN = Y + +#------------------------------------------------------------------------------ +# Do you have a connection to the internet available that you want +# to utilize for obtaining prerequisite Lua source code and +# pdcursesmod source code? +# Default is now Y. Set it to N if that won't work for you. + +INTERNET_AVAILABLE = Y + +#------------------------------------------------------------------------------ +# +# Do you have git commands available and NetHack in a git repository? + +GIT_AVAILABLE = N + +# If not, because you obtained the NetHack sources in a zip file download, +# set GIT_AVAILABLE = N +# You can override INTERNET_AVAILABLE and GIT_AVAILABLE on the nmake command +# line by adding GIT=1 +# for example: +# nmake GIT=1 package +# +#------------------------------------------------------------------------------ +# This Makefile will attempt to auto-detect your selected target architecture +# based on Visual Studio command prompt configuration settings etc. +# However, if you want to manually override generation of a +# 32-bit or 64-bit build target, you can uncomment the appropriate +# TARGET_CPU line below. +# + +#TARGET_CPU=x64 +#TARGET_CPU=x86 +#TARGET_CPU=arm64 + +#============================================================================== +#======================== End of Modification Section ========================= +#============================================================================== +# +# ################################################# +# # # +# # Nothing below here should have to be changed. # +# # # +# ################################################# +# +#============================================================================== +# +# Notes about Makefile variables related to paths in this Makefile.nmake: +# There are R_ prefixed directory path variables. +# +# This only applies to directory path variables. +# +# Variable What's that mean, or what is it used for? +# ---------- -------------------------------------------------------------- +# R_ contains a path without a backslash at the end +# (no prefix) contains a path with a trailing backslash at the end +# +# For example: Usage: +# R_SRC ..\src $(R_SRC)\allmain.c => ..\src\allmain.c +# SRC ..\src\ $(SRC)allmain.c => ..\src\allmain.c +# +#============================================================================== +# if next line is commented out, full compiler command lines will be output +Q=@ + +!IFNDEF LUA_VERSION +LUAVER=5.4.8 +!ELSE +LUAVER=$(LUA_VERSION) +!ENDIF + +# if GIT=1 is passed on the make command, allow use of git and internet +!IF "$(GIT)" == "1" +INTERNET_AVAILABLE=Y +GIT_AVAILABLE=Y +!ENDIF +!IF "$(git)" == "1" +INTERNET_AVAILABLE=Y +GIT_AVAILABLE=Y +!ENDIF + +#============================================================================== +# +# The version of the game this Makefile was designed for +NETHACK_VERSION="5.0.0" + +# A brief version for use in macros +NHV=$(NETHACK_VERSION:.=) +NHV=$(NHV:"=) + +#============================================================================== +# +# Source directories. Makedefs hardcodes these, don't change them. +# + +R_INCL = ..\include # NetHack include files +R_DAT = ..\dat # NetHack data files +R_DOC = ..\doc # NetHack documentation files +R_UTIL = ..\util # Utility source +R_SRC = ..\src # Main source +R_SSYS = ..\sys\share # Shared system files +R_MSWSYS = ..\sys\windows # MS windows specific files +R_TTY = ..\win\tty # window port files (tty) +R_MSWIN = ..\win\win32 # window port files (win32) +R_WCURSES = ..\win\curses # window port files (curses) +R_WSHR = ..\win\share # Tile support files +R_QT = ..\win\Qt # QT support files +R_X11 = ..\win\X11 # X11 support files +R_LIBDIR = ..\lib # libraries and external bits +R_SUBM = ..\submodules # NetHack git submodules +R_SndWavDir = ..\sound\wav # sound files that get integrated +R_BinDir = ..\binary +R_PkgDir = ..\package +R_SOUNDDIR = ..\sound +#R_GAMEDIR is user option up near the top + +#!MESSAGE $(R_SRC) +#!MESSAGE $(R_GAMEDIR) +#============================================================================== +# Ordinary path variations with trailing backslash +# +BACKSLASH=^\ +INCL = $(R_INCL)$(BACKSLASH) +DAT = $(R_DAT)$(BACKSLASH) +UTIL = $(R_UTIL)$(BACKSLASH) +SRC = $(R_SRC)$(BACKSLASH) +SSYS = $(R_SSYS)$(BACKSLASH) +MSWSYS = $(R_MSWSYS)$(BACKSLASH) +TTY = $(R_TTY)$(BACKSLASH) +MSWIN = $(R_MSWIN)$(BACKSLASH) +WCURSES = $(R_WCURSES)$(BACKSLASH) +WSHR = $(R_WSHR)$(BACKSLASH) +QT = $(R_QT)$(BACKSLASH) +X11 = $(R_X11)$(BACKSLASH) +LIBDIR = $(R_LIBDIR)$(BACKSLASH) +SUBM = $(R_SUBM)$(BACKSLASH) +DOC = $(R_DOC)$(BACKSLASH) +SndWavDir = $(R_SndWavDir)$(BACKSLASH) +BinDir = $(R_BinDir)$(BACKSLASH) +PkgDir = $(R_PkgDir)$(BACKSLASH) +SOUNDDIR = $(R_SOUNDDIR)$(BACKSLASH) +GAMEDIR = $(R_GAMEDIR)$(BACKSLASH) + +#!MESSAGE $(SRC) +#!MESSAGE $(GAMEDIR) +#============================================================================== +# Unix path variations with trailing forward slash +# +#U_INCL = $(INCL:\=/) +#U_DAT = $(DAT:\=/) +#U_UTIL = $(UTIL:\=/) +#U_SRC = $(SRC:\=/) +#U_SSYS = $(SSYS:\=/) +#U_MSWSYS = $(MSWSYS:\=/) +#U_TTY = $(TTY:\=/) +#U_MSWIN = $(MSWIN:\=/) +#U_WCURSES = $(WCURSES:\=/) +#U_WSHR = $(WSHR:\=/) +#U_QT = $(QT:\=/) +#U_X11 = $(X11:\=/) +#U_LIBDIR = $(LIBDIR:\=/) +#U_SUBM = $(SUBM:\=/) +#U_DOC = $(DOC:\=/) +#U_SndWavDir = $(SndWavDir:\=/) +#U_BinDir = $(BinDir:\=/) +#U_PkgDir = $(PkgDir:\=/) +#U_SOUNDDIR = $(SOUNDDIR:\=/) +U_GAMEDIR = $(R_GAMEDIR:\=/) +# +#!MESSAGE $(U_SRC) +#!MESSAGE $(U_GAMEDIR) +#============================================================================== +# Sanity checks for prerequisite Lua and pdcursesmod +# +LUA_MAY_PROCEED=N +ADD_CURSES=N + +# First, Lua +!IF "$(INTERNET_AVAILABLE)" == "Y" +!IF "$(GIT_AVAILABLE)" == "Y" +R_LUATOP=$(SUBM)lua +LUATOP=$(SUBM)lua$(BACKSLASH) +R_LUASRC=$(R_LUATOP) +LUASRC=$(R_LUASRC)$(BACKSLASH) +LUA_MAY_PROCEED=Y +!ELSE # GIT_AVAILABLE +R_LUATOP=$(LIBDIR)lua-$(LUAVER) +LUATOP=$(R_LUATOP)$(BACKSLASH) +#U_LUATOP=$(LUATOP:\=/) +R_LUASRC=$(LUATOP)src +LUASRC=$(R_LUASRC)$(BACKSLASH) +#U_LUASRC=$(LUASRC:\=/) +LUA_MAY_PROCEED=Y +!ENDIF # GIT_AVAILABLE +!ELSE # INTERNET_AVAILABLE is not Y below +# The internet is not available for obtaining Lua using either +# method (git or download). Check to see if it is available already, with +# precedence given to ../submodules, then ../lib. +# +!IF EXIST("$(SUBM)lua\lua.h") +R_LUATOP=$(SUBM)lua +LUATOP=$(R_LUATOP)$(BACKSLASH) +#U_LUATOP=$(LUATOP:\=/) +R_LUASRC=$(LUATOP) +LUASRC=$(LUATOP)$(BACKSLASH) +#U_LUASRC=$(LUASRC:\=/) +LUA_MAY_PROCEED=Y +!ELSEIF EXIST("$(LIBDIR)lua-$(LUAVER)\src\lua.h") +R_LUATOP=$(LIBDIR)lua-$(LUAVER) +LUATOP=$(R_LUATOP)$(BACKSLASH) +#U_LUATOP=$(LUATOP:\=/) +R_LUASRC=$(LUATOP)src +LUASRC=$(R_LUASRC)$(BACKSLASH) +#U_LUASRC=$(LUASRC:\=/) +LUA_MAY_PROCEED=Y +!ENDIF # Lua sources +!IF "$(LUA_MAY_PROCEED)" == "Y" +!MESSAGE No internet connection was authorized in the Makefile, +!MESSAGE but a copy of lua-$(LUAVER) was found in $(LUATOP), so that will be used. +!ENDIF # LUA_MAY_PROCEED +!ENDIF # INTERNET_AVAILABLE + +#!MESSAGE R_LUATOP=$(R_LUATOP) +#!MESSAGE LUATOP=$(R_LUATOP) +#!MESSAGE R_LUASRC=$(R_LUASRC) +#!MESSAGE LUASRC=$(LUASRC) + +!IF "$(LUA_MAY_PROCEED)" != "Y" +!IF "$(INTERNET_AVAILABLE)" != "Y" +!MESSAGE Your Makefile settings do not allow use of the internet to obtain Lua +!ENDIF # INTERNET_AVAILABLE +!MESSAGE and no copy of Lua was found in either $(SUBM)lua or $(LIBDIR)lua-$(LUAVER). +!MESSAGE Change your nmake command line to include: +!MESSAGE GIT=1 +!MESSAGE or modify your Makefile to set the following: +!MESSAGE INTERNET_AVAILABLE=Y +!MESSAGE GIT_AVAILABLE=Y +!ERROR Stopping because NetHack 5.0 requires Lua for its build. +!ENDIF # LUA_MAY_PROCEED + +# Now, pdcursesmod +!IF "$(CURSES_CONSOLE)" == "Y" +WANT_CURSES=Y +!ENDIF +!IF "$(CURSES_GRAPHICAL)" == "Y" +WANT_CURSES=Y +!ENDIF + +!IF "$(CURSES_CONSOLE)" != "Y" +!IF "$(CURSES_GRAPHICAL)" != "Y" +WANT_CURSES=N +ADD_CURSES=N +!ENDIF +!ENDIF + +# Now, pdcursesmod +!IF "$(WANT_CURSES)" == "Y" +R_PDCDIST=pdcursesmod +PDCDIST=$(R_PDCDIST)$(BACKSLASH) +#U_PDCDIST=$(PDCDIST:\=/) +! IF "$(INTERNET_AVAILABLE)" == "Y" +! IF "$(GIT_AVAILABLE)" == "Y" +#!MESSAGE debug spot1 +R_PDCURSES_TOP=$(SUBM)$(R_PDCDIST) +PDCURSES_TOP=$(R_PDCURSES_TOP)$(BACKSLASH) +#U_PDCURSES_TOP=$(PDCURSES_TOP:\=/) +ADD_CURSES=Y +! ELSE # GIT_AVAILABLE +#!MESSAGE debug spot2 +R_PDCURSES_TOP=$(LIBDIR)$(R_PDCDIST) +PDCURSES_TOP=$(R_PDCURSES_TOP)$(BACKSLASH) +#U_PDCURSES_TOP=$(PDCURSES_TOP:\=/) +ADD_CURSES=Y +! ENDIF # GIT_AVAILABLE +! ELSE # NO internet available +# Your Makefile settings do not allow $(PDCDIST) to be obtained by +# git or by download. Check to see if it is available at one of +# the expected locations already, with precedence given to ../submodules, +# then ../lib. +#! MESSAGE debug spot3 +! IF EXIST("$(LIBDIR)$(R_PDCDIST)curses.h") +R_PDCURSES_TOP=$(LIBDIR)$(PDCDIST) +PDCURSES_TOP=$(R_PDCURSES_TOP)$(BACKSLASH) +ADD_CURSES=Y +! ELSEIF EXIST("$(SUBM)$(R_PDCDIST)curses.h") +#!MESSAGE debug spot4 +R_PDCURSES_TOP=$(LIBDIR)$(PDCDIST) +PDCURSES_TOP=$(R_PDCURSES_TOP)$(BACKSLASH) +ADD_CURSES=Y +! ENDIF # pdcursesmod sources available somewhere +! ENDIF # Internet dealt with +! IF "$(ADD_CURSES)" != "Y" +#!MESSAGE debug spot5 +!MESSAGE Your Makefile settings do not allow $(PDCDIST) to be +!MESSAGE obtained by git or by download, but a copy of pdcursesmod was +!MESSAGE found in $(PDCURSES_TOP), +!MESSAGE so that will be used. +! ELSE +#!MESSAGE debug spot6 +! IF EXIST("$(PDCURSES_TOP)curses.h") +INCLCURSES_H=-I$(R_PDCURSES_TOP) +! ELSE +# Cannot do it, sorry +PDCINCL= +INCLCURSES_H= +ADD_CURSES = N +! ENDIF # If we found a copy of curses.h +! ENDIF # ADD_CURSES == Y +!ENDIF # WANT_CURSES + +!IF "$(ADD_CURSES)" != "Y" +!MESSAGE NetHack 5.0 will be built without support for the curses window-port. +!ENDIF + +#These will be in the environment variables with one of the Visual Studio +#developer command prompts. +#VSCMD_ARG_HOST_ARCH=x64 +#VSCMD_ARG_TGT_ARCH=x86 +#VSCMD_ARG_TGT_ARCH=arm64 + +# We need to do this here, so some output files can +# incorporate TARGET_CPU into their names. +# +!IFDEF VSCMD_ARG_HOST_ARCH +!MESSAGE Host architecture is $(VSCMD_ARG_HOST_ARCH) +!MESSAGE Target architecture is $(VSCMD_ARG_TGT_ARCH) +! IFNDEF TARGET_CPU +! IF "$(VSCMD_ARG_TGT_ARCH)"=="x64" +TARGET_CPU=x64 +! ELSE +! IF "$(VSCMD_ARG_TGT_ARCH)"=="arm64" +TARGET_CPU=arm64 +! ELSE +TARGET_CPU=x86 +! ENDIF +! ENDIF +! ENDIF +!ENDIF + +!IF "$(TARGET_CPU)" == "" +TARGET_CPU=x86 +!ENDIF + +#TEST_CROSSCOMPILE=Y + +# +#========================================== +# Exe File Info. +#========================================== + +# +# Optional high-quality BSD random number generation routines +# (see pcconf.h). Set to nothing if not used. +# + +#RANDOM = +BCRYPT=bcrypt.lib + +# To store all the level files, +# help files, etc. in a single library file. +# USE_DLB = Y is left uncommented + +USE_DLB = Y + +! IF ("$(USE_DLB)"=="Y") +DLBDEF = -DDLB +! ELSE +DLBDEF = +! ENDIF + +# +# If you defined ZLIB_COMP in include/config.h and you need +# to link with the zlib.lib library, uncomment the line below. +# If necessary, prefix explicit path information to the file name +# otherwise it assumes the NetHack src directory. +# + +#ZLIB = zlib.lib + + +#========================================== +#================ MACROS ================== +#========================================== +# This section creates shorthand macros for many objects +# referenced later on in the Makefile. +# +# +# Object file directories. +# + +R_OBJTTY_B = objtty +R_OBJGUI_B = objgui +R_OBJUTIL_B = objutil +R_OBJLUA_B = objlua +R_OBJPDC_B = objpdc +R_OBJPDCTXT_B = objpdctxt +R_OBJPDCGUI_B = objpdcgui + +OBJTTY_B = $(R_OBJTTY_B)$(BACKSLASH) +OBJGUI_B = $(R_OBJGUI_B)$(BACKSLASH) +OBJUTIL_B = $(R_OBJUTIL_B)$(BACKSLASH) +OBJLUA_B = $(R_OBJLUA_B)$(BACKSLASH) +OBJPDC_B = $(R_OBJPDC_B)$(BACKSLASH) +OBJPDCTXT_B = $(R_OBJPDCTXT_B)$(BACKSLASH) +OBJPDCGUI_B = $(R_OBJPDCGUI_B)$(BACKSLASH) + +R_OBJTTY = $(OBJTTY_B)$(TARGET_CPU) +R_OBJGUI = $(OBJGUI_B)$(TARGET_CPU) +R_OBJUTIL = $(OBJUTIL_B)$(TARGET_CPU) +R_OBJLUA = $(OBJLUA_B)$(TARGET_CPU) +R_OBJPDC = $(OBJPDC_B)$(TARGET_CPU) +R_OBJPDCTXT = $(OBJPDCTXT_B)$(TARGET_CPU) +R_OBJPDCGUI = $(OBJPDCGUI_B)$(TARGET_CPU) + +OBJTTY = $(R_OBJTTY)$(BACKSLASH) +OBJGUI = $(R_OBJGUI)$(BACKSLASH) +OBJUTIL = $(R_OBJUTIL)$(BACKSLASH) +OBJLUA = $(R_OBJLUA)$(BACKSLASH) +OBJPDC = $(R_OBJPDC)$(BACKSLASH) +OBJPDCTXT = $(R_OBJPDCTXT)$(BACKSLASH) +OBJPDCGUI = $(R_OBJPDCGUI)$(BACKSLASH) + +# +# Shorten up the location for some files +# + +OTTY = $(OBJTTY) +OGUI = $(OBJGUI) +OUTL = $(OBJUTIL) +OLUA = $(OBJLUA) +OPDC = $(OBJPDC) +OPDCTXT = $(OBJPDCTXT) +OPDCGUI = $(OBJPDCGUI) + +U = $(UTIL) + +!IFDEF TEST_CROSSCOMPILE +HOST=_host +CROSSCOMPILE_TARGET= -DCROSSCOMPILE_TARGET +CROSSCOMPILE= -DCROSSCOMPILE +!ELSE +HOST= +CROSSCOMPILE_TARGET= +CROSSCOMPILE= +!ENDIF + +!IFDEF GIT_HASH +GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" +!ENDIF + +!IFDEF GIT_BRANCH +GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" +!ENDIF + +!IFDEF GIT_PREFIX +GITPREFIX = -DNETHACK_GIT_PREFIX=\"$(GIT_PREFIX)\" +!ENDIF + +#================================================================= +# LUA library +# Official source for Lua is http://www.lua.org/ftp/lua-5.4.8.tar.gz +# +# Source for the NetHack repository submodule in ../submodules/lua +# is https://github.com/lua/lua.git +#================================================================= +# +# Location of LUA +# +# Original source needs to be obtained from: +# http://www.lua.org/ftp/lua-5.4.8.tar.gz +# +# This build assumes that the LUA sources are located +# at the specified location. If they are actually elsewhere +# you'll need to specify the correct spot below in order to +# successfully build NetHack-5.0. You cannot build a functional +# version of NetHack-5.0 Work-in-progress without including Lua. +# + +!IFNDEF LUAVER +LUAVER=5.4.8 +!ENDIF + +LUALIB = $(LIBDIR)lua$(LUAVER)-$(TARGET_CPU)-static.lib +LUADLL = $(LIBDIR)lua$(LUAVER)-$(TARGET_CPU).dll +R_LUAINCL = /I$(R_LUASRC) +LUATARGETS = lua.exe $(LUADLL) $(LUALIB) + +LUASRCFILES = lapi.c lauxlib.c lbaselib.c lcode.c \ + lcorolib.c lctype.c ldblib.c ldebug.c ldo.c \ + ldump.c lfunc.c lgc.c linit.c liolib.c llex.c \ + lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c \ + loslib.c lparser.c lstate.c lstring.c lstrlib.c \ + ltable.c ltablib.c ltm.c lundump.c lutf8lib.c \ + lvm.c lzio.c + +LUAOBJFILES = $(OLUA)lapi.o $(OLUA)lauxlib.o $(OLUA)lbaselib.o \ + $(OLUA)lcode.o $(OLUA)lcorolib.o $(OLUA)lctype.o $(OLUA)ldblib.o \ + $(OLUA)ldebug.o $(OLUA)ldo.o $(OLUA)ldump.o $(OLUA)lfunc.o \ + $(OLUA)lgc.o $(OLUA)linit.o $(OLUA)liolib.o $(OLUA)llex.o \ + $(OLUA)lmathlib.o $(OLUA)lmem.o $(OLUA)loadlib.o $(OLUA)lobject.o \ + $(OLUA)lopcodes.o $(OLUA)loslib.o $(OLUA)lparser.o $(OLUA)lstate.o \ + $(OLUA)lstring.o $(OLUA)lstrlib.o $(OLUA)ltable.o $(OLUA)ltablib.o \ + $(OLUA)ltm.o $(OLUA)lundump.o $(OLUA)lutf8lib.o $(OLUA)lvm.o $(OLUA)lzio.o + +!IF "$(LUAVER)" == "5.3.5" +LUASRCFILES = $(LUASRCFILES) lbitlib.c +LUAOBJFILES = $(LUAOBJFILES) $(OLUA)lbitlib.o +!ELSE +# 5.4.0 added header files ljumptab.h and lopnames.h +# and removes lbitlib.c +!ENDIF +#===============-================================================= +# PDCursesmod build macros +# Source for the NetHack repository submodule in +# ../submodules/pdcursesmod +# is https://github.com/Bill-Gray/PDCursesMod +# Source for the NetHack repository submodule in +# ../submodules/pdcurses +# is https://github.com/wmcbrine/PDCurses.git +#================================================================= + +!IF "$(ADD_CURSES)" == "Y" +PDCTXTFOLDER = wincon +#PDCTXTFOLDER = vt +PDCURSES_CURSES_H = $(PDCURSES_TOP)curses.h +PDCURSES_CURSPRIV_H = $(PDCURSES_TOP)curspriv.h +PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) +R_PDCSRC = $(PDCURSES_TOP)pdcurses +PDCSRC = $(R_PDCSRC)$(BACKSLASH) +!IF "$(CURSES_CONSOLE)" == "Y" +R_PDCTXT = $(PDCURSES_TOP)$(PDCTXTFOLDER) +PDCTXT = $(PDCURSES_TOP)$(PDCTXTFOLDER)$(BACKSLASH) +#!MESSAGE PDCTXT = $(PDCTXT) +!ENDIF +!IF "$(CURSES_GRAPHICAL)" == "Y" +R_PDCGUI = $(PDCURSES_TOP)wingui +PDCGUI = $(PDCURSES_TOP)wingui$(BACKSLASH) +!ENDIF +PDCDEP = $(PDCURSES_TOP)curses.h + +PDCCOMMONOBJS = $(OPDC)addch.o $(OPDC)addchstr.o $(OPDC)addstr.o $(OPDC)attr.o $(OPDC)beep.o \ + $(OPDC)bkgd.o $(OPDC)border.o $(OPDC)clear.o $(OPDC)color.o $(OPDC)debug.o \ + $(OPDC)delch.o $(OPDC)deleteln.o $(OPDC)getch.o $(OPDC)getstr.o \ + $(OPDC)getyx.o $(OPDC)inch.o $(OPDC)inchstr.o $(OPDC)initscr.o \ + $(OPDC)inopts.o $(OPDC)insch.o $(OPDC)insstr.o $(OPDC)instr.o \ + $(OPDC)kernel.o $(OPDC)keyname.o $(OPDC)mouse.o $(OPDC)move.o \ + $(OPDC)outopts.o $(OPDC)overlay.o $(OPDC)pad.o $(OPDC)panel.o \ + $(OPDC)printw.o $(OPDC)refresh.o $(OPDC)scanw.o $(OPDC)scr_dump.o \ + $(OPDC)scroll.o $(OPDC)slk.o $(OPDC)termattr.o $(OPDC)touch.o \ + $(OPDC)util.o $(OPDC)window.o +PDCINCL = /I$(R_PDCURSES_TOP) /I$(R_PDCSRC) +!IF "$(CURSES_CONSOLE)" == "Y" +PDCINCLTXT = /I$(R_PDCTXT) +PDCTXTOBJS = $(OPDCTXT)pdcclip.o $(OPDCTXT)pdcdisp.o $(OPDCTXT)pdcgetsc.o \ + $(OPDCTXT)pdckbd.o $(OPDCTXT)pdcscrn.o $(OPDCTXT)pdcsetsc.o $(OPDCTXT)pdcutil.o +!ENDIF +!IF "$(CURSES_GRAPHICAL)" == "Y" +PDCGUIOBJS = $(OPDCGUI)pdcclip.o $(OPDCGUI)pdcdisp.o $(OPDCGUI)pdcgetsc.o \ + $(OPDCGUI)pdckbd.o $(OPDCGUI)pdcscrn.o $(OPDCGUI)pdcsetsc.o $(OPDCGUI)pdcutil.o +PDCINCLGUI = /I$(R_PDCGUI) +!ENDIF +!ELSE +PDCDEP= +PDCCOMMONOBJS= +PDCTXTOBJS= +PDCGUIOBJS= +PDCINCL= +PDINCLGUI= +PDCINCLTXT= +!ENDIF + + +#================================================================= +# all .c that are part of the main NetHack program and are not operating- or +# windowing-system specific + +HACKCSRC = \ + $(SRC)allmain.c $(SRC)alloc.c $(SRC)apply.c $(SRC)artifact.c \ + $(SRC)attrib.c $(SRC)ball.c $(SRC)bones.c $(SRC)botl.c \ + $(SRC)calendar.c $(SRC)cmd.c $(SRC)coloratt.c $(SRC)dbridge.c \ + $(SRC)decl.c $(SRC)detect.c $(SRC)dig.c $(SRC)display.c \ + $(SRC)dlb.c $(SRC)do.c $(SRC)do_name.c $(SRC)do_wear.c \ + $(SRC)dog.c $(SRC)dogmove.c $(SRC)dokick.c $(SRC)dothrow.c \ + $(SRC)drawing.c $(SRC)dungeon.c $(SRC)earlyarg.c $(SRC)eat.c \ + $(SRC)end.c $(SRC)engrave.c $(SRC)exper.c $(SRC)explode.c \ + $(SRC)files.c $(SRC)fountain.c $(SRC)getpos.c $(SRC)glyphs.c \ + $(SRC)hack.c $(SRC)iactions.c $(SRC)insight.c $(SRC)invent.c \ + $(SRC)isaac64.c $(SRC)light.c $(SRC)lock.c $(SRC)mail.c \ + $(SRC)makemon.c $(SRC)mcastu.c $(SRC)mdlib.c $(SRC)mhitm.c \ + $(SRC)mhitu.c $(SRC)minion.c $(SRC)mklev.c $(SRC)mkmap.c \ + $(SRC)mkmaze.c $(SRC)mkobj.c $(SRC)mkroom.c $(SRC)mon.c \ + $(SRC)mondata.c $(SRC)monmove.c $(SRC)monst.c $(SRC)mplayer.c \ + $(SRC)mthrowu.c $(SRC)muse.c $(SRC)music.c $(SRC)nhlua.c \ + $(SRC)nhlsel.c $(SRC)nhlobj.c $(SRC)o_init.c $(SRC)objects.c \ + $(SRC)objnam.c $(SRC)options.c $(SRC)pager.c $(SRC)pickup.c \ + $(SRC)pline.c $(SRC)polyself.c $(SRC)potion.c $(SRC)pray.c \ + $(SRC)priest.c $(SRC)quest.c $(SRC)questpgr.c $(SRC)read.c \ + $(SRC)rect.c $(SRC)region.c $(SRC)restore.c $(SRC)rip.c \ + $(SRC)rnd.c $(SRC)role.c $(SRC)rumors.c $(SRC)save.c \ + $(SRC)selvar.c $(SRC)sfbase.c $(SRC)sfstruct.c $(SRC)shk.c \ + $(SRC)shknam.c $(SRC)sit.c $(SRC)sounds.c $(SRC)sp_lev.c \ + $(SRC)spell.c $(SRC)stairs.c $(SRC)steal.c $(SRC)steed.c \ + $(SRC)symbols.c $(SRC)sys.c $(SRC)teleport.c $(SRC)timeout.c \ + $(SRC)topten.c $(SRC)track.c $(SRC)trap.c $(SRC)u_init.c \ + $(SRC)uhitm.c $(SRC)utf8map.c $(SRC)vault.c $(SRC)version.c \ + $(SRC)vision.c $(SRC)weapon.c $(SRC)were.c $(SRC)wield.c \ + $(SRC)windows.c $(SRC)wizard.c $(SRC)worm.c $(SRC)worn.c \ + $(SRC)write.c $(SRC)zap.c + +# all .h files except date.h +HACKINCL = \ + $(INCL)align.h $(INCL)artifact.h $(INCL)artilist.h \ + $(INCL)attrib.h $(INCL)botl.h $(INCL)color.h \ + $(INCL)config.h $(INCL)config1.h $(INCL)context.h \ + $(INCL)coord.h $(INCL)cstd.h $(INCL)decl.h \ + $(INCL)defsym.h $(INCL)display.h $(INCL)dlb.h \ + $(INCL)dungeon.h $(INCL)engrave.h $(INCL)extern.h \ + $(INCL)flag.h $(INCL)fnamesiz.h $(INCL)func_tab.h \ + $(INCL)global.h $(INCL)warnings.h $(INCL)hack.h \ + $(INCL)lint.h $(INCL)mextra.h $(INCL)micro.h \ + $(INCL)mcastu.h $(INCL)mfndpos.h $(INCL)mkroom.h \ + $(INCL)monattk.h $(INCL)mondata.h $(INCL)monflag.h \ + $(INCL)monst.h $(INCL)monsters.h $(INCL)nhmd4.h \ + $(INCL)obj.h $(INCL)objects.h $(INCL)objclass.h \ + $(INCL)optlist.h $(INCL)patchlevel.h $(INCL)pcconf.h \ + $(INCL)permonst.h $(INCL)prop.h $(INCL)rect.h \ + $(INCL)region.h $(INCL)savefile.h $(INCL)selvar.h \ + $(INCL)sfprocs.h $(INCL)sym.h $(INCL)rm.h \ + $(INCL)sp_lev.h $(INCL)spell.h $(INCL)sndprocs.h \ + $(INCL)seffects.h $(INCL)stairs.h $(INCL)sys.h \ + $(INCL)tcap.h $(INCL)timeout.h $(INCL)tradstdc.h \ + $(INCL)trap.h $(INCL)unixconf.h $(INCL)vision.h \ + $(INCL)vmsconf.h $(INCL)wintty.h $(INCL)wincurs.h \ + $(INCL)winX.h $(INCL)winprocs.h $(INCL)wintype.h \ + $(INCL)you.h $(INCL)youprop.h $(INCL)weight.h + +LUA_FILES = $(DAT)asmodeus.lua $(DAT)baalz.lua $(DAT)bigrm-1.lua \ + $(DAT)bigrm-10.lua $(DAT)bigrm-11.lua $(DAT)bigrm-12.lua \ + $(DAT)bigrm-13.lua \ + $(DAT)bigrm-2.lua $(DAT)bigrm-3.lua $(DAT)bigrm-4.lua \ + $(DAT)bigrm-5.lua $(DAT)bigrm-6.lua $(DAT)bigrm-7.lua \ + $(DAT)bigrm-8.lua $(DAT)bigrm-9.lua $(DAT)castle.lua \ + $(DAT)fakewiz1.lua $(DAT)fakewiz2.lua $(DAT)juiblex.lua \ + $(DAT)knox.lua $(DAT)medusa-1.lua $(DAT)medusa-2.lua \ + $(DAT)medusa-3.lua $(DAT)medusa-4.lua $(DAT)minend-1.lua \ + $(DAT)minend-2.lua $(DAT)minend-3.lua $(DAT)minefill.lua \ + $(DAT)minetn-1.lua $(DAT)minetn-2.lua $(DAT)minetn-3.lua \ + $(DAT)minetn-4.lua $(DAT)minetn-5.lua $(DAT)minetn-6.lua \ + $(DAT)minetn-7.lua $(DAT)oracle.lua $(DAT)orcus.lua \ + $(DAT)sanctum.lua $(DAT)soko1-1.lua $(DAT)soko1-2.lua \ + $(DAT)soko2-1.lua $(DAT)soko2-2.lua $(DAT)soko3-1.lua \ + $(DAT)soko3-2.lua $(DAT)soko4-1.lua $(DAT)soko4-2.lua \ + $(DAT)tower1.lua $(DAT)tower2.lua $(DAT)tower3.lua \ + $(DAT)valley.lua $(DAT)wizard1.lua $(DAT)wizard2.lua \ + $(DAT)wizard3.lua $(DAT)nhcore.lua $(DAT)nhlib.lua \ + $(DAT)themerms.lua $(DAT)astral.lua $(DAT)air.lua \ + $(DAT)earth.lua $(DAT)fire.lua $(DAT)water.lua \ + $(DAT)hellfill.lua $(DAT)tut-1.lua $(DAT)tut-2.lua \ + $(DAT)Arc-goal.lua $(DAT)Bar-goal.lua $(DAT)Cav-goal.lua \ + $(DAT)Hea-goal.lua $(DAT)Kni-goal.lua $(DAT)Mon-goal.lua \ + $(DAT)Pri-goal.lua $(DAT)Ran-goal.lua $(DAT)Rog-goal.lua \ + $(DAT)Sam-goal.lua $(DAT)Tou-goal.lua $(DAT)Val-goal.lua \ + $(DAT)Wiz-goal.lua $(DAT)Arc-fila.lua $(DAT)Arc-filb.lua \ + $(DAT)Bar-fila.lua $(DAT)Bar-filb.lua $(DAT)Cav-fila.lua \ + $(DAT)Cav-filb.lua $(DAT)Hea-fila.lua $(DAT)Hea-filb.lua \ + $(DAT)Kni-fila.lua $(DAT)Kni-filb.lua $(DAT)Mon-fila.lua \ + $(DAT)Mon-filb.lua $(DAT)Pri-fila.lua $(DAT)Pri-filb.lua \ + $(DAT)Ran-fila.lua $(DAT)Ran-filb.lua $(DAT)Rog-fila.lua \ + $(DAT)Rog-filb.lua $(DAT)Sam-fila.lua $(DAT)Sam-filb.lua \ + $(DAT)Tou-fila.lua $(DAT)Tou-filb.lua $(DAT)Val-fila.lua \ + $(DAT)Val-filb.lua $(DAT)Wiz-fila.lua $(DAT)Wiz-filb.lua \ + $(DAT)Arc-loca.lua $(DAT)Bar-loca.lua $(DAT)Cav-loca.lua \ + $(DAT)Hea-loca.lua $(DAT)Kni-loca.lua $(DAT)Mon-loca.lua \ + $(DAT)Pri-loca.lua $(DAT)Ran-loca.lua $(DAT)Rog-loca.lua \ + $(DAT)Sam-loca.lua $(DAT)Tou-loca.lua $(DAT)Val-loca.lua \ + $(DAT)Wiz-loca.lua $(DAT)Arc-strt.lua $(DAT)Bar-strt.lua \ + $(DAT)Cav-strt.lua $(DAT)Hea-strt.lua $(DAT)Kni-strt.lua \ + $(DAT)Mon-strt.lua $(DAT)Pri-strt.lua $(DAT)Ran-strt.lua \ + $(DAT)Rog-strt.lua $(DAT)Sam-strt.lua $(DAT)Tou-strt.lua \ + $(DAT)Val-strt.lua $(DAT)Wiz-strt.lua $(DAT)dungeon.lua \ + $(DAT)quest.lua + +luawildcards = asmodeus.lua baalz.lua bigrm-*.lua castle.lua fakewiz?.lua \ + juiblex.lua knox.lua medusa-?.lua minend-?.lua minefill.lua \ + minetn-?.lua oracle.lua orcus.lua sanctum.lua soko?-?.lua tower?.lua \ + valley.lua wizard?.lua nhcore.lua nhlib.lua themerms.lua astral.lua \ + air.lua earth.lua fire.lua water.lua hellfill.lua tut-?.lua \ + ???-goal.lua ???-fil?.lua ???-loca.lua ???-strt.lua \ + dungeon.lua quest.lua + +# +# - Utility +# + +MAKESRC = $(U)makedefs.c + +MAKEDEFSOBJS = $(OUTL)makedefs.o $(OUTL)monst$(HOST).o $(OUTL)objects$(HOST).o \ + $(OUTL)date.o $(OUTL)alloc.o $(OUTL)panic.o + +RECOVOBJS = $(OUTL)recover.o + +TILEFILES = $(WSHR)monsters.txt $(WSHR)objects.txt $(WSHR)other.txt + +# +# These are not invoked during a normal game build in 5.0 +# + +TEXT_IO = $(OUTL)tiletext.o $(OUTL)tiletxt.o $(OUTL)drawing$(HOST).o \ + $(OUTL)monst$(HOST).o $(OUTL)objects$(HOST).o + +TEXT_IO32 = $(OUTL)tilete32.o $(OUTL)tiletx32.o $(OUTL)drawing$(HOST).o \ + $(OUTL)monst$(HOST).o $(OUTL)objects$(HOST).o + +GIFREADERS_HOST = $(OUTL)gifread.o $(OUTL)alloc$(HOST).o $(OUTL)panic$(HOST).o +GIFREADERS32_HOST = $(OUTL)gifrd32.o $(OUTL)alloc$(HOST).o $(OUTL)panic$(HOST).o + +PPMWRITERS = $(OUTL)ppmwrite.o $(OUTL)alloc$(HOST).o $(OUTL)panic$(HOST).o + +WINDHDR = $(MSWSYS)win10.h $(MSWSYS)winos.h $(MSWSYS)win32api.h + +# +# - Curses +# + +!IF "$(ADD_CURSES)" == "Y" +PDCURSESFLAGS = -DPDC_WIDE -DPDC_RGB +CURSESOBJ= $(OTTY)cursdial.o $(OTTY)cursinit.o $(OTTY)cursinvt.o \ + $(OTTY)cursmain.o $(OTTY)cursmesg.o $(OTTY)cursmisc.o \ + $(OTTY)cursstat.o $(OTTY)curswins.o +!IF "$(CURSES_CONSOLE)" == "Y" +CURSESWINCONOBJS = $(CURSESOBJ) +PDCTXTLIB = $(LIBDIR)$(R_PDCDIST)-$(PDCTXTFOLDER)-$(TARGET_CPU)-static.lib +CURSESCONDEF1=-D"CURSES_GRAPHICS" -DPDC_NCMOUSE +#CURSESDEF2=-D"CURSES_BRIEF_INCLUDE" -DCHTYPE_32 +CURSESDEF2=-DCURSES_UNICODE $(PDCURSESFLAGS) +!ENDIF +!IF "$(CURSES_GRAPHICAL)" == "Y" +CURSESWINGUIOBJS = $(CURSESOBJ) $(OGUI)guitty.o +PDCGUILIB = $(LIBDIR)$(R_PDCDIST)-wingui-$(TARGET_CPU)-static.lib +CURSESGUIDEF1=-D"CURSES_GRAPHICS" -DPDC_NCMOUSE +#CURSESDEF2=-D"CURSES_BRIEF_INCLUDE" -DCHTYPE_32 +CURSESDEF2=-DCURSES_UNICODE $(PDCURSESFLAGS) +!ENDIF +!ELSE +!UNDEF CURSDEF1 +!UNDEF CURSDEF2 +!UNDEF CURSESLIB +!UNDEF CURSESOBJ +!UNDEF CURSESWINCONOBJS +!UNDEF CURSESWINGUIOBJS +!UNDEF PDCTXTLIB +!UNDEF PDCGUILIB +!ENDIF + +OUTLHACKLIBOBJS = $(OUTL)hacklib.o +OTTYHACKLIBOBJS = $(OTTY)hacklib.o +OGUIHACKLIBOBJS = $(OGUI)hacklib.o +OUTLHACKLIB = $(OUTL)hacklib-$(TARGET_CPU)-static.lib +OTTYHACKLIB = $(OTTY)hacklib-$(TARGET_CPU)-static.lib +OGUIHACKLIB = $(OGUI)hacklib-$(TARGET_CPU)-static.lib + +# +# - TTY +# + +TTYDEF= -D"_CONSOLE" -DWIN32CON $(CURSESCONDEF1) $(CURSESGUIDEF1) + +#RANDOMTTY = $(OTTY)random.o +MDLIBTTY = $(OTTY)mdlib.o +DLBOBJTTY = $(OTTY)dlb.o +REGEXTTY = $(OTTY)cppregex.o +LUAOBJTTY = $(OTTY)nhlua.o $(OTTY)nhlsel.o $(OTTY)nhlobj.o +VVOBJTTY = $(OTTY)version.o + +SOBJTTY = $(OTTY)windmain.o $(OTTY)windsys.o $(OTTY)win10.o + +TTYOBJTTY = $(OTTY)topl.o $(OTTY)getline.o $(OTTY)wintty.o + +COREOBJTTY = \ + $(OTTY)allmain.o $(OTTY)alloc.o $(OTTY)apply.o $(OTTY)artifact.o \ + $(OTTY)attrib.o $(OTTY)ball.o $(OTTY)bones.o $(OTTY)botl.o \ + $(OTTY)calendar.o $(OTTY)cfgfiles.o $(OTTY)cmd.o $(OTTY)coloratt.o \ + $(OTTY)dbridge.o $(OTTY)decl.o $(OTTY)detect.o $(OTTY)dig.o \ + $(OTTY)display.o $(OTTY)do.o $(OTTY)do_name.o $(OTTY)do_wear.o \ + $(OTTY)dog.o $(OTTY)dogmove.o $(OTTY)dokick.o $(OTTY)dothrow.o \ + $(OTTY)drawing.o $(OTTY)dungeon.o $(OTTY)earlyarg.o $(OTTY)eat.o \ + $(OTTY)end.o $(OTTY)engrave.o $(OTTY)exper.o $(OTTY)explode.o \ + $(OTTY)extralev.o $(OTTY)files.o $(OTTY)fountain.o $(OTTY)getpos.o \ + $(OTTY)glyphs.o $(OTTY)iactions.o $(OTTY)hack.o $(OTTY)insight.o \ + $(OTTY)invent.o $(OTTY)isaac64.o $(OTTY)light.o $(OTTY)lock.o \ + $(OTTY)mail.o $(OTTY)makemon.o $(OTTY)mcastu.o $(OTTY)mhitm.o \ + $(OTTY)mhitu.o $(OTTY)minion.o $(OTTY)mklev.o $(OTTY)mkmap.o \ + $(OTTY)mkmaze.o $(OTTY)mkobj.o $(OTTY)mkroom.o $(OTTY)mon.o \ + $(OTTY)mondata.o $(OTTY)monmove.o $(OTTY)monst.o $(OTTY)mplayer.o \ + $(OTTY)mthrowu.o $(OTTY)muse.o $(OTTY)music.o $(OTTY)o_init.o \ + $(OTTY)objects.o $(OTTY)objnam.o $(OTTY)options.o $(OTTY)pager.o \ + $(OTTY)pickup.o $(OTTY)pline.o $(OTTY)polyself.o $(OTTY)potion.o \ + $(OTTY)pray.o $(OTTY)priest.o $(OTTY)quest.o $(OTTY)questpgr.o \ + $(OTTY)read.o $(OTTY)rect.o $(OTTY)region.o $(OTTY)report.o \ + $(OTTY)restore.o $(OTTY)rip.o $(OTTY)rnd.o $(OTTY)role.o \ + $(OTTY)rumors.o $(OTTY)save.o $(OTTY)selvar.o $(OTTY)sfbase.o \ + $(OTTY)sfstruct.o $(OTTY)shk.o $(OTTY)shknam.o $(OTTY)sit.o \ + $(OTTY)sounds.o $(OTTY)sp_lev.o $(OTTY)spell.o $(OTTY)stairs.o \ + $(OTTY)steal.o $(OTTY)steed.o $(OTTY)strutil.o $(OTTY)symbols.o \ + $(OTTY)sys.o $(OTTY)teleport.o $(OTTY)timeout.o $(OTTY)topten.o \ + $(OTTY)track.o $(OTTY)trap.o $(OTTY)u_init.o $(OTTY)uhitm.o \ + $(OTTY)utf8map.o $(OTTY)vault.o $(OTTY)vision.o $(OTTY)weapon.o \ + $(OTTY)were.o $(OTTY)wield.o $(OTTY)windows.o $(OTTY)wizard.o \ + $(OTTY)wizcmds.o $(OTTY)worm.o $(OTTY)worn.o $(OTTY)write.o \ + $(OTTY)zap.o + +OBJSTTY = $(MDLIBTTY) $(COREOBJTTY) $(REGEXTTY) $(RANDOMTTY) + +ALLOBJTTY = $(SOBJTTY) $(DLBOBJTTY) $(OBJSTTY) $(VVOBJTTY) $(LUAOBJTTY) + +# +# - GUI +# + +GUIDEF= -DTILES -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(CURSESGUIDEF1) + +ALL_GUIHDR = $(MSWIN)mhaskyn.h $(MSWIN)mhdlg.h $(MSWIN)mhfont.h \ + $(MSWIN)mhinput.h $(MSWIN)mhmain.h $(MSWIN)mhmap.h $(MSWIN)mhmenu.h \ + $(MSWIN)mhmsg.h $(MSWIN)mhmsgwnd.h $(MSWIN)mhrip.h \ + $(MSWIN)mhsplash.h $(MSWIN)mhstatus.h \ + $(MSWIN)mhtext.h $(MSWIN)resource.h $(MSWIN)winMS.h + +#RANDOMGUI = $(OGUI)random.o +MDLIBGUI = $(OGUI)mdlib.o +DLBOBJGUI = $(OGUI)dlb.o +REGEXGUI = $(OGUI)cppregex.o +LUAOBJGUI = $(OGUI)nhlua.o $(OGUI)nhlsel.o $(OGUI)nhlobj.o +VVOBJGUI = $(OGUI)version.o + +SOBJGUI = $(OGUI)windmain.o $(OGUI)windsys.o $(OGUI)win10.o + +GUIOBJ = $(OGUI)mhaskyn.o $(OGUI)mhdlg.o \ + $(OGUI)mhfont.o $(OGUI)mhinput.o $(OGUI)mhmain.o $(OGUI)mhmap.o \ + $(OGUI)mhmenu.o $(OGUI)mhmsgwnd.o $(OGUI)mhrip.o $(OGUI)mhsplash.o \ + $(OGUI)mhstatus.o $(OGUI)mhtext.o $(OGUI)mswproc.o $(OGUI)NetHackW.o + +COREOBJGUI = \ + $(OGUI)allmain.o $(OGUI)alloc.o $(OGUI)apply.o $(OGUI)artifact.o \ + $(OGUI)attrib.o $(OGUI)ball.o $(OGUI)bones.o $(OGUI)botl.o \ + $(OGUI)calendar.o $(OGUI)cfgfiles.o $(OGUI)cmd.o $(OGUI)coloratt.o \ + $(OGUI)dbridge.o $(OGUI)decl.o $(OGUI)detect.o $(OGUI)dig.o \ + $(OGUI)display.o $(OGUI)do.o $(OGUI)do_name.o $(OGUI)do_wear.o \ + $(OGUI)dog.o $(OGUI)dogmove.o $(OGUI)dokick.o $(OGUI)dothrow.o \ + $(OGUI)drawing.o $(OGUI)dungeon.o $(OGUI)earlyarg.o $(OGUI)eat.o \ + $(OGUI)end.o $(OGUI)engrave.o $(OGUI)exper.o $(OGUI)explode.o \ + $(OGUI)extralev.o $(OGUI)files.o $(OGUI)fountain.o $(OGUI)getpos.o \ + $(OGUI)glyphs.o $(OGUI)iactions.o $(OGUI)hack.o $(OGUI)insight.o \ + $(OGUI)invent.o $(OGUI)isaac64.o $(OGUI)light.o $(OGUI)lock.o \ + $(OGUI)mail.o $(OGUI)makemon.o $(OGUI)mcastu.o $(OGUI)mhitm.o \ + $(OGUI)mhitu.o $(OGUI)minion.o $(OGUI)mklev.o $(OGUI)mkmap.o \ + $(OGUI)mkmaze.o $(OGUI)mkobj.o $(OGUI)mkroom.o $(OGUI)mon.o \ + $(OGUI)mondata.o $(OGUI)monmove.o $(OGUI)monst.o $(OGUI)mplayer.o \ + $(OGUI)mthrowu.o $(OGUI)muse.o $(OGUI)music.o $(OGUI)o_init.o \ + $(OGUI)objects.o $(OGUI)objnam.o $(OGUI)options.o $(OGUI)pager.o \ + $(OGUI)pickup.o $(OGUI)pline.o $(OGUI)polyself.o $(OGUI)potion.o \ + $(OGUI)pray.o $(OGUI)priest.o $(OGUI)quest.o $(OGUI)questpgr.o \ + $(OGUI)read.o $(OGUI)rect.o $(OGUI)region.o $(OGUI)report.o \ + $(OGUI)restore.o $(OGUI)rip.o $(OGUI)rnd.o $(OGUI)role.o \ + $(OGUI)rumors.o $(OGUI)save.o $(OGUI)selvar.o $(OGUI)sfbase.o \ + $(OGUI)sfstruct.o $(OGUI)shk.o $(OGUI)shknam.o $(OGUI)sit.o \ + $(OGUI)sounds.o $(OGUI)sp_lev.o $(OGUI)spell.o $(OGUI)stairs.o \ + $(OGUI)steal.o $(OGUI)steed.o $(OGUI)strutil.o $(OGUI)symbols.o \ + $(OGUI)sys.o $(OGUI)teleport.o $(OGUI)timeout.o $(OGUI)topten.o \ + $(OGUI)track.o $(OGUI)trap.o $(OGUI)u_init.o $(OGUI)uhitm.o \ + $(OGUI)utf8map.o $(OGUI)vault.o $(OGUI)vision.o $(OGUI)weapon.o \ + $(OGUI)were.o $(OGUI)wield.o $(OGUI)windows.o $(OGUI)wizard.o \ + $(OGUI)wizcmds.o $(OGUI)worm.o $(OGUI)worn.o $(OGUI)write.o \ + $(OGUI)zap.o + +OBJSGUI = $(MDLIBGUI) $(COREOBJGUI) $(REGEXGUI) $(RANDOMGUI) + +ALLOBJGUI = $(SOBJGUI) $(DLBOBJGUI) $(OBJSGUI) $(VVOBJGUI) $(LUAOBJGUI) + +# +# - other +# +COMCTRL = comctl32.lib + +OPTIONS_FILE = $(DAT)options + +!IFDEF TEST_CROSSCOMPILE +DLBOBJ_HOST = $(OTTY)dlb$(HOST).o +!ENDIF + +#===============-================================================= +# SOUND_LIBRARIES +#================================================================= + +# +-------------------------------+ +# | windsound (uses built-in api) | +# +-------------------------------+ +# +SNDTEMP = $(SOUND_LIBRARIES:windsound=) +!IF "$(SOUND_LIBRARIES)" != "$(SNDTEMP)" +!MESSAGE Including windsound integration +SOUND_WINDSOUND=Y +HAVE_SOUNDLIB=Y +NEED_USERSOUNDS=Y +NEED_SEAUTOMAP=Y +NEED_WAV=Y +R_SOUNDLIBINCL = $(R_SOUNDLIBINCL) +SOUNDLIBINCL = $(R_SOUNDLIBINCL)$(BACKSLASH) +SOUNDLIBDEFS = $(SOUNDLIBDEFS) -DSND_LIB_WINDSOUND +TTYSOUNDOBJS = $(TTYSOUNDOBJS) $(OTTY)windsound.o +GUISOUNDOBJS = $(GUISOUNDOBJS) $(OGUI)windsound.o +#WINDSOUNDLIBDIR = +#TTYSOUNDLIBS = $(TTYSOUNDLIBS) +#GUISOUNDLIBS = $(GUISOUNDLIBS) +#WINDSOUNDLIBDIR = +#WINDSOUNDLIBDLL = +R_WINDSOUNDDIR = $(SOUNDDIR)windsound +WINDSOUNDDIR=$(R_WINDSOUNDDIR)$(BACKSLASH) +#U_WINDSOUNDDIR = $(WINDSOUNDDIR:\=/) +SOUNDSRCS = $(SOUNDSRCS) $(WINDSOUNDDIR)windsound.c +#GAMEDIRDLLS = $(GAMEDIRDLLS) $(GAMEDIR)$(WINDSOUNDLIBDLL) +!ENDIF +SNDTEMP= + +# +--------------------------------+ +# | fmod? (requires 3rd party lib) | +# +--------------------------------+ +# + +SNDTEMP = $(SOUND_LIBRARIES:fmod=) +!IF "$(SOUND_LIBRARIES)" != "$(SNDTEMP)" +!MESSAGE Including fmod integration +SOUND_FMOD=Y +HAVE_SOUNDLIB=Y +NEED_USERSOUNDS=Y +NEED_SEAUTOMAP=Y +NEED_WAV=Y +R_FMODROOT=..\lib\fmod\api\core +FMODROOT=$(R_FMODROOT)$(BACKSLASH) +U_FMODROOT=$(FMODROOT:\=/) +FMODDLLBASENAME = fmod.dll +R_SOUNDLIBINCL = $(R_SOUNDLIBINCL) -I$(FMODROOT)inc +SOUNDLIBINCL = $(R_SOUNDLIBINCL)$BACKSLASH) +SOUNDLIBDEFS = $(SOUNDLIBDEFS) -DSND_LIB_FMOD +TTYSOUNDOBJS = $(TTYSOUNDOBJS) $(OTTY)fmod.o +GUISOUNDOBJS = $(GUISOUNDOBJS) $(OGUI)fmod.o +R_FMODLIBDIR = $(FMODROOT)lib\$(TARGET_CPU) +FMODLIBDIR=$(R_FMODLIBDIR)$(BACKSLASH) +#U_FMODLIBDIR=$(FMODLIBDIR:\=/) +FMODLIBDLL = $(FMODLIBDIR)$(FMODDLLBASENAME) +FMODFLAGS = -wd4201 +TTYSOUNDLIBS = $(TTYSOUNDLIBS) $(FMODLIBDIR)fmod_vc.lib +GUISOUNDLIBS = $(GUISOUNDLIBS) $(FMODLIBDIR)fmod_vc.lib +GAMEDIRDLLS = $(GAMEDIRDLLS) $(GAMEDIR)\$(FMODDLLBASENAME) +R_FMODDIR = $(SOUNDDIR)fmod +FMODDIR=$(R_FMODDIR)$(BACKSLASH) +#U_FMODDIR=$(FMODDIR:\=/) +SOUNDSRCS = $(SOUNDSRCS) $(FMODDIR)fmod.c +!MESSAGE --------------------------------------------------------------------- +!MESSAGE ** NOTES for fmod sound library integration ** +!MESSAGE For fmod integration, this Makefile expects: +!MESSAGE fmod include directory : $(FMODROOT)inc +!MESSAGE fmod library directory : $(FMODLIBDIR) +!MESSAGE fmod library to link with : $(FMODLIBDIR)fmod_vc.lib +!MESSAGE fmod library dll : $(FMODLIBDLL) +!MESSAGE --------------------------------------------------------------------- +FMOD_MISSING= +!IF !EXIST("$(FMODROOT)inc") +FMOD_MISSING= $(FMOD_MISSING) $(FMODROOT)inc +!MESSAGE Error: missing $(FMODROOT)inc +!ENDIF +!IF !EXIST("$(FMODLIBDIR)") +FMOD_MISSING= $(FMOD_MISSING) $(FMODLIBDIR) +!MESSAGE Error: missing $(FMODLIBDIR) +!ENDIF +!IF !EXIST("$(FMODLIBDIR)fmod_vc.lib") +FMOD_MISSING= $(FMOD_MISSING) $(FMODLIBDIR)fmod_vc.lib +!MESSAGE Error: missing $(FMODLIBDIR)fmod_vc.lib +!ENDIF +!IF !EXIST("$(FMODLIBDLL)") +FMOD_MISSING= $(FMOD_MISSING) $(FMODLIBDLL) +!MESSAGE Error: missing $(FMODLIBDLL) +!ENDIF +!IF "$(FMOD_MISSING)" != "" +!ERROR Error: Cannot proceed with fmod integration included +!ENDIF +!ENDIF +SNDTEMP= + +#===============-================================================= +# SOUND Support +#================================================================= + +WAVS = $(SndWavDir)se_squeak_A.wav $(SndWavDir)se_squeak_B.wav \ + $(SndWavDir)se_squeak_B_flat.wav $(SndWavDir)se_squeak_C.wav \ + $(SndWavDir)se_squeak_D.wav $(SndWavDir)se_squeak_D_flat.wav \ + $(SndWavDir)se_squeak_E.wav $(SndWavDir)se_squeak_E_flat.wav \ + $(SndWavDir)se_squeak_F.wav $(SndWavDir)se_squeak_F_sharp.wav \ + $(SndWavDir)se_squeak_G.wav $(SndWavDir)se_squeak_G_sharp.wav \ + $(SndWavDir)sound_Bell.wav $(SndWavDir)sound_Bugle_A.wav \ + $(SndWavDir)sound_Bugle_B.wav $(SndWavDir)sound_Bugle_C.wav \ + $(SndWavDir)sound_Bugle_D.wav $(SndWavDir)sound_Bugle_E.wav \ + $(SndWavDir)sound_Bugle_F.wav $(SndWavDir)sound_Bugle_G.wav \ + $(SndWavDir)sound_Drum_Of_Earthquake.wav \ + $(SndWavDir)sound_Fire_Horn.wav $(SndWavDir)sound_Frost_Horn.wav \ + $(SndWavDir)sound_Leather_Drum.wav $(SndWavDir)sound_Magic_Harp_A.wav \ + $(SndWavDir)sound_Magic_Harp_B.wav $(SndWavDir)sound_Magic_Harp_C.wav \ + $(SndWavDir)sound_Magic_Harp_D.wav $(SndWavDir)sound_Magic_Harp_E.wav \ + $(SndWavDir)sound_Magic_Harp_F.wav $(SndWavDir)sound_Magic_Harp_G.wav \ + $(SndWavDir)sound_Magic_Flute_A.wav \ + $(SndWavDir)sound_Magic_Flute_B.wav $(SndWavDir)sound_Magic_Flute_C.wav \ + $(SndWavDir)sound_Magic_Flute_D.wav $(SndWavDir)sound_Magic_Flute_E.wav \ + $(SndWavDir)sound_Magic_Flute_F.wav $(SndWavDir)sound_Magic_Flute_G.wav \ + $(SndWavDir)sound_Tooled_Horn_A.wav $(SndWavDir)sound_Tooled_Horn_B.wav \ + $(SndWavDir)sound_Tooled_Horn_C.wav $(SndWavDir)sound_Tooled_Horn_D.wav \ + $(SndWavDir)sound_Tooled_Horn_E.wav $(SndWavDir)sound_Tooled_Horn_F.wav \ + $(SndWavDir)sound_Tooled_Horn_G.wav $(SndWavDir)sound_Wooden_Flute_A.wav \ + $(SndWavDir)sound_Wooden_Flute_B.wav $(SndWavDir)sound_Wooden_Flute_C.wav \ + $(SndWavDir)sound_Wooden_Flute_D.wav $(SndWavDir)sound_Wooden_Flute_E.wav \ + $(SndWavDir)sound_Wooden_Flute_F.wav $(SndWavDir)sound_Wooden_Flute_G.wav \ + $(SndWavDir)sound_Wooden_Harp_A.wav $(SndWavDir)sound_Wooden_Harp_B.wav \ + $(SndWavDir)sound_Wooden_Harp_C.wav $(SndWavDir)sound_Wooden_Harp_D.wav \ + $(SndWavDir)sound_Wooden_Harp_E.wav $(SndWavDir)sound_Wooden_Harp_F.wav \ + $(SndWavDir)sound_Wooden_Harp_G.wav $(SndWavDir)sa2_xpleveldown.wav \ + $(SndWavDir)sa2_xplevelup.wav + +!IF "$(HAVE_SOUNDLIB)" == "Y" +!IF "$(NEED_USERSOUNDS)" == "Y" +SOUNDLIBDEFS = $(SOUNDLIBDEFS) -DUSER_SOUNDS +!ENDIF +!IF "$(NEED_SEAUTOMAP)" == "Y" +SOUNDLIBDEFS = $(SOUNDLIBDEFS) -DSND_SOUNDEFFECTS_AUTOMAP +!ENDIF +WAV = $(WAVS) +RCFLAGS = $(RCFLAGS) -dRCWAV +!ENDIF #HAVE_SOUNDLIB + +#========================================== +# Header file macros +#========================================== + +# config.h +CONFIG_H = $(INCL)color.h $(INCL)config.h $(INCL)config1.h \ + $(INCL)coord.h $(INCL)cstd.h $(INCL)fnamesiz.h \ + $(INCL)global.h $(INCL)integer.h $(INCL)micro.h \ + $(INCL)patchlevel.h $(INCL)pcconf.h \ + $(INCL)tradstdc.h $(INCL)unixconf.h \ + $(INCL)vmsconf.h $(INCL)warnings.h \ + $(INCL)windconf.h + +# hack.h +HACK_H = $(CONFIG_H) $(INCL)align.h $(INCL)artilist.h \ + $(INCL)attrib.h $(INCL)botl.h $(INCL)context.h \ + $(INCL)decl.h $(INCL)defsym.h $(INCL)display.h \ + $(INCL)dungeon.h $(INCL)engrave.h $(INCL)flag.h \ + $(INCL)hack.h $(INCL)lint.h $(INCL)mextra.h \ + $(INCL)mcastu.h \ + $(INCL)mkroom.h $(INCL)monattk.h $(INCL)mondata.h \ + $(INCL)monflag.h $(INCL)monst.h $(INCL)monsters.h \ + $(INCL)nhlua.h $(INCL)obj.h $(INCL)objclass.h \ + $(INCL)objects.h $(INCL)permonst.h $(INCL)prop.h \ + $(INCL)quest.h $(INCL)rect.h $(INCL)region.h \ + $(INCL)rm.h $(INCL)seffects.h $(INCL)selvar.h \ + $(INCL)skills.h $(INCL)sndprocs.h $(INCL)spell.h \ + $(INCL)stairs.h $(INCL)sym.h $(INCL)sys.h \ + $(INCL)timeout.h $(INCL)trap.h $(INCL)vision.h \ + $(INCL)weight.h $(INCL)winprocs.h $(INCL)wintype.h \ + $(INCL)you.h $(INCL)youprop.h + +TILE_H = $(WSHR)tile.h + +#========================================== +# Miscellaneous +#========================================== + +DATABASE = $(DAT)data.base + +#========================================== +#========================================== +# Setting up the compiler and linker +#========================================== +#========================================== + +# +# ctags options +# +#CTAGSCMD=ctags-orig.exe +!IF "$(CI_BUILD_DIR)" != "" +R_CTAGSDIR=$(LIBDIR)ctags +CTAGSDIR=$(R_CTAGSDIR)$(BACKSLASH) +#U_CTAGSDIR=$(CTAGSDIR:\=/) +!ELSE +R_CTAGSDIR=..\lib\ctags +CTAGSDIR=$(R_CTAGSDIR)$(BACKSLASH) +#U_CTAGSDIR=$(CTAGSDIR:\=/) +!ENDIF +CTAGSCMD=$(CTAGSDIR)ctags.exe + +CTAGSOPT =--language-force=c --sort=no -D"Bitfield(x,n)=unsigned x : n" --excmd=pattern +# +# ctags wants unix-style pathnames +# + +cc=cl.exe +cpp=cpp.exe +link=link.exe +librarian=lib.exe +rc=Rc.exe + +# Before we get started, this section is used to determine the version of +# Visual Studio we are using. We set VSVER to 0000 to flag any version that +# is too old or untested. +# +# Recently tested versions: +TESTEDVS2022 = 14.44.35225.0 +TESTEDVS2026 = 14.50.35730.0 + +VS20261ST = 1450000000 +VS2026CUR = $(TESTEDVS2026:.=) +VS2026DN1 = $(VS20261ST) - 1 +VS2026UP1 = $(VS2026CUR) + 1 + +#!MESSAGE $(MAKEFLAGS) +#!MESSAGE $(MAKEDIR) +#!MESSAGE $(MAKE) + +MAKEVERSION=$(_NMAKE_VER:.= ) +MAKEVERSION=$(MAKEVERSION: =) +#!MESSAGE $(_NMAKE_VER) +#!MESSAGE $(MAKEVERSION) + +VSSPECIAL= +VSNEWEST=2026 +!IF ($(MAKEVERSION) < 1411000000) +VSVER=0000 #untested ancient version +!ELSEIF ($(MAKEVERSION) < $(VS20261ST)) +VSVER=2022 +!ELSEIF ($(MAKEVERSION) > $(VS20261ST)) && ($(MAKEVERSION) < $(VS2026UP1)) +VSVER=2026 +!ELSEIF ($(MAKEVERSION) > $(VS2026CUR)) +VSVER=2999 #untested future version +!ENDIF + +!IF ($(VSVER) <= $(VSNEWEST)) +!IF ($(MAKEVERSION) < $(VS20261ST)) +!MESSAGE Autodetected Visual Studio $(VSVER) or earlier +!ELSE +!MESSAGE Autodetected Visual Studio $(VSVER) $(VSSPECIAL) +!ENDIF +!ENDIF + +!IF ($(VSVER) == 2999) +!MESSAGE The NMAKE version of this Visual Studio $(_NMAKE_VER) is newer than the +!MESSAGE most recent at the time this Makefile was crafted (Visual Studio $(VSNEWEST)). +!MESSAGE Because it is newer we'll proceed expecting that the VS$(VSNEWEST) processing +!MESSAGE will still work. +!ELSEIF ($(VSVER) == 0000) +!MESSAGE The version of Visual Studio appears to be quite old, older +!MESSAGE than VS2010 which is the oldest version confirmed to work with this +!MESSAGE Makefile, so we'll stop now. +!ERROR Untested old Visual Studio version with NMAKE $(_NMAKE_VER). +!ENDIF + +!IF ($(VSVER) >= 2019) && ("$(WANT_ASAN)"=="Y") +ASAN=/fsanitize=address +!ELSE +ASAN= +!ENDIF + +#========================================== +# More compiler setup post-macros +#========================================== +#---------------------------------------------------------------- + +ccommon= -c -nologo -D"_CRT_NONSTDC_NO_DEPRECATE" -D"_CRT_SECURE_NO_DEPRECATE" \ + -D"_LIB" -D"_SCL_SECURE_NO_DEPRECATE" -D"_VC80_UPGRADE=0x0600" -D"_MBCS" \ + -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -D"NDEBUG" -D"YY_NO_UNISTD_H" \ + -DHAS_STDINT_H -DHAS_INLINE $(RUNTIMEOPTDEF) \ + -EHsc -fp:precise -Gd -GF -GS -Gy \ + $(CL_RECENT) -WX- -Zc:forScope -Zc:wchar_t -Zi +cdebug= -analyze- -D"_DEBUG" -MTd -RTC1 -Od $(ASAN) +crelease= -analyze- -D"_MBCS" -errorReport:prompt -MT -O2 -Ot -Ox -Oy + +lcommon= /NOLOGO /INCREMENTAL:NO + +!IF "$(DEBUGINFO)" == "Y" +ldebug = /DEBUG +ctmpflags1=$(ccommon) $(cdebug) +lflags1=$(lcommon) $(ldebug) +!ELSE +ldebug= /DEBUG +ctmpflags1=$(ccommon) $(crelease) +lflags1=$(lcommon) $(ldebug) +!ENDIF + +lflags= $(lflags1) + +!IF "$(TARGET_CPU)" == "x86" +ctmpflags = $(ctmpflags1) -D_X86_=1 -DWIN32 -D_WIN32 -W3 +scall = -Gz + +!ELSEIF "$(TARGET_CPU)" == "x64" +ctmpflags = $(ctmpflags1) -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 +scall = +!ELSEIF "$(TARGET_CPU)" == "arm64" +ctmpflags = $(ctmpflags1) -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 +scall = +!ENDIF + +!IF ($(VSVER) >= 2012) +# +# 4100 unreferenced formal parameter +# 4101 'identifier': unreferenced local variable +# 4102 'label': unreferenced label +# 4131 old-style declarator +# 4201 'nonstandard extension used : nameless struct/union' +# 4244 conversion possible loss of data +# 4245 conversion from 'char' to 'uchar', signed/unsigned mismatch +# 4310 a constant value is cast to a smaller type +# 4324 'structname': structure was padded due to alignment specifier +# 4431 missing type specifier - int assumed. Note: C no longer supports default-int +# 4706 assignment within conditional +# 4774 format string is not a string literal (default is off at W4) +# 4777 format string requires an argument of type 'type', +# but variadic argument 'position' has type 'type' +# 4820 padding in struct +# 5262 enable fallthrough warnings that lack [[fallthrough]] +# 5264 'variable-name': 'const' variable is not used +# 5266 'const' qualifier on return type has no effect +# 6001 'Using uninitialized memory' +# +#ctmpflags = $(ctmpflags:-W3=-W4) -wd4100 -wd4244 -wd4245 -wd4310 -wd4706 +ctmpflags = $(ctmpflags:-W3=-W4) -wd4244 -wd4245 -wd4310 -wd4706 -w44101 -w44102 +!IF ($(VSVER) >= 2019) +ctmpflags = $(ctmpflags) -w44774 +!ENDIF +!IF ($(VSVER) >= 2022) +!IF ($(MAKEVERSION) >= 1440338120) +# warning 5262 became available starting in Visual Studio 2022 version 17.4. +ctmpflags = $(ctmpflags) -w45262 -w45264 -w45266 -w44431 -w44777 -wd4820 /std:clatest +!ENDIF +!ENDIF +!ENDIF + +#More verbose warning output options below +#ctmpflags = $(ctmpflags:-W4=-wd4131 +#ctmpflags = $(ctmpflags:-W4=-Wall) +#ctmpflags = $(ctmpflags:-W3=-wd4131 +#ctmpflags = $(ctmpflags:-W3=-Wall) + +cpptmpflags = $(ctmpflags) + +# declarations for use on Intel x86 systems +!IF "$(TARGET_CPU)" == "x86" +DLLENTRY = @12 +MACHINE=/MACHINE:X86 +!ENDIF + +# declarations for use on AMD64 systems +!IF "$(TARGET_CPU)" == "x64" +DLLENTRY = +MACHINE=/MACHINE:X64 +!ENDIF + +# declarations for use on arm64 systems +!IF "$(TARGET_CPU)" == "arm64" +DLLENTRY = +MACHINE=/MACHINE:arm64 +!ENDIF + +# for Windows applications +conlflags = $(lflags) -subsystem:console +guilflags = $(lflags) -subsystem:windows + +# basic subsystem specific libraries, less the C Run-Time +baselibs = kernel32.lib $(optlibs) $(winsocklibs) advapi32.lib gdi32.lib \ + ole32.lib Shell32.lib UserEnv.lib dbghelp.lib Rpcrt4.lib +winlibs = $(baselibs) user32.lib comdlg32.lib winspool.lib + +# for Windows applications that use the C Run-Time libraries +conlibs = $(baselibs) +guilibs = $(winlibs) +# + +INCLUSIONS= /I$(R_INCL) /I$(R_MSWSYS) $(R_LUAINCL) $(R_SOUNDLIBINCL) + +#========================================== +# Util and console builds +#========================================== + +CFLAGS = $(ctmpflags) $(INCLUSIONS) $(DLBDEF) $(SOUNDLIBDEFS) +CPPFLAGS = $(cpptmpflags) $(INCLUSIONS) $(DLBDEF) $(SOUNDLIBDEFS) +LFLAGS = $(lflags) $(conlibs) $(MACHINE) + +#========================================== +# - Game build +#========================================== + +LIBS= user32.lib winmm.lib $(ZLIB) + +! IF ("$(USE_DLB)"=="Y") +DLB = nhdat$(NHV) +! ELSE +DLB = +! ENDIF + +#========================================== +#================ RULES ================== +#========================================== + +.SUFFIXES: .exe .o .til .uu .c .y .l + +#========================================== +# Rules for files in src +#========================================== + +.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +.c{$(R_OBJUTIL)}.o: + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_SRC)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_SRC)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_SRC)}.c{$(R_OBJUTIL)}.o: + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in sound\windsound +#========================================== + +{$(R_WINDSOUNDDIR)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_WINDSOUNDDIR)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in sound\sample +#========================================== + +{$(SOUNDDIR)sample}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(SOUNDDIR)sample}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in sys\share +#========================================== + +{$(R_SSYS)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_SSYS)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_SSYS)}.c{$(R_OBJUTIL)}.o: + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_SSYS)}.cpp{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CPPFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /EHsc -Fo$@ $< + +{$(R_SSYS)}.cpp{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CPPFLAGS) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /EHsc -Fo$@ $< + +{$(R_SSYS)}.cpp{$(R_OBJUTIL)}.o: + $(Q)$(CC) $(CPPFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /EHsc -Fo$@ $< + +#========================================== +# Rules for files in sys\windows +#========================================== + +{$(R_MSWSYS)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -Fo$@ $< + +{$(R_MSWSYS)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) -I$(MSWSYS) $(GUIDEF) -Fo$@ $< + +{$(R_MSWSYS)}.uu{$(R_MSWSYS)}.bmp: + $(U)uudecode.exe $< + move $(SRC)$(@B).bmp $@ + +#========================================== +# Rules for files in util +#========================================== + +{$(R_UTIL)}.c{$(R_OBJUTIL)}.o: + echo R_UTIL=$(R_UTIL) + echo R_OBJUTIL=$(R_OBJUTIL) + $(Q)$(CC) $(CFLAGS) -Fo$@ $< + +#========================================== +# Rules for files in win\share +#========================================== + +{$(R_WSHR)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_WSHR)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_WSHR)}.c{$(R_OBJUTIL)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in win\tty +#========================================== + +{$(R_TTY)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -I$(R_MSWSYS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in win\win32 +#========================================== + +{$(R_MSWIN)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) $(GUIDEF) -I$(R_MSWSYS) -I$(R_MSWIN) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_MSWIN)}.uu{$(R_MSWIN)}.bmp: + $(U)uudecode.exe $< + move $(SRC)$(@B).bmp $@ + +#========================================== +# Rules for files in win\curses +#========================================== +#!MESSAGE INCLCURSES_H=$(INCLCURSES_H) + +{$(R_WCURSES)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(INCLCURSES_H) $(CFLAGS) $(CURSESCONDEF1) $(CURSESGUIDEF1) $(CURSESDEF2) $(TTYDEF) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in PDCurses +#========================================== +#!MESSAGE {$(R_PDCURSES_TOP)}.c{$(R_OBJPDC)}.o: +#!MESSAGE {$(R_PDCSRC)}.c{$(R_OBJPDC)}.o: +#!MESSAGE PDCINCL = $(PDCINCL) +#!MESSAGE PDCINCLGUI = $(PDCINCLGUI) +#!MESSAGE PDCINCLTXT = $(PDCINCLTXT) +#!MESSAGE $(Q)$(CC) /wd4244 /wd4267 /wd4774 $(R_PDCINCL) $(CFLAGS:-w44774= ) $(CURSESDEF2) /wd5262 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -FoX2 X1 + +# +!IF "$(ADD_CURSES)" == "Y" +{$(R_PDCURSES_TOP)}.c{$(R_OBJPDC)}.o: + $(Q)$(CC) /wd4244 $(PDCINCL) $(CFLAGS) $(CURSESDEF2) /wd5262 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_PDCSRC)}.c{$(R_OBJPDC)}.o: + $(Q)$(CC) /wd4244 /wd4267 /wd4774 $(PDCINCL) $(CFLAGS:-w44774= ) $(CURSESDEF2) /wd5262 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +!IF "$(CURSES_CONSOLE)" == "Y" +{$(R_PDCTXT)}.c{$(R_OBJPDCTXT)}.o: + $(Q)$(CC) /wd4244 /wd4267 /wd4774 $(PDCINCL) $(PDCINCLTXT) $(CFLAGS) $(CURSESDEF2) /wd5262 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< +#!MESSAGE {$(R_PDCTXT)}.c{$(R_OBJPDCTXT)}.o: +!ENDIF + +!IF "$(CURSES_GRAPHICAL)" == "Y" +{$(R_PDCGUI)}.c{$(R_OBJPDCGUI)}.o: + $(Q)$(CC) /wd4244 /wd4267 /wd4774 $(PDCINCL) $(PDCINCLGUI) $(CFLAGS) $(CURSESDEF2) /wd5262 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< +#!MESSAGE {$(R_PDCGUI)}.c{$(R_OBJPDCGUI)}.o: +!ENDIF +!ENDIF + + +#========================================== +# Rules for LUA files +#========================================== + +{$(R_LUASRC)}.c{$(R_OBJLUA)}.o: + $(Q)$(CC) $(CFLAGS) -wd4701 -wd4702 -wd4774 -wd4324 -wd5262 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#=============================================================================== +# Rules for integrated sound files in sound/wav +#=============================================================================== + +{$(R_SndWavDir)}.uu{$(R_SndWavDir)}.wav: + $(U)uudecode.exe $(SndWavDir)$(@B).uu + move $(SRC)$(@B).wav $(SndWavDir)$(@B).wav + +#========================================== +# Rules for files in sound\windsound +#========================================== + +{$(R_WINDSOUNDDIR)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_WINDSOUNDDIR)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) -I$(R_WSHR) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +# Rules for files in sound\fmod +#========================================== + +{$(R_FMODDIR)}.c{$(R_OBJTTY)}.o: + $(Q)$(CC) $(CFLAGS) $(FMODFLAGS) -I$(R_WSHR) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +{$(R_FMODDIR)}.c{$(R_OBJGUI)}.o: + $(Q)$(CC) $(CFLAGS) $(FMODFLAGS) -I$(R_WSHR) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $< + +#========================================== +#=============== TARGETS ================== +#========================================== + +# +# The game target. +# +# +# Everything +# + +all : package + +!IF "$(INTERNET_AVAILABLE)" == "Y" +!IF "$(GIT_AVAILABLE)" == "Y" +$(LUASRC)lua.h: + git submodule init $(SUBM)lua + git submodule update $(SUBM)lua +# git submodule update --remote $(SUBM)lua +# +#aka PDCDEP +!IF "$(ADD_CURSES)" == "Y" +$(PDCURSES_TOP)curses.h: + git submodule init $(SUBM)$(R_PDCDIST) + git submodule update $(SUBM)$(R_PDCDIST) +# git submodule update --remote $(SUBM)$(R_PDCDIST) +!ENDIF +!ELSE # GIT_AVAILABLE no +CURLLUASRC=http://www.lua.org/ftp/lua-5.4.8.tar.gz +CURLLUADST=lua-5.4.8.tar.gz + +#CURLPDCSRC=https://github.com/wmcbrine/PDCurses/archive/refs/tags/3.9.zip +CURLPDCSRC=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v4.4.0.zip +CURLPDCDST=$(PDCDIST).zip + +$(LUASRC)lua.h: + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + cd $(R_LIBDIR) + curl -L $(CURLLUASRC) -o $(CURLLUADST) + tar -xvf $(CURLLUADST) + cd $(R_SRC) +!IF "$(ADD_CURSES)" == "Y" +$(PDCURSES_TOP)curses.h: + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + cd $(LIBDIR) + curl -L $(CURLPDCSRC) -o $(CURLPDCDST) + if not exist $(PDCDIST)*.* mkdir $(R_PDCDIST) + tar -C $(R_PDCDIST) --strip-components=1 -xvf $(CURLPDCDST) + cd $(R_SRC) +!ENDIF # ADD_CURSES +!ENDIF # GIT_AVAILABLE +!ELSE # INTERNET_AVAILABLE +$(LUASRC)lua.h: +!IF "$(ADD_CURSES)" == "Y" +$(PDCURSES_TOP)curses.h: +!ENDIF +!ENDIF # INTERNET_AVAILABLE + +#========================================== +# Main game targets. +#========================================== + +# The section for linking the NetHack image looks a little strange at +# first, especially if you are used to UNIX makes, or NDMAKE. It is +# Microsoft nmake specific, and it gets around the problem of the +# link command line being too long for the linker. An "in-line" linker +# response file is generated temporarily. +# +# It takes advantage of the following features of nmake: +# +# Inline files : +# Specifying the "<<" means to start an inline file. +# Another "<<" at the start of a line closes the +# inline file. +# +# Substitution within Macros: +# $(mymacro:string1=string2) replaces every +# occurrence of string1 with string2 in the +# macro mymacro. Special ascii key codes may be +# used in the substitution text by preceding it +# with ^ as we have done below. Every occurrence +# of a in $(ALLOBJ) is replaced by +# <+>. + +GAMEOBJ=$(ALLOBJ:^ =^ +) +GAMEOBJ=$(GAMEOBJ:^ =^ +) + +# +# DO NOT INDENT THE << below! +# + +#-------- +# NetHack +#-------- +# + +$(GAMEDIR)NetHack.exe : gamedir.tag $(OTTY)consoletty.o \ + $(ALLOBJTTY) $(CURSESWINCONOBJS) \ + $(TTYSOUNDOBJS) $(OTTY)date.o $(OTTY)console.res \ + $(LUALIB) $(TTYOBJTTY) $(PDCTXTLIB) $(PDCTXTOBJS) $(OTTYHACKLIB) + @if not exist $(GAMEDIR)*.* mkdir $(R_GAMEDIR) + @echo Linking $(@:\=/) + $(link) $(LFLAGS) $(conlflags) /STACK:2048 /PDB:$(GAMEDIR)$(@B).PDB /MAP:$(OTTY)$(@B).MAP \ + $(LIBS) $(PDCTXTLIB) $(LUALIB) $(TTYSOUNDLIBS) $(OTTYHACKLIB) \ + $(conlibs) $(BCRYPT) -out:$@ @<<$(@B).lnk + $(GAMEOBJTTY) + $(ALLOBJTTY) + $(TTYOBJTTY) + $(TTYSOUNDOBJS) $(CURSESWINCONOBJS) $(PDCTXTOBJS) + $(OTTY)consoletty.o + $(OTTY)date.o + $(OTTY)console.res +<< keep + @if exist binary.tag del binary.tag + +#--------- +# NetHackW +#--------- +# +$(GAMEDIR)NetHackW.exe : gamedir.tag $(OGUI)tile.o \ + $(ALLOBJGUI) $(GAMEOBJGUI) $(GUIOBJ) $(GUISOUNDOBJS) \ + $(CURSESWINGUIOBJS) $(OGUI)date.o \ + $(OGUI)NetHackW.res \ + $(LUALIB) $(PDCGUILIB) $(PDCGUIOBJS) $(OGUIHACKLIB) + @if not exist $(GAMEDIR)*.* mkdir $(R_GAMEDIR) + @echo Linking $(@:\=/) + $(link) $(LFLAGS) $(guilflags) /STACK:2048 /PDB:$(GAMEDIR)$(@B).PDB \ + /MAP:$(OGUI)$(@B).MAP \ + $(LIBS) $(PDCGUILIB) $(LUALIB) \ + $(GUISOUNDLIBS) $(OGUIHACKLIB) \ + $(guilibs) $(COMCTRL) $(BCRYPT) -out:$@ @<<$(@B).lnk + $(GAMEOBJGUI) + $(ALLOBJGUI) + $(GUIOBJ) + $(GUISOUNDOBJS) $(CURSESWINGUIOBJS) $(PDCGUIOBJS) + $(OGUI)tile.o + $(OGUI)date.o + $(OGUI)NetHackW.res +<< keep + +#-------- +# install +#-------- +# +binary.tag: $(DAT)data $(DAT)rumors $(DAT)oracles $(DLB) \ + $(HACKCSRC) $(SOUNDSRCS) + copy nhdat$(NHV) $(GAMEDIR) + copy $(DAT)license $(GAMEDIR) + if exist $(DAT)opthelp copy $(DAT)opthelp $(GAMEDIR) + if exist $(MSWSYS)sysconf.template copy $(MSWSYS)sysconf.template $(GAMEDIR) + if exist $(DAT)symbols copy $(DAT)symbols $(GAMEDIR)symbols + if exist $(DOC)guidebook.txt copy $(DOC)guidebook.txt $(GAMEDIR)Guidebook.txt + if exist $(DOC)nethack.txt copy $(DOC)nethack.txt $(GAMEDIR)NetHack.txt +# if exist $(UTIL)sfctool.pdb copy $(UTIL)sfctool.pdb $(GAMEDIR)sfctool.pdb + @if exist $(GAMEDIR)NetHack.PDB echo NOTE: You may want to remove $(U_GAMEDIR)/NetHack.PDB to conserve space + @if exist $(GAMEDIR)NetHackW.PDB echo NOTE: You may want to remove $(U_GAMEDIR)/NetHackW.PDB to conserve space + -if exist $(MSWSYS)nethackrc.template copy $(MSWSYS)nethackrc.template $(R_GAMEDIR) + -if not exist $(GAMEDIR)record. goto>$(GAMEDIR)record. +! IF ("$(USE_DLB)" == "Y") + copy /Y nhdat$(NHV) $(GAMEDIR) +! ELSE + copy $(DAT)bogusmon $(GAMEDIR) + copy $(DAT)cmdhelp $(GAMEDIR) + copy $(DAT)data $(GAMEDIR) + copy $(DAT)engrave $(GAMEDIR) + copy $(DAT)epitaph $(GAMEDIR) + copy $(DAT)help $(GAMEDIR) + copy $(DAT)hh $(GAMEDIR) + copy $(DAT)history $(GAMEDIR) + copy $(DAT)license $(GAMEDIR) + copy $(DAT)optmenu $(GAMEDIR) + copy $(DAT)oracles $(GAMEDIR) + copy $(DAT)rumors $(GAMEDIR) + copy $(DAT)symbols $(GAMEDIR) + copy $(DAT)tribute $(GAMEDIR) + copy $(DAT)wizhelp $(GAMEDIR) + copy /Y $(DAT)*.lua $(GAMEDIR) + if exist $(DAT)guioptions copy $(DAT)guioptions $(GAMEDIR) + if exist $(DAT)keyhelp copy $(DAT)keyhelp $(GAMEDIR) + if exist $(DAT)options copy $(DAT)options $(GAMEDIR) + if exist $(DAT)porthelp copy $(DAT)porthelp $(GAMEDIR) + if exist $(DAT)ttyoptions copy $(DAT)ttyoptions $(GAMEDIR) +! ENDIF + echo binary built > $@ + +# copy $(MSWSYS)windsyshlp $(GAMEDIR) + +recover: $(OUTLHACKLIB) $(U)recover.exe + if exist $(U)recover.exe copy $(U)recover.exe $(GAMEDIR) + if exist $(DOC)recover.txt copy $(DOC)recover.txt $(GAMEDIR)recover.txt + +$(OUTL)utility.tag: $(INCL)nhlua.h outldir$(TARGET_CPU).tag $(OUTLHACKLIB) $(U)tile2bmp.exe $(U)makedefs.exe + @echo utilities made >$@ + @echo utilities made. + +$(INCL)nhlua.h: + @echo /* nhlua.h - generated by Makefile from Makefile.nmake */ > $@ + @echo #include "lua.h" >> $@ + @echo ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN; >> $@ + @echo #include "lualib.h" >> $@ + @echo #include "lauxlib.h" >> $@ + @echo /*nhlua.h*/ >> $@ + +tileutil: $(U)gif2txt.exe $(U)gif2tx32.exe $(U)txt2ppm.exe + @echo Optional tile development utilities are up to date. + +$(OGUI)NetHackW.res: $(SRC)tiles.bmp $(MSWIN)NetHackW.rc $(MSWIN)NetHack.ico \ + $(MSWIN)mnsel.bmp $(MSWIN)mnselcnt.bmp $(MSWIN)mnunsel.bmp \ + $(MSWIN)petmark.bmp $(MSWIN)pilemark.bmp $(MSWIN)NetHack.ico \ + $(MSWIN)rip.bmp $(MSWIN)splash.bmp $(MSWIN)NetHackW.exe.manifest $(WAV) + @echo Building resource file $@ from $** + $(rc) -nologo -r -fo$@ -i$(MSWIN) -i$(SndWavDir) -dNDEBUG -dVIA_MAKE $(RCFLAGS) $(MSWIN)NetHackW.rc + +$(OTTY)console.res: $(MSWSYS)console.rc $(MSWSYS)NetHack.ico $(WAV) + @echo Building resource file $@ from $** + $(rc) -nologo -r -fo$@ -i$(MSWSYS) -i$(SndWavDir) -dNDEBUG $(RCFLAGS) $(MSWSYS)console.rc + +# +# Secondary Targets. +# + +#========================================== +# Makedefs Stuff +#========================================== +$(U)nhsizes3.exe: $(OUTL)nhsizes3.o + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) -out:$@ $(OUTL)nhsizes.o $(OUTL)panic$(HOST).o $(OUTL)alloc$(HOST).o + +$(OUTL)nhsizes3.o: $(CONFIG_H) nhsizes3.c + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -Fo$@ nhsizes3.c + +$(U)makedefs.exe: $(OUTLHACKLIB) $(MAKEDEFSOBJS) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" -out:$@ $(MAKEDEFSOBJS) $(OUTLHACKLIB) + +$(OUTL)makedefs.o: $(U)makedefs.c $(SRC)mdlib.c $(CONFIG_H) $(INCL)permonst.h \ + $(INCL)objclass.h $(INCL)sym.h $(INCL)defsym.h \ + $(INCL)artilist.h $(INCL)dungeon.h $(INCL)obj.h \ + $(INCL)monst.h $(INCL)you.h $(INCL)flag.h \ + $(INCL)dlb.h + @if not exist $(OBJTTY)*.* echo creating directory $(OBJTTY:\=/) + @if not exist $(OBJTTY)*.* mkdir $(R_OBJTTY) + $(Q)$(CC) -DENUM_PM $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) -Fo$@ $(U)makedefs.c +# $(Q)$(CC) -DENUM_PM $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) /EP -Fo$@ $(U)makedefs.c >$(OUTL)makedefs.c.preproc + +# +# This is awful, but it allows the GITHASH, GITBRANCH and GITPREFIX macros to be +# defined and utilized, using only build-in Windows and nmake commands, +# as well as the necessary git commands. +# +# We build a temporary Makefile on-the-fly for compiling date.c and +# invoke nmake again. +# +$(OTTY)date.o: $(HACKINCL) $(HACKSRC) $(HACKOBJ) $(ALLOBJTTY) $(CURSESOBJ) +!IF "$(GIT_AVAILABLE)" == "1" + @git rev-parse --verify HEAD 2>&1 >$(OTTY)date1.tmp + @git rev-parse --abbrev-ref HEAD 2>&1 >$(OTTY)date2.tmp + @git config nethack.substprefix 2>&1 >$(OTTY)date3.tmp + @echo.>date.nmk + @echo OBJ = $(OBJTTY)>>date.nmk + @echo O = ^$(OBJTTY)^^^\>>date.nmk + @echo cc = $(cc)>>date.nmk + @echo CFLAGS = $(CFLAGS) ^\>>date.nmk + @for /F "usebackq" %%A IN ("$(OTTY)date1.tmp") DO @echo. -DNETHACK_GIT_SHA=\"%%A\" ^\>>date.nmk + @for /F "usebackq" %%A IN ("$(OTTY)date2.tmp") DO @echo. -DNETHACK_GIT_BRANCH=\"%%A\">>date.nmk + @for /F "usebackq" %%A IN ("$(OTTY)date3.tmp") DO @echo. -DNETHACK_GIT_PREFIX=\"%%A\">>date.nmk + @echo.>>date.nmk + @echo default: ^$(OTTY)date.o>>date.nmk + @echo.>>date.nmk + @echo ^$(OTTY)date.o: >>date.nmk + @echo. ^$(cc) ^$(CFLAGS) -Fo^$@ date.c>>date.nmk + @echo.>>date.nmk + @$(MAKE) /NOLOGO /A -f date.nmk +!ENDIF + +$(OGUI)date.o: $(HACKINCL) $(HACKSRC) $(HACKOBJ) $(ALLOBJGUI) +!IF "$(GIT_AVAILABLE)" == "1" + @git rev-parse --verify HEAD 2>&1 >$(OGUI)date1.tmp + @git rev-parse --abbrev-ref HEAD 2>&1 >$(OGUI)date2.tmp + @git config nethack.substprefix 2>&1 >$(OTTY)date3.tmp + @echo.>date.nmk + @echo OBJ = $(OBJGUI)>>date.nmk + @echo O = ^$(OBJGUI)^^^\>>date.nmk + @echo cc = $(cc)>>date.nmk + @echo CFLAGS = $(CFLAGS) ^\>>date.nmk + @for /F "usebackq" %%A IN ("$(OGUI)date1.tmp") DO @echo. -DNETHACK_GIT_SHA=\"%%A\" ^\>>date.nmk + @for /F "usebackq" %%A IN ("$(OGUI)date2.tmp") DO @echo. -DNETHACK_GIT_BRANCH=\"%%A\">>date.nmk + @for /F "usebackq" %%A IN ("$(OTTY)date3.tmp") DO @echo. -DNETHACK_GIT_PREFIX=\"%%A\">>date.nmk + @echo.>>date.nmk + @echo default: ^$(OGUI)date.o>>date.nmk + @echo.>>date.nmk + @echo ^$(OGUI)date.o: >>date.nmk + @echo. ^$(cc) ^$(CFLAGS) -Fo^$@ date.c>>date.nmk + @echo.>>date.nmk + @$(MAKE) /NOLOGO /A -f date.nmk +!ENDIF + +$(OGUI)sfbase.o: sfbase.c $(HACK_H) $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) /EP $(@B).c > $(OGUI)$(@B).c.preproc + $(Q)$(CC) $(CFLAGS) -Fo$@ $(@B).c + +$(OTTY)sfbase.o: sfbase.c $(HACK_H) $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) /EP $(@B).c > $(OTTY)$(@B).c.preproc + $(Q)$(CC) $(CFLAGS) -Fo$@ $(@B).c + +# +# date.h is not used with NetHack 5.0 +# onames.h is not used with NetHack 5.0 +# pm.h is not used with NetHack 5.0 + +$(INCL)date.h $(OPTIONS_FILE) : $(U)makedefs.exe + $(U)makedefs -v + +$(INCL)onames.h : $(U)makedefs.exe + $(U)makedefs -o + +$(INCL)pm.h : $(U)makedefs.exe + $(U)makedefs -p + + +#========================================== +# HACKLIB +#========================================== + +$(OUTLHACKLIB): $(OUTLHACKLIBOBJS) + @echo Building library $@ from $** + @$(librarian) /OUT:$@ $(OUTLHACKLIBOBJS) + +$(OTTYHACKLIB): $(OTTYHACKLIBOBJS) + @echo Building library $@ from $** + @$(librarian) /OUT:$@ $(OTTYHACKLIBOBJS) + +$(OGUIHACKLIB): $(OGUIHACKLIBOBJS) + @echo Building library $@ from $** + @$(librarian) /OUT:$@ $(OGUIHACKLIBOBJS) + +#========================================== +# uudecode utility and uuencoded targets +#========================================== + +$(U)uudecode.exe: $(OUTL)uudecode.o + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" \ + -out:$@ $(OUTL)uudecode.o + +$(OUTL)uudecode.o: $(SSYS)uudecode.c + $(Q)$(CC) $(CFLAGS) -wd4702 $(TTYDEF) $(CROSSCOMPILE) \ + /D_CRT_SECURE_NO_DEPRECATE -Fo$@ $(SSYS)uudecode.c + +$(MSWIN)mnsel.bmp: $(U)uudecode.exe $(MSWIN)mnsel.uu +$(MSWIN)mnselcnt.bmp: $(U)uudecode.exe $(MSWIN)mnselcnt.uu +$(MSWIN)mnunsel.bmp: $(U)uudecode.exe $(MSWIN)mnunsel.uu +$(MSWIN)petmark.bmp: $(U)uudecode.exe $(MSWIN)petmark.uu +$(MSWIN)pilemark.bmp: $(U)uudecode.exe $(MSWIN)pilemark.uu +$(MSWIN)rip.bmp: $(U)uudecode.exe $(MSWIN)rip.uu +$(MSWIN)splash.bmp: $(U)uudecode.exe $(MSWIN)splash.uu + +$(MSWIN)NetHack.ico: $(U)uudecode.exe $(MSWSYS)nhico.uu + $(U)uudecode.exe $(MSWSYS)nhico.uu + move nethack.ico $@ + +$(MSWSYS)NetHack.ico: $(U)uudecode.exe $(MSWSYS)nhico.uu + $(U)uudecode.exe $(MSWSYS)nhico.uu + move nethack.ico $@ + +#================================================= +# Create directories for holding output files +#================================================= + +gamedir.tag: + @if not exist $(GAMEDIR)*.* echo creating directory $(GAMEDIR:\=/) + @if not exist $(GAMEDIR)*.* mkdir $(R_GAMEDIR) + @echo directory created > $@ + +ottydir$(TARGET_CPU).tag: + @if not exist $(OBJTTY)*.* echo creating directory $(OBJTTY:\=/) + @if not exist $(OBJTTY)*.* mkdir $(R_OBJTTY) + @echo directory created >$@ + +oguidir$(TARGET_CPU).tag: + @if not exist $(OBJGUI)*.* echo creating directory $(OBJGUI:\=/) + @if not exist $(OBJGUI)*.* mkdir $(R_OBJGUI) + @echo directory created >$@ + +outldir$(TARGET_CPU).tag: + @if not exist $(OBJUTIL)*.* echo creating directory $(OBJUTIL:\=/) + @if not exist $(OBJUTIL)*.* mkdir $(R_OBJUTIL) + @echo directory created >$@ + +oluadir$(TARGET_CPU).tag: + @if not exist $(OBJLUA)*.* echo creating directory $(OBJLUA:\=/) + @if not exist $(OBJLUA)*.* mkdir $(R_OBJLUA) + @echo directory created >$@ + +opdcdir$(TARGET_CPU).tag: + @if not exist $(OBJPDC)*.* echo creating directory $(OBJPDC:\=/) + @if not exist $(OBJPDC)*.* mkdir $(R_OBJPDC) + @echo directory created >$@ + +opdctxtdir$(TARGET_CPU).tag: + @if not exist $(OBJPDCTXT)*.* echo creating directory $(OBJPDCTXT:\=/) + @if not exist $(OBJPDCTXT)*.* mkdir $(R_OBJPDCTXT) + @echo directory created >$@ + +opdcguidir$(TARGET_CPU).tag: + @if not exist $(OBJPDCGUI)*.* echo creating directory $(OBJPDCGUI:\=/) + @if not exist $(OBJPDCGUI)*.* mkdir $(R_OBJPDCGUI) + @echo directory created >$@ + +libdir.tag: + @if not exist $(LIBDIR)*.* echo creating directory $(LIB:\=/) + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + @echo directory created >$@ + +pkgdir.tag: + if NOT exist $(PkgDir)*.* echo creating directory $(PkgDir:\=/) + if NOT exist $(PkgDir)*.* mkdir $(R_PkgDir) + @echo directory created >$@ + +#========================================== +# Notify of any CL environment variables +# in effect since they change the compiler +# options. +#========================================== + +envchk.tag: cpu.tag +!IFDEF TTYOBJTTY + @echo tty window support included +! IF "$(CURSES_CONSOLE)" == "Y" + @echo curses console window support also included +! ENDIF +! IF "$(CURSES_GRAPHICAL)" == "Y" + @echo curses graphical window support also included +! ENDIF +!ENDIF +! IF "$(CL)"!="" +# @echo Warning, the CL Environment variable is defined: +# @echo CL=$(CL) +! ENDIF + @echo "cflags=$(CFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET)" + @echo envchk >$@ + +cpu.tag: +! IF "$(TARGET_CPU)"=="x64" + @echo Windows x64 64-bit target build +! ELSE +! IF "$(TARGET_CPU)"=="arm64" + @echo Windows arm64 64-bit target build +! ELSE + @echo Windows x86 32-bit target build +! ENDIF +! ENDIF + @echo cpu >$@ + +#========================================== +#=========== SECONDARY TARGETS ============ +#========================================== +fetch-lua: fetch-actual-Lua + +fetch-Lua: fetch-actual-Lua + +fetch-actual-Lua: + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + cd $(LIBDIR) + curl -L -R -O http://www.lua.org/ftp/lua-$(LUAVER).tar.gz + tar zxf lua-$(LUAVER).tar.gz + if exist lua-$(LUAVER).tar.gz del lua-$(LUAVER).tar.gz + if exist lua-$(LUAVER).tar del lua-$(LUAVER).tar + cd $(R_SRC) + @echo Lua has been fetched into $(LIBDIR)lua-$(LUAVER) + +!IF "$(ADD_CURSES)" == "Y" +fetch-pdcurses: + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + cd $(LIBDIR) +# curl -L -R https://codeload.github.com/wmcbrine/PDCurses/zip/master -o pdcurses.zip + curl -L -R https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v4.5.1.zip -o $(PDCDIST).zip + powershell -command "Expand-Archive -Path .\$(PDCDIST).zip -DestinationPath ./$(PDCDIST)-temp" + if exist .\$(PDCDIST)\* rd .\$(PDCDIST) /s /Q + move .\$(PDCDIST)-temp\PDCurses-master . + ren PDCurses-master $(PDCDIST) + if exist .\$(PDCDIST)-temp\* rd .\$(PDCDIST)-temp /s /Q + if exist .\$(PDCDIST).zip del .\$(PDCDIST).zip + cd $(R_SRC) + @echo $(PDCDIST) has been fetched into $(LIBDIR)$(PDCDIST) +!ENDIF + +#https://github.com/universal-ctags/ctags/archive/refs/tags/v6.2.1.zip +CTAGSVER=6.2.1 +CTAGSURL=https://github.com/universal-ctags/ctags/archive/refs/tags/v$(CTAGSVER).zip + +fetch-ctags: $(LIBDIR)ctags.zip + +build-ctags: $(LIBDIR)ctags\ctags-$(CTAGSVER)\ctags.exe + +$(LIBDIR)ctags\ctags-$(CTAGSVER)\ctags.exe: $(LIBDIR)ctags\ctags-$(CTAGSVER)\mk_mvc.mak + @ECHO on + cd $(LIBDIR) + cd ctags\ctags-$(CTAGSVER) + copy win32\config_mvc.h config.h + copy win32\gnulib_h\langinfo.h gnulib + copy win32\gnulib_h\fnmatch.h gnulib + nmake -f mk_mvc.mak + copy /Y ctags.exe ..\ctags.exe + @echo ctags has been compiled into $(LIBDIR)ctags + @ECHO off + cd ..\.. + cd $(R_SRC) + +$(LIBDIR)ctags.zip: + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + cd $(LIBDIR) + curl -L -R $(CTAGSURL) -o ctags.zip + cd $(R_SRC) + @echo ctags source has been fetched into $@ + +$(LIBDIR)ctags\ctags-$(CTAGSVER)\mk_mvc.mak: $(LIBDIR)ctags.zip + @if not exist $(LIBDIR)*.* mkdir $(R_LIBDIR) + cd $(LIBDIR) + powershell -command "Expand-Archive -Path $(LIBDIR)ctags.zip -DestinationPath $(LIBDIR)ctags" + cd $(R_SRC) + @echo ctags source has been expanded from zip file into $(LIBDIR)\ctags\ctags-$(CTAGSVER) + +clean-ctags: + cd $(LIBDIR) + rd $(LIBDIR)\ctags\ctags-$(CTAGSVER) /S + cd $(R_SRC) + +spotless-ctags: + cd $(LIBDIR) + @if exist ctags\ctags.exe del ctags\ctags.exe + @if exist ctags.zip del ctags.zip + cd $(R_SRC) + + +#========================================== +# DLB utility and nhdatNNN file creation +#========================================== + +$(U)dlb.exe: $(DLBOBJ_HOST) $(OUTL)dlb$(HOST).o $(OUTLHACKLIB) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" $(OUTLHACKLIB) -out:$@ @<<$(@B).lnk + $(OUTL)dlb_main$(HOST).o + $(OUTL)dlb$(HOST).o + $(OUTL)alloc$(HOST).o + $(OUTL)panic$(HOST).o +<< + +!IFDEF TEST_CROSSCOMPILE +$(OUTL)dlb$(HOST).o: $(OUTL)dlb_main$(HOST).o $(OUTL)alloc$(HOST).o $(OUTL)panic$(HOST).o $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) /Fo$@ $(SRC)dlb.c +!ENDIF + +$(OUTL)dlb.o: $(OUTL)dlb_main.o $(OUTL)alloc.o $(OUTL)panic.o $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) /Fo$@ $(SRC)dlb.c + +$(OTTY)dlb.o: $(OTTY)dlb_main.o $(OTTY)alloc.o $(OTTY)panic.o $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) /Fo$@ $(SRC)dlb.c + +$(OGUI)dlb.o: $(OGUI)dlb_main.o $(OGUI)alloc.o $(OGUI)panic.o $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) /Fo$@ $(SRC)dlb.c + +$(OUTL)dlb_main.o: $(UTIL)dlb_main.c $(INCL)config.h $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /Fo$@ $(UTIL)dlb_main.c + +$(OTTY)dlb_main.o: $(UTIL)dlb_main.c $(INCL)config.h $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /Fo$@ $(UTIL)dlb_main.c + +$(OGUI)dlb_main.o: $(UTIL)dlb_main.c $(INCL)config.h $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /Fo$@ $(UTIL)dlb_main.c + +$(DAT)porthelp: $(MSWSYS)porthelp + @copy $(MSWSYS)porthelp $@ >nul + +!IF ("$(USE_DLB)"=="Y") +nhdat$(NHV): $(U)dlb.exe $(DAT)data $(DAT)oracles $(OPTIONS_FILE) $(LUA_FILES) \ + $(DAT)rumors $(DAT)help $(DAT)hh $(DAT)cmdhelp $(DAT)keyhelp \ + $(DAT)history $(DAT)opthelp $(DAT)optmenu $(DAT)wizhelp $(DAT)porthelp \ + $(DAT)license $(DAT)engrave $(DAT)epitaph $(DAT)bogusmon $(DAT)tribute + @echo Building $@ + @cd $(DAT) + @echo data >dlb.lst + @echo oracles >>dlb.lst + @if exist options @echo options >>dlb.lst + @if exist ttyoptions @echo ttyoptions >>dlb.lst + @if exist guioptions @echo guioptions >>dlb.lst + @if exist porthelp @echo porthelp >>dlb.lst + @echo rumors >>dlb.lst + @echo help >>dlb.lst + @echo hh >>dlb.lst + @echo cmdhelp >>dlb.lst + @echo keyhelp >>dlb.lst + @echo history >>dlb.lst + @echo opthelp >>dlb.lst + @echo optmenu >>dlb.lst + @echo wizhelp >>dlb.lst + @echo license >>dlb.lst + @echo engrave >>dlb.lst + @echo epitaph >>dlb.lst + @echo bogusmon >>dlb.lst + @echo tribute >>dlb.lst +# @for %%N in ($(luawildcards)) do dir /b %%N >>dlb.lst + @for %%N in (*.lua) do @echo %%N >>dlb.lst + @$(U)dlb cIf dlb.lst $(SRC)nhdat + @cd $(SRC) +!ENDIF + +#========================================== +# Recover Utility +#========================================== + +$(U)recover.exe: $(RECOVOBJS) $(OUTLHACKLIB) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" \ + -out:$@ $(RECOVOBJS) $(OUTLHACKLIB) + +$(OUTL)recover.o: $(CONFIG_H) $(U)recover.c $(MSWSYS)win32api.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -Fo$@ $(U)recover.c + +#========================================== +# Tile Mapping +#========================================== + +tile.c: $(U)tilemap.exe + @$(U)tilemap + @echo A new $(@:\=/) has been created + +$(U)tilemap.exe: $(OUTL)tilemap.o $(OUTL)monst.o $(OUTL)objects.o $(OUTL)drawing.o $(OUTLHACKLIB) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" $(HACKLIB) -out:$@ \ + $(OUTL)tilemap.o $(OUTL)monst.o $(OUTL)objects.o $(OUTL)drawing.o $(OUTLHACKLIB) + +$(OUTL)tilemap.o: $(WSHR)tilemap.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -Fo$@ $(WSHR)tilemap.c + +$(OUTL)tiletx32.o: $(WSHR)tilemap.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) /DTILETEXT /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)tilemap.c + +$(OUTL)tiletxt.o: $(WSHR)tilemap.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) /DTILETEXT -Fo$@ $(WSHR)tilemap.c + +$(OUTL)gifread.o: $(WSHR)gifread.c $(CONFIG_H) $(TILE_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -I$(WSHR) -Fo$@ $(WSHR)gifread.c + +$(OUTL)gifrd32.o: $(WSHR)gifread.c $(CONFIG_H) $(TILE_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)gifread.c + +$(OUTL)ppmwrite.o: $(WSHR)ppmwrite.c $(CONFIG_H) $(TILE_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -I$(WSHR) -Fo$@ $(WSHR)ppmwrite.c + +$(OUTL)tiletext.o: $(WSHR)tiletext.c $(CONFIG_H) $(TILE_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -I$(WSHR) -Fo$@ $(WSHR)tiletext.c + +$(OUTL)tilete32.o: $(WSHR)tiletext.c $(CONFIG_H) $(TILE_H) + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)tiletext.c + +#========================================== +# Optional Tile Utilities +#========================================== + +$(U)gif2txt.exe: $(GIFREADERS_HOST) $(TEXT_IO) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" -out:$@ @<<$(@B).lnk + $(GIFREADERS_HOST:^ =^ + ) + $(TEXT_IO:^ =^ + ) +<< + +$(U)gif2tx32.exe: $(GIFREADERS32_HOST) $(TEXT_IO32) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" -out:$@ @<<$(@B).lnk + $(GIFREADERS32_HOST:^ =^ + ) + $(TEXT_IO32:^ =^ + ) +<< + +$(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" -out:$@ @<<$(@B).lnk + $(PPMWRITERS:^ =^ + ) + $(TEXT_IO:^ =^ + ) +<< + +$(SRC)tiles.bmp: $(U)tile2bmp.exe $(TILEFILES) + @echo Creating 16x16 binary tile files (this may take some time) + @$(U)tile2bmp $@ + +$(U)tile2bmp.exe: $(OUTL)tile2bmp.o $(TEXT_IO) $(OUTL)alloc.o $(OUTL)panic.o + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" $(OUTLHACKLIB) -out:$@ @<<$(@B).lnk + $(OUTL)tile2bmp.o + $(TEXT_IO:^ =^ + ) + $(OUTL)alloc.o + $(OUTL)panic.o +<< + +$(U)til2bm32.exe: $(OUTL)til2bm32.o $(TEXT_IO32) + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" $(OUTLHACKLIB) -out:$@ @<<$(@B).lnk + $(OUTL)til2bm32.o + $(TEXT_IO32:^ =^ + ) +<< + +$(OUTL)tile2bmp.o: $(WSHR)tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)win32api.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) -I$(WSHR) /DPACKED_FILE /Fo$@ $(WSHR)tile2bmp.c + +#$(OUTL)til2bm32.o: $(WSHR)tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)win32api.h +# $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) -I$(WSHR) /DPACKED_FILE /DTILE_X=32 /DTILE_Y=32 /Fo$@ $(WSHR)tile2bmp.c + +$(U)tile2x11.exe: $(OUTL)tile2x11.o $(OUTL)tiletext.o $(OUTL)tiletxt.o $(OUTL)alloc.o \ + $(OUTL)panic.o $(OUTL)monst.o $(OUTL)objects.o + @echo Linking $(@:\=/) + @$(link) $(LFLAGS) /PDB:"$(OUTL)$(@B).PDB" /MAP:"$(OUTL)$(@B).MAP" -out:$@ @<<$(@B).lnk + $(OUTL)tile2x11.o + $(OUTL)tiletext.o + $(OUTL)tiletxt.o + $(OUTL)drawing.o + $(OUTL)monst.o + $(OUTL)objects.o + $(OUTL)alloc.o + $(OUTL)panic.o +<< + +$(OUTL)tile2x11.o: $(X11)tile2x11.c $(HACK_H) $(TILE_H) $(INCL)tile2x11.h + $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -I$(WSHR) /DPACKED_FILE /Fo$@ $(X11)tile2x11.c + +$(SRC)x11tiles: $(U)tile2x11.exe $(WSHR)monsters.txt $(WSHR)objects.txt \ + $(WSHR)other.txt \ + $(WSHR)monsters.txt + $(U)tile2x11 $(WSHR)monsters.txt $(WSHR)objects.txt \ + $(WSHR)other.txt \ + -grayscale $(WSHR)monsters.txt + +#=============================================================================== +# PDCurses +#=============================================================================== +!IF "$(ADD_CURSES)" == "Y" +!IF "$(CURSES_CONSOLE)" == "Y" +$(PDCTXTLIB) : $(PDCCOMMONOBJS) $(PDCTXTOBJS) + @echo Building library $@ from $** + @$(librarian) -nologo /out:$@ $(PDCCOMMONOBJS) $(PDCTXTOBJS) +!ENDIF +!IF "$(CURSES_GRAPHICAL)" == "Y" +$(PDCGUILIB) : $(PDCCOMMONOBJS) $(PDCGUIOBJS) + @echo Building library $@ from $** + @$(librarian) -nologo /out:$@ $(PDCCOMMONOBJS) $(PDCGUIOBJS) +!ENDIF +!ENDIF +$(OGUI)guitty.o: $(MSWSYS)guitty.c $(WINDHDR) $(HACK_H) $(TILE_H) + +#=============================================================================== +# LUA +#=============================================================================== + +lua.exe: $(OLUA)lua.o $(LUALIB) + @echo Linking $(@:\=/) + @$(link) /OUT:$@ $(OLUA)lua.o $(LUALIB) + +#luac.exe: $(OLUA)luac.o $(LUALIB) +# @echo Linking $(@:\=/) +# @$(link) /OUT:$@ $(OLUA)luac.o $(LUALIB) + +$(LIBDIR)lua$(LUAVER)-$(TARGET_CPU).dll: $(LUAOBJFILES) + @echo Linking $(@:\=/) + @$(link) /DLL /IMPLIB:$(LIBDIR)lua$(LUAVER).lib /OUT:$@ $(LUAOBJFILES) + +$(LIBDIR)lua$(LUAVER)-$(TARGET_CPU)-static.lib: $(LUAOBJFILES) + @echo Building library $@ from $** + @$(librarian) /OUT:$@ $(LUAOBJFILES) + +$(OLUA)lua.o: $(LUASRC)lua.c +#$(OLUA)luac.o: $(LUASRC)luac.c +$(OLUA)lapi.o: $(LUASRC)lapi.c + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -wd4244 -wd4701 -wd4702 -Fo$@ $(LUASRC)lapi.c + +#=================================================================== +# windsound dependencies +#=================================================================== +!IF "$(SOUND_WINDSOUND)" == "Y" +$(OTTY)windsound.o: $(WINDSOUNDDIR)windsound.c $(HACK_H) +$(OGUI)windsound.o: $(WINDSOUNDDIR)windsound.c $(HACK_H) +!ENDIF +#=================================================================== +# fmod dependencies +#=================================================================== +!IF "$(SOUND_FMOD)" == "Y" +$(OTTY)fmod.o: $(FMODDIR)fmod.c $(HACK_H) +$(OGUI)fmod.o: $(FMODDIR)fmod.c $(HACK_H) + +# Copy the DLL to GAMEDIR +$(GAMEDIR)$(FMODDLLBASENAME): + copy $(FMODLIBDLL) $@ +!ENDIF +#=================================================================== +# sys/windows dependencies +#=================================================================== + +$(OTTY)consoletty.o: $(MSWSYS)consoletty.c $(WINDHDR) $(HACK_H) $(TILE_H) +$(OTTY)win10.o: $(MSWSYS)win10.c $(WINDHDR) $(HACK_H) +$(OTTY)windsys.o: $(MSWSYS)windsys.c $(WINDHDR) $(HACK_H) +$(OTTY)windsound.o: $(WINDSOUNDDIR)windsound.c $(HACK_H) +#$(OTTY)sample.o: $(SOUNDDIR)sample.c $(HACK_H) +$(OTTY)windmain.o: $(MSWSYS)windmain.c $(WINDHDR) $(HACK_H) + +$(OGUI)consoletty.o: $(MSWSYS)consoletty.c $(WINDHDR) $(HACK_H) $(TILE_H) +$(OGUI)win10.o: $(MSWSYS)win10.c $(WINDHDR) $(HACK_H) +$(OGUI)windsys.o: $(MSWSYS)windsys.c $(WINDHDR) $(HACK_H) +$(OGUI)windsound.o: $(WINDSOUNDDIR)windsound.c $(HACK_H) +$(OGUI)windmain.o: $(MSWSYS)windmain.c $(WINDHDR) $(HACK_H) + +#=================================================================== +# win/win32 dependencies +#=================================================================== + +$(OGUI)mhaskyn.o: $(MSWIN)mhaskyn.c $(MSWIN)$(@B).h $(WINDHDR) $(HACK_H) +$(OGUI)mhdlg.o: $(MSWIN)mhdlg.c $(MSWIN)$(@B).h $(MSWIN)resource.h $(WINDHDR) $(HACK_H) +$(OGUI)mhfont.o: $(MSWIN)mhfont.c $(MSWIN)$(@B).h $(WINDHDR) $(HACK_H) +$(OGUI)mhinput.o: $(MSWIN)mhinput.c $(MSWIN)$(@B).h $(MSWIN)winMS.h $(WINDHDR) $(HACK_H) +$(OGUI)mhmain.o: $(MSWIN)mhmain.c $(ALL_GUIHDR) $(WINDHDR) $(HACK_H) +$(OGUI)mhmap.o: $(MSWIN)mhmap.c $(MSWIN)$(@B).h $(MSWIN)mhfont.h $(MSWIN)mhinput.h \ + $(MSWIN)mhmsg.h $(MSWIN)resource.h $(WINDHDR) $(HACK_H) +$(OGUI)mhmenu.o: $(MSWIN)mhmenu.c $(MSWIN)$(@B).h $(MSWIN)mhmain.h $(MSWIN)mhmsg.h \ + $(MSWIN)mhfont.h $(MSWIN)mhdlg.h $(MSWIN)resource.h $(WINDHDR) $(HACK_H) +$(OGUI)mhmsgwnd.o: $(MSWIN)mhmsgwnd.c $(MSWIN)$(@B).h $(MSWIN)mhmsg.h $(MSWIN)mhfont.h \ + $(MSWIN)winMS.h $(WINDHDR) $(HACK_H) +$(OGUI)mhrip.o: $(MSWIN)mhrip.c $(MSWIN)$(@B).h $(MSWIN)mhmsg.h $(MSWIN)mhfont.h \ + $(MSWIN)resource.h $(WINDHDR) $(HACK_H) +$(OGUI)mhsplash.o: $(MSWIN)mhsplash.c $(MSWIN)$(@B).h $(MSWIN)mhmsg.h $(MSWIN)mhfont.h \ + $(MSWIN)resource.h $(WINDHDR) $(HACK_H) +$(OGUI)mhstatus.o: $(MSWIN)mhstatus.c $(MSWIN)$(@B).h $(MSWIN)mhmsg.h $(MSWIN)mhfont.h \ + $(WINDHDR) $(HACK_H) +$(OGUI)mhtext.o: $(MSWIN)mhtext.c $(MSWIN)$(@B).h $(MSWIN)mhmsg.h $(MSWIN)mhfont.h \ + $(WINDHDR) $(HACK_H) +$(OGUI)mswproc.o: $(MSWIN)mswproc.c $(ALL_GUIHDR) $(MSWIN)resource.h $(WINDHDR) $(HACK_H) +$(OGUI)NetHackW.o: $(MSWIN)NetHackW.c $(ALL_GUIHDR) $(MSWIN)resource.h $(WINDHDR) $(HACK_H) + +#=================================================================== +# sys/share dependencies +#=================================================================== + +#$(OTTY)cppregex.o: $(SSYS)cppregex.cpp $(HACK_H) +# $(Q)$(CC) $(CPPFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $(SSYS)cppregex.cpp + +#$(OGUI)cppregex.o: $(SSYS)cppregex.cpp $(HACK_H) +# $(Q)$(CC) $(CPPFLAGS) $(GUIDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $(SSYS)cppregex.cpp + +#=============================================================================== +# CROSSCOMPILE +#=============================================================================== + +# Under a cross-compile, some of the values stored statically into +# text files cannot be trusted as being representative of the +# settings and features used on the build of the target binaries. +# +# We move some of that stuff into the game run-time by separating +# out the functions into src\mdlib.c to get some of the required +# functionality at game runtime instead of from a previously written +# data file. +# + +!IFDEF TEST_CROSSCOMPILE +$(OUTL)mdlib$(HOST).o: $(SRC)mdlib.c + $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) -Fo$@ $(SRC)mdlib.c +!ENDIF + +$(OUTL)mdlib.o: $(SRC)mdlib.c + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -Fo$@ $(SRC)mdlib.c +# $(Q)$(CC) $(CFLAGS) $(TTYDEF) /EP -Fo$@ $(SRC)mdlib.c >$(OUTL)mdlib.c.preproc + +#============================================ +# util dual-role CROSSCOMPILE dependencies +#============================================ +# +# These have dual-roles and need to be build for host and target platforms. +# +#$(OUTL)panic_host.o: $(U)panic.c $(CONFIG_H) +# $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) -Fo$@ $(U)panic.c + +$(OUTL)panic.o: $(U)panic.c $(CONFIG_H) + $(Q)$(CC) $(CFLAGS) -Fo$@ $(U)panic.c +$(OTTY)panic.o: $(U)panic.c $(CONFIG_H) + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -Fo$@ $(U)panic.c +$(OGUI)panic.o: $(U)panic.c $(CONFIG_H) + $(Q)$(CC) $(CFLAGS) $(GUIDEF) -Fo$@ $(U)panic.c + +#$(OUTL)drawing_host.o: drawing.c $(CONFIG_H) +# $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) -Fo$@ drawing.c + +$(OUTL)drawing.o: drawing.c $(CONFIG_H) $(INCL)color.h \ + $(INCL)sym.h $(INCL)defsym.h $(INCL)rm.h \ + $(INCL)objclass.h + $(Q)$(CC) $(CFLAGS) -Fo$@ drawing.c + +#$(OUTL)monst_host.o: monst.c $(CONFIG_H) $(INCL)permonst.h $(INCL)align.h \ +# $(INCL)monattk.h $(INCL)monflag.h $(INCL)sym.h \ +# $(INCL)defsym.h $(INCL)color.h +# $(Q)$(CC) $(CFLAGS) $(TTYDEF) -Fo$@ monst.c + +$(OUTL)monst.o: monst.c $(CONFIG_H) $(INCL)permonst.h $(INCL)align.h \ + $(INCL)monattk.h $(INCL)monflag.h $(INCL)sym.h \ + $(INCL)defsym.h $(INCL)color.h + $(Q)$(CC) $(CFLAGS) -Fo$@ monst.c + +#$(OUTL)objects_host.o: objects.c $(CONFIG_H) $(INCL)obj.h $(INCL)objclass.h \ +# $(INCL)prop.h $(INCL)skills.h $(INCL)color.h +# $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) /EP $(@B).c > $(OUTL)$(@B).c.preproc +# $(Q)$(CC) $(CFLAGS) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $(@B).c + +$(OUTL)objects.o: objects.c $(CONFIG_H) $(INCL)obj.h $(INCL)objclass.h \ + $(INCL)prop.h $(INCL)skills.h $(INCL)color.h + $(Q)$(CC) $(CFLAGS) /EP $(@B).c > $(OUTL)$(@B).c.preproc + $(Q)$(CC) $(CFLAGS) -Fo$@ $(@B).c + +#$(OUTL)alloc_host.o: alloc.c $(CONFIG_H) +# $(Q)$(CC) $(CFLAGS) $(TTYDEF) $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ alloc.c + +$(OUTL)alloc.o: alloc.c $(CONFIG_H) + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -Fo$@ alloc.c + +#=================================================================== +# DAT dependencies +#=================================================================== + +# +# dat dependencies +# + +$(DAT)data: $(U)makedefs.exe $(DATABASE) + $(U)makedefs -d + +$(DAT)rumors: $(U)makedefs.exe $(DAT)rumors.tru $(DAT)rumors.fal + $(U)makedefs -r + +$(DAT)oracles: $(U)makedefs.exe $(DAT)oracles.txt + $(U)makedefs -h + +$(DAT)engrave: $(U)makedefs.exe $(DAT)engrave.txt + $(U)makedefs -2 + +$(DAT)epitaph: $(U)makedefs.exe $(DAT)epitaph.txt + $(U)makedefs -1 + +$(DAT)bogusmon: $(U)makedefs.exe $(DAT)bogusmon.txt + $(U)makedefs -3 + +# This is the universal ctags utility which produces the tags in the +# format that util/readtags requires. +# https://github.com/universal-ctags/ctags.git + +#=============================================================================== +# sfutil +#=============================================================================== +SFCTOOLBIN = $(BinDir)sfctool.exe +!IF "$(SFCTOOL)" == "1" +SFCTOOLPKG=$(SFCTOOLBIN) +SFCTOOLBASENAM=sfctool.exe +SFCTOOLPDBNAM=sfctool.PDB +SFCTOOLPDBBIN=$(BinDir)sfctool.PDB +!ELSE +SFCTOOLPKG= +SFCTOOLBASENAM= +SFCTOOLPDBNAM= +SFCTOOLPDBBIN= +!ENDIF + +!IF "$(SFCTOOLPKG)" != "" +SFCTOOLOBJS = $(OUTL)sfctool.o \ + $(OUTL)sf-alloc.o $(OUTL)sf-artifact.o $(OUTL)sfdata.o \ + $(OUTL)sf-date.o $(OUTL)sf-decl.o $(OUTL)sf-calendar.o \ + $(OUTL)sf-cfgfiles.o $(OUTL)sf-dungeon.o $(OUTL)sf-end.o \ + $(OUTL)sf-engrave.o $(OUTL)sf-files.o $(OUTL)sf-light.o \ + $(OUTL)sf-mdlib.o $(OUTL)sf-mkmaze.o $(OUTL)sf-mkroom.o \ + $(OUTL)sf-monst.o $(OUTL)sf-nhlua.o $(OUTL)sf-objects.o \ + $(OUTL)sf-o_init.o $(OUTL)panic.o $(OUTL)sf-region.o \ + $(OUTL)sf-restore.o $(OUTL)sf-rumors.o $(OUTL)sfbase.o \ + $(OUTL)sfexpasc.o $(OUTL)sf-struct.o $(OUTL)strutil.o \ + $(OUTL)sf-sys.o $(OUTL)sf-timeout.o $(OUTL)sf-track.o \ + $(OUTL)sf-version.o $(OUTL)sf-worm.o $(OUTL)sf-windsys.o + +SFFLAGS = -DSFCTOOL -DNOPANICTRACE -DNOCRASHREPORT -DNO_CHRONICLE + +#CTAGSCMD = $(LIB)\ctags\ctags.exe + +# +# dependencies for optional sfctool +# +# $(Q)$(CC) $(CFLAGS) -Fo$@ monst.c + +#$(UTIL)sfutil.exe: $(SFCTOOLBIN) +#$(UTIL)sfctool.exe: $(SFCTOOLBIN) + +$(SFCTOOLBIN): $(OUTLHACKLIB) $(SFCTOOLOBJS) + $(link) $(lflags) -out:$@ /PDB:$(BinDir)$(@B).PDB $(SFCTOOLOBJS) \ + $(LIBS) ole32.lib Shell32.lib userenv.lib advapi32.lib $(OUTLHACKLIB) + @echo '$(SFCTOOLBIN) is up to date.' +$(OUTL)sfctool.o: $(UTIL)sfctool.c $(HACK_H) $(INCL)sfprocs.h + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(UTIL)sfctool.c +$(OUTL)sfdata.o: $(UTIL)sfdata.c $(HACK_H) $(INCL)sfprocs.h $(INCL)sfproto.h + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(UTIL)sfdata.c +$(OUTL)sfexpasc.o: $(UTIL)sfexpasc.c $(HACK_H) $(INCL)sfprocs.h $(INCL)sfproto.h $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(UTIL)sfexpasc.c +$(OUTL)sf-alloc.o: $(SRC)alloc.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)alloc.c +$(OUTL)sf-date.o: $(SRC)date.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)date.c +$(OUTL)sf-decl.o: $(SRC)decl.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)decl.c +$(OUTL)sf-monst.o: $(SRC)monst.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)monst.c +$(OUTL)sf-objects.o: $(SRC)objects.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)objects.c +$(OUTL)sfbase.o: $(SRC)sfbase.c $(HACK_H) $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)sfbase.c +$(OUTL)sf-struct.o: $(SRC)sfstruct.c $(HACK_H) $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)sfstruct.c +$(OUTL)sf-artifact.o: $(SRC)artifact.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)artifact.c +$(OUTL)sf-calendar.o: $(SRC)calendar.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)calendar.c +$(OUTL)sf-cfgfiles.o: $(SRC)cfgfiles.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)cfgfiles.c +$(OUTL)sf-dungeon.o: $(SRC)dungeon.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)dungeon.c +$(OUTL)sf-end.o: $(SRC)end.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)end.c +$(OUTL)sf-engrave.o: $(SRC)engrave.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)engrave.c +$(OUTL)sf-files.o: $(SRC)files.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)files.c +$(OUTL)sf-light.o: $(SRC)light.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)light.c +$(OUTL)sf-mdlib.o: $(SRC)mdlib.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)mdlib.c +$(OUTL)sf-mkmaze.o: $(SRC)mkmaze.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)mkmaze.c +$(OUTL)sf-mkroom.o: $(SRC)mkroom.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)mkroom.c +$(OUTL)sf-o_init.o: $(SRC)o_init.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)o_init.c +$(OUTL)sf-region.o: $(SRC)region.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)region.c +$(OUTL)sf-restore.o: $(SRC)restore.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)restore.c +$(OUTL)sf-rumors.o: $(SRC)\rumors.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)rumors.c +$(OUTL)sf-timeout.o: $(SRC)timeout.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)timeout.c +$(OUTL)sf-version.o: $(SRC)version.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)version.c +$(OUTL)sf-worm.o: $(SRC)worm.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)worm.c +$(OUTL)sf-nhlua.o: $(SRC)nhlua.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)nhlua.c +$(OUTL)sf-track.o: $(SRC)track.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)track.c +$(OUTL)sf-sys.o: $(SRC)sys.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(SRC)sys.c +$(OUTL)sf-windsys.o: $(MSWSYS)windsys.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) $(SFFLAGS) -Fo$@ -c $(MSWSYS)windsys.c + +$(UTIL)sftags.exe: $(OUTL)sftags.o $(OUTL)sf-alloc.o $(OUTL)panic.o $(OUTLHACKLIB) + $(link) $(LFLAGS) /OUT:$@ $(OUTL)sftags.o \ + $(OUTL)sf-alloc.o $(OUTL)panic.o \ + $(OUTLHACKLIB) +$(OUTL)sftags.o: $(UTIL)sftags.c $(HACK_H) + $(Q)$(CC) $(CFLAGS) -Fo$@ -c $(UTIL)sftags.c +$(INCL)sfproto.h: $(UTIL)sftags.exe $(UTIL)sf.tags + $(UTIL)sftags.exe +$(UTIL)sfdata.c: $(UTIL)sftags.exe $(UTIL)sf.tags + $(UTIL)sftags.exe +# dependencies for sftags +# # +CTAGDEP = $(INCL)align.h $(INCL)artifact.h $(INCL)artilist.h \ + $(INCL)attrib.h $(INCL)context.h $(INCL)coord.h \ + $(INCL)decl.h $(INCL)dungeon.h $(INCL)engrave.h \ + $(INCL)flag.h $(INCL)func_tab.h $(INCL)global.h \ + $(INCL)hack.h $(INCL)mextra.h $(INCL)mcastu.h \ + $(INCL)mkroom.h $(INCL)monst.h \ + $(INCL)obj.h $(INCL)objclass.h $(INCL)prop.h \ + $(INCL)quest.h $(INCL)rect.h $(INCL)region.h \ + $(INCL)rm.h $(INCL)skills.h $(INCL)spell.h \ + $(INCL)stairs.h $(INCL)sys.h $(INCL)timeout.h \ + $(INCL)trap.h $(INCL)you.h $(INCL)onames.h \ + $(INCL)wintype.h +# $(INCL)permonst.h +CTAGSOPT = --language-force=c --sort=no -D"Bitfield(x,n)=unsigned x : n" --excmd=pattern +# +$(UTIL)sf.tags: $(CTAGSCMD) $(CTAGDEP) + $(CTAGSCMD) $(CTAGSOPT) -f $@ $(INCL)align.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)artifact.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)artifact.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)artilist.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)attrib.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)bones.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)context.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)coord.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)decl.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)decl.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)dungeon.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)engrave.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)engrave.c + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)flag.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)func_tab.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)global.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)hack.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)mextra.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)mcastu.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)mkroom.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)monst.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)defsym.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)obj.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)objclass.h +# $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)permonst.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)prop.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)quest.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)rect.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)region.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)rm.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)skills.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)spell.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)stairs.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)sys.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)timeout.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)trap.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)you.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)onames.h + $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)wintype.h +!ENDIF + +#=============================================================================== +# Integrated sound files +#=============================================================================== +$(SndWavDir)se_squeak_A.wav: $(SndWavDir)se_squeak_A.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_B.wav: $(SndWavDir)se_squeak_B.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_B_flat.wav: $(SndWavDir)se_squeak_B_flat.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_C.wav: $(SndWavDir)se_squeak_C.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_D.wav: $(SndWavDir)se_squeak_D.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_D_flat.wav: $(SndWavDir)se_squeak_D_flat.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_E.wav: $(SndWavDir)se_squeak_E.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_E_flat.wav: $(SndWavDir)se_squeak_E_flat.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_F.wav: $(SndWavDir)se_squeak_F.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_F_sharp.wav: $(SndWavDir)se_squeak_F_sharp.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_G.wav: $(SndWavDir)se_squeak_G.uu $(U)uudecode.exe +$(SndWavDir)se_squeak_G_sharp.wav: $(SndWavDir)se_squeak_G_sharp.uu $(U)uudecode.exe +$(SndWavDir)sound_Bell.wav: $(SndWavDir)sound_Bell.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_A.wav: $(SndWavDir)sound_Bugle_A.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_B.wav: $(SndWavDir)sound_Bugle_B.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_C.wav: $(SndWavDir)sound_Bugle_C.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_D.wav: $(SndWavDir)sound_Bugle_D.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_E.wav: $(SndWavDir)sound_Bugle_E.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_F.wav: $(SndWavDir)sound_Bugle_F.uu $(U)uudecode.exe +$(SndWavDir)sound_Bugle_G.wav: $(SndWavDir)sound_Bugle_G.uu $(U)uudecode.exe +$(SndWavDir)sound_Drum_Of_Earthquake.wav: $(SndWavDir)sound_Drum_Of_Earthquake.uu $(U)uudecode.exe +$(SndWavDir)sound_Fire_Horn.wav: $(SndWavDir)sound_Fire_Horn.uu $(U)uudecode.exe +$(SndWavDir)sound_Frost_Horn.wav: $(SndWavDir)sound_Frost_Horn.uu $(U)uudecode.exe +$(SndWavDir)sound_Leather_Drum.wav: $(SndWavDir)sound_Leather_Drum.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_A.wav: $(SndWavDir)sound_Magic_Harp_A.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_B.wav: $(SndWavDir)sound_Magic_Harp_B.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_C.wav: $(SndWavDir)sound_Magic_Harp_C.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_D.wav: $(SndWavDir)sound_Magic_Harp_D.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_E.wav: $(SndWavDir)sound_Magic_Harp_E.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_F.wav: $(SndWavDir)sound_Magic_Harp_F.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Harp_G.wav: $(SndWavDir)sound_Magic_Harp_G.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_A.wav: $(SndWavDir)sound_Magic_Flute_A.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_B.wav: $(SndWavDir)sound_Magic_Flute_B.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_C.wav: $(SndWavDir)sound_Magic_Flute_C.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_D.wav: $(SndWavDir)sound_Magic_Flute_D.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_E.wav: $(SndWavDir)sound_Magic_Flute_E.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_F.wav: $(SndWavDir)sound_Magic_Flute_F.uu $(U)uudecode.exe +$(SndWavDir)sound_Magic_Flute_G.wav: $(SndWavDir)sound_Magic_Flute_G.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_A.wav: $(SndWavDir)sound_Tooled_Horn_A.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_B.wav: $(SndWavDir)sound_Tooled_Horn_B.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_C.wav: $(SndWavDir)sound_Tooled_Horn_C.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_D.wav: $(SndWavDir)sound_Tooled_Horn_D.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_E.wav: $(SndWavDir)sound_Tooled_Horn_E.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_F.wav: $(SndWavDir)sound_Tooled_Horn_F.uu $(U)uudecode.exe +$(SndWavDir)sound_Tooled_Horn_G.wav: $(SndWavDir)sound_Tooled_Horn_G.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_A.wav: $(SndWavDir)sound_Wooden_Flute_A.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_B.wav: $(SndWavDir)sound_Wooden_Flute_B.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_C.wav: $(SndWavDir)sound_Wooden_Flute_C.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_D.wav: $(SndWavDir)sound_Wooden_Flute_D.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_E.wav: $(SndWavDir)sound_Wooden_Flute_E.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_F.wav: $(SndWavDir)sound_Wooden_Flute_F.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Flute_G.wav: $(SndWavDir)sound_Wooden_Flute_G.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_A.wav: $(SndWavDir)sound_Wooden_Harp_A.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_B.wav: $(SndWavDir)sound_Wooden_Harp_B.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_C.wav: $(SndWavDir)sound_Wooden_Harp_C.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_D.wav: $(SndWavDir)sound_Wooden_Harp_D.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_E.wav: $(SndWavDir)sound_Wooden_Harp_E.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_F.wav: $(SndWavDir)sound_Wooden_Harp_F.uu $(U)uudecode.exe +$(SndWavDir)sound_Wooden_Harp_G.wav: $(SndWavDir)sound_Wooden_Harp_G.uu $(U)uudecode.exe +$(SndWavDir)sa2_xpleveldown.wav: $(SndWavDir)sa2_xpleveldown.uu $(U)uudecode.exe +$(SndWavDir)sa2_xplevelup.wav: $(SndWavDir)sa2_xplevelup.uu $(U)uudecode.exe + +#=============================================================================== +# packaging +#=============================================================================== + +PKGFILES = nethackrc.template Guidebook.txt license NetHack.exe NetHack.txt \ + NetHackW.exe opthelp nhdat$(NHV) record symbols \ + sysconf.template $(SFCTOOLBASENAM) +FILESTOZIP = $(BinDir)nethackrc.template $(BinDir)Guidebook.txt $(BinDir)license \ + $(BinDir)NetHack.exe $(BinDir)NetHack.txt $(BinDir)NetHackW.exe \ + $(BinDir)opthelp $(BinDir)nhdat$(NHV) $(BinDir)record \ + $(BinDir)symbols $(BinDir)sysconf.template $(SFCTOOLPKG) + +DBGSYMS = NetHack.PDB NetHackW.PDB $(SFCTOOLPDBNAM) +PDBTOZIP = $(BinDir)NetHack.PDB $(BinDir)NetHackW.PDB $(SFCTOOLPDBBIN) +MAINZIP = $(PkgDir)nethack-$(NHV)-win-$(TARGET_CPU).zip +DBGSYMZIP = $(PkgDir)nethack-$(NHV)-win-$(TARGET_CPU)-debugsymbols.zip + +package: binary $(FILESTOZIP) $(MAINZIP) $(DBGSYMZIP) + @echo NetHack Windows package created: $(MAINZIP) + +$(MAINZIP): $(FILESTOZIP) + if not exist $(PkgDir)*.* mkdir $(R_PkgDir) + tar -a -cf $(MAINZIP) -C $(R_BinDir) $(PKGFILES) +$(DBGSYMZIP): $(PDBTOZIP) + tar -a -cf $(DBGSYMZIP) -C $(R_BinDir) $(DBGSYMS) + +binary: envchk.tag libdir.tag ottydir$(TARGET_CPU).tag \ + outldir$(TARGET_CPU).tag oguidir$(TARGET_CPU).tag \ + oluadir$(TARGET_CPU).tag opdcdir$(TARGET_CPU).tag \ + opdctxtdir$(TARGET_CPU).tag opdcguidir$(TARGET_CPU).tag \ + $(LUASRC)lua.h $(PDCDEP) \ + $(INCL)nhlua.h $(OUTL)utility.tag \ + $(DAT)data $(DAT)rumors $(DAT)oracles $(DAT)engrave \ + $(DAT)epitaph $(DAT)bogusmon $(GAMEDIR)NetHack.exe \ + $(GAMEDIR)NetHackW.exe $(SFCTOOLPKG) $(GAMEDIRDLLS) binary.tag + @echo NetHack is up to date. + +#=============================================================================== +# Housekeeping +#=============================================================================== + +spotless: clean + if exist $(GAMEDIR)NetHack.exe del $(GAMEDIR)NetHack.exe + if exist $(GAMEDIR)NetHackW.exe del $(GAMEDIR)NetHackW.exe + if exist $(GAMEDIR)NetHack.pdb del $(GAMEDIR)NetHack.pdb + if exist $(GAMEDIR)nhdat$(NHV) del $(GAMEDIR)nhdat$(NHV) + if exist $(INCL)date.h del $(INCL)date.h + if exist $(INCL)onames.h del $(INCL)onames.h + if exist $(INCL)pm.h del $(INCL)pm.h + if exist $(U)*.lnk del $(U)*.lnk + if exist $(U)*.map del $(U)*.map + if exist $(DAT)data del $(DAT)data + if exist $(DAT)rumors del $(DAT)rumors + if exist $(DAT)engrave del $(DAT)engrave + if exist $(DAT)epitaph del $(DAT)epitaph + if exist $(DAT)bogusmon del $(DAT)bogusmon + if exist $(DAT)porthelp del $(DAT)porthelp + if exist nhdat$(NHV). del nhdat$(NHV). + if exist outldirx86.tag del outldirx86.tag + if exist ottydirx86.tag del ottydirx86.tag + if exist oguidirx86.tag del oguidirx86.tag + if exist oluadirx86.tag del oluadirx86.tag + if exist opdcdirx86.tag del opdcdirx86.tag + if exist opdctxtdirx86.tag del opdctxtdirx86.tag + if exist opdcguidirx86.tag del opdcguidirx86.tag + if exist outldirx64.tag del outldirx64.tag + if exist ottydirx64.tag del ottydirx64.tag + if exist oguidirx64.tag del oguidirx64.tag + if exist oluadirx64.tag del oluadirx64.tag + if exist opdcdirx64.tag del opdcdirx64.tag + if exist opdctxtdirx64.tag del opdctxtdirx64.tag + if exist opdcguidirx64.tag del opdcguidirx64.tag + if exist outldirarm64.tag del outldirarm64.tag + if exist ottydirarm64.tag del ottydirarm64.tag + if exist oguidirarm64.tag del oguidirarm64.tag + if exist oluadirarm64.tag del oluadirarm64.tag + if exist opdcdirarm64.tag del opdcdirarm64.tag + if exist opdctxtdirarm64.tag del opdctxtdirarm64.tag + if exist opdcguidirarm64.tag del opdcguidirarm64.tag + if exist libdir.tag del libdir.tag + if exist gamedir.tag del gamedir.tag + if exist $(MSWIN)mnsel.bmp del $(MSWIN)mnsel.bmp + if exist $(MSWIN)mnselcnt.bmp del $(MSWIN)mnselcnt.bmp + if exist $(MSWIN)mnunsel.bmp del $(MSWIN)mnunsel.bmp + if exist $(MSWIN)petmark.bmp del $(MSWIN)petmark.bmp + if exist $(MSWIN)pilemark.bmp del $(MSWIN)pilemark.bmp + if exist $(MSWIN)rip.bmp del $(MSWIN)rip.bmp + if exist $(MSWIN)splash.bmp del $(MSWIN)splash.bmp + if exist $(MSWIN)nethack.ico del $(MSWIN)nethack.ico + if exist $(MSWSYS)nethack.ico del $(MSWSYS)nethack.ico + if exist $(U)recover.exe del $(U)recover.exe + if exist $(U)tile2bmp.exe del $(U)tile2bmp.exe + if exist $(U)tilemap.exe del $(U)tilemap.exe + if exist $(U)uudecode.exe del $(U)uudecode.exe + if exist $(U)dlb.exe del $(U)dlb.exe +!IF "$(ADD_CURSES)" == "Y" + if exist $(LIBDIR)$(PDCDIST)-$(PDCTXTFOLDER)-$(TARGET_CPU)-static.lib del $(LIBDIR)$(PDCDIST)-$(PDCTXTFOLDER)-$(TARGET_CPU)-static.lib + if exist $(LIBDIR)$(PDCDIST)-wingui-$(TARGET_CPU)-static.lib del $(LIBDIR)$(PDCDIST)-wingui-$(TARGET_CPU)-static.lib +!ENDIF + if exist $(LUALIB) del $(LUALIB) + if exist $(DAT)oracles del $(DAT)oracles + if exist $(DAT)rumors del $(DAT)rumors + if exist $(DAT)options del $(DAT)options + if exist $(DAT)ttyoptions del $(DAT)ttyoptions + if exist $(DAT)guioptions del $(DAT)guioptions + if exist $(DAT)data del $(DAT)data + if exist tilemappings.lst del tilemappings.lst + if exist $(SndWavDir)*.wav del $(SndWavDir)*.wav + if exist $(MAINZIP) del $(MAINZIP) + if exist $(DBGSYMZIP) del $(DBGSYMZIP) + if exist $(OBJTTY)* rmdir $(OBJTTY) /s /Q + if exist $(OBJGUI)* rmdir $(OBJGUI) /s /Q + if exist $(OBJUTIL)* rmdir $(OBJUTIL) /s /Q + if exist $(OBJLUA)* rmdir $(OBJLUA) /s /Q + if exist $(OBJPDC)* rmdir $(OBJPDC) /s /Q + if exist $(OBJPDCTXT)* rmdir $(OBJPDCTXT) /s /Q + if exist $(OBJPDCGUI)* rmdir $(OBJPDCGUI) /s /Q + if exist $(OBJTTY_B)* rmdir $(OBJTTY_B) /s /Q + if exist $(OBJGUI_B)* rmdir $(OBJGUI_B) /s /Q + if exist $(OBJUTIL_B)* rmdir $(OBJUTIL_B) /s /Q + if exist $(OBJLUA_B)* rmdir $(OBJLUA_B) /s /Q + if exist $(OBJPDC_B)* rmdir $(OBJPDC_B) /s /Q + if exist $(OBJPDCTXT_B)* rmdir $(OBJPDCTXT_B) /s /Q + if exist $(OBJPDCGUI_B)* rmdir $(OBJPDCGUI_B) /s /Q + +clean: + if exist binary.tag del binary.tag + if exist gamedir.tag del gamedir.tag + if exist envchk.tag del envchk.tag + if exist cpu.tag del cpu.tag + if exist envchk.tag del envchk.tag + if exist pkgdir.tag del pkgdir.tag + if exist $(OUTL)utility.tag del $(OUTL)utility.tag + if exist $(OTTY)sp_lev.tag del $(OTTY)sp_lev.tag + if exist $(OGUI)sp_lev.tag del $(OGUI)sp_lev.tag + if exist $(SRC)tile.c del $(SRC)tile.c + if exist $(INCL)nhlua.h del $(INCL)nhlua.h + if exist $(U)makedefs.exe del $(U)makedefs.exe + if exist $(U)dlb_main.exe del $(U)dlb_main.exe + if exist $(U)tile2bmp.exe del $(U)tile2bmp.exe + if exist $(U)tilemap.exe del $(U)tilemap.exe + if exist $(SRC)*.lnk del $(SRC)*.lnk + if exist $(DAT)dlb.lst del $(DAT)dlb.lst + if exist $(OUTL)*.o del $(OUTL)*.o + if exist $(OTTY)*.o del $(OTTY)*.o + if exist $(OGUI)*.o del $(OGUI)*.o + if exist $(OLUA)*.o del $(OLUA)*.o + if exist $(OPDC)*.o del $(OPDC)*.o + if exist $(OPDCTXT)*.o del $(OPDCTXT)*.o + if exist $(OPDCGUI)*.o del $(OPDCGUI)*.o + if exist $(OUTL)*.PDB del $(OUTL)*.PDB + if exist $(OTTY)*.PDB del $(OTTY)*.PDB + if exist $(OGUI)*.PDB del $(OGUI)*.PDB + if exist $(OLUA)*.PDB del $(OLUA)*.PDB + if exist $(OPDC)*.PDB del $(OPDC)*.PDB + if exist $(OPDCTXT)*.PDB del $(OPDCTXT)*.PDB + if exist $(OPDCGUI)*.PDB del $(OPDCGUI)*.PDB + if exist $(OUTL)*.MAP del $(OUTL)*.MAP + if exist $(OTTY)*.MAP del $(OTTY)*.MAP + if exist $(OGUI)*.MAP del $(OGUI)*.MAP + if exist $(OLUA)*.MAP del $(OLUA)*.MAP + if exist $(OPDC)*.MAP del $(OPDC)*.MAP + if exist $(OUTL)*.LIB del $(OUTL)*.LIB + if exist $(OTTY)*.LIB del $(OTTY)*.LIB + if exist $(OGUI)*.LIB del $(OGUI)*.LIB + if exist $(OLUA)*.LIB del $(OLUA)*.LIB + if exist $(OPDC)*.LIB del $(OPDC)*.LIB + if exist $(OPDCTXT)*.LIB del $(OPDCTXT)*.LIB + if exist $(OPDCGUI)*.LIB del $(OPDCGUI)*.LIB + if exist $(OUTL)*.EXP del $(OUTL)*.EXP + if exist $(OTTY)*.EXP del $(OTTY)*.EXP + if exist $(OGUI)*.EXP del $(OGUI)*.EXP + if exist $(OLUA)*.EXP del $(OLUA)*.EXP + if exist $(OPDC)*.EXP del $(OPDC)*.EXP + if exist $(OPDCTXT)*.EXP del $(OPDCTXT)*.EXP + if exist $(OPDCGUI)*.EXP del $(OPDCGUI)*.EXP + if exist $(SRC)tiles.bmp del $(SRC)tiles.bmp + if exist $(OTTY)console.res del $(OTTY)console.res + if exist $(OTTY)NetHack.res del $(OTTY)NetHack.res + if exist $(OGUI)NetHackW.res del $(OGUI)NetHackW.res + +#=================================================================== +# OTHER DEPENDENCIES +#=================================================================== +# The rest are stolen from sys/unix/Makefile.src, +# twice, with the following changes: +# * the CONFIG_H and HACK_H sections comment out or removed completely +# * ../include/ changed to $(INCL) +# * slashes changed to back-slashes +# * -c (which is included in cflagsBuild) substituted with -Fo$@ +# * "-o $@ " is removed +# * win/X11/Window.o commented due to conflict with pdcurses +# * win/share/cppregex.o commented out due to earlier rule +# * commented out $(TARGETPFX)tile.o: tile.c $(HACK_H) +# * commented out $(TARGETPFX)cppregex.o because it has its own rule already +# * check for an erroneous embedded Makefile comment char in the files.o line +# * $(TARGETPFX) becomes $(OTTY) in 1st batch with $(TTYDEF) +# * $(TARGETPFX) becomes $(OGUI) in 2nd batch with $(GUIDEF) +# * commented out the lines starting with +# $(TARGET_CC) so the rules in this Makefile will be used instead +# * add compile recipe for nhlua.c to add -wd4324 to suppress a +# warning during x64 build related to padding due to alignment +# but otherwise untouched. +# That means that there is some irrelevant stuff +# in here, but maintenance should be easier. +# + +TARGET_CC=$(cc) +TARGET_CFLAGS=$(CFLAGS) $(TTYDEF) +TARGET_CXX=$(cc) +TARGET_CXXFLAGS=$(CPPFLAGS) $(TTYDEF) +MOCPATH = moc.exe + +#$(OTTY)cppregex.o: ..\sys\share\cppregex.cpp $(CONFIG_H) +# $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\sys\share\cppregex.cpp +$(OTTY)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)tcap.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\ioctl.c +$(OTTY)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)dlb.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pcmain.c +$(OTTY)pcsys.o: ..\sys\share\pcsys.c $(HACK_H) $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pcsys.c +$(OTTY)pctty.o: ..\sys\share\pctty.c $(HACK_H) $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pctty.c +$(OTTY)pcunix.o: ..\sys\share\pcunix.c $(HACK_H) $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pcunix.c +$(OTTY)pmatchregex.o: ..\sys\share\pmatchregex.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pmatchregex.c +$(OTTY)posixregex.o: ..\sys\share\posixregex.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\posixregex.c +$(OTTY)random.o: ..\sys\share\random.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\random.c +$(OTTY)unixtty.o: ..\sys\share\unixtty.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\unixtty.c +$(OTTY)unixmain.o: ..\sys\unix\unixmain.c $(HACK_H) $(INCL)dlb.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\unix\unixmain.c +$(OTTY)unixres.o: ..\sys\unix\unixres.c $(CONFIG_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\unix\unixres.c +$(OTTY)unixunix.o: ..\sys\unix\unixunix.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\unix\unixunix.c +$(OTTY)qt_bind.o: ..\win\Qt\qt_bind.cpp $(HACK_H) $(QTn_H) \ + $(INCL)dlb.h ..\win\Qt\qt_bind.h ..\win\Qt\qt_click.h \ + ..\win\Qt\qt_clust.h ..\win\Qt\qt_delay.h ..\win\Qt\qt_icon.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_key.h ..\win\Qt\qt_line.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h ..\win\Qt\qt_menu.h \ + ..\win\Qt\qt_msg.h ..\win\Qt\qt_plsel.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_rip.h ..\win\Qt\qt_set.h \ + ..\win\Qt\qt_stat.h ..\win\Qt\qt_str.h ..\win\Qt\qt_streq.h \ + ..\win\Qt\qt_svsel.h ..\win\Qt\qt_win.h ..\win\Qt\qt_xcmd.h \ + ..\win\Qt\qt_yndlg.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_bind.cpp +$(OTTY)qt_click.o: ..\win\Qt\qt_click.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_click.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_click.cpp +$(OTTY)qt_clust.o: ..\win\Qt\qt_clust.cpp $(QTn_H) ..\win\Qt\qt_clust.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_clust.cpp +$(OTTY)qt_delay.o: ..\win\Qt\qt_delay.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_delay.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_delay.cpp +$(OTTY)qt_glyph.o: ..\win\Qt\qt_glyph.cpp $(HACK_H) $(QTn_H) \ + $(INCL)tile2x11.h ..\win\Qt\qt_bind.h \ + ..\win\Qt\qt_clust.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_inv.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h \ + ..\win\Qt\qt_str.h ..\win\Qt\qt_win.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_glyph.cpp +$(OTTY)qt_icon.o: ..\win\Qt\qt_icon.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_icon.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_icon.cpp +$(OTTY)qt_inv.o: ..\win\Qt\qt_inv.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_inv.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_inv.cpp +$(OTTY)qt_key.o: ..\win\Qt\qt_key.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_key.cpp +$(OTTY)qt_line.o: ..\win\Qt\qt_line.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_line.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_line.cpp +$(OTTY)qt_main.o: ..\win\Qt\qt_main.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_clust.h ..\win\Qt\qt_glyph.h \ + ..\win\Qt\qt_icon.h ..\win\Qt\qt_inv.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h \ + ..\win\Qt\qt_msg.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_stat.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_win.h qt_kde0.moc qt_main.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_main.cpp +$(OTTY)qt_map.o: ..\win\Qt\qt_map.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_click.h ..\win\Qt\qt_clust.h \ + ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_map.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h ..\win\Qt\qt_win.h \ + qt_map.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_map.cpp +$(OTTY)qt_menu.o: ..\win\Qt\qt_menu.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_line.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_menu.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_rip.h ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_streq.h ..\win\Qt\qt_win.h qt_menu.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_menu.cpp +$(OTTY)qt_msg.o: ..\win\Qt\qt_msg.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_clust.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h ..\win\Qt\qt_msg.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h \ + ..\win\Qt\qt_str.h ..\win\Qt\qt_win.h qt_msg.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_msg.cpp +$(OTTY)qt_plsel.o: ..\win\Qt\qt_plsel.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_plsel.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h \ + qt_plsel.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_plsel.cpp +$(OTTY)qt_rip.o: ..\win\Qt\qt_rip.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_rip.h \ + ..\win\Qt\qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_rip.cpp +$(OTTY)qt_set.o: ..\win\Qt\qt_set.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h ..\win\Qt\qt_xcmd.h \ + qt_set.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_set.cpp +$(OTTY)qt_stat.o: ..\win\Qt\qt_stat.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_icon.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_stat.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_win.h ..\win\Qt\qt_xpms.h qt_stat.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_stat.cpp +$(OTTY)qt_str.o: ..\win\Qt\qt_str.cpp $(QTn_H) ..\win\Qt\qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_str.cpp +$(OTTY)qt_streq.o: ..\win\Qt\qt_streq.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_line.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h ..\win\Qt\qt_streq.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_streq.cpp +$(OTTY)qt_svsel.o: ..\win\Qt\qt_svsel.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_svsel.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_svsel.cpp +$(OTTY)qt_win.o: ..\win\Qt\qt_win.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_click.h ..\win\Qt\qt_clust.h \ + ..\win\Qt\qt_glyph.h ..\win\Qt\qt_icon.h ..\win\Qt\qt_inv.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_key.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_map.h ..\win\Qt\qt_menu.h ..\win\Qt\qt_msg.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_rip.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_win.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_win.cpp +$(OTTY)qt_xcmd.o: ..\win\Qt\qt_xcmd.cpp $(HACK_H) $(QTn_H) \ + $(INCL)func_tab.h ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_xcmd.h qt_xcmd.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_xcmd.cpp +$(OTTY)qt_yndlg.o: ..\win\Qt\qt_yndlg.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_str.h ..\win\Qt\qt_yndlg.h qt_yndlg.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_yndlg.cpp +#$(OTTY)Window.o: ..\win\X11\Window.c $(CONFIG_H) $(INCL)lint.h \ +# $(INCL)winX.h $(INCL)wintype.h $(INCL)xwindow.h \ +# $(INCL)xwindowp.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\Window.c +$(OTTY)dialogs.o: ..\win\X11\dialogs.c $(CONFIG_H) $(INCL)lint.h \ + $(INCL)winX.h $(INCL)wintype.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\dialogs.c +$(OTTY)winX.o: ..\win\X11\winX.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)winX.h $(INCL)xwindow.h ..\win\X11\nh32icon \ + ..\win\X11\nh56icon ..\win\X11\nh72icon +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winX.c +$(OTTY)winmap.o: ..\win\X11\winmap.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)tile2x11.h $(INCL)winX.h $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmap.c +$(OTTY)winmenu.o: ..\win\X11\winmenu.c $(HACK_H) $(INCL)winX.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmenu.c +$(OTTY)winmesg.o: ..\win\X11\winmesg.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmesg.c +$(OTTY)winmisc.o: ..\win\X11\winmisc.c $(HACK_H) $(INCL)func_tab.h \ + $(INCL)winX.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmisc.c +$(OTTY)winstat.o: ..\win\X11\winstat.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winstat.c +$(OTTY)wintext.o: ..\win\X11\wintext.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\wintext.c +$(OTTY)winval.o: ..\win\X11\winval.c $(HACK_H) $(INCL)winX.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winval.c +$(OTTY)wc_chainin.o: ..\win\chain\wc_chainin.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\chain\wc_chainin.c +$(OTTY)wc_chainout.o: ..\win\chain\wc_chainout.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\chain\wc_chainout.c +$(OTTY)wc_trace.o: ..\win\chain\wc_trace.c $(HACK_H) \ + $(INCL)func_tab.h $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\chain\wc_trace.c +$(OTTY)cursdial.o: ..\win\curses\cursdial.c $(HACK_H) \ + $(INCL)func_tab.h $(INCL)wincurs.h \ + ..\win\curses\cursdial.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursdial.c +$(OTTY)cursinit.o: ..\win\curses\cursinit.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursinit.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursinit.c +$(OTTY)cursinvt.o: ..\win\curses\cursinvt.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursinvt.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursinvt.c +$(OTTY)cursmain.o: ..\win\curses\cursmain.c $(HACK_H) $(INCL)wincurs.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursmain.c +$(OTTY)cursmesg.o: ..\win\curses\cursmesg.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursmesg.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursmesg.c +$(OTTY)cursmisc.o: ..\win\curses\cursmisc.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)func_tab.h $(INCL)wincurs.h \ + ..\win\curses\cursmisc.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursmisc.c +$(OTTY)cursstat.o: ..\win\curses\cursstat.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursstat.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursstat.c +$(OTTY)curswins.o: ..\win\curses\curswins.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\curswins.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\curswins.c +$(OTTY)winshim.o: ..\win\shim\winshim.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\shim\winshim.c +$(OTTY)getline.o: ..\win\tty\getline.c $(HACK_H) $(INCL)func_tab.h \ + $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\getline.c +$(OTTY)termcap.o: ..\win\tty\termcap.c $(HACK_H) $(INCL)tcap.h \ + $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\termcap.c +$(OTTY)topl.o: ..\win\tty\topl.c $(HACK_H) $(INCL)tcap.h \ + $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\topl.c +$(OTTY)wintty.o: ..\win\tty\wintty.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)tcap.h $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\wintty.c +$(OTTY)allmain.o: allmain.c $(HACK_H) +$(OTTY)alloc.o: alloc.c $(CONFIG_H) $(INCL)nhlua.h +$(OTTY)apply.o: apply.c $(HACK_H) +$(OTTY)artifact.o: artifact.c $(HACK_H) $(INCL)artifact.h +$(OTTY)attrib.o: attrib.c $(HACK_H) +$(OTTY)ball.o: ball.c $(HACK_H) +$(OTTY)bones.o: bones.c $(HACK_H) +$(OTTY)botl.o: botl.c $(HACK_H) +$(OTTY)calendar.o: calendar.c $(HACK_H) +$(OTTY)cfgfiles.o: cfgfiles.c $(HACK_H) +$(OTTY)cmd.o: cmd.c $(HACK_H) $(INCL)func_tab.h +$(OTTY)coloratt.o: coloratt.c $(HACK_H) +$(OTTY)dbridge.o: dbridge.c $(HACK_H) +$(OTTY)decl.o: decl.c $(HACK_H) +$(OTTY)detect.o: detect.c $(HACK_H) $(INCL)artifact.h +$(OTTY)dig.o: dig.c $(HACK_H) +$(OTTY)display.o: display.c $(HACK_H) +$(OTTY)dlb.o: dlb.c $(CONFIG_H) $(INCL)dlb.h +$(OTTY)do.o: do.c $(HACK_H) +$(OTTY)do_name.o: do_name.c $(HACK_H) +$(OTTY)do_wear.o: do_wear.c $(HACK_H) +$(OTTY)dog.o: dog.c $(HACK_H) +$(OTTY)dogmove.o: dogmove.c $(HACK_H) $(INCL)mfndpos.h +$(OTTY)dokick.o: dokick.c $(HACK_H) +$(OTTY)dothrow.o: dothrow.c $(HACK_H) +$(OTTY)drawing.o: drawing.c $(CONFIG_H) $(INCL)defsym.h \ + $(INCL)objclass.h $(INCL)objects.h $(INCL)rm.h \ + $(INCL)sym.h $(INCL)wintype.h +$(OTTY)dungeon.o: dungeon.c $(HACK_H) $(INCL)dgn_file.h \ + $(INCL)dlb.h +$(OTTY)earlyarg.o: earlyarg.c $(HACK_H) +$(OTTY)eat.o: eat.c $(HACK_H) +$(OTTY)end.o: end.c $(HACK_H) $(INCL)dlb.h +$(OTTY)engrave.o: engrave.c $(HACK_H) +$(OTTY)exper.o: exper.c $(HACK_H) +$(OTTY)explode.o: explode.c $(HACK_H) +$(OTTY)extralev.o: extralev.c $(HACK_H) +$(OTTY)files.o: files.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)wintty.h +$(OTTY)fountain.o: fountain.c $(HACK_H) +$(OTTY)getpos.o: getpos.c $(HACK_H) +$(OTTY)glyphs.o: glyphs.c $(HACK_H) +$(OTTY)hack.o: hack.c $(HACK_H) +$(OTTY)hacklib.o: hacklib.c $(HACK_H) +$(OTTY)iactions.o: iactions.c $(HACK_H) +$(OTTY)insight.o: insight.c $(HACK_H) +$(OTTY)invent.o: invent.c $(HACK_H) +$(OTTY)isaac64.o: isaac64.c $(CONFIG_H) $(INCL)isaac64.h +$(OTTY)light.o: light.c $(HACK_H) +$(OTTY)lock.o: lock.c $(HACK_H) +$(OTTY)mail.o: mail.c $(HACK_H) $(INCL)mail.h +$(OTTY)makemon.o: makemon.c $(HACK_H) +$(OTTY)mcastu.o: mcastu.c $(HACK_H) $(INCL)mcastu.h +$(OTTY)mdlib.o: mdlib.c $(CONFIG_H) $(INCL)align.h \ + $(INCL)artilist.h $(INCL)attrib.h \ + $(INCL)context.h $(INCL)defsym.h $(INCL)dlb.h \ + $(INCL)dungeon.h $(INCL)flag.h $(INCL)hacklib.h \ + $(INCL)mextra.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monst.h $(INCL)monsters.h $(INCL)obj.h \ + $(INCL)objclass.h $(INCL)objects.h \ + $(INCL)permonst.h $(INCL)prop.h $(INCL)seffects.h \ + $(INCL)skills.h $(INCL)sndprocs.h $(INCL)sym.h \ + $(INCL)wintype.h $(INCL)you.h +$(OTTY)mhitm.o: mhitm.c $(HACK_H) $(INCL)artifact.h +$(OTTY)mhitu.o: mhitu.c $(HACK_H) $(INCL)artifact.h +$(OTTY)minion.o: minion.c $(HACK_H) +$(OTTY)mklev.o: mklev.c $(HACK_H) +$(OTTY)mkmap.o: mkmap.c $(HACK_H) $(INCL)sp_lev.h +$(OTTY)mkmaze.o: mkmaze.c $(HACK_H) $(INCL)sp_lev.h +$(OTTY)mkobj.o: mkobj.c $(HACK_H) +$(OTTY)mkroom.o: mkroom.c $(HACK_H) +$(OTTY)mon.o: mon.c $(HACK_H) $(INCL)mfndpos.h +$(OTTY)mondata.o: mondata.c $(HACK_H) +$(OTTY)monmove.o: monmove.c $(HACK_H) $(INCL)artifact.h \ + $(INCL)mfndpos.h +$(OTTY)monst.o: monst.c $(CONFIG_H) $(INCL)align.h \ + $(INCL)defsym.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monsters.h $(INCL)permonst.h $(INCL)sym.h \ + $(INCL)wintype.h +$(OTTY)mplayer.o: mplayer.c $(HACK_H) +$(OTTY)mthrowu.o: mthrowu.c $(HACK_H) +$(OTTY)muse.o: muse.c $(HACK_H) +$(OTTY)music.o: music.c $(HACK_H) +$(OTTY)nhlobj.o: nhlobj.c $(HACK_H) $(INCL)sp_lev.h +$(OTTY)nhlsel.o: nhlsel.c $(HACK_H) $(INCL)sp_lev.h +$(OTTY)nhlua.o: nhlua.c $(HACK_H) $(INCL)dlb.h + $(Q)$(CC) $(CFLAGS) $(TTYDEF) -wd4324 $(CROSSCOMPILE) $(CROSSCOMPILE_TARGET) -Fo$@ $(@B).c +$(OTTY)nhmd4.o: nhmd4.c $(HACK_H) $(INCL)nhmd4.h +$(OTTY)o_init.o: o_init.c $(HACK_H) +$(OTTY)objects.o: objects.c $(CONFIG_H) $(INCL)defsym.h \ + $(INCL)obj.h $(INCL)objclass.h $(INCL)objects.h \ + $(INCL)prop.h $(INCL)skills.h +$(OTTY)objnam.o: objnam.c $(HACK_H) +$(OTTY)options.o: options.c $(CONFIG_H) $(HACK_H) $(INCL)defsym.h \ + $(INCL)flag.h $(INCL)objclass.h $(INCL)objects.h \ + $(INCL)optlist.h $(INCL)tcap.h +$(OTTY)pager.o: pager.c $(HACK_H) $(INCL)dlb.h +$(OTTY)pickup.o: pickup.c $(HACK_H) +$(OTTY)pline.o: pline.c $(HACK_H) +$(OTTY)polyself.o: polyself.c $(HACK_H) +$(OTTY)potion.o: potion.c $(HACK_H) +$(OTTY)pray.o: pray.c $(HACK_H) +$(OTTY)priest.o: priest.c $(HACK_H) $(INCL)mfndpos.h +$(OTTY)quest.o: quest.c $(HACK_H) +$(OTTY)questpgr.o: questpgr.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)wintty.h +$(OTTY)read.o: read.c $(HACK_H) +$(OTTY)rect.o: rect.c $(HACK_H) +$(OTTY)region.o: region.c $(HACK_H) +$(OTTY)report.o: report.c $(HACK_H) $(INCL)dlb.h $(INCL)nhmd4.h +$(OTTY)restore.o: restore.c $(HACK_H) $(INCL)tcap.h +$(OTTY)rip.o: rip.c $(HACK_H) +$(OTTY)rnd.o: rnd.c $(HACK_H) $(INCL)isaac64.h +$(OTTY)role.o: role.c $(HACK_H) +$(OTTY)rumors.o: rumors.c $(HACK_H) $(INCL)dlb.h +$(OTTY)save.o: save.c $(HACK_H) +$(OTTY)selvar.o: selvar.c $(HACK_H) $(INCL)sp_lev.h +$(OTTY)sfstruct.o: sfstruct.c $(HACK_H) $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) /EP $(@B).c > $(OTTY)$(@B).c.preproc + $(Q)$(CC) $(CFLAGS) -Fo$@ $(@B).c +$(OTTY)shk.o: shk.c $(HACK_H) +$(OTTY)shknam.o: shknam.c $(HACK_H) +$(OTTY)sit.o: sit.c $(HACK_H) $(INCL)artifact.h + $(Q)$(CC) $(CFLAGS) /EP $(@B).c > $(OTTY)$(@B).c.preproc + $(Q)$(CC) $(CFLAGS) -Fo$@ $(@B).c +$(OTTY)sounds.o: sounds.c $(HACK_H) +$(OTTY)sp_lev.o: sp_lev.c $(HACK_H) $(INCL)sp_lev.h +$(OTTY)spell.o: spell.c $(HACK_H) +$(OTTY)stairs.o: stairs.c $(HACK_H) +$(OTTY)steal.o: steal.c $(HACK_H) +$(OTTY)steed.o: steed.c $(HACK_H) +$(OTTY)strutil.o: strutil.c $(HACK_H) +$(OTTY)symbols.o: symbols.c $(HACK_H) $(INCL)tcap.h +$(OTTY)sys.o: sys.c $(HACK_H) +$(OTTY)teleport.o: teleport.c $(HACK_H) +#$(OTTY)tile.o: tile.c $(HACK_H) +$(OTTY)timeout.o: timeout.c $(HACK_H) +$(OTTY)topten.o: topten.c $(HACK_H) $(INCL)dlb.h +$(OTTY)track.o: track.c $(HACK_H) +$(OTTY)trap.o: trap.c $(HACK_H) +$(OTTY)u_init.o: u_init.c $(HACK_H) +$(OTTY)uhitm.o: uhitm.c $(HACK_H) +$(OTTY)utf8map.o: utf8map.c $(HACK_H) +$(OTTY)vault.o: vault.c $(HACK_H) +$(OTTY)version.o: version.c $(HACK_H) $(INCL)dlb.h +$(OTTY)vision.o: vision.c $(HACK_H) +$(OTTY)weapon.o: weapon.c $(HACK_H) +$(OTTY)were.o: were.c $(HACK_H) +$(OTTY)wield.o: wield.c $(HACK_H) +$(OTTY)windows.o: windows.c $(HACK_H) $(INCL)dlb.h $(INCL)wintty.h +$(OTTY)wizard.o: wizard.c $(HACK_H) +$(OTTY)wizcmds.o: wizcmds.c $(HACK_H) $(INCL)func_tab.h +$(OTTY)worm.o: worm.c $(HACK_H) +$(OTTY)worn.o: worn.c $(HACK_H) +$(OTTY)write.o: write.c $(HACK_H) +$(OTTY)zap.o: zap.c $(HACK_H) +# +#$(OGUI)cppregex.o: ..\sys\share\cppregex.cpp $(CONFIG_H) +# $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\sys\share\cppregex.cpp +$(OGUI)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)tcap.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\ioctl.c +$(OGUI)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)dlb.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pcmain.c +$(OGUI)pcsys.o: ..\sys\share\pcsys.c $(HACK_H) $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pcsys.c +$(OGUI)pctty.o: ..\sys\share\pctty.c $(HACK_H) $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pctty.c +$(OGUI)pcunix.o: ..\sys\share\pcunix.c $(HACK_H) $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pcunix.c +$(OGUI)pmatchregex.o: ..\sys\share\pmatchregex.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\pmatchregex.c +$(OGUI)posixregex.o: ..\sys\share\posixregex.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\posixregex.c +$(OGUI)random.o: ..\sys\share\random.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\random.c +$(OGUI)unixtty.o: ..\sys\share\unixtty.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\share\unixtty.c +$(OGUI)unixmain.o: ..\sys\unix\unixmain.c $(HACK_H) $(INCL)dlb.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\unix\unixmain.c +$(OGUI)unixres.o: ..\sys\unix\unixres.c $(CONFIG_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\unix\unixres.c +$(OGUI)unixunix.o: ..\sys\unix\unixunix.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\sys\unix\unixunix.c +$(OGUI)qt_bind.o: ..\win\Qt\qt_bind.cpp $(HACK_H) $(QTn_H) \ + $(INCL)dlb.h ..\win\Qt\qt_bind.h ..\win\Qt\qt_click.h \ + ..\win\Qt\qt_clust.h ..\win\Qt\qt_delay.h ..\win\Qt\qt_icon.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_key.h ..\win\Qt\qt_line.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h ..\win\Qt\qt_menu.h \ + ..\win\Qt\qt_msg.h ..\win\Qt\qt_plsel.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_rip.h ..\win\Qt\qt_set.h \ + ..\win\Qt\qt_stat.h ..\win\Qt\qt_str.h ..\win\Qt\qt_streq.h \ + ..\win\Qt\qt_svsel.h ..\win\Qt\qt_win.h ..\win\Qt\qt_xcmd.h \ + ..\win\Qt\qt_yndlg.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_bind.cpp +$(OGUI)qt_click.o: ..\win\Qt\qt_click.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_click.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_click.cpp +$(OGUI)qt_clust.o: ..\win\Qt\qt_clust.cpp $(QTn_H) ..\win\Qt\qt_clust.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_clust.cpp +$(OGUI)qt_delay.o: ..\win\Qt\qt_delay.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_delay.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_delay.cpp +$(OGUI)qt_glyph.o: ..\win\Qt\qt_glyph.cpp $(HACK_H) $(QTn_H) \ + $(INCL)tile2x11.h ..\win\Qt\qt_bind.h \ + ..\win\Qt\qt_clust.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_inv.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h \ + ..\win\Qt\qt_str.h ..\win\Qt\qt_win.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_glyph.cpp +$(OGUI)qt_icon.o: ..\win\Qt\qt_icon.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_icon.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_icon.cpp +$(OGUI)qt_inv.o: ..\win\Qt\qt_inv.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_inv.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_inv.cpp +$(OGUI)qt_key.o: ..\win\Qt\qt_key.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_key.cpp +$(OGUI)qt_line.o: ..\win\Qt\qt_line.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_line.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_line.cpp +$(OGUI)qt_main.o: ..\win\Qt\qt_main.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_clust.h ..\win\Qt\qt_glyph.h \ + ..\win\Qt\qt_icon.h ..\win\Qt\qt_inv.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h \ + ..\win\Qt\qt_msg.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_stat.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_win.h qt_kde0.moc qt_main.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_main.cpp +$(OGUI)qt_map.o: ..\win\Qt\qt_map.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_click.h ..\win\Qt\qt_clust.h \ + ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_map.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h ..\win\Qt\qt_win.h \ + qt_map.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_map.cpp +$(OGUI)qt_menu.o: ..\win\Qt\qt_menu.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_line.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_menu.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_rip.h ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_streq.h ..\win\Qt\qt_win.h qt_menu.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_menu.cpp +$(OGUI)qt_msg.o: ..\win\Qt\qt_msg.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_clust.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_map.h ..\win\Qt\qt_msg.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h \ + ..\win\Qt\qt_str.h ..\win\Qt\qt_win.h qt_msg.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_msg.cpp +$(OGUI)qt_plsel.o: ..\win\Qt\qt_plsel.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_plsel.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h \ + qt_plsel.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_plsel.cpp +$(OGUI)qt_rip.o: ..\win\Qt\qt_rip.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_rip.h \ + ..\win\Qt\qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_rip.cpp +$(OGUI)qt_set.o: ..\win\Qt\qt_set.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_glyph.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h ..\win\Qt\qt_xcmd.h \ + qt_set.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_set.cpp +$(OGUI)qt_stat.o: ..\win\Qt\qt_stat.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_icon.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_stat.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_win.h ..\win\Qt\qt_xpms.h qt_stat.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_stat.cpp +$(OGUI)qt_str.o: ..\win\Qt\qt_str.cpp $(QTn_H) ..\win\Qt\qt_str.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_str.cpp +$(OGUI)qt_streq.o: ..\win\Qt\qt_streq.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_line.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h ..\win\Qt\qt_streq.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_streq.cpp +$(OGUI)qt_svsel.o: ..\win\Qt\qt_svsel.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_svsel.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_svsel.cpp +$(OGUI)qt_win.o: ..\win\Qt\qt_win.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_bind.h ..\win\Qt\qt_click.h ..\win\Qt\qt_clust.h \ + ..\win\Qt\qt_glyph.h ..\win\Qt\qt_icon.h ..\win\Qt\qt_inv.h \ + ..\win\Qt\qt_kde0.h ..\win\Qt\qt_key.h ..\win\Qt\qt_main.h \ + ..\win\Qt\qt_map.h ..\win\Qt\qt_menu.h ..\win\Qt\qt_msg.h \ + ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h ..\win\Qt\qt_rip.h \ + ..\win\Qt\qt_set.h ..\win\Qt\qt_win.h + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_win.cpp +$(OGUI)qt_xcmd.o: ..\win\Qt\qt_xcmd.cpp $(HACK_H) $(QTn_H) \ + $(INCL)func_tab.h ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_main.h ..\win\Qt\qt_post.h \ + ..\win\Qt\qt_pre.h ..\win\Qt\qt_set.h ..\win\Qt\qt_str.h \ + ..\win\Qt\qt_xcmd.h qt_xcmd.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_xcmd.cpp +$(OGUI)qt_yndlg.o: ..\win\Qt\qt_yndlg.cpp $(HACK_H) $(QTn_H) \ + ..\win\Qt\qt_key.h ..\win\Qt\qt_post.h ..\win\Qt\qt_pre.h \ + ..\win\Qt\qt_str.h ..\win\Qt\qt_yndlg.h qt_yndlg.moc + $(TARGET_CXX) $(TARGET_CXXFLAGS) -Fo$@ ..\win\Qt\qt_yndlg.cpp +#$(OGUI)Window.o: ..\win\X11\Window.c $(CONFIG_H) $(INCL)lint.h \ +# $(INCL)winX.h $(INCL)wintype.h $(INCL)xwindow.h \ +# $(INCL)xwindowp.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\Window.c +$(OGUI)dialogs.o: ..\win\X11\dialogs.c $(CONFIG_H) $(INCL)lint.h \ + $(INCL)winX.h $(INCL)wintype.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\dialogs.c +$(OGUI)winX.o: ..\win\X11\winX.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)winX.h $(INCL)xwindow.h ..\win\X11\nh32icon \ + ..\win\X11\nh56icon ..\win\X11\nh72icon +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winX.c +$(OGUI)winmap.o: ..\win\X11\winmap.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)tile2x11.h $(INCL)winX.h $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmap.c +$(OGUI)winmenu.o: ..\win\X11\winmenu.c $(HACK_H) $(INCL)winX.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmenu.c +$(OGUI)winmesg.o: ..\win\X11\winmesg.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmesg.c +$(OGUI)winmisc.o: ..\win\X11\winmisc.c $(HACK_H) $(INCL)func_tab.h \ + $(INCL)winX.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winmisc.c +$(OGUI)winstat.o: ..\win\X11\winstat.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winstat.c +$(OGUI)wintext.o: ..\win\X11\wintext.c $(HACK_H) $(INCL)winX.h \ + $(INCL)xwindow.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\wintext.c +$(OGUI)winval.o: ..\win\X11\winval.c $(HACK_H) $(INCL)winX.h +# $(TARGET_CC) $(TARGET_CFLAGS) $(X11CFLAGS) -Fo$@ ..\win\X11\winval.c +$(OGUI)wc_chainin.o: ..\win\chain\wc_chainin.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\chain\wc_chainin.c +$(OGUI)wc_chainout.o: ..\win\chain\wc_chainout.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\chain\wc_chainout.c +$(OGUI)wc_trace.o: ..\win\chain\wc_trace.c $(HACK_H) \ + $(INCL)func_tab.h $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\chain\wc_trace.c +$(OGUI)cursdial.o: ..\win\curses\cursdial.c $(HACK_H) \ + $(INCL)func_tab.h $(INCL)wincurs.h \ + ..\win\curses\cursdial.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursdial.c +$(OGUI)cursinit.o: ..\win\curses\cursinit.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursinit.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursinit.c +$(OGUI)cursinvt.o: ..\win\curses\cursinvt.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursinvt.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursinvt.c +$(OGUI)cursmain.o: ..\win\curses\cursmain.c $(HACK_H) $(INCL)wincurs.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursmain.c +$(OGUI)cursmesg.o: ..\win\curses\cursmesg.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursmesg.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursmesg.c +$(OGUI)cursmisc.o: ..\win\curses\cursmisc.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)func_tab.h $(INCL)wincurs.h \ + ..\win\curses\cursmisc.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursmisc.c +$(OGUI)cursstat.o: ..\win\curses\cursstat.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\cursstat.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\cursstat.c +$(OGUI)curswins.o: ..\win\curses\curswins.c $(HACK_H) \ + $(INCL)wincurs.h ..\win\curses\curswins.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\curses\curswins.c +$(OGUI)winshim.o: ..\win\shim\winshim.c $(HACK_H) +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\shim\winshim.c +$(OGUI)getline.o: ..\win\tty\getline.c $(HACK_H) $(INCL)func_tab.h \ + $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\getline.c +$(OGUI)termcap.o: ..\win\tty\termcap.c $(HACK_H) $(INCL)tcap.h \ + $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\termcap.c +$(OGUI)topl.o: ..\win\tty\topl.c $(HACK_H) $(INCL)tcap.h \ + $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\topl.c +$(OGUI)wintty.o: ..\win\tty\wintty.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)tcap.h $(INCL)wintty.h +# $(TARGET_CC) $(TARGET_CFLAGS) -Fo$@ ..\win\tty\wintty.c +$(OGUI)allmain.o: allmain.c $(HACK_H) +$(OGUI)alloc.o: alloc.c $(CONFIG_H) $(INCL)nhlua.h +$(OGUI)apply.o: apply.c $(HACK_H) +$(OGUI)artifact.o: artifact.c $(HACK_H) $(INCL)artifact.h +$(OGUI)attrib.o: attrib.c $(HACK_H) +$(OGUI)ball.o: ball.c $(HACK_H) +$(OGUI)bones.o: bones.c $(HACK_H) +$(OGUI)botl.o: botl.c $(HACK_H) +$(OGUI)calendar.o: calendar.c $(HACK_H) +$(OGUI)cfgfiles.o: cfgfiles.c $(HACK_H) +$(OGUI)cmd.o: cmd.c $(HACK_H) $(INCL)func_tab.h +$(OGUI)coloratt.o: coloratt.c $(HACK_H) +$(OGUI)dbridge.o: dbridge.c $(HACK_H) +$(OGUI)decl.o: decl.c $(HACK_H) +$(OGUI)detect.o: detect.c $(HACK_H) $(INCL)artifact.h +$(OGUI)dig.o: dig.c $(HACK_H) +$(OGUI)display.o: display.c $(HACK_H) +$(OGUI)dlb.o: dlb.c $(CONFIG_H) $(INCL)dlb.h +$(OGUI)do.o: do.c $(HACK_H) +$(OGUI)do_name.o: do_name.c $(HACK_H) +$(OGUI)do_wear.o: do_wear.c $(HACK_H) +$(OGUI)dog.o: dog.c $(HACK_H) +$(OGUI)dogmove.o: dogmove.c $(HACK_H) $(INCL)mfndpos.h +$(OGUI)dokick.o: dokick.c $(HACK_H) +$(OGUI)dothrow.o: dothrow.c $(HACK_H) +$(OGUI)drawing.o: drawing.c $(CONFIG_H) $(INCL)defsym.h \ + $(INCL)objclass.h $(INCL)objects.h $(INCL)rm.h \ + $(INCL)sym.h $(INCL)wintype.h +$(OGUI)dungeon.o: dungeon.c $(HACK_H) $(INCL)dgn_file.h \ + $(INCL)dlb.h +$(OGUI)earlyarg.o: earlyarg.c $(HACK_H) +$(OGUI)eat.o: eat.c $(HACK_H) +$(OGUI)end.o: end.c $(HACK_H) $(INCL)dlb.h +$(OGUI)engrave.o: engrave.c $(HACK_H) +$(OGUI)exper.o: exper.c $(HACK_H) +$(OGUI)explode.o: explode.c $(HACK_H) +$(OGUI)extralev.o: extralev.c $(HACK_H) +$(OGUI)files.o: files.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)wintty.h +$(OGUI)fountain.o: fountain.c $(HACK_H) +$(OGUI)getpos.o: getpos.c $(HACK_H) +$(OGUI)glyphs.o: glyphs.c $(HACK_H) +$(OGUI)hack.o: hack.c $(HACK_H) +$(OGUI)hacklib.o: hacklib.c $(HACK_H) +$(OGUI)iactions.o: iactions.c $(HACK_H) +$(OGUI)insight.o: insight.c $(HACK_H) +$(OGUI)invent.o: invent.c $(HACK_H) +$(OGUI)isaac64.o: isaac64.c $(CONFIG_H) $(INCL)isaac64.h +$(OGUI)light.o: light.c $(HACK_H) +$(OGUI)lock.o: lock.c $(HACK_H) +$(OGUI)mail.o: mail.c $(HACK_H) $(INCL)mail.h +$(OGUI)makemon.o: makemon.c $(HACK_H) +$(OGUI)mcastu.o: mcastu.c $(HACK_H) +$(OGUI)mdlib.o: mdlib.c $(CONFIG_H) $(INCL)align.h \ + $(INCL)artilist.h $(INCL)attrib.h \ + $(INCL)context.h $(INCL)defsym.h $(INCL)dlb.h \ + $(INCL)dungeon.h $(INCL)flag.h $(INCL)hacklib.h \ + $(INCL)mextra.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monst.h $(INCL)monsters.h $(INCL)obj.h \ + $(INCL)objclass.h $(INCL)objects.h \ + $(INCL)permonst.h $(INCL)prop.h $(INCL)seffects.h \ + $(INCL)skills.h $(INCL)sndprocs.h $(INCL)sym.h \ + $(INCL)wintype.h $(INCL)you.h +$(OGUI)mhitm.o: mhitm.c $(HACK_H) $(INCL)artifact.h +$(OGUI)mhitu.o: mhitu.c $(HACK_H) $(INCL)artifact.h +$(OGUI)minion.o: minion.c $(HACK_H) +$(OGUI)mklev.o: mklev.c $(HACK_H) +$(OGUI)mkmap.o: mkmap.c $(HACK_H) $(INCL)sp_lev.h +$(OGUI)mkmaze.o: mkmaze.c $(HACK_H) $(INCL)sp_lev.h +$(OGUI)mkobj.o: mkobj.c $(HACK_H) +$(OGUI)mkroom.o: mkroom.c $(HACK_H) +$(OGUI)mon.o: mon.c $(HACK_H) $(INCL)mfndpos.h +$(OGUI)mondata.o: mondata.c $(HACK_H) +$(OGUI)monmove.o: monmove.c $(HACK_H) $(INCL)artifact.h \ + $(INCL)mfndpos.h +$(OGUI)monst.o: monst.c $(CONFIG_H) $(INCL)align.h \ + $(INCL)defsym.h $(INCL)monattk.h $(INCL)monflag.h \ + $(INCL)monsters.h $(INCL)permonst.h $(INCL)sym.h \ + $(INCL)wintype.h +$(OGUI)mplayer.o: mplayer.c $(HACK_H) +$(OGUI)mthrowu.o: mthrowu.c $(HACK_H) +$(OGUI)muse.o: muse.c $(HACK_H) +$(OGUI)music.o: music.c $(HACK_H) +$(OGUI)nhlobj.o: nhlobj.c $(HACK_H) $(INCL)sp_lev.h +$(OGUI)nhlsel.o: nhlsel.c $(HACK_H) $(INCL)sp_lev.h +$(OGUI)nhlua.o: nhlua.c $(HACK_H) $(INCL)dlb.h +$(OGUI)nhmd4.o: nhmd4.c $(HACK_H) $(INCL)nhmd4.h +$(OGUI)o_init.o: o_init.c $(HACK_H) +$(OGUI)objects.o: objects.c $(CONFIG_H) $(INCL)defsym.h \ + $(INCL)obj.h $(INCL)objclass.h $(INCL)objects.h \ + $(INCL)prop.h $(INCL)skills.h +$(OGUI)objnam.o: objnam.c $(HACK_H) +$(OGUI)options.o: options.c $(CONFIG_H) $(HACK_H) $(INCL)defsym.h \ + $(INCL)flag.h $(INCL)objclass.h $(INCL)objects.h \ + $(INCL)optlist.h $(INCL)tcap.h +$(OGUI)pager.o: pager.c $(HACK_H) $(INCL)dlb.h +$(OGUI)pickup.o: pickup.c $(HACK_H) +$(OGUI)pline.o: pline.c $(HACK_H) +$(OGUI)polyself.o: polyself.c $(HACK_H) +$(OGUI)potion.o: potion.c $(HACK_H) +$(OGUI)pray.o: pray.c $(HACK_H) +$(OGUI)priest.o: priest.c $(HACK_H) $(INCL)mfndpos.h +$(OGUI)quest.o: quest.c $(HACK_H) +$(OGUI)questpgr.o: questpgr.c $(HACK_H) $(INCL)dlb.h \ + $(INCL)wintty.h +$(OGUI)read.o: read.c $(HACK_H) +$(OGUI)rect.o: rect.c $(HACK_H) +$(OGUI)region.o: region.c $(HACK_H) +$(OGUI)report.o: report.c $(HACK_H) $(INCL)dlb.h $(INCL)nhmd4.h +$(OGUI)restore.o: restore.c $(HACK_H) $(INCL)tcap.h +$(OGUI)rip.o: rip.c $(HACK_H) +$(OGUI)rnd.o: rnd.c $(HACK_H) $(INCL)isaac64.h +$(OGUI)role.o: role.c $(HACK_H) +$(OGUI)rumors.o: rumors.c $(HACK_H) $(INCL)dlb.h +$(OGUI)save.o: save.c $(HACK_H) +$(OGUI)selvar.o: selvar.c $(HACK_H) $(INCL)sp_lev.h +$(OGUI)sfstruct.o: sfstruct.c $(HACK_H) $(INCL)sfmacros.h + $(Q)$(CC) $(CFLAGS) /EP $(@B).c > $(OGUI)$(@B).c.preproc + $(Q)$(CC) $(CFLAGS) -Fo$@ $(@B).c +$(OGUI)shk.o: shk.c $(HACK_H) +$(OGUI)shknam.o: shknam.c $(HACK_H) +$(OGUI)sit.o: sit.c $(HACK_H) $(INCL)artifact.h +$(OGUI)sounds.o: sounds.c $(HACK_H) +$(OGUI)sp_lev.o: sp_lev.c $(HACK_H) $(INCL)sp_lev.h +$(OGUI)spell.o: spell.c $(HACK_H) +$(OGUI)stairs.o: stairs.c $(HACK_H) +$(OGUI)steal.o: steal.c $(HACK_H) +$(OGUI)steed.o: steed.c $(HACK_H) +$(OGUI)strutil.o: strutil.c $(HACK_H) +$(OGUI)symbols.o: symbols.c $(HACK_H) $(INCL)tcap.h +$(OGUI)sys.o: sys.c $(HACK_H) +$(OGUI)teleport.o: teleport.c $(HACK_H) +#$(OGUI)tile.o: tile.c $(HACK_H) +$(OGUI)timeout.o: timeout.c $(HACK_H) +$(OGUI)topten.o: topten.c $(HACK_H) $(INCL)dlb.h +$(OGUI)track.o: track.c $(HACK_H) +$(OGUI)trap.o: trap.c $(HACK_H) +$(OGUI)u_init.o: u_init.c $(HACK_H) +$(OGUI)uhitm.o: uhitm.c $(HACK_H) +$(OGUI)utf8map.o: utf8map.c $(HACK_H) +$(OGUI)vault.o: vault.c $(HACK_H) +$(OGUI)version.o: version.c $(HACK_H) $(INCL)dlb.h +$(OGUI)vision.o: vision.c $(HACK_H) +$(OGUI)weapon.o: weapon.c $(HACK_H) +$(OGUI)were.o: were.c $(HACK_H) +$(OGUI)wield.o: wield.c $(HACK_H) +$(OGUI)windows.o: windows.c $(HACK_H) $(INCL)dlb.h $(INCL)wintty.h +$(OGUI)wizard.o: wizard.c $(HACK_H) +$(OGUI)wizcmds.o: wizcmds.c $(HACK_H) $(INCL)func_tab.h +$(OGUI)worm.o: worm.c $(HACK_H) +$(OGUI)worn.o: worn.c $(HACK_H) +$(OGUI)write.o: write.c $(HACK_H) +$(OGUI)zap.o: zap.c $(HACK_H) + + +qt_kde0.moc: $(QTn_H) ..\win\Qt\qt_kde0.h + $(MOCPATH) ..\win\Qt\qt_kde0.h +qt_main.moc: $(QTn_H) ..\win\Qt\qt_kde0.h ..\win\Qt\qt_main.h + $(MOCPATH) ..\win\Qt\qt_main.h +qt_map.moc: $(QTn_H) ..\win\Qt\qt_clust.h ..\win\Qt\qt_map.h ..\win\Qt\qt_win.h + $(MOCPATH) ..\win\Qt\qt_map.h +qt_menu.moc: $(QTn_H) ..\win\Qt\qt_menu.h ..\win\Qt\qt_rip.h ..\win\Qt\qt_win.h + $(MOCPATH) ..\win\Qt\qt_menu.h +qt_msg.moc: $(QTn_H) ..\win\Qt\qt_msg.h ..\win\Qt\qt_win.h + $(MOCPATH) ..\win\Qt\qt_msg.h +qt_plsel.moc: $(QTn_H) ..\win\Qt\qt_plsel.h + $(MOCPATH) ..\win\Qt\qt_plsel.h +qt_set.moc: $(QTn_H) ..\win\Qt\qt_bind.h ..\win\Qt\qt_kde0.h \ + ..\win\Qt\qt_main.h ..\win\Qt\qt_set.h + $(MOCPATH) ..\win\Qt\qt_set.h +qt_stat.moc: $(QTn_H) ..\win\Qt\qt_icon.h ..\win\Qt\qt_stat.h \ + ..\win\Qt\qt_win.h + $(MOCPATH) ..\win\Qt\qt_stat.h +qt_xcmd.moc: $(QTn_H) ..\win\Qt\qt_xcmd.h + $(MOCPATH) ..\win\Qt\qt_xcmd.h +qt_yndlg.moc: $(QTn_H) ..\win\Qt\qt_yndlg.h + $(MOCPATH) ..\win\Qt\qt_yndlg.h +# DEPENDENCIES MUST END AT END OF FILE +# IF YOU PUT STUFF HERE IT WILL GO AWAY diff --git a/sys/windows/build-msys2.txt b/sys/windows/build-msys2.txt new file mode 100644 index 000000000..ee4d4a11f --- /dev/null +++ b/sys/windows/build-msys2.txt @@ -0,0 +1,152 @@ +Building NetHack using MSYS2 + +Prerequisite Requirements: + + o MSYS2 + - https://www.msys2.org/ + - Download and run the installer, and start the UCRT64 shell. + then + pacman -S mingw-w64-ucrt-x86_64-gcc + pacman -S git + pacman -S make + pacman -S vim (or your editor of choice) + pacman -S man (otherwise "git help foo" will not work) + pacman -S perl-doc (otherwise "git nhhelp foo" will not work, + so only needed if you use nhgitset.pl) + o Lua + o pdcursesmod (Only required if curses interface support is desired) + Instructions for obtaining these are later in this file. + +/---------------------------------------------\ +| Directories for a Windows NetHack build | +\---------------------------------------------/ + + (NetHack-top) + | + +-----+------+-----+-------+-----------+-----------+-----~-----+------+ + | | | | | | | | | + dat doc include lib src sys win submodules util + | | | | + +----------+ +------+ +----+ +----+ + | | | | | | | | + | | | | | | | | + lua-5.4.8 pdcursesmod share windows tty win32 lua pdcursesmod + | + vs + | + +----------+-------+--------+--------+-----------+-------+-----+------+ + | | | | | | | | | + makedefs NetHack NetHackW PDCurses PDCursesGui tile2bmp tilemap tiles uudecode + +/-----------------------------------------------------------\ +| Building from MSYS2 bash | +\-----------------------------------------------------------/ + +Required components that are not bundled in the NetHack repository, but +are required to build NetHack yourself. + +Lua + NetHack 5.0 for Windows requires 3rd party Lua source that is not part + of the NetHack distribution or repository. + + A bash shell script for fetching prerequisite + sources is available, and can be run as follows from the top of + the NetHack source tree to obtain lua: + sh sys/windows/fetch.sh lua + +Curses + If you want to include curses interface support in NetHack 5.0 for + 3rd part pdcursesmod source code is required and is not part of the + NetHack distribution or repository. + + A bash shell script for fetching prerequisite + sources is available, and can be run as follows from the top of + the NetHack source tree to obtain pdcursesmod: + sh sys/windows/fetch.sh pdcursesmod + +Building + +Two different versions of NetHack will be built for Windows from the +command line using the Makefile approach: + A tty port utilizing the Win32 Console I/O subsystem Console, + and a curses interface in an executable called NetHack.exe. + + A Win32 native port built on the Windows API Graphical NetHack, + and graphical curses in an executable called NetHackW.exe. + +The Makefile configurations will build both NetHack.exe and NetHackW.exe +and will be able to use the same datafiles, save files and bones files. + +Since the last official release of NetHack, compilers and computer +architectures have evolved and you can now choose whether to build +a 32-bit x86 version, or a 64-bit x64 version. The default Makefile +is set up for a 32-bit x86 version, but that's only because it will +run on the largest number of existing Windows environments. Change it if you +want. Be aware that NetHack's save files and bones files in the 5.0.0 +release are not interchangeable between the 32-bit version and the +64-bit version (or between different platforms). + +I. Dispelling the Myths: + + Compiling NetHack for Windows is not as easy as it sounds, nor as hard + as it looks, however it will behoove you to read this entire section + through before beginning the task. + + We have provided GNUmakefile in sys/windows/GNUmakefile, which you use + from the bash Windows command shell included with MSYS2. It is called + GNUmakefile because that is the first name searched for by the GNU + make utility thus preventing conflict with the Makefile used by the + Microsoft nmake utility. + + +II. To compile your copy of NetHack on a Windows machine using MSYS2: + +Setting Up + +1. Change your current directory the top of the nethack + source tree if it isn't there already. + +2. Execute the following command to place copies of the Makefiles in + the src subfolder. + cp sys/windows/GNUmakefile* src + +3. Change your current directory to the src subfolder of the nethack + source tree. The following command assumes you are still in the + sys/windows folder from steps #1 and #2 above: + cd src + +Compiling + +4. Now that everything is set up, you should be ready to start the + process. + + Your current directory should be the NetHack src directory. + + Issue these following commands, which will find and use GNUmakefile + by default: + + make clean + make depend + make + + If all goes well, intermediate NetHack files will be placed in the + binary subfolder of the NetHack tree, and the final NetHack package + for windows will be in the package subfolder. + +Notes: + +1. To rebuild NetHack after changing something, change your current directory + to src and issue the following command: + make + +2. An alternative to MSYS2 may be MinGW-w64 - winlibs standalone build. + That has not been tested by us at time of writing. + MinGW-w64 - winlibs standalone build + - https://github.com/brechtsanders/winlibs_mingw + - Download one of the releases from + https://github.com/brechtsanders/winlibs_mingw/releases + and extract the contents into a folder (ideally in a folder + without spaces in the path), and add the location of the + subfolder containing gcc.exe to your PATH. + + diff --git a/sys/windows/build-nmake.txt b/sys/windows/build-nmake.txt new file mode 100644 index 000000000..b564d20fb --- /dev/null +++ b/sys/windows/build-nmake.txt @@ -0,0 +1,145 @@ +Building NetHack using the Visual Studio nmake from the command line + +Prerequisite Requirements: + + o Visual Studio Community + A copy of Microsoft Visual Studio Community needs to + be installed on your machine. See: + https://visualstudio.microsoft.com/vs/community/ + o Lua + NetHack 5.0 for Windows requires 3rd party Lua source that is not part + of the NetHack distribution or repository. + + A windows cmd command procedure for fetching prerequisite sources + is available, and can be run as follows from the top of the + NetHack source tree to obtain lua: + sys\windows\fetch.cmd lua + o pdcursesmod (Only required if curses interface support is desired) + If you want to include curses interface support in NetHack 5.0 for + 3rd part pdcursesmod source code is required and is not part of the + NetHack distribution or repository. + + A windows cmd command procedure for fetching prerequisite + sources is available, and can be run as follows from the top of + the NetHack source tree to obtain pdcursesmod: + sys\windows\fetch.cmd pdcursesmod + +The build Makefiles and procedures produce two executables: + a. A TTY and curses version of NetHack in nethack.exe + b. A Windows and curses graphical version in nethackw.exe. + +You can use one of the following build environments: + +/---------------------------------------------\ +| Directories for a Windows NetHack build | +\---------------------------------------------/ + + (NetHack-top) + | + +-----+------+-----+-------+-----------+-----------+-----~-----+------+ + | | | | | | | | | + dat doc include lib src sys win submodules util + | | | | + +----------+ +------+ +----+ +----+ + | | | | | | | | + | | | | | | | | + lua-5.4.8 pdcursesmod share windows tty win32 lua pdcursesmod + | + vs + | + +----------+-------+--------+--------+-----------+-------+-----+------+ + | | | | | | | | | + makedefs NetHack NetHackW PDCurses PDCursesGui tile2bmp tilemap tiles uudecode + + +/-----------------------------------------------------------\ +| Building From the Command Line Using nmake from one of the | +| Visual Studio Community versions | +\-----------------------------------------------------------/ + +Building + +Two different versions of NetHack will be built for Windows from the +command line using the Makefile approach: + A tty port utilizing the Win32 Console I/O subsystem Console, + and a curses interface in an executable called NetHack.exe. + NetHack + A Win32 native port built on the Windows API Graphical NetHack, + and graphical curses in an executable called NetHackW.exe. + +The Makefile configurations will build both; NetHack.exe and NetHackW.exe +and will be able to use the same datafiles, save files and bones files. + +Since the last official release of NetHack, compilers and computer +architectures have evolved and you can now choose whether to build +a 32-bit x86 version, or a 64-bit x64 version. The default Makefile +is set up for a 32-bit x86 version, but that's only because it will +run on the most number of existing Windows environments. Change it if you +want. Be aware that NetHack's save files and bones files in the 5.0.0 +release have not yet evolved enough to allow them to interchange between +the 32-bit version and the 64-bit version (or between different platforms). +That may change in future. + +I. Dispelling the Myths: + + Compiling NetHack for Windows is not as easy as it sounds, nor as hard + as it looks, however it will behoove you to read this entire section + through before beginning the task. + + We have provided a Visual Studio nmake Makefile.make in + sys/windows/Makefile.nmake, which you use from the Windows command + line. + + +II. To compile your copy of NetHack on a Windows machine: + +Setting Up + +1. Change your current directory to the sys\windows subfolder of the nethack + source tree, if you are at the top of the NetHack source tree. + cd sys\windows. + +2. Execute .\nhsetup.bat to place copies of the Makefiles in + the src subfolder. The file sys\windows\Makefile.nmake will copied + to a file src\Makefile. + .\nhsetup.bat + +3. Change your current directory to the src subfolder of the nethack + source tree. The following command assumes you are still in the + sys\windows folder from steps #1 and #2 above: + cd ..\..\src + +Compiling + +4. Now that everything is set up, you should be ready to start the + process. + + Your current directory should be the NetHack src directory. + + Issue these following command: + nmake package + + If all goes well, intermediate NetHack files will be placed in the + binary subfolder of the NetHack tree, and the final NetHack package + for windows will be in the package subfolder. + +Notes: + +1. To rebuild NetHack after changing something, change your current directory + to src and issue the appropriate command for your compiler: + + For Microsoft compiler: + nmake package + +2. Depending on the build and compiler and tools used above, the + package produced by the build will be either contain: + - a 32-bit (x86) .exe file, + which should run on any recent Win32 environment. + or + - a 64-bit (x64) .exe file, + which should run on any 64-bit Windows O/S. + + **Note**: saved games and bones files are NOT compatible between the + 32-bit and the 64-bit versions at this time. + + diff --git a/sys/windows/build-vs.txt b/sys/windows/build-vs.txt new file mode 100644 index 000000000..0b3c7d12a --- /dev/null +++ b/sys/windows/build-vs.txt @@ -0,0 +1,104 @@ +Building NetHack using the Visual Studio IDE + +Prerequisite Requirements: + + o Visual Studio Community + A copy of a version of Microsoft Visual Studio Community needs to + be installed on your machine. Visual Studio Community can be either + the version for Windows 11 x64 for use on machines with + Intel/AMD64 processors, or the version for Windows 11 ARM64 for + use on machines with ARM64 processors (Snapdragon). + + You can opt to build for a target x64, or for a target ARM64 + on either the x64 version of Visual Studio, or on the ARM64 + version. Versions of Visual Studio, since Visual Studio 26, + are able to compile for the native host platform and + cross-compile to the other target platform. + + If you want to selectively cross-compile for both x64 and ARM64 + target types, ensure that the necessary Individual Components for + both types of target builds are selected (checked-off) in the + Visual Studio Installer Individual Components dialog: + + Under Compilers, build tools, and runtimes: + o MSVC Build Tools for ARM64/ARM64EC (Latest) + o MSVC Build Tools for x64/x86 (Latest) + + You can use the Visual Studio Installer "Modify" button + to add missing Individual Components after installation, + if needed. + + See: + https://visualstudio.microsoft.com/vs/community/ + o Lua + NetHack 5.0 for Windows requires 3rd party Lua source that is not part + of the NetHack distribution or repository. + + A windows cmd command procedure for fetching prerequisite sources + is available, and can be run as follows from the top of the + NetHack source tree to obtain lua: + sys\windows\fetch.cmd lua + o pdcursesmod (Only required if curses interface support is desired) + If you want to include curses interface support in NetHack 5.0 for + 3rd part pdcursesmod source code is required and is not part of the + NetHack distribution or repository. + + A windows cmd command procedure for fetching prerequisite + sources is available, and can be run as follows from the top of + the NetHack source tree to obtain pdcursesmod: + sys\windows\fetch.cmd pdcursesmod + +This processes produces a zip file containing two executable +versions: + + a. A TTY and curses version of NetHack in nethack.exe + b. A Windows and curses graphical version in nethackw.exe. + + +/---------------------------------------------\ +| Directories for a Windows NetHack build | +\---------------------------------------------/ + + (NetHack-top) + | + +-----+------+-----+-------+-----------+-----------+-----~-----+------+ + | | | | | | | | | + dat doc include lib src sys win submodules util + | | | | + +----------+ +------+ +----+ +----+ + | | | | | | | | + | | | | | | | | + lua-5.4.8 pdcursesmod share windows tty win32 lua pdcursesmod + | + vs + | + +----------+-------+--------+--------+-----------+-------+-----+------+ + | | | | | | | | | + makedefs NetHack NetHackW PDCurses PDCursesGui tile2bmp tilemap tiles uudecode + + +/-----------------------------------------------------------\ +| Building And Running Using Visual Studio Community | +\-----------------------------------------------------------/ + +When using a version of Visual Studio Community, load the provided solution +file within the IDE, build the solution. + +The Visual Studio NetHack solution file can be found here: + sys\windows\vs\NetHack.sln + +The steps are: + 1. Launch the IDE. + 2. Open the appropriate solution file in sys\windows\vs\NetHack.sln. + 3. Select the build platform and configuration that you wish + to target (x64 or ARM64, and Release or Debug). + (Note: If you want to target an ARM64 build from an x64 machine, + or target an x64 build from an ARM64 machine, you need to + first complete the build for the native machine type target. + That's necessary to ensure that host-native versions of + uudecode.exe, makedefs.exe, tilemap.exe, tile2bmp.exe and + dlb.exe tools are available for execution during the build + steps that rely on those tools.) + 4. From the build menu, select build solution. + 5. Type F5 to start debugging. + diff --git a/sys/windows/console.rc b/sys/windows/console.rc new file mode 100644 index 000000000..81a21b2ca --- /dev/null +++ b/sys/windows/console.rc @@ -0,0 +1,112 @@ +/* NetHack 5.0 console.rc $NHDT-Date: 1596498311 2020/08/03 23:45:11 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.14 $ */ +/* Copyright (c) Yitzhak Sapir, 2002. */ +/* NetHack may be freely redistributed. See license for details. */ + +#include "windows.h" + +1 ICON DISCARDABLE "NetHack.ICO" + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 5,0,0,0 + PRODUCTVERSION 5,0,0,0 + FILEFLAGSMASK 0x1fL +#ifdef _DEBUG + FILEFLAGS 0x9L +#else + FILEFLAGS 0x8L +#endif + FILEOS 0x4L + FILETYPE 0x0L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "NetHack for Windows - TTY Interface\0" + VALUE "FileVersion", "5.0.0\0" + VALUE "InternalName", "NetHack\0" + VALUE "LegalCopyright", "Copyright (C) 1985 - 2026. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0" + VALUE "OriginalFilename", "NetHack.exe\0" + VALUE "PrivateBuild", "050107\0" + VALUE "ProductName", "NetHack\0" + VALUE "ProductVersion", "5.0.0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#ifdef RCWAV +se_squeak_A WAVE "se_squeak_A.wav" +se_squeak_B WAVE "se_squeak_B.wav" +se_squeak_B_flat WAVE "se_squeak_B_flat.wav" +se_squeak_C WAVE "se_squeak_C.wav" +se_squeak_D WAVE "se_squeak_D.wav" +se_squeak_D_flat WAVE "se_squeak_D_flat.wav" +se_squeak_E WAVE "se_squeak_E.wav" +se_squeak_E_flat WAVE "se_squeak_E_flat.wav" +se_squeak_F WAVE "se_squeak_F.wav" +se_squeak_F_sharp WAVE "se_squeak_F_sharp.wav" +se_squeak_G WAVE "se_squeak_G.wav" +se_squeak_G_share WAVE "se_squeak_G_sharp.wav" + +sound_Bell WAVE "sound_Bell.wav" +sound_Bugle_A WAVE "sound_Bugle_A.wav" +sound_Bugle_B WAVE "sound_Bugle_B.wav" +sound_Bugle_C WAVE "sound_Bugle_C.wav" +sound_Bugle_D WAVE "sound_Bugle_D.wav" +sound_Bugle_E WAVE "sound_Bugle_E.wav" +sound_Bugle_F WAVE "sound_Bugle_F.wav" +sound_Bugle_G WAVE "sound_Bugle_G.wav" +sound_Drum_Of_Earthquake WAVE "sound_Drum_Of_Earthquake.wav" +sound_Fire_Horn WAVE "sound_Fire_Horn.wav" +sound_Frost_Horn WAVE "sound_Frost_Horn.wav" +sound_Leather_Drum WAVE "sound_Leather_Drum.wav" +sound_Magic_Harp_A WAVE "sound_Magic_Harp_A.wav" +sound_Magic_Harp_B WAVE "sound_Magic_Harp_B.wav" +sound_Magic_Harp_C WAVE "sound_Magic_Harp_C.wav" +sound_Magic_Harp_D WAVE "sound_Magic_Harp_D.wav" +sound_Magic_Harp_E WAVE "sound_Magic_Harp_E.wav" +sound_Magic_Harp_F WAVE "sound_Magic_Harp_F.wav" +sound_Magic_Harp_G WAVE "sound_Magic_Harp_G.wav" +sound_Magic_Flute_A WAVE "sound_Magic_Flute_A.wav" +sound_Magic_Flute_B WAVE "sound_Magic_Flute_B.wav" +sound_Magic_Flute_C WAVE "sound_Magic_Flute_C.wav" +sound_Magic_Flute_D WAVE "sound_Magic_Flute_D.wav" +sound_Magic_Flute_E WAVE "sound_Magic_Flute_E.wav" +sound_Magic_Flute_F WAVE "sound_Magic_Flute_F.wav" +sound_Magic_Flute_G WAVE "sound_Magic_Flute_G.wav" +sound_Tooled_Horn_A WAVE "sound_Tooled_Horn_A.wav" +sound_Tooled_Horn_B WAVE "sound_Tooled_Horn_B.wav" +sound_Tooled_Horn_C WAVE "sound_Tooled_Horn_C.wav" +sound_Tooled_Horn_D WAVE "sound_Tooled_Horn_D.wav" +sound_Tooled_Horn_E WAVE "sound_Tooled_Horn_E.wav" +sound_Tooled_Horn_F WAVE "sound_Tooled_Horn_F.wav" +sound_Tooled_Horn_G WAVE "sound_Tooled_Horn_G.wav" +sound_Wooden_Flute_A WAVE "sound_Wooden_Flute_A.wav" +sound_Wooden_Flute_B WAVE "sound_Wooden_Flute_B.wav" +sound_Wooden_Flute_C WAVE "sound_Wooden_Flute_C.wav" +sound_Wooden_Flute_D WAVE "sound_Wooden_Flute_D.wav" +sound_Wooden_Flute_E WAVE "sound_Wooden_Flute_E.wav" +sound_Wooden_Flute_F WAVE "sound_Wooden_Flute_F.wav" +sound_Wooden_Flute_G WAVE "sound_Wooden_Flute_G.wav" +sound_Wooden_Harp_A WAVE "sound_Wooden_Harp_A.wav" +sound_Wooden_Harp_B WAVE "sound_Wooden_Harp_B.wav" +sound_Wooden_Harp_C WAVE "sound_Wooden_Harp_C.wav" +sound_Wooden_Harp_D WAVE "sound_Wooden_Harp_D.wav" +sound_Wooden_Harp_E WAVE "sound_Wooden_Harp_E.wav" +sound_Wooden_Harp_F WAVE "sound_Wooden_Harp_F.wav" +sound_Wooden_Harp_G WAVE "sound_Wooden_Harp_G.wav" +sa2_xpleveldown WAVE "sa2_xpleveldown.wav" +sa2_xplevelup WAVE "sa2_xplevelup.wav" +#endif + +/*console.rc*/" diff --git a/sys/winnt/nttty.c b/sys/windows/consoletty.c similarity index 56% rename from sys/winnt/nttty.c rename to sys/windows/consoletty.c index 6cb01c951..5b5b77070 100644 --- a/sys/winnt/nttty.c +++ b/sys/windows/consoletty.c @@ -1,28 +1,46 @@ -/* NetHack 3.6 nttty.c $NHDT-Date: 1554215932 2019/04/02 14:38:52 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.99 $ */ +/* NetHack 5.0 consoletty.c $NHDT-Date: 1596498316 2020/08/03 23:45:16 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.117 $ */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ -/* tty.c - (Windows NT) version */ +/* tty.c - (Windows console) version */ /* - * Initial Creation M. Allison 1993/01/31 - * Switch to low level console output routines M. Allison 2003/10/01 - * Restrict cursor movement until input pending M. Lehotay 2003/10/02 - * Call Unicode version of output API on NT R. Chason 2005/10/28 - * Use of back buffer to improve performance B. House 2018/05/06 + * Initial Creation M. Allison 1993/01/31 + * Switch to low level console output routines M. Allison 2003/10/01 + * Restrict cursor movement until input pending M. Lehotay 2003/10/02 + * Call Unicode version of output API on NT R. Chason 2005/10/28 + * Use of back buffer to improve performance B. House 2018/05/06 * */ +#ifndef NO_VT +#define VIRTUAL_TERMINAL_SEQUENCES +#define UTF8_FROM_CORE +#endif + #ifdef WIN32 #define NEED_VARARGS /* Uses ... */ #include "win32api.h" #include "winos.h" #include "hack.h" #include "wintty.h" +#include #include #include +#ifdef VIRTUAL_TERMINAL_SEQUENCES +#include +#ifndef INTEGER_H +#include "integer.h" +#endif +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ -extern boolean getreturn_enabled; /* from sys/share/pcsys.c */ +#ifdef __MINGW32__ +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#endif +#endif + +extern boolean getreturn_enabled; /* from windmain.c */ extern int redirect_stdout; #ifdef TTY_GRAPHICS @@ -37,22 +55,70 @@ extern int redirect_stdout; * change. * */ +#ifndef VIRTUAL_TERMINAL_SEQUENCES +#define CONSOLE_CLEAR_ATTRIBUTE \ + (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) +#define CONSOLE_UNDEFINED_ATTRIBUTE (0) +#else /* VIRTUAL_TERMINAL_SEQUENCES */ +#define CONSOLE_CLEAR_ATTRIBUTE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ -#define CONSOLE_CLEAR_ATTRIBUTE (FOREGROUND_RED | FOREGROUND_GREEN \ - | FOREGROUND_BLUE) #define CONSOLE_CLEAR_CHARACTER (' ') - -#define CONSOLE_UNDEFINED_ATTRIBUTE (0) #define CONSOLE_UNDEFINED_CHARACTER ('\0') +#ifdef VIRTUAL_TERMINAL_SEQUENCES +enum console_attributes { + atr_bold = 1, + atr_dim = 2, + atr_uline = 4, + atr_blink = 8, + atr_inverse = 16 +}; +#define MAX_UTF8_SEQUENCE 7 +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ + typedef struct { +#ifndef VIRTUAL_TERMINAL_SEQUENCES WCHAR character; WORD attribute; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + uint8 utf8str[MAX_UTF8_SEQUENCE]; + WCHAR wcharacter; + WORD attr; + long color24; + int color256idx; + const char *bkcolorseq; + const char *colorseq; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } cell_t; +#ifndef VIRTUAL_TERMINAL_SEQUENCES cell_t clear_cell = { CONSOLE_CLEAR_CHARACTER, CONSOLE_CLEAR_ATTRIBUTE }; cell_t undefined_cell = { CONSOLE_UNDEFINED_CHARACTER, CONSOLE_UNDEFINED_ATTRIBUTE }; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ +cell_t clear_cell = { + { CONSOLE_CLEAR_CHARACTER, 0, 0, 0, 0, 0, 0 }, + CONSOLE_CLEAR_CHARACTER, /* wcharacter */ + 0, /* attr */ + 0L, /* color24 */ + 0, /* color256idx */ + "\x1b[0m", /* bkcolorseq */ + 0 /* colorseq */ +}; +cell_t undefined_cell = { + { CONSOLE_UNDEFINED_CHARACTER, 0, 0, 0, 0, 0, 0 }, + CONSOLE_UNDEFINED_CHARACTER, /* wcharacter */ + 0, /* attr */ + 0L, /* color24 */ + 0, /* color256idx */ + (const char *) 0, /* bkcolorseq */ + (const char *) 0 /* colorseq */ +}; +#if 0 +static const uint8 empty_utf8str[MAX_UTF8_SEQUENCE] = { 0 }; +#endif +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ /* * The following WIN32 Console API routines are used in this file. @@ -65,28 +131,43 @@ cell_t undefined_cell = { CONSOLE_UNDEFINED_CHARACTER, * SetConsoleCtrlHandler * PeekConsoleInput * ReadConsoleInput + * GetConsoleOutputCP +#ifndef VIRTUAL_TERMINAL_SEQUENCES * WriteConsoleOutputCharacter * FillConsoleOutputAttribute - * GetConsoleOutputCP +#endif */ -static BOOL FDECL(CtrlHandler, (DWORD)); -static void FDECL(xputc_core, (char)); -void FDECL(cmov, (int, int)); -void FDECL(nocmov, (int, int)); -int FDECL(process_keystroke, - (INPUT_RECORD *, boolean *, BOOLEAN_P numberpad, int portdebug)); -static void NDECL(init_ttycolor); -static void NDECL(really_move_cursor); -static void NDECL(check_and_set_font); -static boolean NDECL(check_font_widths); -static void NDECL(set_known_good_console_font); -static void NDECL(restore_original_console_font); -extern void NDECL(safe_routines); +static BOOL CtrlHandler(DWORD); +#ifndef VIRTUAL_TERMINAL_SEQUENCES +static void xputc_core(char); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ +static void xputc_core(int); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ +void cmov(int, int); +void nocmov(int, int); +int process_keystroke(INPUT_RECORD *, boolean *, uchar numberpad, + int portdebug); +static void init_ttycolor(void); +static void really_move_cursor(void); +static void check_and_set_font(void); +#ifndef VIRTUAL_TERMINAL_SEQUENCES +static boolean check_font_widths(void); +#endif +static void set_known_good_console_font(void); +static void restore_original_console_font(void); +void tty_ibmgraphics_fixup(void); +#ifdef VIRTUAL_TERMINAL_SEQUENCES +extern void (*ibmgraphics_mode_callback)(void); /* symbols.c */ +extern void (*utf8graphics_mode_callback)(void); /* symbols.c */ +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ + +static void init_custom_colors(void); +static void free_custom_colors(void); /* Win32 Screen buffer,coordinate,console I/O information */ COORD ntcoord; -INPUT_RECORD ir; +INPUT_RECORD gbl_ir; static boolean orig_QuickEdit; /* Support for changing console font if existing glyph widths are too wide */ @@ -104,35 +185,20 @@ static boolean init_ttycolor_completed; #ifdef PORT_DEBUG static boolean display_cursor_info = FALSE; #endif -#ifdef CHANGE_COLOR -static void NDECL(adjust_palette); -static int FDECL(match_color_name, (const char *)); -typedef HWND(WINAPI *GETCONSOLEWINDOW)(); -static HWND GetConsoleHandle(void); -static HWND GetConsoleHwnd(void); -static boolean altered_palette; -static COLORREF UserDefinedColors[CLR_MAX]; -static COLORREF NetHackColors[CLR_MAX] = { - 0x00000000, 0x00c80000, 0x0000c850, 0x00b4b432, 0x000000d2, 0x00800080, - 0x000064b4, 0x00c0c0c0, 0x00646464, 0x00f06464, 0x0000ff00, 0x00ffff00, - 0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff -}; -static COLORREF DefaultColors[CLR_MAX] = { - 0x00000000, 0x00800000, 0x00008000, 0x00808000, 0x00000080, 0x00800080, - 0x00008080, 0x00c0c0c0, 0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00, - 0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff -}; -#endif struct console_t { + boolean is_ready; + HWND hWnd; WORD background; WORD foreground; WORD attr; - int current_nhcolor; + int32 current_nhcolor; + int32 current_nhbkcolor; + int32 current_colorflags; int current_nhattr[ATR_INVERSE+1]; COORD cursor; HANDLE hConOut; HANDLE hConIn; - CONSOLE_SCREEN_BUFFER_INFO origcsbi; + CONSOLE_SCREEN_BUFFER_INFO orig_csbi; int width; int height; boolean has_unicode; @@ -141,84 +207,621 @@ struct console_t { cell_t * back_buffer; WCHAR cpMap[256]; boolean font_changed; - CONSOLE_FONT_INFOEX original_font_info; - UINT original_code_page; + CONSOLE_FONT_INFOEX orig_font_info; + UINT orig_code_page; +#ifdef VIRTUAL_TERMINAL_SEQUENCES + char *orig_localestr; + DWORD orig_in_cmode; + DWORD orig_out_cmode; + CONSOLE_FONT_INFOEX font_info; + UINT code_page; + char *localestr; + DWORD in_cmode; + DWORD out_cmode; + long color24; + int color256idx; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } console = { - 0, - (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED), - (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED), - NO_COLOR, - {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}, - {0, 0}, - NULL, - NULL, - { 0 }, - 0, - 0, - FALSE, - 0, - NULL, - NULL, - { 0 }, - FALSE, - { 0 }, - 0 + FALSE, /* is_ready */ + 0, /* hWnd */ + (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED), /* background */ + (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED), /* foreground */ + 0, /* attr */ + 0, /* current_nhcolor */ + 0, /* current_nhbkcolor */ + 0, /* current_colorflags */ + { FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, + { 0, 0 }, /* cursor */ + NULL, /* hConOut*/ + NULL, /* hConIn */ + { { 0, 0}, { 0, 0}, 0, { 0, 0, 0, 0 }, { 0, 0 } }, /* cbsi */ + 0, /* width */ + 0, /* height */ + FALSE, /* has_unicode */ + 0, /* buffer_size */ + NULL, /* front_buffer */ + NULL, /* back_buffer */ + { 0 }, /* cpMap */ + FALSE, /* font_changed */ + { 0 }, /* orig_font_info */ + 0U, /* orig_code_page */ +#ifdef VIRTUAL_TERMINAL_SEQUENCES + NULL, /* orig_localestr */ + 0, /* orig_in_cmode */ + 0, /* orig_out_cmode */ + { 0 }, /* font_info */ + 0U, /* code_page */ + NULL, /* localestr */ + 0, /* in_cmode */ + 0, /* out_cmode */ + 0L, /* color24 */ + 0 /* color256idx */ +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ }; -static DWORD ccount, acount; -#ifndef CLR_MAX -#define CLR_MAX 16 +#if 0 +static const char default_name[] = "default"; #endif +const char *const legal_key_handling[] = { + "none", + "default", + "ray", + "340", +}; -int ttycolors[CLR_MAX]; -int ttycolors_inv[CLR_MAX]; - -#define MAX_OVERRIDES 256 -unsigned char key_overrides[MAX_OVERRIDES]; -static char nullstr[] = ""; -char erase_char, kill_char; -#define DEFTEXTCOLOR ttycolors[7] +enum windows_key_handling keyh[] = { no_keyhandling, default_keyhandling, ray_keyhandling, + nh340_keyhandling }; -int default_processkeystroke(HANDLE, INPUT_RECORD *, boolean *, boolean, int); +int default_processkeystroke(HANDLE, INPUT_RECORD *, boolean *, uchar, int); int default_kbhit(HANDLE, INPUT_RECORD *); -int default_checkinput(HANDLE, INPUT_RECORD *, DWORD *, boolean, +int default_checkinput(HANDLE, INPUT_RECORD *, DWORD *, uchar, int, int *, coord *); -int ray_processkeystroke(HANDLE, INPUT_RECORD *, boolean *, boolean, int); +int ray_processkeystroke(HANDLE, INPUT_RECORD *, boolean *, uchar, int); int ray_kbhit(HANDLE, INPUT_RECORD *); -int ray_checkinput(HANDLE, INPUT_RECORD *, DWORD *, boolean, +int ray_checkinput(HANDLE, INPUT_RECORD *, DWORD *, uchar, int, int *, coord *); -int nh340_processkeystroke(HANDLE, INPUT_RECORD *, boolean *, boolean, int); +int nh340_processkeystroke(HANDLE, INPUT_RECORD *, boolean *, uchar, int); int nh340_kbhit(HANDLE, INPUT_RECORD *); -int nh340_checkinput(HANDLE, INPUT_RECORD *, DWORD *, boolean, +int nh340_checkinput(HANDLE, INPUT_RECORD *, DWORD *, uchar, int, int *, coord *); struct keyboard_handling_t { - char *pKeyHandlingName; + enum windows_key_handling khid; int (*pProcessKeystroke)(HANDLE, INPUT_RECORD *, boolean *, - boolean, int); + uchar, int); int (*pNHkbhit)(HANDLE, INPUT_RECORD *); - int (*pCheckInput)(HANDLE, INPUT_RECORD *, DWORD *, boolean, + int (*pCheckInput)(HANDLE, INPUT_RECORD *, DWORD *, uchar, int, int *, coord *); } keyboard_handling = { - (char *) no_keyhandling, + no_keyhandling, default_processkeystroke, default_kbhit, default_checkinput }; +static DWORD ccount; +#if 0 +static DWORD acount; +#endif +#ifndef CLR_MAX +#define CLR_MAX 16 +#endif + +int ttycolors[CLR_MAX]; +int ttycolors_inv[CLR_MAX]; + +#define MAX_OVERRIDES 256 +unsigned char key_overrides[MAX_OVERRIDES]; +#if 0 +static char nullstr[] = ""; +#endif +char erase_char, kill_char; +#define DEFTEXTCOLOR ttycolors[7] static INPUT_RECORD bogus_key; +/* +Windows console palette: +Color Name Console Legacy RGB Values New Default RGB Values +BLACK 0,0,0 12,12,12 +DARK_BLUE 0,0,128 0,55,218 +DARK_GREEN 0,128,0 19,161,14 +DARK_CYAN 0,128,128 58,150,221 +DARK_RED 128,0,0 197,15,31 +DARK_MAGENTA 128,0,128 136,23,152 +DARK_YELLOW 128,128,0 193,156,0 +DARK_WHITE 192,192,192 204,204,204 +BRIGHT_BLACK 128,128,128 118,118,118 +BRIGHT_BLUE 0,0,255 59,120,255 +BRIGHT_GREEN 0,255,0 22,198,12 +BRIGHT_CYAN 0,255,255 97,214,214 +BRIGHT_RED 255,0,0 231,72,86 +BRIGHT_MAGENTA 255,0,255 180,0,158 +BRIGHT_YELLOW 255,255,0 249,241,165 +WHITE 255,255,255 242,242,242 +*/ + +#ifdef VIRTUAL_TERMINAL_SEQUENCES +int32 customcolors[CLR_MAX]; +const char *esc_seq_colors[CLR_MAX] = { 0 }; +const char *esc_seq_bkcolors[CLR_MAX] = { 0 }; + +void buffer_fill_to_end(cell_t * buffer, cell_t * fill, int x, int y); +void buffer_write(cell_t * buffer, cell_t * cell, COORD pos); +static int32 rgbtable_to_int32(const struct nethack_color *tbl); +void term_start_256color(int idx); +void set_cp_map(void); +#ifdef PORT_DEBUG +void win32con_debug_keystrokes(void); +void win32con_toggle_cursor_info(void); +#endif + +/* GDI typically represents color as BGR (Blue-Green-Red) in memory */ +static int32 +colortable_to_bgr_int32(const struct nethack_color *tbl) +{ + int32 bgrint32 = (tbl->r << 0) | (tbl->g << 8) | (tbl->b << 16); + return bgrint32; +} + +#define rgbtable_offset 16 + +static void +init_custom_colors(void) +{ + char bkcolorbuf[32]; + + customcolors[CLR_BLACK] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 131]); + customcolors[CLR_RED] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 5]); + customcolors[CLR_GREEN] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 31]); + customcolors[CLR_BROWN] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 104]); + customcolors[CLR_BLUE] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 58]); + customcolors[CLR_MAGENTA] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 76]); + customcolors[CLR_CYAN] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 48]); + customcolors[CLR_GRAY] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 73]); + customcolors[NO_COLOR] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 137]); + customcolors[CLR_ORANGE] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 15]); + customcolors[CLR_BRIGHT_GREEN] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 34]); + customcolors[CLR_YELLOW] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 18]); + customcolors[CLR_BRIGHT_BLUE] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 69]); + customcolors[CLR_BRIGHT_MAGENTA] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 84]); + customcolors[CLR_BRIGHT_CYAN] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 49]); + customcolors[CLR_WHITE] = colortable_to_bgr_int32(&colortable[rgbtable_offset + 138]); + +/* esc_seq_colors[CLR_BLACK] = "\x1b[30m"; */ + esc_seq_colors[CLR_BLACK] = "\x1b[38;2;47;79;79m"; + esc_seq_colors[CLR_RED] = "\x1b[31m"; + esc_seq_colors[CLR_GREEN] = "\x1b[32m"; + esc_seq_colors[CLR_YELLOW] = "\x1b[38;2;255;255;0m"; + esc_seq_colors[CLR_BLUE] = "\x1b[38;2;100;149;237m"; + esc_seq_colors[CLR_MAGENTA] = "\x1b[35m"; + esc_seq_colors[CLR_CYAN] = "\x1b[36m"; + esc_seq_colors[CLR_WHITE] = "\x1b[37m"; + + esc_seq_colors[CLR_BROWN] = "\x1b[38;2;205;133;63m"; +// esc_seq_colors[CLR_GRAY] = "\x1b[31m\x1b[32m\x1b[34m"; + esc_seq_colors[CLR_GRAY] = "\x1b[90m"; + esc_seq_colors[NO_COLOR] = "\x1b[39m"; + esc_seq_colors[CLR_ORANGE] = "\x1b[38;2;255;140;0m"; + esc_seq_colors[CLR_BRIGHT_GREEN] = "\x1b[39m"; + esc_seq_colors[CLR_BRIGHT_BLUE] = "\x1b[34m\x1b[94m"; + esc_seq_colors[CLR_BRIGHT_MAGENTA] = "\x1b[35m\x1b[95m"; + esc_seq_colors[CLR_BRIGHT_CYAN] = "\x1b[36m\x1b[96m"; + + /* Sprintf(tmp, "\033[%dm", ((color % 8) + 40)); */ + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BLACK % 8) + 40)); + esc_seq_bkcolors[CLR_BLACK] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_RED % 8) + 40)); + esc_seq_bkcolors[CLR_RED] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_GREEN % 8) + 40)); + esc_seq_bkcolors[CLR_GREEN] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_YELLOW % 8) + 40)); + esc_seq_bkcolors[CLR_YELLOW] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BLUE % 8) + 40)); + esc_seq_bkcolors[CLR_BLUE] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_MAGENTA % 8) + 40)); + esc_seq_bkcolors[CLR_MAGENTA] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_CYAN % 8) + 40)); + esc_seq_bkcolors[CLR_CYAN] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_WHITE % 8) + 40)); + esc_seq_bkcolors[CLR_WHITE] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BROWN % 8) + 40)); + esc_seq_bkcolors[CLR_BROWN] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_GRAY % 8) + 40)); + esc_seq_bkcolors[CLR_GRAY] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((NO_COLOR % 8) + 40)); + esc_seq_bkcolors[NO_COLOR] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_ORANGE % 8) + 40)); + esc_seq_bkcolors[CLR_ORANGE] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_BLUE % 8) + 40)); + esc_seq_bkcolors[CLR_BRIGHT_BLUE] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_GREEN % 8) + 40)); + esc_seq_bkcolors[CLR_BRIGHT_GREEN] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_MAGENTA % 8) + 40)); + esc_seq_bkcolors[CLR_BRIGHT_MAGENTA] = dupstr(bkcolorbuf); + Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_CYAN % 8) + 40)); + esc_seq_bkcolors[CLR_BRIGHT_CYAN] = dupstr(bkcolorbuf); +} + +static void +free_custom_colors(void) +{ +#define CLR_FREE(c) \ + if (esc_seq_bkcolors[(c)] != 0) \ + free((genericptr_t) esc_seq_bkcolors[(c)]), esc_seq_bkcolors[(c)] = 0 + + CLR_FREE(CLR_BLACK); + CLR_FREE(CLR_RED); + CLR_FREE(CLR_GREEN); + CLR_FREE(CLR_YELLOW); + CLR_FREE(CLR_BLUE); + CLR_FREE(CLR_MAGENTA); + CLR_FREE(CLR_CYAN); + CLR_FREE(CLR_WHITE); + CLR_FREE(CLR_BROWN); + CLR_FREE(CLR_GRAY); + CLR_FREE(NO_COLOR); + CLR_FREE(CLR_ORANGE); + CLR_FREE(CLR_BRIGHT_GREEN); + CLR_FREE(CLR_BRIGHT_BLUE); + CLR_FREE(CLR_BRIGHT_MAGENTA); + CLR_FREE(CLR_BRIGHT_CYAN); +#undef CLR_FREE +} + +void emit_start_bold(void); +void emit_stop_bold(void); +void emit_start_dim(void); +void emit_stop_dim(void); +void emit_start_blink(void); +void emit_stop_blink(void); +void emit_start_underline(void); +void emit_stop_underline(void); +void emit_start_inverse(void); +void emit_stop_inverse(void); +void emit_start_24bitcolor(long color24bit); +void emit_start_256color(int u256coloridx); +void emit_default_color(void); +void emit_return_to_default(void); +void emit_hide_cursor(void); +void emit_show_cursor(void); + +void +emit_hide_cursor(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[?25l"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_show_cursor(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[?25h"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_start_bold(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[1m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_stop_bold(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[24m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} +#if 0 +emit_start_dim(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[4m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_stop_dim(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[24m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} +#endif + +void +emit_start_blink(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[5m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_stop_blink(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[25m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_start_underline(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[4m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_stop_underline(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[24m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} +void +emit_start_inverse(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[7m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +void +emit_stop_inverse(void) +{ + DWORD unused; + static const char escseq[] = "\x1b[27m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} + +#if 0 +#define tcfmtstr "\x1b[38;2;%d;%d;%dm" +#if 0 +#define tcfmtstr "\x1b[38:2:%d:%d:%dm" +#endif +#endif + +#ifndef SEP2 +#define tcfmtstr24bit "\x1b[38;2;%ld;%ld;%ldm" +#define tcfmtstr256 "\x1b[38;5;%ldm" +#else +#define tcfmtstr24bit "\x1b[38:2:%ld:%ld:%ldm" +#define tcfmtstr256 "\x1b[38:5:%ldm" +#endif + +void +emit_start_256color(int u256coloridx) +{ + DWORD unused; + static char tcolorbuf[QBUFSZ]; + Snprintf(tcolorbuf, sizeof tcolorbuf, tcfmtstr256, + (long) u256coloridx); + WriteConsoleA(console.hConOut, (LPCSTR) tcolorbuf, + (int) strlen(tcolorbuf), &unused, NULL); +} + +void +emit_start_24bitcolor(long color24bit) +{ + DWORD unused; + static char tcolorbuf[QBUFSZ]; + uint32 mcolor = COLORVAL(color24bit); + Snprintf(tcolorbuf, sizeof tcolorbuf, tcfmtstr24bit, + (long) ((mcolor >> 16) & 0xFF), /* red */ + (long) ((mcolor >> 8) & 0xFF), /* green */ + (long) ((mcolor >> 0) & 0xFF)); /* blue */ + WriteConsoleA(console.hConOut, (LPCSTR) tcolorbuf, + (int) strlen(tcolorbuf), &unused, NULL); +} + +void +emit_default_color(void) +{ + DWORD unused; + static char escseq[] = "\x1b[39m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} +void +emit_return_to_default(void) +{ + DWORD unused; + static char escseq[] = "\x1b[0m"; + + WriteConsoleA(console.hConOut, (LPCSTR) escseq, (int) strlen(escseq), + &unused, NULL); +} +#if 0 +static boolean newattr_on = TRUE; +#endif +static boolean color24_on = TRUE; + +/* for debugging */ +WORD what_is_there_now; +//BOOL success; +DWORD error_result; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ /* Console buffer flipping support */ +#ifdef VIRTUAL_TERMINAL_SEQUENCES +enum do_flags { + do_utf8_content = 0x01, + do_wide_content = 0x02, + do_colorseq = 0x04, + do_color24 = 0x08, + do_newattr = 0x10, + do_bkcolorseq = 0x20, +}; +enum did_flags { + did_utf8_content = 0x01, + did_wide_content = 0x02, + did_colorseq = 0x04, + did_color24 = 0x08, + did_newattr = 0x10, + did_bkcolorseq = 0x20, +}; -static void back_buffer_flip() +static void +back_buffer_flip(void) { - cell_t * back = console.back_buffer; - cell_t * front = console.front_buffer; + cell_t *back = console.back_buffer; + cell_t *front = console.front_buffer; COORD pos; DWORD unused; + unsigned do_anything, did_anything; + + if (!console.is_ready) + return; + + emit_hide_cursor(); + for (pos.Y = 0; pos.Y < console.height; pos.Y++) { + for (pos.X = 0; pos.X < console.width; pos.X++) { + boolean pos_set = FALSE; + do_anything = did_anything = 0U; + if (back->color24 != front->color24) + do_anything |= do_color24; + if (back->colorseq != front->colorseq) + do_anything |= do_colorseq; + if (back->attr != front->attr) + do_anything |= do_newattr; + if (back->bkcolorseq != front->bkcolorseq) + do_anything |= do_bkcolorseq; +#ifdef UTF8_FROM_CORE + if (!SYMHANDLING(H_UTF8)) { + if (console.has_unicode + && (back->wcharacter != front->wcharacter)) + do_anything |= do_wide_content; + } else { +#endif + if (back->utf8str[0] && front->utf8str[0] + && strcmp((const char *) back->utf8str, + (const char *) front->utf8str)) + do_anything |= do_utf8_content; +#ifdef UTF8_FROM_CORE + } +#endif + if (do_anything) { + SetConsoleCursorPosition(console.hConOut, pos); + pos_set = TRUE; + did_anything |= did_newattr; + if (back->attr) { + if (back->attr & atr_bold) + emit_start_bold(); + // if (back->attr & atr_dim) + // emit_start_dim(); + if (back->attr & atr_uline) + emit_start_underline(); + // if (back->attr & atr_blink) + // emit_start_blink(); + if (back->attr & atr_inverse) + emit_start_inverse(); + // front->attr = back->attr; /* will happen below due + // to did_newattr */ + } else { + emit_return_to_default(); + } + + if (color24_on && back->color24) { + did_anything |= did_color24; + if (back->color24) { + if (!iflags.use_truecolor && iflags.colorcount == 256) + emit_start_256color(back->color256idx); + else + emit_start_24bitcolor(back->color24); + } + } else if (back->colorseq) { + did_anything |= did_colorseq; + WriteConsoleA(console.hConOut, back->colorseq, + (int) strlen(back->colorseq), &unused, + NULL); + } + if (back->bkcolorseq) { + did_anything |= did_bkcolorseq; + WriteConsoleA(console.hConOut, back->bkcolorseq, + (int) strlen(back->bkcolorseq), &unused, + NULL); + } + if ((did_anything & (did_colorseq | did_bkcolorseq | did_color24)) == 0) { + did_anything &= ~(did_bkcolorseq | did_color24); + did_anything |= did_colorseq; + emit_default_color(); + } + if (did_anything + || (do_anything & (do_wide_content | do_utf8_content))) { +#ifdef UTF8_FROM_CORE + if (SYMHANDLING(H_UTF8) || !console.has_unicode) { + WriteConsoleA(console.hConOut, (LPCSTR) back->utf8str, + (int) strlen((char *) back->utf8str), + &unused, NULL); + did_anything |= did_utf8_content; + } else { +#endif + WriteConsoleW(console.hConOut, &back->wcharacter, 1, + &unused, NULL); + did_anything |= did_wide_content; +#ifdef UTF8_FROM_CORE + } +#endif + } + } + if (did_anything) { + if (!pos_set) { + SetConsoleCursorPosition(console.hConOut, pos); + pos_set = TRUE; + } + emit_return_to_default(); + *front = *back; + } + back++; + front++; + } + } + emit_show_cursor(); +} +#else +static void +back_buffer_flip(void) +{ + cell_t *back = console.back_buffer; + cell_t *front = console.front_buffer; + COORD pos; + DWORD unused; + + if (!console.is_ready) + return; for (pos.Y = 0; pos.Y < console.height; pos.Y++) { for (pos.X = 0; pos.X < console.width; pos.X++) { @@ -229,12 +832,12 @@ static void back_buffer_flip() } if (back->character != front->character) { if (console.has_unicode) { - WriteConsoleOutputCharacterW(console.hConOut, - &back->character, 1, pos, &unused); + WriteConsoleOutputCharacterW( + console.hConOut, &back->character, 1, pos, &unused); } else { - char ch = (char)back->character; + char ch = (char) back->character; WriteConsoleOutputCharacterA(console.hConOut, &ch, 1, pos, - &unused); + &unused); } *front = *back; } @@ -243,6 +846,7 @@ static void back_buffer_flip() } } } +#endif void buffer_fill_to_end(cell_t * buffer, cell_t * fill, int x, int y) { @@ -255,7 +859,8 @@ void buffer_fill_to_end(cell_t * buffer, cell_t * fill, int x, int y) while (dst != sentinel) *dst++ = *fill; - if (iflags.debug.immediateflips && buffer == console.back_buffer) + if ((iflags.debug.immediateflips || !program_state.in_moveloop) + && buffer == console.back_buffer) back_buffer_flip(); } @@ -270,7 +875,7 @@ static void buffer_clear_to_end_of_line(cell_t * buffer, int x, int y) while (dst != sentinel) *dst++ = clear_cell; - if (iflags.debug.immediateflips) + if (iflags.debug.immediateflips || !program_state.in_moveloop) back_buffer_flip(); } @@ -282,7 +887,8 @@ void buffer_write(cell_t * buffer, cell_t * cell, COORD pos) cell_t * dst = buffer + (console.width * pos.Y) + pos.X; *dst = *cell; - if (iflags.debug.immediateflips && buffer == console.back_buffer) + if ((iflags.debug.immediateflips || !program_state.in_moveloop) + && buffer == console.back_buffer) back_buffer_flip(); } @@ -290,93 +896,113 @@ void buffer_write(cell_t * buffer, cell_t * cell, COORD pos) * Called after returning from ! or ^Z */ void -gettty() +gettty(void) { -#ifndef TEXTCOLOR - int k; -#endif erase_char = '\b'; kill_char = 21; /* cntl-U */ iflags.cbreak = TRUE; -#ifdef TEXTCOLOR init_ttycolor(); -#else - for (k = 0; k < CLR_MAX; ++k) - ttycolors[k] = NO_COLOR; -#endif } /* reset terminal to original state */ void -settty(s) -const char *s; +settty(const char *s) { cmov(ttyDisplay->curx, ttyDisplay->cury); - end_screen(); + term_end_screen(); if (s) raw_print(s); restore_original_console_font(); if (orig_QuickEdit) { +#ifndef VIRTUAL_TERMINAL_SEQUENCES DWORD cmode; GetConsoleMode(console.hConIn, &cmode); cmode |= (ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS); SetConsoleMode(console.hConIn, cmode); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + GetConsoleMode(console.hConIn, &console.in_cmode); + console.in_cmode |= (ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS); + SetConsoleMode(console.hConIn, console.in_cmode); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } } /* called by init_nhwindows() and resume_nhwindows() */ void -setftty() +setftty(void) { -#ifdef CHANGE_COLOR - if (altered_palette) - adjust_palette(); -#endif - start_screen(); + term_start_screen(); } void -tty_startup(wid, hgt) -int *wid, *hgt; +term_startup(int *wid, int *hgt) { *wid = console.width; *hgt = console.height; - set_option_mod_status("mouse_support", SET_IN_GAME); + set_option_mod_status("mouse_support", set_in_game); } void -tty_number_pad(state) -int state; +tty_number_pad(int state UNUSED) { // do nothing } +/* stub tcap replacements for linkage from wintty.c */ + void -tty_start_screen() +term_shutdown(void) { - if (iflags.num_pad) - tty_number_pad(1); /* make keypad send digits */ + consoletty_exit(); } +#ifdef ASCIIGRAPH void -tty_end_screen() +graph_on(void) { - clear_screen(); +} + +void +graph_off(void) +{ +} +#endif + +void +term_end_screen(void) +{ + term_clear_screen(); really_move_cursor(); buffer_fill_to_end(console.back_buffer, &clear_cell, 0, 0); back_buffer_flip(); FlushConsoleInputBuffer(console.hConIn); } +void +term_start_screen(void) +{ + if (iflags.num_pad) + tty_number_pad(1); /* make keypad send digits */ +#ifdef VIRTUAL_TERMINAL_SEQUENCES + ibmgraphics_mode_callback = tty_ibmgraphics_fixup; +#ifdef ENHANCED_SYMBOLS +#ifdef UTF8_FROM_CORE + utf8graphics_mode_callback = tty_utf8graphics_fixup; +#endif +#endif +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ +} + static BOOL -CtrlHandler(ctrltype) -DWORD ctrltype; +CtrlHandler(DWORD ctrltype) { switch (ctrltype) { - /* case CTRL_C_EVENT: */ + /* case CTRL_C_EVENT: */ case CTRL_BREAK_EVENT: - clear_screen(); + term_clear_screen(); + FALLTHROUGH; + /* FALLTHRU */ case CTRL_CLOSE_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: @@ -395,45 +1021,51 @@ DWORD ctrltype; /* called by pcmain() and process_options() */ void -nttty_open(mode) -int mode; // unused +consoletty_open(int mode UNUSED) { - DWORD cmode; + int debugvar; /* Initialize the function pointer that points to - * the kbhit() equivalent, in this TTY case nttty_kbhit() + * the kbhit() equivalent, in this TTY case consoletty_kbhit() */ - nt_kbhit = nttty_kbhit; + nt_kbhit = consoletty_kbhit; if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE)) { /* Unable to set control handler */ - cmode = 0; /* just to have a statement to break on for debugger */ + debugvar = 0; /* just to have a statement to break on for debugger */ } LI = console.height; CO = console.width; really_move_cursor(); + nhUse(debugvar); } +extern void set_emergency_io(void); void -nttty_exit() +consoletty_exit(void) { - /* go back to using the safe routines */ - safe_routines(); + free_custom_colors(); + free((genericptr_t) console.front_buffer); + free((genericptr_t) console.back_buffer); + console.front_buffer = console.back_buffer = 0; + free((genericptr_t) console.localestr); + free((genericptr_t) console.orig_localestr); + set_emergency_io(); } int -process_keystroke(ir, valid, numberpad, portdebug) -INPUT_RECORD *ir; -boolean *valid; -boolean numberpad; -int portdebug; +process_keystroke( + INPUT_RECORD *ir, + boolean *valid, + uchar numberpad, + int portdebug) { int ch; #ifdef QWERTZ_SUPPORT - if (Cmd.swap_yz) + if (gc.Cmd.swap_yz) numberpad |= 0x10; #endif ch = keyboard_handling.pProcessKeystroke( @@ -448,60 +1080,68 @@ int portdebug; } int -nttty_kbhit() +consoletty_kbhit(void) { - return keyboard_handling.pNHkbhit(console.hConIn, &ir); + return keyboard_handling.pNHkbhit(console.hConIn, &gbl_ir); } int -tgetch() +tgetch(void) { int mod; coord cc; DWORD count; - boolean numpad = iflags.num_pad; + uchar numberpad = iflags.num_pad; really_move_cursor(); if (iflags.debug_fuzzer) return randomkey(); #ifdef QWERTZ_SUPPORT - if (Cmd.swap_yz) - numpad |= 0x10; + if (gc.Cmd.swap_yz) + numberpad |= 0x10; #endif return (program_state.done_hup) ? '\033' : keyboard_handling.pCheckInput( - console.hConIn, &ir, &count, numpad, 0, &mod, &cc); + console.hConIn, &gbl_ir, &count, numberpad, 0, &mod, &cc); } int -ntposkey(x, y, mod) -int *x, *y, *mod; +console_poskey(coordxy *x, coordxy *y, int *mod) { int ch; - coord cc; + coord cc = { 0, 0 }; DWORD count; - boolean numpad = iflags.num_pad; + boolean numberpad = iflags.num_pad; really_move_cursor(); - if (iflags.debug_fuzzer) - return randomkey(); + if (iflags.debug_fuzzer) { + int poskey = randomkey(); + + if (poskey == 0) { + *x = rn2(console.width); + *y = rn2(console.height); + } + return poskey; + } #ifdef QWERTZ_SUPPORT - if (Cmd.swap_yz) - numpad |= 0x10; + if (gc.Cmd.swap_yz) + numberpad |= 0x10; #endif + term_curs_set(1); ch = (program_state.done_hup) ? '\033' : keyboard_handling.pCheckInput( - console.hConIn, &ir, &count, numpad, 1, mod, &cc); + console.hConIn, &gbl_ir, &count, numberpad, 1, mod, &cc); #ifdef QWERTZ_SUPPORT - numpad &= ~0x10; + numberpad &= ~0x10; #endif if (!ch) { *x = cc.x; *y = cc.y; } + term_curs_set(0); return ch; } @@ -515,7 +1155,7 @@ static void set_console_cursor(int x, int y) } static void -really_move_cursor() +really_move_cursor(void) { #ifdef PORT_DEBUG char oldtitle[BUFSZ], newtitle[BUFSZ]; @@ -524,9 +1164,11 @@ really_move_cursor() if (GetConsoleTitle(oldtitle, BUFSZ)) { oldtitle[39] = '\0'; } - Sprintf(newtitle, "%-55s tty=(%02d,%02d) nttty=(%02d,%02d)", oldtitle, - ttyDisplay->curx, ttyDisplay->cury, - console.cursor.X, console.cursor.Y); + Snprintf(newtitle, sizeof newtitle, + "%-55s tty=(%02d,%02d) consoletty=(%02d,%02d)", + oldtitle, + ttyDisplay->curx, ttyDisplay->cury, + console.cursor.X, console.cursor.Y); (void) SetConsoleTitle(newtitle); } #endif @@ -538,9 +1180,13 @@ really_move_cursor() } void -cmov(x, y) -register int x, y; +cmov(int x, int y) { + if (x >= console.width) + x = console.width - 1; + if (y >= console.height) + y = console.height - 1; + ttyDisplay->cury = y; ttyDisplay->curx = x; @@ -548,8 +1194,7 @@ register int x, y; } void -nocmov(x, y) -int x, y; +nocmov(int x, int y) { ttyDisplay->curx = x; ttyDisplay->cury = y; @@ -557,19 +1202,8 @@ int x, y; set_console_cursor(x, y); } -/* same signature as 'putchar()' with potential failure result ignored */ -int -xputc(ch) -int ch; -{ - set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); - xputc_core((char) ch); - return 0; -} - void -xputs(s) -const char *s; +xputs(const char *s) { int k; int slen = (int) strlen(s); @@ -579,65 +1213,121 @@ const char *s; if (s) { for (k = 0; k < slen && s[k]; ++k) +#ifndef VIRTUAL_TERMINAL_SEQUENCES xputc_core(s[k]); +#else + xputc_core((int) s[k]); +#endif } } -/* xputc_core() and g_putch() are the only - * two routines that actually place output - * on the display. - */ +/* xputc_core() and g_putch() are the only routines that actually place output. + same signature as 'putchar()' with potential failure result ignored */ +int +xputc(int ch) +{ + int x = ttyDisplay->curx, y = ttyDisplay->cury; + if (x < console.width && y < console.height) { + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); + xputc_core(ch); + } + return 0; +} + +#ifndef VIRTUAL_TERMINAL_SEQUENCES +void +xputc_core(char ch) +#else void -xputc_core(ch) -char ch; +xputc_core(int ch) +#endif { + ccount = 1; /* default to non-zero */ +#ifndef VIRTUAL_TERMINAL_SEQUENCES + boolean inverse = FALSE; +#else + WCHAR wch[2]; +#endif nhassert(console.cursor.X >= 0 && console.cursor.X < console.width); nhassert(console.cursor.Y >= 0 && console.cursor.Y < console.height); - boolean inverse = FALSE; cell_t cell; switch (ch) { case '\n': if (console.cursor.Y < console.height - 1) console.cursor.Y++; - /* fall through */ + FALLTHROUGH; + /* FALLTHRU */ case '\r': console.cursor.X = 1; break; case '\b': if (console.cursor.X > 1) { console.cursor.X--; - } else if(console.cursor.Y > 0) { + } else if (console.cursor.Y > 0) { console.cursor.X = console.width - 1; console.cursor.Y--; } break; default: - +#ifdef VIRTUAL_TERMINAL_SEQUENCES + /* this causes way too much performance degradation */ + /* cell.color24 = customcolors[console.current_nhcolor]; */ + cell.colorseq = esc_seq_colors[console.current_nhcolor]; + cell.bkcolorseq = esc_seq_bkcolors[console.current_nhbkcolor]; + cell.attr = console.attr; + // if (console.color24) + // __debugbreak(); + cell.color24 = 0L; + cell.color256idx = 0; + wch[1] = 0; + if (console.has_unicode) { + wch[0] = (ch >= 0 && ch < SIZE(console.cpMap)) ? console.cpMap[ch] + : ch; +#ifdef UTF8_FROM_CORE + if (SYMHANDLING(H_UTF8)) { + /* we have to convert it to UTF-8 for cell.utf8str */ + ccount = WideCharToMultiByte( + CP_UTF8, 0, wch, -1, (char *) cell.utf8str, + (int) sizeof cell.utf8str, NULL, NULL); + } else { +#endif + /* store the wide version here also, so we don't slow + down back_buffer_flip() with conversions */ + cell.wcharacter = wch[0]; +#ifdef UTF8_FROM_CORE + } +#endif + } else { + /* we can just use the UTF-8 utf8str field, since ascii is a + single-byte representation of a small subset of unicode */ + cell.utf8str[0] = ch; + cell.utf8str[1] = 0; + } +#else /* VIRTUAL_TERMINAL_SEQUENCES */ inverse = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse); - console.attr = (inverse) ? - ttycolors_inv[console.current_nhcolor] : - ttycolors[console.current_nhcolor]; + console.attr = (inverse) ? ttycolors_inv[console.current_nhcolor] + : ttycolors[console.current_nhcolor]; if (console.current_nhattr[ATR_BOLD]) - console.attr |= (inverse) ? - BACKGROUND_INTENSITY : FOREGROUND_INTENSITY; + console.attr |= + (inverse) ? BACKGROUND_INTENSITY : FOREGROUND_INTENSITY; cell.attribute = console.attr; cell.character = (console.has_unicode ? console.cpMap[ch] : ch); - - buffer_write(console.back_buffer, &cell, console.cursor); - - if (console.cursor.X == console.width - 1) { - if (console.cursor.Y < console.height - 1) { - console.cursor.X = 1; - console.cursor.Y++; +#endif + if (ccount) { + buffer_write(console.back_buffer, &cell, console.cursor); + if (console.cursor.X == console.width - 1) { + if (console.cursor.Y < console.height - 1) { + console.cursor.X = 1; + console.cursor.Y++; + } + } else { + console.cursor.X++; } - } else { - console.cursor.X++; } } - nhassert(console.cursor.X >= 0 && console.cursor.X < console.width); nhassert(console.cursor.Y >= 0 && console.cursor.Y < console.height); } @@ -646,51 +1336,158 @@ char ch; * Overrides wintty.c function of the same name * for win32. It is used for glyphs only, not text. */ - +#ifdef UTF8_FROM_CORE + /* See g_pututf8() for a corresponding UTF-8 sequence + * version, rather than a single character. + */ +#endif void -g_putch(in_ch) -int in_ch; +console_g_putch(int in_ch) { - boolean inverse = FALSE; unsigned char ch = (unsigned char) in_ch; + cell_t cell; +#ifndef VIRTUAL_TERMINAL_SEQUENCES + boolean inverse = FALSE; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + ccount = 0; + WCHAR wch[2]; + boolean usemap = (ch >= 0 && ((int) ch < SIZE(console.cpMap))); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); - +#ifndef VIRTUAL_TERMINAL_SEQUENCES inverse = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse); console.attr = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse) ? ttycolors_inv[console.current_nhcolor] : ttycolors[console.current_nhcolor]; if (console.current_nhattr[ATR_BOLD]) console.attr |= (inverse) ? BACKGROUND_INTENSITY : FOREGROUND_INTENSITY; - - cell_t cell; - cell.attribute = console.attr; cell.character = (console.has_unicode ? cp437[ch] : ch); - +#else + cell.attr = console.attr; + cell.colorseq = esc_seq_colors[console.current_nhcolor]; + cell.bkcolorseq = esc_seq_bkcolors[console.current_nhbkcolor]; + cell.color24 = console.color24 ? console.color24 : 0L; + cell.color256idx = 0; + wch[1] = 0; + if (console.has_unicode) { + wch[0] = (usemap) ? console.cpMap[ch] : ch; +#ifdef UTF8_FROM_CORE + if (SYMHANDLING(H_UTF8)) { + /* we have to convert it to UTF-8 for cell.utf8str */ + ccount = WideCharToMultiByte( + CP_UTF8, 0, wch, -1, (char *) cell.utf8str, + (int) sizeof cell.utf8str, NULL, NULL); + } else { +#endif + /* store the wide version here also, so we don't slow + down back_buffer_flip() with conversions */ + cell.wcharacter = wch[0]; +#ifdef UTF8_FROM_CORE + } +#endif + } else { + /* we can just use the UTF-8 utf8str field, since ascii is a + single-byte representation of a small subset of unicode */ + cell.utf8str[0] = ch; + cell.utf8str[1] = 0; + ccount = 2; + } +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ buffer_write(console.back_buffer, &cell, console.cursor); } +/* + * Overrides wintty.c function of the same name + * for win32. It is used for glyphs only, not text and + * only when a UTF-8 sequence is involved for the + * representation. Single character representations + * use g_putch() instead. + */ void -cl_end() +g_pututf8(uint8 *sequence) { +#ifdef VIRTUAL_TERMINAL_SEQUENCES +#ifdef UTF8_FROM_CORE set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); - buffer_clear_to_end_of_line(console.back_buffer, console.cursor.X, - console.cursor.Y); - tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1, (int) ttyDisplay->cury); + cell_t cell; + cell.attr = console.attr; + cell.colorseq = esc_seq_colors[console.current_nhcolor]; + cell.bkcolorseq = esc_seq_bkcolors[console.current_nhbkcolor]; + cell.color24 = console.color24 ? console.color24 : 0L; + cell.color256idx =console.color256idx ? console.color256idx : 0; + Snprintf((char *) cell.utf8str, sizeof cell.utf8str, "%s", + (char *) sequence); + buffer_write(console.back_buffer, &cell, console.cursor); +#endif /* UTF8_FROM_CORE */ +#endif } void -raw_clear_screen() +term_start_extracolor(uint32 nhcolor, uint16 color256idx) { - if (WINDOWPORT("tty")) { +#ifdef VIRTUAL_TERMINAL_SEQUENCES + if ((nhcolor & NH_BASIC_COLOR) == 0) { + console.color24 = COLORVAL(nhcolor); /* color 0 has bit 0x1000000 set */ + console.current_colorflags = 0; + console.color256idx = color256idx; + } else { +#endif + /* NH_BASIC_COLOR */ + console.current_nhcolor = COLORVAL(nhcolor); + console.current_colorflags = NH_BASIC_COLOR; + term_start_color(console.current_nhcolor); +#ifdef VIRTUAL_TERMINAL_SEQUENCES + } +#endif +} + +void term_start_256color(int idx UNUSED) +{ +} + +void +term_end_extracolor(void) +{ +#ifdef VIRTUAL_TERMINAL_SEQUENCES + console.color24 = 0L; + console.color256idx = 0; +#endif + console.current_nhcolor = NO_COLOR; +} + +void +cl_end(void) +{ + if (ttyDisplay->curx < console.width + && ttyDisplay->cury < console.height) { + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); + buffer_clear_to_end_of_line(console.back_buffer, console.cursor.X, + console.cursor.Y); + tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1, + (int) ttyDisplay->cury); + } +} + +void +raw_clear_screen(void) +{ + if (WINDOWPORT(tty)) { cell_t * back = console.back_buffer; cell_t * front = console.front_buffer; COORD pos; DWORD unused; +#ifdef VIRTUAL_TERMINAL_SEQUENCES + pos.Y = 0; + pos.X = 0; + SetConsoleCursorPosition(console.hConOut, pos); + emit_return_to_default(); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ for (pos.Y = 0; pos.Y < console.height; pos.Y++) { for (pos.X = 0; pos.X < console.width; pos.X++) { +#ifndef VIRTUAL_TERMINAL_SEQUENCES WriteConsoleOutputAttribute(console.hConOut, &back->attribute, 1, pos, &unused); front->attribute = back->attribute; @@ -702,37 +1499,65 @@ raw_clear_screen() WriteConsoleOutputCharacterA(console.hConOut, &ch, 1, pos, &unused); } - *front = *back; - back++; - front++; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + *back = clear_cell; + if (console.has_unicode) + WriteConsoleW(console.hConOut, &back->wcharacter, 1, + &unused, NULL); + else + WriteConsoleA(console.hConOut, (LPCSTR) back->utf8str, + (int) strlen((char *) back->utf8str), &unused, NULL); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ + *front = *back; + back++; + front++; } } } } void -clear_screen() +term_clear_screen(void) { buffer_fill_to_end(console.back_buffer, &clear_cell, 0, 0); home(); } void -home() +term_curs_set(int visibility) +{ + static int vis = -1; + + if (vis == visibility) + return; + + static CONSOLE_CURSOR_INFO cursorinfo = { 0, 0 }; + + if (!cursorinfo.dwSize) { + GetConsoleCursorInfo(console.hConOut, &cursorinfo); + vis = cursorinfo.bVisible ? 1 : 0; + } + cursorinfo.bVisible = visibility ? (BOOL) TRUE : (BOOL) FALSE; + SetConsoleCursorInfo(console.hConOut, &cursorinfo); + vis = visibility; +} + +void +home(void) { ttyDisplay->curx = ttyDisplay->cury = 0; set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); } void -backsp() +backsp(void) { set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); xputc_core('\b'); } void -cl_eos() +cl_eos(void) { buffer_fill_to_end(console.back_buffer, &clear_cell, ttyDisplay->curx, ttyDisplay->cury); @@ -740,7 +1565,7 @@ cl_eos() } void -tty_nhbell() +tty_nhbell(void) { if (flags.silent || iflags.debug_fuzzer) return; @@ -750,7 +1575,7 @@ tty_nhbell() volatile int junk; /* prevent optimizer from eliminating loop below */ void -tty_delay_output() +tty_delay_output(void) { /* delay 50 ms - uses ANSI C clock() function now */ clock_t goal; @@ -764,33 +1589,33 @@ tty_delay_output() while (goal > clock()) { k = junk; /* Do nothing */ } + nhUse(k); } /* - * CLR_BLACK 0 - * CLR_RED 1 - * CLR_GREEN 2 - * CLR_BROWN 3 low-intensity yellow - * CLR_BLUE 4 - * CLR_MAGENTA 5 - * CLR_CYAN 6 - * CLR_GRAY 7 low-intensity white - * NO_COLOR 8 - * CLR_ORANGE 9 - * CLR_BRIGHT_GREEN 10 - * CLR_YELLOW 11 - * CLR_BRIGHT_BLUE 12 - * CLR_BRIGHT_MAGENTA 13 - * CLR_BRIGHT_CYAN 14 - * CLR_WHITE 15 - * CLR_MAX 16 - * BRIGHT 8 + * CLR_BLACK 0 + * CLR_RED 1 + * CLR_GREEN 2 + * CLR_BROWN 3 low-intensity yellow + * CLR_BLUE 4 + * CLR_MAGENTA 5 + * CLR_CYAN 6 + * CLR_GRAY 7 low-intensity white + * NO_COLOR 8 + * CLR_ORANGE 9 + * CLR_BRIGHT_GREEN 10 + * CLR_YELLOW 11 + * CLR_BRIGHT_BLUE 12 + * CLR_BRIGHT_MAGENTA 13 + * CLR_BRIGHT_CYAN 14 + * CLR_WHITE 15 + * CLR_MAX 16 + * BRIGHT 8 */ static void -init_ttycolor() +init_ttycolor(void) { -#ifdef TEXTCOLOR ttycolors[CLR_BLACK] = FOREGROUND_INTENSITY; /* fix by Quietust */ ttycolors[CLR_RED] = FOREGROUND_RED; ttycolors[CLR_GREEN] = FOREGROUND_GREEN; @@ -827,34 +1652,9 @@ init_ttycolor() ttycolors_inv[CLR_BRIGHT_CYAN] = BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY; ttycolors_inv[CLR_WHITE] = BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY; -#else - int k; - ttycolors[0] = FOREGROUND_INTENSITY; - ttycolors_inv[0] = BACKGROUND_INTENSITY; - for (k = 1; k < SIZE(ttycolors); ++k) { - ttycolors[k] = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED; - ttycolors_inv[k] = BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_RED; - } -#endif init_ttycolor_completed = TRUE; } -#if 0 -int -has_color(int color) /* this function is commented out */ -{ -#ifdef TEXTCOLOR - if ((color >= 0) && (color < CLR_MAX)) - return 1; -#else - if ((color == CLR_BLACK) || (color == CLR_WHITE) || (color == NO_COLOR)) - return 1; -#endif - else - return 0; -} -#endif - int term_attr_fixup(int attrmask) { @@ -864,6 +1664,22 @@ term_attr_fixup(int attrmask) void term_start_attr(int attrib) { +#ifdef VIRTUAL_TERMINAL_SEQUENCES + switch (attrib) { + case ATR_INVERSE: + console.attr |= atr_inverse; + break; + case ATR_ULINE: + console.attr |= atr_uline; + break; + case ATR_BLINK: + console.attr |= atr_blink; + break; + case ATR_BOLD: + console.attr |= atr_bold; + break; + } +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ console.current_nhattr[attrib] = TRUE; if (attrib) console.current_nhattr[ATR_NONE] = FALSE; } @@ -875,9 +1691,24 @@ term_end_attr(int attrib) switch (attrib) { case ATR_INVERSE: +#ifdef VIRTUAL_TERMINAL_SEQUENCES + console.attr &= ~atr_inverse; + break; +#endif case ATR_ULINE: +#ifdef VIRTUAL_TERMINAL_SEQUENCES + console.attr &= ~atr_uline; + break; +#endif case ATR_BLINK: +#ifdef VIRTUAL_TERMINAL_SEQUENCES + console.attr &= ~atr_blink; + break; +#endif case ATR_BOLD: +#ifdef VIRTUAL_TERMINAL_SEQUENCES + console.attr &= ~atr_bold; +#endif break; } console.current_nhattr[attrib] = FALSE; @@ -904,109 +1735,268 @@ term_start_raw_bold(void) void term_start_color(int color) { -#ifdef TEXTCOLOR - if (color >= 0 && color < CLR_MAX) { + if (color == NO_COLOR) { + term_end_color(); + } else if (color >= 0 && color < CLR_MAX) { console.current_nhcolor = color; - } else -#endif - console.current_nhcolor = NO_COLOR; + } else { + console.current_nhcolor = NO_COLOR; + } +} + +void +term_start_bgcolor(int color) +{ + if (color != NO_COLOR && (color >= 0 && color < CLR_MAX)) { + console.current_nhbkcolor = color; + } else { + console.current_nhbkcolor = NO_COLOR; + } } void term_end_color(void) { -#ifdef TEXTCOLOR console.foreground = DEFTEXTCOLOR; -#endif +#ifndef VIRTUAL_TERMINAL_SEQUENCES console.attr = (console.foreground | console.background); +#endif /* ! VIRTUAL_TERMINAL_SEQUENCES */ console.current_nhcolor = NO_COLOR; + console.current_nhbkcolor = NO_COLOR; } void -standoutbeg() +standoutbeg(void) { term_start_attr(ATR_BOLD); } void -standoutend() +standoutend(void) { term_end_attr(ATR_BOLD); } #ifndef NO_MOUSE_ALLOWED void -toggle_mouse_support() +toggle_mouse_support(void) { static int qeinit = 0; +#ifndef VIRTUAL_TERMINAL_SEQUENCES DWORD cmode; +#endif /* ! VIRTUAL_TERMINAL_SEQUENCES */ +#ifndef VIRTUAL_TERMINAL_SEQUENCES GetConsoleMode(console.hConIn, &cmode); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + GetConsoleMode(console.hConIn, &console.in_cmode); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ if (!qeinit) { qeinit = 1; +#ifndef VIRTUAL_TERMINAL_SEQUENCES orig_QuickEdit = ((cmode & ENABLE_QUICK_EDIT_MODE) != 0); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + orig_QuickEdit = ((console.in_cmode & ENABLE_QUICK_EDIT_MODE) != 0); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } switch(iflags.wc_mouse_support) { case 2: +#ifndef VIRTUAL_TERMINAL_SEQUENCES cmode |= ENABLE_MOUSE_INPUT; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + console.in_cmode |= ENABLE_MOUSE_INPUT; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ break; case 1: +#ifndef VIRTUAL_TERMINAL_SEQUENCES cmode |= ENABLE_MOUSE_INPUT; cmode &= ~ENABLE_QUICK_EDIT_MODE; cmode |= ENABLE_EXTENDED_FLAGS; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + console.in_cmode |= ENABLE_MOUSE_INPUT; + console.in_cmode &= ~ENABLE_QUICK_EDIT_MODE; + console.in_cmode |= ENABLE_EXTENDED_FLAGS; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ break; case 0: + FALLTHROUGH; /*FALLTHRU*/ default: +#ifndef VIRTUAL_TERMINAL_SEQUENCES cmode &= ~ENABLE_MOUSE_INPUT; +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + console.in_cmode &= ~ENABLE_MOUSE_INPUT; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ if (orig_QuickEdit) +#ifndef VIRTUAL_TERMINAL_SEQUENCES cmode |= (ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + console.in_cmode |= (ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } +#ifndef VIRTUAL_TERMINAL_SEQUENCES SetConsoleMode(console.hConIn, cmode); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + SetConsoleMode(console.hConIn, console.in_cmode); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } #endif /* handle tty options updates here */ void -nttty_preference_update(pref) -const char *pref; +consoletty_preference_update(const char *pref) { if (stricmp(pref, "mouse_support") == 0) { #ifndef NO_MOUSE_ALLOWED toggle_mouse_support(); #endif } - if (stricmp(pref, "symset") == 0) - check_and_set_font(); - return; + if (stricmp(pref, "symset") == 0) { +#ifdef UTF8_FROM_CORE + if ((tty_procs.wincap2 & WC2_U_UTF8STR) && SYMHANDLING(H_UTF8)) { +#ifdef ENHANCED_SYMBOLS + tty_utf8graphics_fixup(); +#endif + } else if ((tty_procs.wincap2 & WC2_U_UTF8STR) && SYMHANDLING(H_IBM)) { +#else + if (SYMHANDLING(H_IBM)) { +#endif + tty_ibmgraphics_fixup(); + } + check_and_set_font(); + } + return; +} + +#ifdef UTF8_FROM_CORE +#ifdef VIRTUAL_TERMINAL_SEQUENCES +/* + * This is called when making the switch to a symset + * with a UTF8 handler to allow any operating system + * specific changes to be carried out. + */ +void +tty_utf8graphics_fixup(void) +{ + CONSOLE_FONT_INFOEX console_font_info; + if ((tty_procs.wincap2 & WC2_U_UTF8STR) && SYMHANDLING(H_UTF8)) { + char *localestr = 0; + + if (!console.hConOut) + console.hConOut = GetStdHandle(STD_OUTPUT_HANDLE); + /* the locale */ + if (console.localestr) { + free(console.localestr); + console.localestr = NULL; + } + localestr = setlocale(LC_ALL, ".UTF8"); + if (localestr) + console.localestr = dupstr(localestr); + /* the code page */ + SetConsoleOutputCP(65001); + console.code_page = GetConsoleOutputCP(); + /* the font */ + console_font_info.cbSize = sizeof(console_font_info); + BOOL success = GetCurrentConsoleFontEx(console.hConOut, FALSE, + &console_font_info); + /* Try DejaVu Sans Mono for Powerline */ + wcscpy_s(console_font_info.FaceName, + sizeof(console_font_info.FaceName) + / sizeof(console_font_info.FaceName[0]), + L"DejaVu Sans Mono for Powerline"); + console_font_info.cbSize = sizeof(console_font_info); + success = SetCurrentConsoleFontEx(console.hConOut, FALSE, + &console_font_info); + if (!success) { + /* Next, try Lucida Console */ + wcscpy_s(console_font_info.FaceName, + sizeof(console_font_info.FaceName) + / sizeof(console_font_info.FaceName[0]), + L"Lucida Console"); + console_font_info.cbSize = sizeof(console_font_info); + success = SetCurrentConsoleFontEx(console.hConOut, FALSE, + &console_font_info); + } + nhassert(success); + if (success) { + console.font_info = console_font_info; + console.font_changed = TRUE; + } + /* the console mode */ + GetConsoleMode(console.hConOut, &console.out_cmode); +#if 1 + if ((console.out_cmode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) { + /* recognize escape sequences */ + console.out_cmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(console.hConOut, console.out_cmode); + } +#else + console.out_cmode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; +#endif + } +} +#endif +#endif /* UTF8_FROM_CORE */ + +/* + * This is called when making the switch to a symset + * with an IBM handler to allow any operating system + * specific changes to be carried out. + */ +void +tty_ibmgraphics_fixup(void) +{ +#ifdef VIRTUAL_TERMINAL_SEQUENCES + char buf[BUFSZ], *bp, *localestr; + + if (!console.hConOut) + console.hConOut = GetStdHandle(STD_OUTPUT_HANDLE); + /* the locale */ + Snprintf(buf, sizeof buf, "%s", console.orig_localestr); + if ((bp = strstri(buf, ".utf8")) != 0) + *bp = '\0'; + localestr = setlocale(LC_ALL, buf); + if (localestr) { + if (console.localestr) + free(console.localestr); + console.localestr = dupstr(localestr); + } + set_known_good_console_font(); + /* the console mode */ + GetConsoleMode(console.hConOut, &console.out_cmode); + if ((console.out_cmode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) { + console.out_cmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(console.hConOut, console.out_cmode); + GetConsoleMode(console.hConOut, &console.out_cmode); + } +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } #ifdef PORT_DEBUG void -win32con_debug_keystrokes() +win32con_debug_keystrokes(void) { DWORD count; boolean valid = 0; - int ch; + int ch = 0; xputs("\n"); while (!valid || ch != 27) { nocmov(ttyDisplay->curx, ttyDisplay->cury); - ReadConsoleInput(console.hConIn, &ir, 1, &count); - if ((ir.EventType == KEY_EVENT) && ir.Event.KeyEvent.bKeyDown) - ch = process_keystroke(&ir, &valid, iflags.num_pad, 1); + ReadConsoleInput(console.hConIn, &gbl_ir, 1, &count); + if ((gbl_ir.EventType == KEY_EVENT) && gbl_ir.Event.KeyEvent.bKeyDown) + ch = process_keystroke(&gbl_ir, &valid, (uchar) iflags.num_pad, 1); } (void) doredraw(); } void -win32con_toggle_cursor_info() +win32con_toggle_cursor_info(void) { display_cursor_info = !display_cursor_info; } #endif void -map_subkeyvalue(op) -register char *op; +map_subkeyvalue(char *op) { char digits[] = "0123456789"; int length, i, idx, val; @@ -1014,7 +2004,7 @@ register char *op; idx = -1; val = -1; - kp = index(op, '/'); + kp = strchr(op, '/'); if (kp) { *kp = '\0'; kp++; @@ -1022,14 +2012,14 @@ register char *op; if (length < 1 || length > 3) return; for (i = 0; i < length; i++) - if (!index(digits, kp[i])) + if (!strchr(digits, kp[i])) return; val = atoi(kp); length = strlen(op); if (length < 1 || length > 3) return; for (i = 0; i < length; i++) - if (!index(digits, op[i])) + if (!strchr(digits, op[i])) return; idx = atoi(op); } @@ -1038,10 +2028,10 @@ register char *op; key_overrides[idx] = val; } - +#if 0 /* fatal error */ /*VARARGS1*/ -void nttty_error +void consoletty_error VA_DECL(const char *, s) { char buf[BUFSZ]; @@ -1057,434 +2047,54 @@ VA_DECL(const char *, s) VA_END(); exit(EXIT_FAILURE); } +#endif void -synch_cursor() +synch_cursor(void) { really_move_cursor(); } -#ifdef CHANGE_COLOR -void -tty_change_color(color_number, rgb, reverse) -int color_number, reverse; -long rgb; -{ - /* Map NetHack color index to NT Console palette index */ - int idx, win32_color_number[] = { - 0, /* CLR_BLACK 0 */ - 4, /* CLR_RED 1 */ - 2, /* CLR_GREEN 2 */ - 6, /* CLR_BROWN 3 */ - 1, /* CLR_BLUE 4 */ - 5, /* CLR_MAGENTA 5 */ - 3, /* CLR_CYAN 6 */ - 7, /* CLR_GRAY 7 */ - 8, /* NO_COLOR 8 */ - 12, /* CLR_ORANGE 9 */ - 10, /* CLR_BRIGHT_GREEN 10 */ - 14, /* CLR_YELLOW 11 */ - 9, /* CLR_BRIGHT_BLUE 12 */ - 13, /* CLR_BRIGHT_MAGENTA 13 */ - 11, /* CLR_BRIGHT_CYAN 14 */ - 15 /* CLR_WHITE 15 */ - }; - int k; - if (color_number < 0) { /* indicates OPTIONS=palette with no value */ - /* copy the NetHack palette into UserDefinedColors */ - for (k = 0; k < CLR_MAX; k++) - UserDefinedColors[k] = NetHackColors[k]; - } else if (color_number >= 0 && color_number < CLR_MAX) { - if (!altered_palette) { - /* make sure a full suite is available */ - for (k = 0; k < CLR_MAX; k++) - UserDefinedColors[k] = DefaultColors[k]; - } - idx = win32_color_number[color_number]; - UserDefinedColors[idx] = rgb; - } - altered_palette = TRUE; -} - -char * -tty_get_color_string() -{ - return ""; -} - -int -match_color_name(c) -const char *c; -{ - const struct others { - int idx; - const char *colorname; - } othernames[] = { - { CLR_MAGENTA, "purple" }, - { CLR_BRIGHT_MAGENTA, "bright purple" }, - { NO_COLOR, "dark gray" }, - { NO_COLOR, "dark grey" }, - { CLR_GRAY, "grey" }, - }; - - int cnt; - for (cnt = 0; cnt < CLR_MAX; ++cnt) { - if (!strcmpi(c, c_obj_colors[cnt])) - return cnt; - } - for (cnt = 0; cnt < SIZE(othernames); ++cnt) { - if (!strcmpi(c, othernames[cnt].colorname)) - return othernames[cnt].idx; - } - return -1; -} - -/* - * Returns 0 if badoption syntax - */ -int -alternative_palette(op) -char *op; -{ - /* - * palette:color-R-G-B - * OPTIONS=palette:green-4-3-1, palette:0-0-0-0 - */ - int fieldcnt, color_number, rgb, red, green, blue; - char *fields[4], *cp; - - if (!op) { - change_color(-1, 0, 0); /* indicates palette option with - no value meaning "load an entire - hard-coded NetHack palette." */ - return 1; - } - - cp = fields[0] = op; - for (fieldcnt = 1; fieldcnt < 4; ++fieldcnt) { - cp = index(cp, '-'); - if (!cp) - return 0; - fields[fieldcnt] = cp; - cp++; - } - for (fieldcnt = 1; fieldcnt < 4; ++fieldcnt) { - *(fields[fieldcnt]) = '\0'; - ++fields[fieldcnt]; - } - rgb = 0; - for (fieldcnt = 0; fieldcnt < 4; ++fieldcnt) { - if (fieldcnt == 0 && isalpha(*(fields[0]))) { - color_number = match_color_name(fields[0]); - if (color_number == -1) - return 0; - } else { - int dcount = 0, cval = 0; - cp = fields[fieldcnt]; - if (*cp == '\\' && index("0123456789xXoO", cp[1])) { - const char *dp, *hex = "00112233445566778899aAbBcCdDeEfF"; - - cp++; - if (*cp == 'x' || *cp == 'X') - for (++cp; (dp = index(hex, *cp)) && (dcount++ < 2); cp++) - cval = (int) ((cval * 16) + (dp - hex) / 2); - else if (*cp == 'o' || *cp == 'O') - for (++cp; (index("01234567", *cp)) && (dcount++ < 3); - cp++) - cval = (cval * 8) + (*cp - '0'); - else - return 0; - } else { - for (; *cp && (index("0123456789", *cp)) && (dcount++ < 3); - cp++) - cval = (cval * 10) + (*cp - '0'); - } - switch (fieldcnt) { - case 0: - color_number = cval; - break; - case 1: - red = cval; - break; - case 2: - green = cval; - break; - case 3: - blue = cval; - break; - } - } - } - rgb = RGB(red, green, blue); - if (color_number >= 0 && color_number < CLR_MAX) - change_color(color_number, rgb, 0); - return 1; -} - -/* - * This uses an undocumented method to set console attributes - * at runtime including console palette - * - * VOID WINAPI SetConsolePalette(COLORREF palette[16]) - * - * Author: James Brown at www.catch22.net - * - * Set palette of current console. - * Palette should be of the form: - * - * COLORREF DefaultColors[CLR_MAX] = - * { - * 0x00000000, 0x00800000, 0x00008000, 0x00808000, - * 0x00000080, 0x00800080, 0x00008080, 0x00c0c0c0, - * 0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00, - * 0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff - * }; - */ - -#pragma pack(push, 1) - -/* - * Structure to send console via WM_SETCONSOLEINFO - */ -typedef struct _CONSOLE_INFO { - ULONG Length; - COORD ScreenBufferSize; - COORD WindowSize; - ULONG WindowPosX; - ULONG WindowPosY; - - COORD FontSize; - ULONG FontFamily; - ULONG FontWeight; - WCHAR FaceName[32]; - - ULONG CursorSize; - ULONG FullScreen; - ULONG QuickEdit; - ULONG AutoPosition; - ULONG InsertMode; - - USHORT ScreenColors; - USHORT PopupColors; - ULONG HistoryNoDup; - ULONG HistoryBufferSize; - ULONG NumberOfHistoryBuffers; - - COLORREF ColorTable[16]; - - ULONG CodePage; - HWND Hwnd; - - WCHAR ConsoleTitle[0x100]; -} CONSOLE_INFO; - -#pragma pack(pop) - -BOOL SetConsoleInfo(HWND hwndConsole, CONSOLE_INFO *pci); -static void GetConsoleSizeInfo(CONSOLE_INFO *pci); -VOID WINAPI SetConsolePalette(COLORREF crPalette[16]); - -void -adjust_palette(VOID_ARGS) -{ - SetConsolePalette(UserDefinedColors); - altered_palette = 0; -} - -/* -/* only in Win2k+ (use FindWindow for NT4) */ -/* HWND WINAPI GetConsoleWindow(); */ - -/* Undocumented console message */ -#define WM_SETCONSOLEINFO (WM_USER + 201) - -VOID WINAPI -SetConsolePalette(COLORREF palette[16]) -{ - CONSOLE_INFO ci = { sizeof(ci) }; - int i; - HWND hwndConsole = GetConsoleHandle(); - - /* get current size/position settings rather than using defaults.. */ - GetConsoleSizeInfo(&ci); - - /* set these to zero to keep current settings */ - ci.FontSize.X = 0; /* def = 8 */ - ci.FontSize.Y = 0; /* def = 12 */ - ci.FontFamily = 0; /* def = 0x30 = FF_MODERN|FIXED_PITCH */ - ci.FontWeight = 0; /* 0x400; */ - /* lstrcpyW(ci.FaceName, L"Terminal"); */ - ci.FaceName[0] = L'\0'; - - ci.CursorSize = 25; - ci.FullScreen = FALSE; - ci.QuickEdit = TRUE; - ci.AutoPosition = 0x10000; - ci.InsertMode = TRUE; - ci.ScreenColors = MAKEWORD(0x7, 0x0); - ci.PopupColors = MAKEWORD(0x5, 0xf); - - ci.HistoryNoDup = FALSE; - ci.HistoryBufferSize = 50; - ci.NumberOfHistoryBuffers = 4; - - // colour table - for (i = 0; i < 16; i++) - ci.ColorTable[i] = palette[i]; - - ci.CodePage = GetConsoleOutputCP(); - ci.Hwnd = hwndConsole; - - lstrcpyW(ci.ConsoleTitle, L""); - - SetConsoleInfo(hwndConsole, &ci); -} - -/* - * Wrapper around WM_SETCONSOLEINFO. We need to create the - * necessary section (file-mapping) object in the context of the - * process which owns the console, before posting the message - */ -BOOL -SetConsoleInfo(HWND hwndConsole, CONSOLE_INFO *pci) -{ - DWORD dwConsoleOwnerPid; - HANDLE hProcess; - HANDLE hSection, hDupSection; - PVOID ptrView = 0; - HANDLE hThread; - - /* - * Open the process which "owns" the console - */ - GetWindowThreadProcessId(hwndConsole, &dwConsoleOwnerPid); - hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwConsoleOwnerPid); - - /* - * Create a SECTION object backed by page-file, then map a view of - * this section into the owner process so we can write the contents - * of the CONSOLE_INFO buffer into it - */ - hSection = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, - pci->Length, 0); - - /* - * Copy our console structure into the section-object - */ - ptrView = MapViewOfFile(hSection, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, - pci->Length); - memcpy(ptrView, pci, pci->Length); - UnmapViewOfFile(ptrView); - - /* - * Map the memory into owner process - */ - DuplicateHandle(GetCurrentProcess(), hSection, hProcess, &hDupSection, 0, - FALSE, DUPLICATE_SAME_ACCESS); - - /* Send console window the "update" message */ - SendMessage(hwndConsole, WM_SETCONSOLEINFO, (WPARAM) hDupSection, 0); - - /* - * clean up - */ - hThread = CreateRemoteThread(hProcess, 0, 0, - (LPTHREAD_START_ROUTINE) CloseHandle, - hDupSection, 0, 0); - - CloseHandle(hThread); - CloseHandle(hSection); - CloseHandle(hProcess); - - return TRUE; -} - -/* - * Fill the CONSOLE_INFO structure with information - * about the current console window - */ -static void -GetConsoleSizeInfo(CONSOLE_INFO *pci) -{ - CONSOLE_SCREEN_BUFFER_INFO csbi; - - HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); - - GetConsoleScreenBufferInfo(hConsoleOut, &csbi); - - pci->ScreenBufferSize = csbi.dwSize; - pci->WindowSize.X = csbi.srWindow.Right - csbi.srWindow.Left + 1; - pci->WindowSize.Y = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; - pci->WindowPosX = csbi.srWindow.Left; - pci->WindowPosY = csbi.srWindow.Top; -} - -static HWND -GetConsoleHandle(void) -{ - HMODULE hMod = GetModuleHandle("kernel32.dll"); - GETCONSOLEWINDOW pfnGetConsoleWindow = - (GETCONSOLEWINDOW) GetProcAddress(hMod, "GetConsoleWindow"); - if (pfnGetConsoleWindow) - return pfnGetConsoleWindow(); - else - return GetConsoleHwnd(); -} - -static HWND -GetConsoleHwnd(void) -{ - int iterations = 0; - HWND hwndFound = 0; - char OldTitle[1024], NewTitle[1024], TestTitle[1024]; - - /* Get current window title */ - GetConsoleTitle(OldTitle, sizeof OldTitle); - - (void) sprintf(NewTitle, "NETHACK%d/%d", GetTickCount(), - GetCurrentProcessId()); - SetConsoleTitle(NewTitle); - - GetConsoleTitle(TestTitle, sizeof TestTitle); - while (strcmp(TestTitle, NewTitle) != 0) { - iterations++; - /* sleep(0); */ - GetConsoleTitle(TestTitle, sizeof TestTitle); - } - hwndFound = FindWindow(NULL, NewTitle); - SetConsoleTitle(OldTitle); - /* printf("%d iterations\n", iterations); */ - return hwndFound; -} -#endif /*CHANGE_COLOR*/ - +#ifndef VIRTUAL_TERMINAL_SEQUENCES static int CALLBACK EnumFontCallback( - const LOGFONTW * lf, const TEXTMETRICW * tm, DWORD fontType, LPARAM lParam) + const LOGFONTW * lf, const TEXTMETRICW * tm UNUSED, + DWORD fontType UNUSED, LPARAM lParam) { LOGFONTW * lf_ptr = (LOGFONTW *) lParam; *lf_ptr = *lf; return 0; } +#endif /* check_and_set_font ensures that the current font will render the symbols * that are currently being used correctly. If they will not be rendered * correctly, then it will change the font to a known good font. */ void -check_and_set_font() +check_and_set_font(void) { +#ifndef VIRTUAL_TERMINAL_SEQUENCES if (!check_font_widths()) { - raw_print("WARNING: glyphs too wide in console font." - " Changing code page to 437 and font to Consolas\n"); + if (wizard) { + const char *msg = "WARNING: glyphs too wide in console font." + " Changing code page to 437 and font to Consolas"; + + if (iflags.window_inited) + pline ("%s", msg); + else + raw_printf("%s\n", msg); + } set_known_good_console_font(); } +#endif } +#ifndef VIRTUAL_TERMINAL_SEQUENCES /* check_font_widths returns TRUE if all glyphs in current console font * fit within the width of a single console cell. */ boolean -check_font_widths() +check_font_widths(void) { CONSOLE_FONT_INFOEX console_font_info; console_font_info.cbSize = sizeof(console_font_info); @@ -1495,8 +2105,8 @@ check_font_widths() * NOTE: the DC from the console window does not have the correct * font selected at this point. */ - HWND hWnd = GetConsoleWindow(); - HDC hDC = GetDC(hWnd); + console.hWnd = GetConsoleWindow(); + HDC hDC = GetDC(console.hWnd); LOGFONTW logical_font; logical_font.lfCharSet = DEFAULT_CHARSET; @@ -1528,6 +2138,9 @@ check_font_widths() /* select font */ HGDIOBJ saved_font = SelectObject(hDC, console_font); + /* measure the set of used glyphs to ensure they fit */ + boolean all_glyphs_fit = FALSE; + /* determine whether it is a true type font */ TEXTMETRICA tm; success = GetTextMetricsA(hDC, &tm); @@ -1543,18 +2156,17 @@ check_font_widths() boolean used[256]; memset(used, 0, sizeof(used)); for (int i = 0; i < SYM_MAX; i++) { - used[primary_syms[i]] = TRUE; - used[rogue_syms[i]] = TRUE; + used[gp.primary_syms[i]] = TRUE; + used[gr.rogue_syms[i]] = TRUE; } int wcUsedCount = 0; wchar_t wcUsed[256]; - for (int i = 0; i < sizeof(used); i++) + for (int i = 0; i < (int) sizeof(used); i++) if (used[i]) wcUsed[wcUsedCount++] = cp437[i]; - /* measure the set of used glyphs to ensure they fit */ - boolean all_glyphs_fit = TRUE; + all_glyphs_fit = TRUE; for (int i = 0; i < wcUsedCount; i++) { int width; @@ -1579,50 +2191,78 @@ check_font_widths() return all_glyphs_fit; } +#endif /* set_known_good_console_font sets the code page and font used by the console * to settings know to work well with NetHack. It also saves the original * settings so that they can be restored prior to NetHack exit. */ void -set_known_good_console_font() +set_known_good_console_font(void) { CONSOLE_FONT_INFOEX console_font_info; console_font_info.cbSize = sizeof(console_font_info); BOOL success = GetCurrentConsoleFontEx(console.hConOut, FALSE, &console_font_info); + success = SetConsoleOutputCP(437); + nhassert(success); console.font_changed = TRUE; - console.original_font_info = console_font_info; - console.original_code_page = GetConsoleOutputCP(); +#ifndef VIRTUAL_TERMINAL_SEQUENCES + console.orig_font_info = console_font_info; + console.orig_code_page = GetConsoleOutputCP(); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + console.code_page = GetConsoleOutputCP(); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ wcscpy_s(console_font_info.FaceName, sizeof(console_font_info.FaceName) / sizeof(console_font_info.FaceName[0]), L"Consolas"); - +#ifndef VIRTUAL_TERMINAL_SEQUENCES success = SetConsoleOutputCP(437); nhassert(success); - +#endif /* ! VIRTUAL_TERMINAL_SEQUENCES */ success = SetCurrentConsoleFontEx(console.hConOut, FALSE, &console_font_info); nhassert(success); +#ifdef VIRTUAL_TERMINAL_SEQUENCES + if (success) + console.font_info = console_font_info; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ } /* restore_original_console_font will restore the console font and code page * settings to what they were when NetHack was launched. */ void -restore_original_console_font() +restore_original_console_font(void) { +#ifdef VIRTUAL_TERMINAL_SEQUENCES + char *tmplocalestr; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ + if (console.font_changed) { BOOL success; +#ifndef VIRTUAL_TERMINAL_SEQUENCES raw_print("Restoring original font and code page\n"); - success = SetConsoleOutputCP(console.original_code_page); + success = SetConsoleOutputCP(console.orig_code_page); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + if (wizard) + raw_print("Restoring original font, code page and locale\n"); + + tmplocalestr = setlocale(LC_ALL, console.orig_localestr); + if (tmplocalestr) { + if (console.localestr) + free(console.localestr); + console.localestr = dupstr(tmplocalestr); + } + success = SetConsoleOutputCP(console.orig_code_page); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ if (!success) raw_print("Unable to restore original code page\n"); success = SetCurrentConsoleFontEx(console.hConOut, FALSE, - &console.original_font_info); + &console.orig_font_info); if (!success) raw_print("Unable to restore original font\n"); @@ -1636,18 +2276,31 @@ restore_original_console_font() * wish to print to the console. */ -void set_cp_map() +void set_cp_map(void) { if (console.has_unicode) { +#ifndef VIRTUAL_TERMINAL_SEQUENCES UINT codePage = GetConsoleOutputCP(); +#else + console.code_page = GetConsoleOutputCP(); +#endif +#ifndef VIRTUAL_TERMINAL_SEQUENCES if (codePage == 437) { +#else + if (console.code_page == 437) { +#endif memcpy(console.cpMap, cp437, sizeof(console.cpMap)); } else { for (int i = 0; i < 256; i++) { char c = (char)i; - int count = MultiByteToWideChar(codePage, 0, &c, 1, - &console.cpMap[i], 1); + int count = MultiByteToWideChar( +#ifndef VIRTUAL_TERMINAL_SEQUENCES + codePage, +#else + console.code_page, +#endif + 0, &c, 1, &console.cpMap[i], 1); nhassert(count == 1); // If a character was mapped to unicode control codes, @@ -1662,7 +2315,7 @@ void set_cp_map() } #if 0 -/* early_raw_print() is used during early game intialization prior to the +/* early_raw_print() is used during early game initialization prior to the * setting up of the windowing system. This allows early errors and panics * to have there messages displayed. * @@ -1723,7 +2376,7 @@ void early_raw_print(const char *s) } #endif -/* nethack_enter_nttty() is the first thing that is called from main +/* nethack_enter_consoletty() is the first thing that is called from main * once the tty port is confirmed. * * We initialize all console state to support rendering to the console @@ -1748,50 +2401,100 @@ void early_raw_print(const char *s) * */ -void nethack_enter_nttty() + +DISABLE_WARNING_CONDEXPR_IS_CONSTANT + +void nethack_enter_consoletty(void) { + int width; +#ifdef VIRTUAL_TERMINAL_SEQUENCES + char buf[BUFSZ], *bp, *localestr; + BOOL apisuccess; +// DWORD unused; +// int i = 0; + +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ #if 0 /* set up state needed by early_raw_print() */ windowprocs.win_raw_print = early_raw_print; #endif +#if 0 + /* prevent re-sizing of the console window */ + if (!console.hWnd) + console.hWnd = GetConsoleWindow(); + SetWindowLong(console.hWnd, GWL_STYLE, + GetWindowLong(console.hWnd, GWL_STYLE) + & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX); +#endif + + CONSOLE_SCREEN_BUFFER_INFO csbi; + if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) { + /* srWindow identifies the visible area; dwSize identifies the buffer + */ + width = csbi.srWindow.Right - csbi.srWindow.Left + 1; +#ifdef DEBUG + if (NH_DEVEL_STATUS != NH_STATUS_RELEASED) + fprintf(stdout, "width = %d\n", width); +#endif + } + console.hConOut = GetStdHandle(STD_OUTPUT_HANDLE); nhassert(console.hConOut != NULL); // NOTE: this assert will not print + GetConsoleScreenBufferInfo(console.hConOut, &console.orig_csbi); + //COORD screencheck = GetLargestConsoleWindowSize(console.hConOut); - GetConsoleScreenBufferInfo(console.hConOut, &console.origcsbi); - + GetConsoleMode(console.hConOut, &console.orig_out_cmode); + console.out_cmode = console.orig_out_cmode; + console.out_cmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(console.hConOut, console.out_cmode); +#if 0 + /* tests */ + WriteConsoleA(console.hConOut, "\033[8;;133t",9, &unused, NULL); + for (i = 0; i < 13; ++i) { + WriteConsoleA(console.hConOut, "0123456789", 10, &unused, NULL); + } + WriteConsoleA(console.hConOut, "\033[3;133ftest", 12, &unused, NULL); + GetConsoleScreenBufferInfo(console.hConOut, &console.orig_csbi); /* Testing of widths != COLNO has not turned up any problems. Need * to do a bit more testing and then we are likely to enable having * console width match window width. */ +#endif + #if 0 - console.width = console.origcsbi.srWindow.Right - - console.origcsbi.srWindow.Left + 1; + console.width = console.orig_csbi.srWindow.Right - + console.orig_csbi.srWindow.Left + 1; console.Width = max(console.Width, COLNO); #else - console.width = COLNO; +// console.width = COLNO; + console.width = console.orig_csbi.srWindow.Right - + console.orig_csbi.srWindow.Left + 1; + if (console.width < COLNO) + console.width = COLNO; #endif - console.height = console.origcsbi.srWindow.Bottom - - console.origcsbi.srWindow.Top + 1; - console.height = max(console.height, ROWNO + 3); - + console.height = console.orig_csbi.srWindow.Bottom - + console.orig_csbi.srWindow.Top + 1; +// console.height = max(console.height, ROWNO + 3); + if (console.height < (ROWNO + 2 + 1)) + console.height = (ROWNO + 2 + 1); console.buffer_size = console.width * console.height; /* clear the entire console buffer */ - int size = console.origcsbi.dwSize.X * console.origcsbi.dwSize.Y; - DWORD unused; - set_console_cursor(0, 0); - FillConsoleOutputAttribute( - console.hConOut, CONSOLE_CLEAR_ATTRIBUTE, - size, console.cursor, &unused); + //int size = console.orig_csbi.dwSize.X * console.orig_csbi.dwSize.Y; + //DWORD unused; + //set_console_cursor(0, 0); + // FillConsoleOutputAttribute( + // console.hConOut, CONSOLE_CLEAR_ATTRIBUTE, + // size, console.cursor, &unused); - FillConsoleOutputCharacter( - console.hConOut, CONSOLE_CLEAR_CHARACTER, - size, console.cursor, &unused); + // FillConsoleOutputCharacter( + // console.hConOut, CONSOLE_CLEAR_CHARACTER, + // size, console.cursor, &unused); - set_console_cursor(1, 0); - SetConsoleCursorPosition(console.hConOut, console.cursor); + //set_console_cursor(1, 0); + //SetConsoleCursorPosition(console.hConOut, console.cursor); /* At this point early_raw_print will work */ @@ -1799,13 +2502,12 @@ void nethack_enter_nttty() nhassert(console.hConIn != NULL); /* grow the size of the console buffer if it is not wide enough */ - if (console.origcsbi.dwSize.X < console.width) { - COORD size = { - size.Y = console.origcsbi.dwSize.Y, - size.X = console.width - }; + if (console.orig_csbi.dwSize.X < console.width) { + COORD screen_size = {0}; - SetConsoleScreenBufferSize(console.hConOut, size); + screen_size.Y = console.orig_csbi.dwSize.Y, + screen_size.X = console.width; + SetConsoleScreenBufferSize(console.hConOut, screen_size); } /* setup front and back buffers */ @@ -1818,28 +2520,101 @@ void nethack_enter_nttty() buffer_fill_to_end(console.back_buffer, &clear_cell, 0, 0); /* determine whether OS version has unicode support */ - console.has_unicode = ((GetVersion() & 0x80000000) == 0); + console.has_unicode = (IsWindows8OrGreater()); + +#ifdef VIRTUAL_TERMINAL_SEQUENCES + /* store the original code page*/ + console.orig_code_page = GetConsoleOutputCP(); + + /* store the original locale */ + console.orig_localestr = NULL; + localestr = setlocale(LC_ALL, ""); + if (localestr) + console.orig_localestr = dupstr(localestr); + + /* store the original font */ + console.orig_font_info.cbSize = sizeof(console.orig_font_info); + apisuccess = GetCurrentConsoleFontEx(console.hConOut, + FALSE, &console.orig_font_info); + console.font_info = console.orig_font_info; + + /* adjust the locale */ + Snprintf(buf, sizeof buf, "%s", console.orig_localestr); + if ((bp = strstri(buf, ".utf8")) != 0) + *bp = '\0'; + localestr = setlocale(LC_ALL, buf); + if (localestr) { + if (console.localestr) + free(console.localestr); + console.localestr = dupstr(localestr); + } + console.code_page = console.orig_code_page; + if (console.has_unicode) { + if (console.code_page != 437) + apisuccess = SetConsoleOutputCP(437); + } else if (console.code_page != 1252) { + apisuccess = SetConsoleOutputCP(1252); + } + console.code_page = GetConsoleOutputCP(); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ /* check the font before we capture the code page map */ check_and_set_font(); set_cp_map(); +#ifndef VIRTUAL_TERMINAL_SEQUENCES /* Set console mode */ DWORD cmode, mask; GetConsoleMode(console.hConIn, &cmode); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + /* input console mode */ + DWORD disablemask; + GetConsoleMode(console.hConIn, &console.orig_in_cmode); + GetConsoleMode(console.hConOut, &console.orig_out_cmode); + + console.in_cmode = console.orig_in_cmode; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ #ifdef NO_MOUSE_ALLOWED +#ifndef VIRTUAL_TERMINAL_SEQUENCES mask = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_MOUSE_INPUT +#else + disablemask = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_MOUSE_INPUT +#endif | ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT; #else +#ifndef VIRTUAL_TERMINAL_SEQUENCES mask = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT +#else + disablemask = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT +#endif | ENABLE_WINDOW_INPUT; #endif /* Turn OFF the settings specified in the mask */ +#ifndef VIRTUAL_TERMINAL_SEQUENCES cmode &= ~mask; +#else + console.in_cmode &= ~disablemask; +#endif #ifndef NO_MOUSE_ALLOWED +#ifndef VIRTUAL_TERMINAL_SEQUENCES cmode |= ENABLE_MOUSE_INPUT; -#endif +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + console.in_cmode |= ENABLE_MOUSE_INPUT; +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ +#endif /* NO_MOUSE_ALLOWED */ +#ifndef VIRTUAL_TERMINAL_SEQUENCES SetConsoleMode(console.hConIn, cmode); +#else /* VIRTUAL_TERMINAL_SEQUENCES */ + SetConsoleMode(console.hConIn, console.in_cmode); + + console.out_cmode = console.orig_out_cmode; + if ((console.out_cmode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) { + /* recognize escape sequences */ + console.out_cmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(console.hConOut, console.out_cmode); + } + GetConsoleMode(console.hConOut, &console.out_cmode); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ /* load default keyboard handler */ HKL keyboard_layout = GetKeyboardLayout(0); @@ -1855,7 +2630,16 @@ void nethack_enter_nttty() set_altkeyhandling("ray"); } } +#ifdef VIRTUAL_TERMINAL_SEQUENCES + init_custom_colors(); +#endif /* VIRTUAL_TERMINAL_SEQUENCES */ + console.current_nhcolor = NO_COLOR; + console.is_ready = TRUE; + nhUse(apisuccess); } + +RESTORE_WARNING_CONDEXPR_IS_CONSTANT + #endif /* TTY_GRAPHICS */ /* this is used as a printf() replacement when the window @@ -1868,7 +2652,7 @@ VA_DECL(const char *, fmt) VA_START(fmt); VA_INIT(fmt, const char *); (void) vsnprintf(buf, sizeof buf, fmt, VA_ARGS); - if (redirect_stdout) + if (redirect_stdout || program_state.early_options) fprintf(stdout, "%s", buf); else { #ifdef TTY_GRAPHICS @@ -1880,7 +2664,7 @@ VA_DECL(const char *, fmt) if (console.cursor.Y > console.height - 4) { xputs("Hit to continue."); while (pgetchar() != '\n') - ; + ; raw_clear_screen(); set_console_cursor(1, 0); } @@ -1894,7 +2678,9 @@ VA_DECL(const char *, fmt) VA_END(); return; } +#ifndef VIRTUAL_TERMINAL_SEQUENCES +#endif /* ! VIRTUAL_TERMINAL_SEQUENCES */ /* * Keyboard translation tables. @@ -1911,13 +2697,13 @@ VA_DECL(const char *, fmt) #ifdef QWERTZ_SUPPORT /* when 'numberpad' is 0 and Cmd.swap_yz is True - (signaled by setting 0x10 on boolean numpad argument) + (signaled by setting 0x10 on uchar numberpad argument) treat keypress of numpad 7 as 'z' rather than 'y' */ static boolean qwertz = FALSE; #endif #define inmap(x, vk) (((x) > 'A' && (x) < 'Z') || (vk) == 0xBF || (x) == '2') -const struct pad { +struct pad { uchar normal, shift, cntrl; }; @@ -2037,15 +2823,6 @@ nh340_numpad[PADKEYS] = { static struct pad keypad[PADKEYS], numpad[PADKEYS]; static BYTE KeyState[256]; -static const char default_name[] = "default"; -const char *const legal_key_handling[] = { - "none", - "default", - "ray", - "340", -}; -enum windows_key_handling keyh[] = { no_keyhandling, default_keyhandling, ray_keyhandling, - nh340_keyhandling }; void set_altkeyhandling(const char *inName) { @@ -2053,22 +2830,18 @@ void set_altkeyhandling(const char *inName) /*backward compatibility - so people's existing config files may work as is */ if (!strcmpi(inName, "nhraykey.dll")) - inName = legal_key_handling[ray_keyhandling]; + inName = legal_key_handling[ray_keyhandling]; else if (!strcmpi(inName, "nh340key.dll")) - inName = legal_key_handling[nh340_keyhandling]; + inName = legal_key_handling[nh340_keyhandling]; else if (!strcmpi(inName, "nhdefkey.dll")) - inName = legal_key_handling[default_keyhandling]; + inName = legal_key_handling[default_keyhandling]; for (i = default_keyhandling; i < SIZE(legal_key_handling); i++) { if (!strcmpi(inName, legal_key_handling[i])) { iflags.key_handling = keyh[i]; - if (keyboard_handling.pKeyHandlingName) { - free((genericptr_t) keyboard_handling.pKeyHandlingName); - keyboard_handling.pKeyHandlingName = (char *) 0; - } switch(iflags.key_handling) { case ray_keyhandling: - keyboard_handling.pKeyHandlingName = strdup("ray"); + keyboard_handling.khid = ray_keyhandling; keyboard_handling.pProcessKeystroke = ray_processkeystroke; keyboard_handling.pNHkbhit = ray_kbhit; keyboard_handling.pCheckInput = ray_checkinput; @@ -2087,7 +2860,7 @@ void set_altkeyhandling(const char *inName) } break; case nh340_keyhandling: - keyboard_handling.pKeyHandlingName = strdup("340"); + keyboard_handling.khid = nh340_keyhandling; keyboard_handling.pProcessKeystroke = nh340_processkeystroke; keyboard_handling.pNHkbhit = nh340_kbhit; keyboard_handling.pCheckInput = nh340_checkinput; @@ -2098,7 +2871,7 @@ void set_altkeyhandling(const char *inName) break; case default_keyhandling: default: - keyboard_handling.pKeyHandlingName = strdup("default"); + keyboard_handling.khid = default_keyhandling; keyboard_handling.pProcessKeystroke = default_processkeystroke; keyboard_handling.pNHkbhit = default_kbhit; @@ -2121,17 +2894,17 @@ set_keyhandling_via_option(void) { winid tmpwin; anything any; - int i; + int i, clr = 0; menu_item *console_key_handling_pick = (menu_item *) 0; tmpwin = create_nhwindow(NHW_MENU); - start_menu(tmpwin); - any = zeroany; + start_menu(tmpwin, MENU_BEHAVE_STANDARD); + any = cg.zeroany; for (i = default_keyhandling; i < SIZE(legal_key_handling); i++) { any.a_int = i + 1; - add_menu(tmpwin, 0, &any, 'a' + i, - 0, ATR_NONE, - legal_key_handling[i], 0); + add_menu(tmpwin, &nul_glyphinfo, &any, 'a' + i, + 0, ATR_NONE, clr, + legal_key_handling[i], MENU_ITEMFLAGS_NONE); } end_menu(tmpwin, "Select windows console key handling:"); if (select_menu(tmpwin, PICK_ONE, &console_key_handling_pick) > 0) { @@ -2145,10 +2918,10 @@ set_keyhandling_via_option(void) int default_processkeystroke( - HANDLE hConIn, - INPUT_RECORD* ir, - boolean* valid, - boolean numberpad, + HANDLE hConIn UNUSED, + INPUT_RECORD *ir, + boolean *valid, + uchar numberpad, int portdebug) { int k = 0; @@ -2314,8 +3087,8 @@ int default_checkinput( HANDLE hConIn, INPUT_RECORD *ir, - DWORD* count, - boolean numpad, + DWORD *count, + uchar numberpad, int mode, int *mod, coord *cc) @@ -2324,64 +3097,89 @@ default_checkinput( DWORD dwWait; #endif int ch = 0; - boolean valid = 0, done = 0; + boolean valid = 0, done = 0, done_a_checkpoint = FALSE; + DWORD how_many_milliseconds = 0; #ifdef QWERTZ_SUPPORT - if (numpad & 0x10) { - numpad &= ~0x10; + if (numberpad & 0x10) { + numberpad &= ~0x10; qwertz = TRUE; } else { qwertz = FALSE; } #endif + done_a_checkpoint = FALSE; + how_many_milliseconds = (iflags.idlecheckpoint) + ? (IDLECHECKPOINT_WAIT_TIME * 1000) + : INFINITE; while (!done) { -#if defined(SAFERHANGUP) dwWait = WaitForSingleObjectEx(hConIn, // event object to wait for - INFINITE, // waits indefinitely + how_many_milliseconds, TRUE); // alertable wait enabled +#if defined(SAFERHANGUP) if (dwWait == WAIT_FAILED) return '\033'; #endif - ReadConsoleInput(hConIn, ir, 1, count); - if (mode == 0) { - if ((ir->EventType == KEY_EVENT) && ir->Event.KeyEvent.bKeyDown) { - ch = default_processkeystroke(hConIn, ir, &valid, numpad, 0); - done = valid; - } - } else { - if (count > 0) { - if (ir->EventType == KEY_EVENT + if (iflags.idlecheckpoint + && dwWait == WAIT_TIMEOUT && !done_a_checkpoint) { + /* no input for 30 seconds, so let's take + * advantage and do a game checkpoint, + * then resume the wait. + */ +#ifdef INSURANCE + save_currentstate(); +#endif /* INSURANCE */ + done_a_checkpoint = TRUE; + } else + { + ReadConsoleInput(hConIn, ir, 1, count); + if (mode == 0) { + if ((ir->EventType == KEY_EVENT) && ir->Event.KeyEvent.bKeyDown) { + ch = default_processkeystroke(hConIn, ir, &valid, + numberpad, 0); + done = valid; + } + } else { + if (*count > 0) { + if (ir->EventType == KEY_EVENT + && ir->Event.KeyEvent.bKeyDown) { #ifdef QWERTZ_SUPPORT - if (qwertz) - numpad |= 0x10; + if (qwertz) + numberpad |= 0x10; #endif - ch = default_processkeystroke(hConIn, ir, &valid, numpad, 0); + ch = default_processkeystroke(hConIn, ir, &valid, + numberpad, 0); #ifdef QWERTZ_SUPPORT - numpad &= ~0x10; + numberpad &= ~0x10; #endif - if (valid) - return ch; - } else if (ir->EventType == MOUSE_EVENT) { - if ((ir->Event.MouseEvent.dwEventFlags == 0) - && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK)) { - cc->x = ir->Event.MouseEvent.dwMousePosition.X + 1; - cc->y = ir->Event.MouseEvent.dwMousePosition.Y - 1; + if (valid) + return ch; + } else if (ir->EventType == MOUSE_EVENT) { + if ((ir->Event.MouseEvent.dwEventFlags == 0) + && (ir->Event.MouseEvent.dwButtonState + & MOUSEMASK)) { + cc->x = + ir->Event.MouseEvent.dwMousePosition.X + 1; + cc->y = + ir->Event.MouseEvent.dwMousePosition.Y - 1; - if (ir->Event.MouseEvent.dwButtonState & LEFTBUTTON) - *mod = CLICK_1; - else if (ir->Event.MouseEvent.dwButtonState - & RIGHTBUTTON) - *mod = CLICK_2; + if (ir->Event.MouseEvent.dwButtonState + & LEFTBUTTON) + *mod = CLICK_1; + else if (ir->Event.MouseEvent.dwButtonState + & RIGHTBUTTON) + *mod = CLICK_2; #if 0 /* middle button */ - else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) - *mod = CLICK_3; + else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) + *mod = CLICK_3; #endif - return 0; + return 0; + } } - } - } else - done = 1; + } else + done = 1; + } } } return mode ? 0 : ch; @@ -2573,7 +3371,7 @@ is_altseq(unsigned long shiftstate) case RIGHT_ALT_PRESSED: case RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED: - return (GetVersion() & 0x80000000) == 0; + return (IsWindows8OrGreater()); default: return 0; @@ -2584,7 +3382,7 @@ int ray_processkeystroke( HANDLE hConIn, INPUT_RECORD *ir, boolean *valid, - boolean numberpad, + uchar numberpad, int portdebug) { int keycode, vk; @@ -2771,7 +3569,7 @@ ray_checkinput( HANDLE hConIn, INPUT_RECORD *ir, DWORD *count, - boolean numpad, + uchar numberpad, int mode, int *mod, coord *cc) @@ -2783,8 +3581,8 @@ ray_checkinput( boolean valid = 0, done = 0; #ifdef QWERTZ_SUPPORT - if (numpad & 0x10) { - numpad &= ~0x10; + if (numberpad & 0x10) { + numberpad &= ~0x10; qwertz = TRUE; } else { qwertz = FALSE; @@ -2806,21 +3604,21 @@ ray_checkinput( ReadConsoleInput(hConIn, ir, 1, count); } else { ch = 0; - if (count > 0) { + if (*count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { #ifdef QWERTZ_SUPPORT if (qwertz) - numpad |= 0x10; + numberpad |= 0x10; #endif - ch = ray_processkeystroke(hConIn, ir, &valid, numpad, + ch = ray_processkeystroke(hConIn, ir, &valid, numberpad, #ifdef PORTDEBUG 1); #else 0); #endif #ifdef QWERTZ_SUPPORT - numpad &= ~0x10; + numberpad &= ~0x10; #endif if (valid) return ch; @@ -2842,18 +3640,18 @@ ray_checkinput( & RIGHTBUTTON) *mod = CLICK_2; #if 0 /* middle button */ - else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) - *mod = CLICK_3; + else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) + *mod = CLICK_3; #endif return 0; } } #if 0 - /* We ignore these types of console events */ - else if (ir->EventType == FOCUS_EVENT) { - } - else if (ir->EventType == MENU_EVENT) { - } + /* We ignore these types of console events */ + else if (ir->EventType == FOCUS_EVENT) { + } + else if (ir->EventType == MENU_EVENT) { + } #endif } } else @@ -2941,10 +3739,10 @@ ray_kbhit( int nh340_processkeystroke( - HANDLE hConIn, + HANDLE hConIn UNUSED, INPUT_RECORD *ir, boolean *valid, - boolean numberpad, + uchar numberpad, int portdebug) { int keycode, vk; @@ -3090,7 +3888,7 @@ nh340_checkinput( HANDLE hConIn, INPUT_RECORD *ir, DWORD *count, - boolean numpad, + uchar numberpad, int mode, int *mod, coord *cc) @@ -3102,8 +3900,8 @@ nh340_checkinput( boolean valid = 0, done = 0; #ifdef QWERTZ_SUPPORT - if (numpad & 0x10) { - numpad &= ~0x10; + if (numberpad & 0x10) { + numberpad &= ~0x10; qwertz = TRUE; } else { qwertz = FALSE; @@ -3122,19 +3920,19 @@ nh340_checkinput( if ((ir->EventType == KEY_EVENT) && ir->Event.KeyEvent.bKeyDown) { #ifdef QWERTZ_SUPPORT if (qwertz) - numpad |= 0x10; + numberpad |= 0x10; #endif - ch = nh340_processkeystroke(hConIn, ir, &valid, numpad, 0); + ch = nh340_processkeystroke(hConIn, ir, &valid, numberpad, 0); #ifdef QWERTZ_SUPPORT - numpad &= ~0x10; + numberpad &= ~0x10; #endif done = valid; } } else { - if (count > 0) { + if (*count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { - ch = nh340_processkeystroke(hConIn, ir, &valid, numpad, 0); + ch = nh340_processkeystroke(hConIn, ir, &valid, numberpad, 0); if (valid) return ch; } else if (ir->EventType == MOUSE_EVENT) { @@ -3149,8 +3947,8 @@ nh340_checkinput( & RIGHTBUTTON) *mod = CLICK_2; #if 0 /* middle button */ - else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) - *mod = CLICK_3; + else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) + *mod = CLICK_3; #endif return 0; } @@ -3161,5 +3959,4 @@ nh340_checkinput( } return mode ? 0 : ch; } - #endif /* WIN32 */ diff --git a/sys/windows/fetch.cmd b/sys/windows/fetch.cmd new file mode 100644 index 000000000..a508ad8dc --- /dev/null +++ b/sys/windows/fetch.cmd @@ -0,0 +1,30 @@ +@echo off +if not exist lib\* mkdir lib + +if [%1] == [lua] ( + set LUA_VERSION=5.4.8 + set LUASRC=../lib/lua + set CURLLUASRC=http://www.lua.org/ftp/lua-%LUA_VERSION%.tar.gz + set CURLLUADST=lua-%LUA_VERSION%.tar.gz + if NOT exist lib/lua.h ( + cd lib + curl -L %CURLLUASRC% -o %CURLLUADST% + tar -xvf %CURLLUADST% + cd .. + ) + echo Lua placed in lib/lua-%LUA_VERSION%.tar.gz +) + +if [%1] == [pdcursesmod] ( + set PDCVERSION=4.4.0 + set CURLPDCSRC=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v%PDCVERSION%.zip + set CURLPDCDST=pdcursesmod.zip + if NOT exist lib/pdcursesmod/curses.h ( + cd lib + curl -L %CURLPDCSRC% -o %CURLPDCDST% + tar -xvf %CURLPDCDST% + mkdir pdcursesmod + tar -C pdcursesmod --strip-components=1 -xvf %CURLPDCDST% + cd .. + ) +) diff --git a/sys/windows/fetch.sh b/sys/windows/fetch.sh new file mode 100644 index 000000000..e04dd31d3 --- /dev/null +++ b/sys/windows/fetch.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +if [ ! -d lib ]; then +mkdir -p lib +fi + +if [ $1 == "lua" ]; then + if [ -z "$LUA_VERSION" ]; then + export LUA_VERSION=5.4.8 + export LUASRC=../lib/lua + fi + + export CURLLUASRC=http://www.lua.org/ftp/lua-5.4.8.tar.gz + export CURLLUADST=lua-5.4.8.tar.gz + + if [ ! -f lib/lua.h ] ;then + cd lib + curl -L $CURLLUASRC -o $CURLLUADST + /c/Windows/System32/tar -xvf $CURLLUADST + cd .. + fi +fi + +if [ $1 == "pdcursesmod" ]; then + export CURLPDCSRC=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v4.4.0.zip + export CURLPDCDST=pdcursesmod.zip + + if [ ! -f lib/pdcursesmod/curses.h ] ; then + cd lib + curl -L $CURLPDCSRC -o $CURLPDCDST + /c/Windows/System32/tar -xvf $CURLPDCDST + mkdir -p pdcursesmod + /c/Windows/System32/tar -C pdcursesmod --strip-components=1 -xvf $CURLPDCDST + cd .. + fi +fi diff --git a/sys/windows/guitty.c b/sys/windows/guitty.c new file mode 100644 index 000000000..7dd14ec3a --- /dev/null +++ b/sys/windows/guitty.c @@ -0,0 +1,4 @@ +/* Provide erase_char and kill_char for Curses on Windows GUI */ + +char erase_char; +char kill_char; diff --git a/sys/winnt/nethack.def b/sys/windows/nethack.def similarity index 80% rename from sys/winnt/nethack.def rename to sys/windows/nethack.def index b3f68f2bf..2695cecb9 100644 --- a/sys/winnt/nethack.def +++ b/sys/windows/nethack.def @@ -1,5 +1,5 @@ NAME NETHACK -DESCRIPTION 'NetHack 3.6.6 for Windows' +DESCRIPTION 'NetHack 5.0.0 for Windows' EXETYPE WINDOWS STUB 'WINSTUB.EXE' CODE PRELOAD MOVEABLE DISCARDABLE diff --git a/sys/winnt/.nethackrc.template b/sys/windows/nethackrc.template similarity index 91% rename from sys/winnt/.nethackrc.template rename to sys/windows/nethackrc.template index a4558e063..8e2ce9c68 100644 --- a/sys/winnt/.nethackrc.template +++ b/sys/windows/nethackrc.template @@ -1,4 +1,4 @@ -# NetHack 3.6 defaults.nh $NHDT-Date: 1524689357 2018/04/25 20:49:17 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.32 $ +# NetHack 5.0 defaults.nh $NHDT-Date: 1524689357 2018/04/25 20:49:17 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.32 $ # Copyright (c) 2006 by Michael Allison # NetHack may be freely redistributed. See license for details. @@ -54,6 +54,14 @@ OPTIONS=!autopickup #OPTIONS=menustyle:traditional #OPTIONS=perm_invent +# Set the default boulder symbol to '0' +OPTIONS=boulder:0 + +# Disable the prompt for a tutorial +#OPTIONS=!tutorial + +# Disable game tips +#OPTIONS=!tips # Highlight menu lines with different colors. You need to define the colors # with MENUCOLOR lines. @@ -72,7 +80,7 @@ MENUCOLOR=" cursed " = red # Show all unholy water in red MENUCOLOR=" unholy " = red # Show all cursed worn items in orange and underlined -MENUCOLOR=" cursed .* (being worn)" = orange&underline +MENUCOLOR=" cursed .* \(being worn\)" = orange&underline @@ -133,31 +141,27 @@ OPTIONS=hilite_pet,!toptenwin # window, windowframe, windowtext. #OPTIONS=windowcolors:status windowtext/window message windowtext/window -# "Nethack mode" colors -OPTIONS=windowcolors:status white/#000000 message white/#000000 text white/#000000 menu white/#000000 menutext white/#000000 -OPTIONS=vary_msgcount:4 - # *** LOCATIONS *** # IMPORTANT: If you change any of these locations, the directories they # point at must exist. NetHack will not create them for you. # # The location that documentation and helps files are placed -#HACKDIR=c:\User\USERNAME\NetHack\3.6 +#HACKDIR=c:\User\USERNAME\NetHack\5.0 # # The location that level files in progress are stored (writeable) -#LEVELDIR=c:\User\USERNAME\AppData\Local\NetHack\3.6 +#LEVELDIR=c:\User\USERNAME\AppData\Local\NetHack\5.0 # # The location where saved games are kept (writeable) -#SAVEDIR=c:\User\USERNAME\AppData\Local\NetHack\3.6 +#SAVEDIR=c:\User\USERNAME\AppData\Local\NetHack\5.0 # # The location that bones files are kept (writeable) -#BONESDIR=c:\ProgramData\NetHack\3.6 +#BONESDIR=c:\ProgramData\NetHack\5.0 # # The location that score files are kept (writeable) -#SCOREDIR=c:\ProgramData\NetHack\3.6 +#SCOREDIR=c:\ProgramData\NetHack\5.0 # # The location that file synchronization locks are stored (writeable) -#LOCKDIR=c:\ProgramData\NetHack\3.6 +#LOCKDIR=c:\ProgramData\NetHack\5.0 # # Finnish keyboards might need these modifications uncommented. @@ -231,3 +235,7 @@ OPTIONS=hilite_status:gold/up/yellow/down/brown # St, Dx, Co, In, Wi, Ch OPTIONS=hilite_status:characteristics/up/green/down/red +# CRASHREPORTURL must be set in syscf to enable these options. +# These identify you in crash reports +#OPTIONS=crash_name:Your Name +#OPTIONS=crash_email:user@example.com diff --git a/sys/winnt/nhico.uu b/sys/windows/nhico.uu similarity index 100% rename from sys/winnt/nhico.uu rename to sys/windows/nhico.uu diff --git a/sys/windows/nhsetup.bat b/sys/windows/nhsetup.bat new file mode 100755 index 000000000..684b81bb6 --- /dev/null +++ b/sys/windows/nhsetup.bat @@ -0,0 +1,76 @@ +@REM NetHack 5.0 nhsetup.bat $NHDT-Date: 1596498315 2020/08/03 23:45:15 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.40 $ */ +@REM Copyright (c) NetHack Development Team 1993-2024 +@REM NetHack may be freely redistributed. See license for details. +@REM Win32 setup batch file, see Install.windows for details +@REM +@echo off +pushd %~dp0 +set WIN32PATH=..\..\win\win32 +set BINPATH=..\..\binary +set VCDir= + +goto :main + +:dirname +rem Get the dirname of the second argument and set the variable who's +rem name was specified in the first argument. +call set %~1=%%~dp2 +call set %~1=%%%~1:~0,-1%% +goto :EOF + +:main + +echo Checking to see if source tree directories are set up properly... +if not exist ..\..\include\hack.h goto :err_dir +if not exist ..\..\src\hack.c goto :err_dir +if not exist ..\..\dat\wizard1.lua goto :err_dir +if not exist ..\..\util\makedefs.c goto :err_dir +if not exist ..\..\sys\windows\windsys.c goto :err_dir +if not exist ..\..\win\win32\mhmain.c goto :err_dir +echo Directories look ok. + +:movemakes +echo Moving Makefiles into ..\..\src for those not using Visual Studio +REM Some file movement for those that still want to use MAKE or NMAKE and a Makefile +:do_tty +if NOT exist %BINPATH%\*.* mkdir %BINPATH% +if NOT exist %BINPATH%\license copy ..\..\dat\license %BINPATH%\license >nul + +echo Copying Microsoft Makefile - Makefile.nmake to ..\..\src\Makefile +if NOT exist ..\..\src\Makefile goto donenmake +copy ..\..\src\Makefile ..\..\src\Makefile-orig >nul +echo Your existing +echo ..\..\src\Makefile +echo has been renamed to +echo ..\..\src\Makefile-orig +:donenmake +copy /Y Makefile.nmake ..\..\src\Makefile >nul +echo Microsoft nmake Makefile.nmake copy to ..\..\src\Makefile completed. + +echo Copying mingw-w64 GNUmakefile to ..\..\src\GNUmakefile +copy /Y GNUmakefile ..\..\src\GNUmakefile >nul +echo Copying mingw-w64 GNUmakefile.depend to ..\..\src\GNUmakefile.depend +copy /Y GNUmakefile.depend ..\..\src\GNUmakefile.depend >nul +echo mingw-w64 Makefile copies to ..\..\src completed. + +echo Done copying files. +goto :done + +:err_dir +echo Your directories are not set up properly, please re-read the +echo documentation and sys/windows/Install.windows. +goto :fini + +:done +echo done! +echo. +echo Proceed with the next step documented in Install.windows +echo. + +:fini +:end +set _pause=N +for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set _pause=Y +if "%_pause%"=="Y" pause +set _pause= +popd diff --git a/sys/winnt/porthelp b/sys/windows/porthelp similarity index 69% rename from sys/winnt/porthelp rename to sys/windows/porthelp index 3f553739e..cce6549a5 100644 --- a/sys/winnt/porthelp +++ b/sys/windows/porthelp @@ -1,38 +1,35 @@ - Microsoft Windows specific help file for NetHack 3.6 - Copyright (c) NetHack PC Development Team 1993-2002. + Microsoft Windows specific help file for NetHack 5.0 + Copyright (c) NetHack PC Development Team 1993-2025. NetHack may be freely distributed. See license for details. - (Last Revision: March 16, 2003) + (Last Revision: August 19, 2025) -This file details specifics for NetHack built for Windows 95, 98, NT, -Me, 2000, and XP. Users of really early 16-bit Windows versions should -use the MSDOS NetHack. +This file details some specifics for NetHack built for Windows. -Please note that "NetHack for Windows - Graphical Interface" requires -an installation of Internet Explorer 4 or an installation of -version 4.71 of the common controls. See the following internet page: - http://www.nethack.org/v340/ports/download-win.html#cc -for more information. If the game runs for you, you are not affected. - -New players should be sure to read GuideBook.txt which contains +New players should be sure to read GuideBook.txt which contains essential information about playing NetHack. It can be found in the same directory as your NetHack executable. -The NetHack for Windows port supports some additional or enhanced -commands as well as some defaults.nh file options specific to -configuration choices used during the building of NetHack for -Windows. Listed below are those commands and defaults.nh file -options. +The NetHack for Windows port supports some additional or enhanced +commands as well as some NetHack config file options. + +The active NetHack config file is stored in the nethack subfolder of the +user's User Profile Folder. The config file can be referenced +in the legacy CMD command prompt as: + %USERPROFILE%\nethack\.nethackrc + +Under powershell, the User's config file can be referenced +as: + $env:USERPROFILE\nethack\.nethackrc -Some options are applicable only to the "Graphical Interface." -These are discussed separately in their own section. +Some options are applicable only to the "Graphical Interface." +These are discussed separately in their own section. Contents 1. ALT Key Combinations -2. Boolean options - Option that you can toggle on or off -3. Graphical Interface - Options you can assign a value to -4. Graphical Interface - Additional/Enhanced Commands -5. Graphical Interface - Menus -6. Numeric Keypad (for number_pad mode) +2. Graphical Interface - Options you can assign a value to +3. Graphical Interface - Additional/Enhanced Commands +4. Graphical Interface - Menus +5. Numeric Keypad (for number_pad mode) 1. ALT Key Combinations @@ -42,7 +39,7 @@ while the "NetHack for Windows - Graphical Interface" lets you toggle the mode. In non-NetHack mode, all ALT-key combinations are sent to the Windows itself, rather than to NetHack. -While playing in NetHack mode you can press the ALT key in +While playing in NetHack mode you can press the ALT key in combination with another key to execute an extended command as an alternative method to pressing a # key sequence. The available commands are: @@ -57,7 +54,7 @@ The available commands are: Alt-i #invoke - invoke an object's powers. Alt-j #jump - jump to a location. Alt-l #loot - loot a box on the floor. - Alt-m #monster - use a monster's special ability. + Alt-m #monster - use a monster's special ability. Alt-n #name - name an item or type of object. Alt-o #offer - offer a sacrifice to the gods. Alt-p #pray - pray to the gods for help. @@ -71,41 +68,14 @@ The available commands are: Alt-w #wipe - wipe off your face. Alt-? #? - display list of extended menu commands -2. Boolean Options (Options that can be toggled on or off) ----------------------------------------------------------- - -Listed here are any options not discussed in the main help, options -which may be slightly different from the main help file, and options -which may need a slightly more explanatory note: - - color Use color when displaying non-tiled maps. Tiled - maps (available in the graphical port) are always - rendered in color. Default: [TRUE] - - hilite_pet Using tiled graphics, displays a small heart symbol - next to your pet. Using ascii graphics, the pet is - hilited in a white background. - Default: [TRUE] - - IBMgraphics Use IBM extended characters for the dungeon - Default: [TRUE] - - msg_window When ^P is pressed, it shows menu in a full window. - Available only in the non-graphical (tty) version. - Default: [FALSE] - - toptenwin Write top ten list to a window, as opposed to stdout. - Default in tty interface: [FALSE] - Default in graphical interface: [TRUE] (and cannot be changed) - -3. Options that you assign a value to (Graphical Interface only) +2. Options that you assign a value to (Graphical Interface only) ---------------------------------------------------------------- -"NetHack for Windows - Graphical Interface" recognizes the following +"NetHack for Windows - Graphical Interface" recognizes the following additional options, which the non-graphical (tty) version will silently ignore. These are options that specify attributes of various -windows. The windows that you can tailor include menu windows (such -as the inventory list), text windows (such as "It is written in the +windows. The windows that you can tailor include menu windows (such +as the inventory list), text windows (such as "It is written in the book of ..." screens), the message window (where events of the game are displayed), the status window (where your character name and attributes are displayed), and the map window (where the map @@ -113,47 +83,47 @@ is drawn). Window Alignment options: - align_message Specifies at which side of the NetHack screen the - message window is aligned. This option can be used + align_message Specifies at which side of the NetHack screen the + message window is aligned. This option can be used to align the window to "top" or "bottom". - Default: [TOP] + Default: [TOP] - align_status Specifies at which side of the NetHack screen the + align_status Specifies at which side of the NetHack screen the status window is aligned. This option can be used to align the window to "top" or "bottom". - Default: [BOTTOM] + Default: [BOTTOM] Map Window options: - map_mode Specifies which map mode to use. - The following map modes are available: - tiles (display things on the map with colored tiles), + map_mode Specifies which map mode to use. + The following map modes are available: + tiles (display things on the map with colored tiles), ascii4x6, ascii6x8, ascii8x8, ascii16x8, ascii7x12, ascii8x12, ascii16x12, ascii12x16, ascii10x18 - (which use that size font to display things on + (which use that size font to display things on the map), or fit_to_screen (an ascii mode which forces things to fit on a single screen). Default: [tiles] scroll_margin Specifies the number of map cells from the edge of the map window where scrolling will take place. - Default: [5] + Default: [5] - tile_file An alternative file containing bitmap to use for - tiles. This file should be a .bmp file and should - be organized as 40 rectangular tiles wide. It is - beyond the scope of this document to describe the + tile_file An alternative file containing bitmap to use for + tiles. This file should be a .bmp file and should + be organized as 40 rectangular tiles wide. It is + beyond the scope of this document to describe the exact contents of each tile in the .bmp, which must match the object lists used when building NetHack. - tile_height Used with tile_file to specify the height of each + tile_height Used with tile_file to specify the height of each tile in pixels. This option may only be specified in the defaults.nh config file. - Default: [16] + Default: [16] - tile_width Used with tile_file to specify the width of each + tile_width Used with tile_file to specify the width of each tile in pixels. This option may only be specified - in the defaults.nh config file. + in the defaults.nh config file. Default: [16] Other Window options: @@ -177,12 +147,12 @@ Other Window options: cyan, gray (or grey), orange, brightgreen, yellow, brightblue, brightmagenta, brightcyan, white, trueblack, purple, silver, maroon, fuchsia, - lime, olive, navy, teal, aqua. In addition, you - can use the following names to refer to default - Windows settings: activeborder, activecaption, - appworkspace, background, btnface, btnshadow, btntext, - captiontext, graytext, highlight, highlighttext, - inactiveborder, inactivecaption, menu, menutext, + lime, olive, navy, teal, aqua. In addition, you + can use the following names to refer to default + Windows settings: activeborder, activecaption, \ + appworkspace, background, btnface, btnshadow, btntext, + captiontext, graytext, highlight, highlighttext, + inactiveborder, inactivecaption, menu, menutext, scrollbar, window, windowframe, windowtext. Example: @@ -203,56 +173,56 @@ Other Window options: font_size_text Specifies the size of the text font. -Miscellaneous options: +Miscellaneous options: - vary_msgcount Number of lines to display in message window. + vary_msgcount Number of lines to display in message window. -4. NetHack for Windows - Graphical Interface, Additional/Enhanced Commands +3. NetHack for Windows - Graphical Interface, Additional/Enhanced Commands ------------------------------------------------------------------------- The following function keys are active in -the "NetHack for Windows - Graphical Interface": - - F4 Toggle level overview mode on/off - This key will toggle the map between a view that - is mapped to fit exactly to the window, and the - view that shows the various symbols in their - normal size. This is useful for getting an idea - of where you are in a level. - - F5 Toggle tiled display on/off. - This key switches between the tiled and the - traditional ASCII display. This is equivalent to - using the "map_mode" option. - - F10 Activate menu bar. - This key will activate the menu bar, allowing you - to select between the menus: File, Map, - Window Settings, and Help. - -5. Graphical Port Menus +the "NetHack for Windows - Graphical Interface": + + F4 Toggle level overview mode on/off + This key will toggle the map between a view that + is mapped to fit exactly to the window, and the + view that shows the various symbols in their + normal size. This is useful for getting an idea + of where you are in a level. + + F5 Toggle tiled display on/off. + This key switches between the tiled and the + traditional ASCII display. This is equivalent to + using the "map_mode" option. + + F10 Activate menu bar. + This key will activate the menu bar, allowing you + to select between the menus: File, Map, + Window Settings, and Help. + +4. Graphical Port Menus ----------------------- File Save - Allows you to save and exit the game Quit - Allows you to quit the game -Map - Provides for selection of map mode. Equivalent to using -the map_mode option. +Map - Provides for selection of map mode. Equivalent to using +the map_mode option. Window Settings - Changes your logged-on user's settings for NetHack. -In 3.5.0, only one setting is available: NetHack mode, which can be +Only one setting is available: NetHack mode, which can be checked or unchecked. NetHack mode allows you to use the ALT key for game key commands [see list above]. You can use F10 to access the menu bar while in NetHack mode. You can also clear your logged-on user's settings for NetHack. Settings in this window are saved in -your logged-on user's registry. +your logged-on user's registry. Help - Provides help about various portions of NetHack. -6. Numeric Keypad (for "OPTION=number_pad" mode) +5. Numeric Keypad (for "OPTION=number_pad" mode) ------------------------------------------------ The numeric keypad and surrounding characters act as macros for different @@ -297,4 +267,3 @@ most of these keys: Ctrl-Shift-PgDn (3) Scroll (Pan) map left to lowermost corner - diff --git a/sys/windows/sysconf.template b/sys/windows/sysconf.template new file mode 100644 index 000000000..4b00865c3 --- /dev/null +++ b/sys/windows/sysconf.template @@ -0,0 +1,130 @@ +# +# NetHack 5.0 sysconf $NHDT-Date: 1524689357 2018/04/25 20:49:17 $ $NHDT-Branch: NetHack-5.0.0 $:$NHDT-Revision: 1.22 $ +# Copyright (c) 2015 by Michael Allison +# NetHack may be freely redistributed. See license for details. +# +# Sample sysconf file. +# The sysconf file is only used if NetHack is compiled with SYSCF defined. +# This file uses the same syntax as nethack.cf. + +# Which users can use WIZARD (debugging) mode (the -D flag). +# A value of * allows anyone to enter debugging mode. +WIZARDS=* + +# Users allowed to use the ! (shell escape) command or to suspend the game. +# Uses the same syntax as the WIZARDS option above. +#SHELLERS= + +# Execute this program whenever a new message-window message is shown. +# The program will get the message text as the only parameter. +#MSGHANDLER=\path\program + +# Show debugging information originating from these source files. +# Use '*' for all, or list source files separated by spaces. +# Only available if game has been compiled with DEBUG. +#DEBUGFILES=* + +# Save end of game dump log to this file. +# Only available if NetHack was compiled with DUMPLOG +# Allows following placeholders: +# %% literal '%' +# %v version (eg. "5.0.0-0") +# %u game UID +# %t game start time, UNIX timestamp format +# %T current time, UNIX timestamp format +# %d game start time, YYYYMMDDhhmmss format +# %D current time, YYYYMMDDhhmmss format +# %n player name +# %N first character of player name +#DUMPLOGFILE=nethack-%n-%d.log + +# Number of bones file pools. +# The pool you belong to is determined at game start. You will +# load and save bones only from that pool. Generally useful +# for public servers only. +# Changing this might make existing bones inaccessible. +# Disabled by setting to 0, or commenting out. +#BONES_POOLS=10 + +# Limit the number of simultaneous games (see also nethack.sh). +#MAXPLAYERS=10 + +# If not null, added to string "To get local support, " in the support +# information help. +#SUPPORT=call Izchak at extension 42. + +# Uncomment the next line to disable the SEDUCE option. +#SEDUCE=0 + +# Uncomment the next line to enable some accessibility features such +# as S_hero_override and S_pet_override symbols for screen readers +# in the user config file. +#ACCESSIBILITY=1 + +# Record (high score) file options. +# CAUTION: changing these after people have started playing games can +# lead to lost high scores! +# Maximum entries for one person. +#PERSMAX=10 +# Maximum entries in the record file. +#ENTRYMAX=100 +# Minimum points to get an entry. +#POINTSMIN=1 +# Determine identity of "person" in the score file with name (0) or +# numeric (1) user id. +#PERS_IS_UID=1 + +# Help menu control; 0 - include "command line usage" entry in help menu; +# 1 - suppress it from the menu. Does not affect 'nethack --usage' when +# player has access to the command line. The usage feedback describes +# command line handling for UNIX so enabling it won't be much use here. +HIDEUSAGE=1 + +# Maximum number of score file entries to use for random statue names +#MAX_STATUENAME_RANK=10 + +# 'portable_device_paths' is only supported for Windows. Starting with +# 3.6.3, nethack on Windows treats the folder containing nethack.exe and +# nethackW.exe as read-only and puts data files which are generated or +# modified during play or by the user in assorted folders derived from +# user name. 3.6.4 added PORTABLE_DEVICE_PATHS to allow reverting to +# the old behavior of having the run-time configuration file and other +# data in the same directory as the executable so that the whole thing +# can be moved from one machine to another (flash drive or perhaps cloud) +# without updating folder paths. Uncomment it and set to 1 to activate. +#PORTABLE_DEVICE_PATHS=0 + +# *** LOCATIONS *** +# IMPORTANT: If you change any of these locations, the directories they +# point at must exist. NetHack will not create them for you. +# +# Before adjusting, you can verify the default locations for files with: +# nethack --showpaths +# +# The location that users can adjust their config file startup options +#CONFIGDIR=%USERPROFILE%\NetHack +# +# The location that a record of game aborts and self-diagnosed game problems +# is kept (default=HACKDIR, writeable) +#TROUBLEDIR=%USERPROFILE%\NetHack\5.0 +# +# The location that documentation and helps files are placed +#HACKDIR=%USERPROFILE%\NetHack\5.0 +# +# The location that level files in progress are stored (writeable) +#LEVELDIR=%USERPROFILE%\AppData\Local\NetHack\5.0 +# +# The location where saved games are kept (writeable) +#SAVEDIR=%USERPROFILE%\AppData\Local\NetHack\5.0 +# +# The location that bones files are kept (writeable) +#BONESDIR=c:\ProgramData\NetHack\5.0 +# +# The location that score files are kept (writeable) +#SCOREDIR=c:\ProgramData\NetHack\5.0 +# +# The location that file synchronization locks are stored (writeable) +#LOCKDIR=c:\ProgramData\NetHack\5.0 + +# URL loaded for creating reports to the NetHack DevTeam +#CRASHREPORTURL=https://nethack.org/links/cr-5.0.0.html diff --git a/sys/windows/vs/.gitattributes b/sys/windows/vs/.gitattributes new file mode 100644 index 000000000..508769ffa --- /dev/null +++ b/sys/windows/vs/.gitattributes @@ -0,0 +1,2 @@ +* NH_filestag=(file%s_for_Visual_Studio_Community_builds) +..files !NH_filegenerated diff --git a/sys/windows/vs/.gitignore b/sys/windows/vs/.gitignore new file mode 100644 index 000000000..ced2d32bd --- /dev/null +++ b/sys/windows/vs/.gitignore @@ -0,0 +1,17 @@ +!NetHack.sln +*.db-shm +*.db-wal +paniclog +_pkginfo.txt +AppPackages +BundleArtifacts +report.xml +*.cer +*.appxbundle +NetHackPackage_StoreKey.pfx +NetHackPackage_TemporaryKey.pfx +NetHackPackage.assets.cache +NetHackPackage.wapproj.user +NetHackPackage/obj/ +NetHackW.vcxproj.user +obj/ diff --git a/sys/windows/vs/FetchPrereq/fetchprereq.nmake b/sys/windows/vs/FetchPrereq/fetchprereq.nmake new file mode 100644 index 000000000..2d89c381f --- /dev/null +++ b/sys/windows/vs/FetchPrereq/fetchprereq.nmake @@ -0,0 +1,70 @@ +# NetHack 5.0 fetchprereq.nmake +#============================================================================== +# +# The version of the game this Makefile was designed for +NETHACK_VERSION="5.0.0" + +# A brief version for use in macros +NHV=$(NETHACK_VERSION:.=) +NHV=$(NHV:"=) + +# The version of Lua we want +LUA_VERSION=5.4.8 +CURLLUASRC=https://www.lua.org/ftp/lua-$(LUA_VERSION).tar.gz +CURLLUADST=lua-$(LUA_VERSION).tar.gz + +# The version of pdcursesmod that we want +PDCDIST=pdcursesmod +PDCURSES_VERSION = 4.4.0 +PDCURL=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v +CURLPDCSRC=$(PDCURL)$(PDCURSES_VERSION).zip +CURLPDCDST=$(PDCDIST) + +# +# relative directories from root of NetHack tree. +# + +LIBSDIR=lib # libraries and external bits +SUBMSDIR=submodules # NetHack git submodules +ROOTDIR=..\..\..\.. # root of NetHack tree relative to project file +LIBDIR=$(ROOTDIR)\$(LIBSDIR) +SUBMDIR=$(ROOTDIR)\$(SUBMSDIR) + + +default: fetchall + +fetchall: libdir fetch-Lua fetch-pdcurses + +fetch-lua: fetch-actual-Lua + +fetch-Lua: fetch-actual-Lua + +fetch-actual-Lua: + cd $(LIBDIR) + curl --insecure -R -O $(CURLLUASRC) + tar zxf lua-$(LUA_VERSION).tar.gz + if exist lua-$(LUA_VERSION).tar.gz del lua-$(LUA_VERSION).tar.gz + cd ..\sys\windows\vs\fetchprereq + @echo Lua has been fetched into $(LIBDIR)\lua-$(LUA_VERSION) + +fetch-pdcurses: + cd $(LIBDIR) + curl --insecure -L -R $(PDCURL)$(PDCURSES_VERSION).zip -o $(PDCDIST).zip + if not exist $(PDCDIST)\*.* mkdir $(PDCDIST) + tar -zxC $(PDCDIST) --strip-components=1 -f $(CURLPDCDST).zip + if exist $(CURLPDCDST).zip del $(CURLPDCDST).zip + cd ..\sys\windows\vs\fetchprereq + @echo $(PDCDIST) has been fetched into $(LIBDIR)\$(PDCDIST) + +libdir: + @if not exist $(LIBDIR)\*.* echo creating directory $(LIB:\=/) + @if not exist $(LIBDIR)\*.* mkdir $(LIBDIR) + +clean: + @if exist $(LIBDIR)\$(PDCDIST) rmdir /Q $(LIBDIR)\$(PDCDIST) /s + @if exist $(LIBDIR)\lua-$(LUA_VERSION) rmdir /Q $(LIBDIR)\lua-$(LUA_VERSION) /s + @if exist ..\..\..\..\include\nhlua.h del /Q ..\..\..\..\include\nhlua.h + +rebuild: + @if exist $(LIBDIR)\$(PDCDIST) echo nothing to do for lib\$(PDCDIST) + @if exist $(LIBDIR)\lua-$(LUA_VERSION) echo nothing to do for lib\lua-$(LUA_VERSION) diff --git a/sys/windows/vs/FetchPrereq/fetchprereq.vcxproj b/sys/windows/vs/FetchPrereq/fetchprereq.vcxproj new file mode 100644 index 000000000..1aab0cbbc --- /dev/null +++ b/sys/windows/vs/FetchPrereq/fetchprereq.vcxproj @@ -0,0 +1,86 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + 17.0 + {503AE687-C33A-45ED-93AA-83967E176D67} + Win32Proj + 10.0 + + + + Makefile + true + + + Makefile + false + + + Makefile + true + + + Makefile + true + + + Makefile + false + + + Makefile + false + + + + + + + + + + + + echo lib\pdcursesmod and lib\lua-$(LUA_VERSION) are already present + pushd $(vsDir)fetchprereq %26%26 nmake -F fetchprereq.nmake clean %26%26 popd + echo rebuilding lib\pdcursesmod and lib\lua-$(LUA_VERSION) + _DEBUG;$(NMakePreprocessorDefinitions) + + + pushd $(vsDir)fetchprereq %26%26 nmake -F fetchprereq.nmake %26%26 popd + pushd $(vsDir)fetchprereq %26%26 nmake -F fetchprereq.nmake clean %26%26 popd + pushd $(vsDir)fetchprereq %26%26 nmake -F fetchprereq.nmake rebuild %26%26 popd + _DEBUG;$(NMakePreprocessorDefinitions) + + + + + \ No newline at end of file diff --git a/sys/windows/vs/Images/BadgeLogo.scale-100.png b/sys/windows/vs/Images/BadgeLogo.scale-100.png new file mode 100644 index 000000000..0c1dff1b4 Binary files /dev/null and b/sys/windows/vs/Images/BadgeLogo.scale-100.png differ diff --git a/sys/windows/vs/Images/BadgeLogo.scale-125.png b/sys/windows/vs/Images/BadgeLogo.scale-125.png new file mode 100644 index 000000000..45aa7773c Binary files /dev/null and b/sys/windows/vs/Images/BadgeLogo.scale-125.png differ diff --git a/sys/windows/vs/Images/BadgeLogo.scale-150.png b/sys/windows/vs/Images/BadgeLogo.scale-150.png new file mode 100644 index 000000000..6a911cb2a Binary files /dev/null and b/sys/windows/vs/Images/BadgeLogo.scale-150.png differ diff --git a/sys/windows/vs/Images/BadgeLogo.scale-200.png b/sys/windows/vs/Images/BadgeLogo.scale-200.png new file mode 100644 index 000000000..21e20fb67 Binary files /dev/null and b/sys/windows/vs/Images/BadgeLogo.scale-200.png differ diff --git a/sys/windows/vs/Images/BadgeLogo.scale-400.png b/sys/windows/vs/Images/BadgeLogo.scale-400.png new file mode 100644 index 000000000..10fdb8f1e Binary files /dev/null and b/sys/windows/vs/Images/BadgeLogo.scale-400.png differ diff --git a/sys/windows/vs/Images/LargeTile.scale-100.png b/sys/windows/vs/Images/LargeTile.scale-100.png new file mode 100644 index 000000000..2c00fc94e Binary files /dev/null and b/sys/windows/vs/Images/LargeTile.scale-100.png differ diff --git a/sys/windows/vs/Images/LargeTile.scale-125.png b/sys/windows/vs/Images/LargeTile.scale-125.png new file mode 100644 index 000000000..fb1ba8d8e Binary files /dev/null and b/sys/windows/vs/Images/LargeTile.scale-125.png differ diff --git a/sys/windows/vs/Images/LargeTile.scale-150.png b/sys/windows/vs/Images/LargeTile.scale-150.png new file mode 100644 index 000000000..f3ccd1107 Binary files /dev/null and b/sys/windows/vs/Images/LargeTile.scale-150.png differ diff --git a/sys/windows/vs/Images/LargeTile.scale-200.png b/sys/windows/vs/Images/LargeTile.scale-200.png new file mode 100644 index 000000000..0c40a8a72 Binary files /dev/null and b/sys/windows/vs/Images/LargeTile.scale-200.png differ diff --git a/sys/windows/vs/Images/LargeTile.scale-400.png b/sys/windows/vs/Images/LargeTile.scale-400.png new file mode 100644 index 000000000..5c11c508b Binary files /dev/null and b/sys/windows/vs/Images/LargeTile.scale-400.png differ diff --git a/sys/windows/vs/Images/LockScreenLogo.scale-200.png b/sys/windows/vs/Images/LockScreenLogo.scale-200.png new file mode 100644 index 000000000..735f57adb Binary files /dev/null and b/sys/windows/vs/Images/LockScreenLogo.scale-200.png differ diff --git a/sys/windows/vs/Images/SmallTile.scale-100.png b/sys/windows/vs/Images/SmallTile.scale-100.png new file mode 100644 index 000000000..f7e719d06 Binary files /dev/null and b/sys/windows/vs/Images/SmallTile.scale-100.png differ diff --git a/sys/windows/vs/Images/SmallTile.scale-125.png b/sys/windows/vs/Images/SmallTile.scale-125.png new file mode 100644 index 000000000..e5aa2ea1b Binary files /dev/null and b/sys/windows/vs/Images/SmallTile.scale-125.png differ diff --git a/sys/windows/vs/Images/SmallTile.scale-150.png b/sys/windows/vs/Images/SmallTile.scale-150.png new file mode 100644 index 000000000..57d16d648 Binary files /dev/null and b/sys/windows/vs/Images/SmallTile.scale-150.png differ diff --git a/sys/windows/vs/Images/SmallTile.scale-200.png b/sys/windows/vs/Images/SmallTile.scale-200.png new file mode 100644 index 000000000..5e5e0ece8 Binary files /dev/null and b/sys/windows/vs/Images/SmallTile.scale-200.png differ diff --git a/sys/windows/vs/Images/SmallTile.scale-400.png b/sys/windows/vs/Images/SmallTile.scale-400.png new file mode 100644 index 000000000..3ed4e6994 Binary files /dev/null and b/sys/windows/vs/Images/SmallTile.scale-400.png differ diff --git a/sys/windows/vs/Images/SplashScreen.scale-100.png b/sys/windows/vs/Images/SplashScreen.scale-100.png new file mode 100644 index 000000000..d4bab84e3 Binary files /dev/null and b/sys/windows/vs/Images/SplashScreen.scale-100.png differ diff --git a/sys/windows/vs/Images/SplashScreen.scale-125.png b/sys/windows/vs/Images/SplashScreen.scale-125.png new file mode 100644 index 000000000..d97a15fc2 Binary files /dev/null and b/sys/windows/vs/Images/SplashScreen.scale-125.png differ diff --git a/sys/windows/vs/Images/SplashScreen.scale-150.png b/sys/windows/vs/Images/SplashScreen.scale-150.png new file mode 100644 index 000000000..2ce132a50 Binary files /dev/null and b/sys/windows/vs/Images/SplashScreen.scale-150.png differ diff --git a/sys/windows/vs/Images/SplashScreen.scale-200.png b/sys/windows/vs/Images/SplashScreen.scale-200.png new file mode 100644 index 000000000..cbffd4a6a Binary files /dev/null and b/sys/windows/vs/Images/SplashScreen.scale-200.png differ diff --git a/sys/windows/vs/Images/SplashScreen.scale-400.png b/sys/windows/vs/Images/SplashScreen.scale-400.png new file mode 100644 index 000000000..05424b307 Binary files /dev/null and b/sys/windows/vs/Images/SplashScreen.scale-400.png differ diff --git a/sys/windows/vs/Images/Square150x150Logo.scale-100.png b/sys/windows/vs/Images/Square150x150Logo.scale-100.png new file mode 100644 index 000000000..778506203 Binary files /dev/null and b/sys/windows/vs/Images/Square150x150Logo.scale-100.png differ diff --git a/sys/windows/vs/Images/Square150x150Logo.scale-125.png b/sys/windows/vs/Images/Square150x150Logo.scale-125.png new file mode 100644 index 000000000..6c625595e Binary files /dev/null and b/sys/windows/vs/Images/Square150x150Logo.scale-125.png differ diff --git a/sys/windows/vs/Images/Square150x150Logo.scale-150.png b/sys/windows/vs/Images/Square150x150Logo.scale-150.png new file mode 100644 index 000000000..d0471de30 Binary files /dev/null and b/sys/windows/vs/Images/Square150x150Logo.scale-150.png differ diff --git a/sys/windows/vs/Images/Square150x150Logo.scale-200.png b/sys/windows/vs/Images/Square150x150Logo.scale-200.png new file mode 100644 index 000000000..105037a99 Binary files /dev/null and b/sys/windows/vs/Images/Square150x150Logo.scale-200.png differ diff --git a/sys/windows/vs/Images/Square150x150Logo.scale-400.png b/sys/windows/vs/Images/Square150x150Logo.scale-400.png new file mode 100644 index 000000000..3b5c7146b Binary files /dev/null and b/sys/windows/vs/Images/Square150x150Logo.scale-400.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-16.png b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 000000000..c37bb5650 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-16.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-256.png b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 000000000..c5a031ec3 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-256.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-32.png b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 000000000..33651c0e2 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-32.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-48.png b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 000000000..3be7763d0 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.altform-unplated_targetsize-48.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.scale-100.png b/sys/windows/vs/Images/Square44x44Logo.scale-100.png new file mode 100644 index 000000000..b0b2e6cfd Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.scale-100.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.scale-125.png b/sys/windows/vs/Images/Square44x44Logo.scale-125.png new file mode 100644 index 000000000..7497e6315 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.scale-125.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.scale-150.png b/sys/windows/vs/Images/Square44x44Logo.scale-150.png new file mode 100644 index 000000000..d8291fea8 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.scale-150.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.scale-200.png b/sys/windows/vs/Images/Square44x44Logo.scale-200.png new file mode 100644 index 000000000..aa5dce320 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.scale-200.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.scale-400.png b/sys/windows/vs/Images/Square44x44Logo.scale-400.png new file mode 100644 index 000000000..ec0fa86b7 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.scale-400.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.targetsize-16.png b/sys/windows/vs/Images/Square44x44Logo.targetsize-16.png new file mode 100644 index 000000000..c2f20ed08 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.targetsize-16.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.targetsize-24.png b/sys/windows/vs/Images/Square44x44Logo.targetsize-24.png new file mode 100644 index 000000000..87a34d0aa Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.targetsize-24.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.targetsize-24_altform-unplated.png b/sys/windows/vs/Images/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 000000000..1e2c78548 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.targetsize-256.png b/sys/windows/vs/Images/Square44x44Logo.targetsize-256.png new file mode 100644 index 000000000..d7793c819 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.targetsize-256.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.targetsize-32.png b/sys/windows/vs/Images/Square44x44Logo.targetsize-32.png new file mode 100644 index 000000000..089f3635f Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.targetsize-32.png differ diff --git a/sys/windows/vs/Images/Square44x44Logo.targetsize-48.png b/sys/windows/vs/Images/Square44x44Logo.targetsize-48.png new file mode 100644 index 000000000..fcd6b9b25 Binary files /dev/null and b/sys/windows/vs/Images/Square44x44Logo.targetsize-48.png differ diff --git a/sys/windows/vs/Images/StoreLogo.backup.png b/sys/windows/vs/Images/StoreLogo.backup.png new file mode 100644 index 000000000..a90d0b6cd Binary files /dev/null and b/sys/windows/vs/Images/StoreLogo.backup.png differ diff --git a/sys/windows/vs/Images/StoreLogo.scale-100.png b/sys/windows/vs/Images/StoreLogo.scale-100.png new file mode 100644 index 000000000..7eda4fa47 Binary files /dev/null and b/sys/windows/vs/Images/StoreLogo.scale-100.png differ diff --git a/sys/windows/vs/Images/StoreLogo.scale-125.png b/sys/windows/vs/Images/StoreLogo.scale-125.png new file mode 100644 index 000000000..c1a3b87e2 Binary files /dev/null and b/sys/windows/vs/Images/StoreLogo.scale-125.png differ diff --git a/sys/windows/vs/Images/StoreLogo.scale-150.png b/sys/windows/vs/Images/StoreLogo.scale-150.png new file mode 100644 index 000000000..09163a158 Binary files /dev/null and b/sys/windows/vs/Images/StoreLogo.scale-150.png differ diff --git a/sys/windows/vs/Images/StoreLogo.scale-200.png b/sys/windows/vs/Images/StoreLogo.scale-200.png new file mode 100644 index 000000000..854fafb9b Binary files /dev/null and b/sys/windows/vs/Images/StoreLogo.scale-200.png differ diff --git a/sys/windows/vs/Images/StoreLogo.scale-400.png b/sys/windows/vs/Images/StoreLogo.scale-400.png new file mode 100644 index 000000000..9d4176160 Binary files /dev/null and b/sys/windows/vs/Images/StoreLogo.scale-400.png differ diff --git a/sys/windows/vs/Images/Wide310x150Logo.scale-100.png b/sys/windows/vs/Images/Wide310x150Logo.scale-100.png new file mode 100644 index 000000000..3a29f0911 Binary files /dev/null and b/sys/windows/vs/Images/Wide310x150Logo.scale-100.png differ diff --git a/sys/windows/vs/Images/Wide310x150Logo.scale-125.png b/sys/windows/vs/Images/Wide310x150Logo.scale-125.png new file mode 100644 index 000000000..5bde11842 Binary files /dev/null and b/sys/windows/vs/Images/Wide310x150Logo.scale-125.png differ diff --git a/sys/windows/vs/Images/Wide310x150Logo.scale-150.png b/sys/windows/vs/Images/Wide310x150Logo.scale-150.png new file mode 100644 index 000000000..8f35b96b8 Binary files /dev/null and b/sys/windows/vs/Images/Wide310x150Logo.scale-150.png differ diff --git a/sys/windows/vs/Images/Wide310x150Logo.scale-200.png b/sys/windows/vs/Images/Wide310x150Logo.scale-200.png new file mode 100644 index 000000000..a0be94e1a Binary files /dev/null and b/sys/windows/vs/Images/Wide310x150Logo.scale-200.png differ diff --git a/sys/windows/vs/Images/Wide310x150Logo.scale-400.png b/sys/windows/vs/Images/Wide310x150Logo.scale-400.png new file mode 100644 index 000000000..cbffd4a6a Binary files /dev/null and b/sys/windows/vs/Images/Wide310x150Logo.scale-400.png differ diff --git a/sys/windows/vs/NetHack.sln b/sys/windows/vs/NetHack.sln new file mode 100644 index 000000000..2c70f0491 --- /dev/null +++ b/sys/windows/vs/NetHack.sln @@ -0,0 +1,321 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11205.157 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetHackW", "NetHackW\NetHackW.vcxproj", "{CEC5D360-8804-454F-8591-002184C23499}" + ProjectSection(ProjectDependencies) = postProject + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} = {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {1693F852-A207-4348-8223-222C2A7FEEEB} = {1693F852-A207-4348-8223-222C2A7FEEEB} + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB} + {642BC75D-ABAF-403E-8224-7C725FD4CB42} = {642BC75D-ABAF-403E-8224-7C725FD4CB42} + {93F10526-209E-41D7-BBEA-775787876895} = {93F10526-209E-41D7-BBEA-775787876895} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dlb", "dlb\dlb.vcxproj", "{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}" + ProjectSection(ProjectDependencies) = postProject + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB} + {BA3DD34C-04B7-40D0-B373-9329AA9E8945} = {BA3DD34C-04B7-40D0-B373-9329AA9E8945} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedefs", "makedefs\makedefs.vcxproj", "{BA3DD34C-04B7-40D0-B373-9329AA9E8945}" + ProjectSection(ProjectDependencies) = postProject + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recover", "recover\recover.vcxproj", "{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}" + ProjectSection(ProjectDependencies) = postProject + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} = {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} = {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tile2bmp", "tile2bmp\tile2bmp.vcxproj", "{642BC75D-ABAF-403E-8224-7C725FD4CB42}" + ProjectSection(ProjectDependencies) = postProject + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tilemap", "tilemap\tilemap.vcxproj", "{93F10526-209E-41D7-BBEA-775787876895}" + ProjectSection(ProjectDependencies) = postProject + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uudecode", "uudecode\uudecode.vcxproj", "{63F9B82B-F589-4082-ABE5-D4F0682050AB}" + ProjectSection(ProjectDependencies) = postProject + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetHack", "NetHack\NetHack.vcxproj", "{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}" + ProjectSection(ProjectDependencies) = postProject + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} = {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B} = {BAA70D0F-3EC7-4D10-91F0-974F1F49308B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PDCurses", "PDCurses\PDCurses.vcxproj", "{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}" + ProjectSection(ProjectDependencies) = postProject + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{477BF231-48E0-4312-AA12-9D8576215489}" + ProjectSection(SolutionItems) = preProject + NetHackProperties.props = NetHackProperties.props + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Pdcursesgui", "PDCursesGui\Pdcursesgui.vcxproj", "{1693F852-A207-4348-8223-222C2A7FEEEB}" + ProjectSection(ProjectDependencies) = postProject + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hacklib", "hacklib\hacklib.vcxproj", "{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}" + ProjectSection(ProjectDependencies) = postProject + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fetchprereq", "FetchPrereq\fetchprereq.vcxproj", "{503AE687-C33A-45ED-93AA-83967E176D67}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "package", "package\package.vcxproj", "{0B53AF9B-E1A4-478B-9246-43A39E8B4027}" + ProjectSection(ProjectDependencies) = postProject + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} = {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + {1693F852-A207-4348-8223-222C2A7FEEEB} = {1693F852-A207-4348-8223-222C2A7FEEEB} + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E} = {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E} + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} = {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} + {63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB} + {642BC75D-ABAF-403E-8224-7C725FD4CB42} = {642BC75D-ABAF-403E-8224-7C725FD4CB42} + {93F10526-209E-41D7-BBEA-775787876895} = {93F10526-209E-41D7-BBEA-775787876895} + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} + {BA3DD34C-04B7-40D0-B373-9329AA9E8945} = {BA3DD34C-04B7-40D0-B373-9329AA9E8945} + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B} = {BAA70D0F-3EC7-4D10-91F0-974F1F49308B} + {CEC5D360-8804-454F-8591-002184C23499} = {CEC5D360-8804-454F-8591-002184C23499} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lualib", "lualib\lualib.vcxproj", "{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}" + ProjectSection(ProjectDependencies) = postProject + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nhlua_h", "nhlua_h\nhlua_h.vcxproj", "{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}" + ProjectSection(ProjectDependencies) = postProject + {503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67} + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEC5D360-8804-454F-8591-002184C23499}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {CEC5D360-8804-454F-8591-002184C23499}.Debug|ARM64.Build.0 = Debug|ARM64 + {CEC5D360-8804-454F-8591-002184C23499}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEC5D360-8804-454F-8591-002184C23499}.Debug|Win32.Build.0 = Debug|Win32 + {CEC5D360-8804-454F-8591-002184C23499}.Debug|x64.ActiveCfg = Debug|x64 + {CEC5D360-8804-454F-8591-002184C23499}.Debug|x64.Build.0 = Debug|x64 + {CEC5D360-8804-454F-8591-002184C23499}.Release|ARM64.ActiveCfg = Release|ARM64 + {CEC5D360-8804-454F-8591-002184C23499}.Release|ARM64.Build.0 = Release|ARM64 + {CEC5D360-8804-454F-8591-002184C23499}.Release|Win32.ActiveCfg = Release|Win32 + {CEC5D360-8804-454F-8591-002184C23499}.Release|Win32.Build.0 = Release|Win32 + {CEC5D360-8804-454F-8591-002184C23499}.Release|x64.ActiveCfg = Release|x64 + {CEC5D360-8804-454F-8591-002184C23499}.Release|x64.Build.0 = Release|x64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|ARM64.Build.0 = Debug|ARM64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|Win32.ActiveCfg = Debug|Win32 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|Win32.Build.0 = Debug|Win32 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|x64.ActiveCfg = Debug|x64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|x64.Build.0 = Debug|x64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|ARM64.ActiveCfg = Release|ARM64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|ARM64.Build.0 = Release|ARM64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|Win32.ActiveCfg = Release|Win32 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|Win32.Build.0 = Release|Win32 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|x64.ActiveCfg = Release|x64 + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|x64.Build.0 = Release|x64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|ARM64.Build.0 = Debug|ARM64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|Win32.ActiveCfg = Debug|Win32 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|Win32.Build.0 = Debug|Win32 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|x64.ActiveCfg = Debug|x64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|x64.Build.0 = Debug|x64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|ARM64.ActiveCfg = Release|ARM64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|ARM64.Build.0 = Release|ARM64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|Win32.ActiveCfg = Release|Win32 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|Win32.Build.0 = Release|Win32 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|x64.ActiveCfg = Release|x64 + {BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|x64.Build.0 = Release|x64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|ARM64.Build.0 = Debug|ARM64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|Win32.Build.0 = Debug|Win32 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|x64.ActiveCfg = Debug|x64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|x64.Build.0 = Debug|x64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|ARM64.ActiveCfg = Release|ARM64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|ARM64.Build.0 = Release|ARM64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|Win32.ActiveCfg = Release|Win32 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|Win32.Build.0 = Release|Win32 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|x64.ActiveCfg = Release|x64 + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|x64.Build.0 = Release|x64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|ARM64.Build.0 = Debug|ARM64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|Win32.ActiveCfg = Debug|Win32 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|Win32.Build.0 = Debug|Win32 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|x64.ActiveCfg = Debug|x64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|x64.Build.0 = Debug|x64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|ARM64.ActiveCfg = Release|ARM64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|ARM64.Build.0 = Release|ARM64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|Win32.ActiveCfg = Release|Win32 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|Win32.Build.0 = Release|Win32 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|x64.ActiveCfg = Release|x64 + {642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|x64.Build.0 = Release|x64 + {93F10526-209E-41D7-BBEA-775787876895}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {93F10526-209E-41D7-BBEA-775787876895}.Debug|ARM64.Build.0 = Debug|ARM64 + {93F10526-209E-41D7-BBEA-775787876895}.Debug|Win32.ActiveCfg = Debug|Win32 + {93F10526-209E-41D7-BBEA-775787876895}.Debug|Win32.Build.0 = Debug|Win32 + {93F10526-209E-41D7-BBEA-775787876895}.Debug|x64.ActiveCfg = Debug|x64 + {93F10526-209E-41D7-BBEA-775787876895}.Debug|x64.Build.0 = Debug|x64 + {93F10526-209E-41D7-BBEA-775787876895}.Release|ARM64.ActiveCfg = Release|ARM64 + {93F10526-209E-41D7-BBEA-775787876895}.Release|ARM64.Build.0 = Release|ARM64 + {93F10526-209E-41D7-BBEA-775787876895}.Release|Win32.ActiveCfg = Release|Win32 + {93F10526-209E-41D7-BBEA-775787876895}.Release|Win32.Build.0 = Release|Win32 + {93F10526-209E-41D7-BBEA-775787876895}.Release|x64.ActiveCfg = Release|x64 + {93F10526-209E-41D7-BBEA-775787876895}.Release|x64.Build.0 = Release|x64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|ARM64.Build.0 = Debug|ARM64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|Win32.ActiveCfg = Debug|Win32 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|Win32.Build.0 = Debug|Win32 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|x64.ActiveCfg = Debug|x64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|x64.Build.0 = Debug|x64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|ARM64.ActiveCfg = Release|ARM64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|ARM64.Build.0 = Release|ARM64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|Win32.ActiveCfg = Release|Win32 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|Win32.Build.0 = Release|Win32 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|x64.ActiveCfg = Release|x64 + {63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|x64.Build.0 = Release|x64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|ARM64.Build.0 = Debug|ARM64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|Win32.ActiveCfg = Debug|Win32 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|Win32.Build.0 = Debug|Win32 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|x64.ActiveCfg = Debug|x64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|x64.Build.0 = Debug|x64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|ARM64.ActiveCfg = Release|ARM64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|ARM64.Build.0 = Release|ARM64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|Win32.ActiveCfg = Release|Win32 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|Win32.Build.0 = Release|Win32 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|x64.ActiveCfg = Release|x64 + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|x64.Build.0 = Release|x64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|ARM64.Build.0 = Debug|ARM64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|Win32.ActiveCfg = Debug|Win32 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|Win32.Build.0 = Debug|Win32 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|x64.ActiveCfg = Debug|x64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|x64.Build.0 = Debug|x64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|ARM64.ActiveCfg = Release|ARM64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|ARM64.Build.0 = Release|ARM64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|Win32.ActiveCfg = Release|Win32 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|Win32.Build.0 = Release|Win32 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|x64.ActiveCfg = Release|x64 + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|x64.Build.0 = Release|x64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|ARM64.Build.0 = Debug|ARM64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|Win32.ActiveCfg = Debug|Win32 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|Win32.Build.0 = Debug|Win32 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|x64.ActiveCfg = Debug|x64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|x64.Build.0 = Debug|x64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Release|ARM64.ActiveCfg = Release|ARM64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Release|ARM64.Build.0 = Release|ARM64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Release|Win32.ActiveCfg = Release|Win32 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Release|Win32.Build.0 = Release|Win32 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Release|x64.ActiveCfg = Release|x64 + {1693F852-A207-4348-8223-222C2A7FEEEB}.Release|x64.Build.0 = Release|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.Build.0 = Debug|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|Win32.ActiveCfg = Debug|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|Win32.Build.0 = Debug|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.ActiveCfg = Debug|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.Build.0 = Debug|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.ActiveCfg = Release|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.Build.0 = Release|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|Win32.ActiveCfg = Release|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|Win32.Build.0 = Release|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.ActiveCfg = Release|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.Build.0 = Release|x64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Debug|ARM64.Build.0 = Debug|ARM64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Debug|Win32.ActiveCfg = Debug|Win32 + {503AE687-C33A-45ED-93AA-83967E176D67}.Debug|Win32.Build.0 = Debug|Win32 + {503AE687-C33A-45ED-93AA-83967E176D67}.Debug|x64.ActiveCfg = Debug|x64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Debug|x64.Build.0 = Debug|x64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Release|ARM64.ActiveCfg = Release|ARM64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Release|ARM64.Build.0 = Release|ARM64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Release|Win32.ActiveCfg = Release|Win32 + {503AE687-C33A-45ED-93AA-83967E176D67}.Release|Win32.Build.0 = Release|Win32 + {503AE687-C33A-45ED-93AA-83967E176D67}.Release|x64.ActiveCfg = Release|x64 + {503AE687-C33A-45ED-93AA-83967E176D67}.Release|x64.Build.0 = Release|x64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|ARM64.Build.0 = Debug|ARM64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|Win32.Build.0 = Debug|Win32 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|x64.ActiveCfg = Debug|x64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|x64.Build.0 = Debug|x64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|ARM64.ActiveCfg = Release|ARM64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|ARM64.Build.0 = Release|ARM64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|Win32.ActiveCfg = Release|Win32 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|Win32.Build.0 = Release|Win32 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|x64.ActiveCfg = Release|x64 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|x64.Build.0 = Release|x64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|ARM64.Build.0 = Debug|ARM64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|Win32.ActiveCfg = Debug|Win32 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|Win32.Build.0 = Debug|Win32 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|x64.ActiveCfg = Debug|x64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|x64.Build.0 = Debug|x64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|ARM64.ActiveCfg = Release|ARM64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|ARM64.Build.0 = Release|ARM64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|Win32.ActiveCfg = Release|Win32 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|Win32.Build.0 = Release|Win32 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|x64.ActiveCfg = Release|x64 + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|x64.Build.0 = Release|x64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|ARM64.Build.0 = Debug|ARM64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|Win32.ActiveCfg = Debug|Win32 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|Win32.Build.0 = Debug|Win32 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|x64.ActiveCfg = Debug|x64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|x64.Build.0 = Debug|x64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|ARM64.ActiveCfg = Release|ARM64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|ARM64.Build.0 = Release|ARM64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|Win32.ActiveCfg = Release|Win32 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|Win32.Build.0 = Release|Win32 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|x64.ActiveCfg = Release|x64 + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6DF8F690-552A-4329-8FAB-DD447071A473} + EndGlobalSection +EndGlobal diff --git a/sys/windows/vs/NetHack/NetHack.vcxproj b/sys/windows/vs/NetHack/NetHack.vcxproj new file mode 100644 index 000000000..1d29c4f80 --- /dev/null +++ b/sys/windows/vs/NetHack/NetHack.vcxproj @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {609BC774-C6F8-4B2B-AA7D-5B3D0EA95751} + Win32Proj + NetHack + 10.0 + + + $(BinDir) + + + + $(PDCURSES);%(AdditionalIncludeDirectories) + CURSES_GRAPHICS;PDC_NCMOUSE;%(PreprocessorDefinitions) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + PDCurses.lib;%(AdditionalDependencies) + + + + + $(FMODINCDIR);%(AdditionalIncludeDirectories) + SND_LIB_FMOD;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;RCWAV;%(PreprocessorDefinitions) + + + $(FMODLIBDIR);%(AdditionalLibraryDirectories) + $(FMODLIBLIB);%(AdditionalDependencies) + + + + + /Gs /Oi- /w44774 /w45262 %(AdditionalOptions) + 4100;4244;4245;4310;4706;4820;4324 + 4244;4245;4310;4706;4820;4324 + Disabled + Default + Speed + true + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories) + WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + stdclatest + + + hacklib.lib;lualib.lib;kernel32.lib;dbghelp.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;UserEnv.lib;Rpcrt4.lib;bcrypt.lib;%(AdditionalDependencies) + + + $(SndWavDir);$(SysWindDir);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/NetHack/afternethack.proj b/sys/windows/vs/NetHack/afternethack.proj new file mode 100644 index 000000000..7f8bd89ac --- /dev/null +++ b/sys/windows/vs/NetHack/afternethack.proj @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/sys/windows/vs/NetHackPackage.appxmanifest b/sys/windows/vs/NetHackPackage.appxmanifest new file mode 100644 index 000000000..51aed7360 --- /dev/null +++ b/sys/windows/vs/NetHackPackage.appxmanifest @@ -0,0 +1,29 @@ + + + + + NetHack 5.0 + NetHack DevTeam + Images\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/windows/vs/NetHackPackage.wapproj b/sys/windows/vs/NetHackPackage.wapproj new file mode 100644 index 000000000..35fcd2217 --- /dev/null +++ b/sys/windows/vs/NetHackPackage.wapproj @@ -0,0 +1,144 @@ + + + + 15.0 + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + $(MSBuildExtensionsPath)\Microsoft\DesktopBridge\ + + + + + $(BinDir) + + + 6838ec9d-f25d-4779-9cd7-2edb61e49429 + 10.0.20348.0 + 10.0.19041.0 + en-US + NetHackPackage_StoreKey.pfx + NetHackW\NetHackW.vcxproj + 19591BE8832D6EFED75019EACE7C4CA42ABC90D4 + False + True + x86 + 1 + OnApplicationRun + + + Always + + + Always + + + Always + + + Always + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NetHackW\nethackrc.template + + + NetHackW\Guidebook.txt + + + NetHackW\license + + + NetHackW\nhdat$(VERSION_MAJOR)$(VERSION_MINOR)$(PATCHLEVEL) + + + NetHackW\opthelp + + + NetHackW\symbols.template + + + NetHackW\sysconf.template + + + + + + + + + + diff --git a/sys/windows/vs/NetHackProperties.props b/sys/windows/vs/NetHackProperties.props new file mode 100644 index 000000000..80ac3b7ab --- /dev/null +++ b/sys/windows/vs/NetHackProperties.props @@ -0,0 +1,48 @@ + + + + + 5 + 0 + 0 + $(VERSION_MAJOR).$(VERSION_MINOR).$(PATCHLEVEL) + 5 + 4 + 8> + $(LUA_MAJOR_VERSION).$(LUA_MINOR_VERSION).$(LUA_PATCH_LEVEL) + $(ROOTDIR)lib\fmod\api\core\ + fmod_vc.lib + fmod.dll + $(FMODROOT)inc + $(FMODROOT)lib\$(PlatformShortName)\ + $(FMODLIBDIR)$(FMODLIBBASENAME) + $(FMODLIBDIR)$(FMODDLLBASENAME) + $(ROOTDIR)sound\fmod\ + $(FMODDIR)fmod.c + true + + + + + + $(VERSION_MAJOR) + true + + + $(VERSION_MINOR) + true + + + $(PATCHLEVEL) + true + + + $(LUA_VERSION) + true + + + $(ADD_PACKAGE) + true + + + diff --git a/sys/windows/vs/NetHackW/NetHackW.vcxproj b/sys/windows/vs/NetHackW/NetHackW.vcxproj new file mode 100644 index 000000000..df2507e81 --- /dev/null +++ b/sys/windows/vs/NetHackW/NetHackW.vcxproj @@ -0,0 +1,412 @@ + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {CEC5D360-8804-454F-8591-002184C23499} + NetHackW + 10.0 + + + + + + + + + + + + + $(BinDir) + + + + $(PDCURSES);%(AdditionalIncludeDirectories) + CURSES_GRAPHICS;PDC_NCMOUSE;%(PreprocessorDefinitions) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + PDCursesGui.lib;%(AdditionalDependencies) + + + + + $(FMODINCDIR);%(AdditionalIncludeDirectories) + SND_LIB_FMOD;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;RCWAV;%(PreprocessorDefinitions) + + + $(FMODLIBDIR);%(AdditionalLibraryDirectories) + $(FMODLIBLIB);%(AdditionalDependencies) + + + + false + + + false + + + false + + + false + false + + + false + false + + + + /Gs /Oi- /w44774 /w45262 %(AdditionalOptions) + 4100;4244;4245;4310;4706;4820;4324 + 4244;4245;4310;4706;4820;4324 + Disabled + true + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories) + TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;HAS_STDINT_H;HAS_INTTYPES_H;PDC_WIDE;%(PreprocessorDefinitions) + stdclatest + stdclatest + stdclatest + stdclatest + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + $(SndWavDir);$(SysWindDir);%(AdditionalIncludeDirectories) + + + Windows + hacklib.lib;lualib.lib;dbghelp.lib;comctl32.lib;winmm.lib;UserEnv.lib;Rpcrt4.lib;bcrypt.lib;%(AdditionalDependencies) + + + $(WinWin32Dir)NethackW.exe.manifest;%(AdditionalManifestFiles) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4100;4244;4245;4310;4706;4820;4324 + 4100;4244;4245;4310;4706;4820;4324 + 4100;4244;4245;4310;4706;4820;4324 + 4100;4244;4245;4310;4706;4820;4324 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4100;4201;4244;4245;4310;4706;4820;4324 + 4100;4201;4244;4245;4310;4706;4820;4324 + 4100;4201;4244;4245;4310;4706;4820;4324 + 4100;4201;4244;4245;4310;4706;4820;4324 + 4100;4201;4244;4245;4310;4706;4820;4324 + 4100;4201;4244;4245;4310;4706;4820 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/PDCurses/PDCurses.vcxproj b/sys/windows/vs/PDCurses/PDCurses.vcxproj new file mode 100644 index 000000000..e849ca497 --- /dev/null +++ b/sys/windows/vs/PDCurses/PDCurses.vcxproj @@ -0,0 +1,181 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {BAA70D0F-3EC7-4D10-91F0-974F1F49308B} + Win32Proj + PDCurses + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + + + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + + + + + + + + + true + $(PDCURSES);$(IncludePath) + + + + NotUsing + Level3 + true + true + 4996;4244;%(DisableSpecificWarnings) + MultiThreadedDebug + true + + + Windows + true + + + + + Disabled + WIN32;_DEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions) + MultiThreadedDebug + + + + + Disabled + _DEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions) + + + + + Disabled + _DEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions) + + + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions) + + + true + true + + + + + MaxSpeed + true + true + NDEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions) + + + true + true + + + + + MaxSpeed + true + true + NDEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions) + + + true + true + + + + \ No newline at end of file diff --git a/sys/windows/vs/PDCursesGui/pdcursesgui.vcxproj b/sys/windows/vs/PDCursesGui/pdcursesgui.vcxproj new file mode 100644 index 000000000..fef23ab69 --- /dev/null +++ b/sys/windows/vs/PDCursesGui/pdcursesgui.vcxproj @@ -0,0 +1,171 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {1693F852-A207-4348-8223-222C2A7FEEEB} + Win32Proj + PDCursesGui + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + 4996;4244;4267;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(PDCURSES);$(IncludePath) + + + + NotUsing + Level3 + true + true + 4996;4244;%(DisableSpecificWarnings) + MultiThreadedDebug + true + + + Windows + true + + + + + Disabled + WIN32;_DEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions) + MultiThreadedDebug + + + + + Disabled + _DEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions) + + + + + Disabled + _DEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions) + + + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions) + + + true + true + + + + + MaxSpeed + true + true + NDEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions) + + + true + true + + + + + MaxSpeed + true + true + NDEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions) + + + true + true + + + + \ No newline at end of file diff --git a/sys/windows/vs/Package.StoreAssociation.xml b/sys/windows/vs/Package.StoreAssociation.xml new file mode 100644 index 000000000..a33a607d2 --- /dev/null +++ b/sys/windows/vs/Package.StoreAssociation.xml @@ -0,0 +1,373 @@ + + + CN=8BDC628A-FAAA-4EBA-8B5B-EB61BA93BA1F + NetHack DevTeam + AAD + http://www.w3.org/2001/04/xmlenc#sha256 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30485NetHackDevTeam.NetHack3.6 + + NetHack 5.0 + + + + 30485NetHackDevTeam.NetHackBeta + + + diff --git a/sys/windows/vs/ScreenShot.PNG b/sys/windows/vs/ScreenShot.PNG new file mode 100644 index 000000000..36d9f9876 Binary files /dev/null and b/sys/windows/vs/ScreenShot.PNG differ diff --git a/sys/windows/vs/build.bat b/sys/windows/vs/build.bat new file mode 100644 index 000000000..2a10d6239 --- /dev/null +++ b/sys/windows/vs/build.bat @@ -0,0 +1,44 @@ +@echo off + +if "%VSCMD_VER%"=="" ( + echo MSBuild environment not set ... attempting to setup build environment. + call :setup_environment +) + +if "%VSCMD_VER%"=="" ( + echo Unable to setup build environment. Exiting. + goto :EOF +) + +msbuild NetHack.sln /t:Clean;Build /p:Configuration=Debug;Platform=Win32 +msbuild NetHack.sln /t:Clean;Build /p:Configuration=Debug;Platform=x64 +msbuild NetHack.sln /t:Clean;Build /p:Configuration=Release;Platform=Win32 +msbuild NetHack.sln /t:Clean;Build /p:Configuration=Release;Platform=x64 + +goto :EOF + +:setup_environment + + +if "%VS150COMNTOOLS%"=="" ( + call :set_vs15comntools +) + +if "%VS150COMNTOOLS%"=="" ( + echo Can not find Visual Studio 2017 Common Tools path. + echo Set VS150COMNTOOLS appropriately. + goto :EOF +) + +call "%VS150COMNTOOLS%VsMSBuildCmd.bat" +cd %~dp0 + +goto :EOF + +:set_vs15comntools + +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Professional\Common7\Tools" ( + set "VS150COMNTOOLS=%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Professional\Common7\Tools\" +) + +goto :EOF diff --git a/sys/windows/vs/common.props b/sys/windows/vs/common.props new file mode 100644 index 000000000..ea55f68ca --- /dev/null +++ b/sys/windows/vs/common.props @@ -0,0 +1,42 @@ + + + + true + + + false + + + + Level4 + 4820;4706;4244;4245;4100;4310 + WIN32;CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;WINVER=0x0601;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions) + + + Console + $(SymbolsDir)$(TargetName).pdb + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + true + + + + + MaxSpeed + OnlyExplicitInline + NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + + + UseLinkTimeCodeGeneration + + + diff --git a/sys/windows/vs/config.props b/sys/windows/vs/config.props new file mode 100644 index 000000000..3d435b54b --- /dev/null +++ b/sys/windows/vs/config.props @@ -0,0 +1,28 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + + + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) + $(LatestTargetPlatformVersion) + + diff --git a/sys/windows/vs/console.props b/sys/windows/vs/console.props new file mode 100644 index 000000000..f91d9dad4 --- /dev/null +++ b/sys/windows/vs/console.props @@ -0,0 +1,11 @@ + + + + + _CONSOLE;%(PreprocessorDefinitions) + + + Console + + + diff --git a/sys/windows/vs/cpp.hint b/sys/windows/vs/cpp.hint new file mode 100644 index 000000000..3be7cc99a --- /dev/null +++ b/sys/windows/vs/cpp.hint @@ -0,0 +1,31 @@ +// Hint files help the Visual Studio IDE interpret Visual C++ identifiers +// such as names of functions and macros. +// For more information see https://go.microsoft.com/fwlink/?linkid=865984 +#define E +#define NDECL(x) x +#define FDECL(x, y) x y +#define staticfn +#define NONNULL +#define NONNULLPTRS +#define NONNULLARG1 +#define NONNULLARG2 +#define NONNULLARG3 +#define NONNULLARG4 +#define NONNULLARG5 +#define NONNULLARG6 +#define NONNULLARG7 +#define NONNULLARG12 +#define NONNULLARG23 +#define NONNULLARG123 +#define NONNULLARG13 +#define NONNULLARG14 +#define NONNULLARG134 +#define NONNULLARG145 +#define NONNULLARG17 +#define NONNULLARG24 +#define NONNULLARG45 +#define NO_NNARGS +#define ATTRNORETURN +#define NORETURN +#define PRINTF_F + diff --git a/sys/windows/vs/default.props b/sys/windows/vs/default.props new file mode 100644 index 000000000..a8b166609 --- /dev/null +++ b/sys/windows/vs/default.props @@ -0,0 +1,17 @@ + + + + Application + false + MultiByte + $(DefaultPlatformToolset) + $(BinDir) + + + true + + + false + true + + diff --git a/sys/windows/vs/default_dll.props b/sys/windows/vs/default_dll.props new file mode 100644 index 000000000..cf1306958 --- /dev/null +++ b/sys/windows/vs/default_dll.props @@ -0,0 +1,17 @@ + + + + DynamicLibrary + false + MultiByte + $(DefaultPlatformToolset) + + + true + + + false + true + + + diff --git a/sys/windows/vs/default_lib.props b/sys/windows/vs/default_lib.props new file mode 100644 index 000000000..ce33f4abc --- /dev/null +++ b/sys/windows/vs/default_lib.props @@ -0,0 +1,17 @@ + + + + StaticLibrary + false + MultiByte + $(DefaultPlatformToolset) + + + true + + + false + true + + + diff --git a/sys/windows/vs/dirs.props b/sys/windows/vs/dirs.props new file mode 100644 index 000000000..82d8dc1b1 --- /dev/null +++ b/sys/windows/vs/dirs.props @@ -0,0 +1,72 @@ + + + + 5.4.8 + $(MSBuildProjectDirectory)\..\..\..\..\ + $(RootDir)binary\$(Configuration)\$(Platform)\ + $(ProjectDir)obj\$(Configuration)\$(Platform)\$(TargetName)\ + $(ProjectDir)symbols\$(Configuration)\$(Platform)\$(TargetName)\ + $(RootDir)tools\$(Configuration)\$(Platform)\ + $(vsDir)\Images\ + $(RootDir)util\ + $(RootDir)dat\ + $(RootDir)doc\ + $(RootDir)include\ + $(RootDir)lib\ + $(RootDir)sound\wav\ + $(RootDir)sound\windsound\ + $(RootDir)src\ + $(RootDir)sys\ + $(RootDir)util\ + $(RootDir)sys\share\ + $(RootDir)sys\windows\ + $(SysWindDir)vs\ + $(RootDir)win\share\ + $(RootDir)win\tty\ + $(RootDir)win\win32\ + $(ToolsDir) + $(ObjDir) + $(RootDir)win\curses\ + $(RootDir)submodules\ + $(LibDir)lua-$(LUA_VERSION)\src\ + $(RootDir)\sys\windows\vs\sftags\ + $(RootDir)\sys\windows\vs\sfctool\ + $(RootDir)binary\$(Configuration)\$(Platform) + + + $(LibDir)pdcursesmod\ + $(PDCURSESMOD) + + + $(SubmodulesDir)pdcursesmod\ + $(PDCURSESMOD) + + + + $(Platform) + + + ..\ARM64\ + arm64 + + + ..\ARM64\ + arm64 + + + ..\ARM64\ + arm64 + + + ..\x64\ + x64 + + + ..\x64\ + x64 + + + ..\x64\ + x64 + + diff --git a/sys/windows/vs/dlb/afterdlb.proj b/sys/windows/vs/dlb/afterdlb.proj new file mode 100644 index 000000000..44a663187 --- /dev/null +++ b/sys/windows/vs/dlb/afterdlb.proj @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/sys/windows/vs/dlb/dlb.vcxproj b/sys/windows/vs/dlb/dlb.vcxproj new file mode 100644 index 000000000..a0a29af68 --- /dev/null +++ b/sys/windows/vs/dlb/dlb.vcxproj @@ -0,0 +1,110 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IncDir);$(SysWindDir);$(SysShareDir);$(LuaDir);%(AdditionalIncludeDirectories) + WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + stdclatest + stdclatest + stdclatest + stdclatest + + + $(ToolsDir);%(AdditionalLibraryDirectories) + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + hacklib.lib;%(AdditionalDependencies) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + hacklib.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/dll.props b/sys/windows/vs/dll.props new file mode 100644 index 000000000..bd90844f1 --- /dev/null +++ b/sys/windows/vs/dll.props @@ -0,0 +1,11 @@ + + + + + WIN32CON;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + + + Windows + + + diff --git a/sys/windows/vs/fetchctags/fetchctags.nmake b/sys/windows/vs/fetchctags/fetchctags.nmake new file mode 100644 index 000000000..f11449433 --- /dev/null +++ b/sys/windows/vs/fetchctags/fetchctags.nmake @@ -0,0 +1,49 @@ +# NetHack 5.0 fetchctags.nmake +#============================================================================== +# +# The version of the game this Makefile was designed for +NETHACK_VERSION="5.0.0" + +# A brief version for use in macros +NHV=$(NETHACK_VERSION:.=) +NHV=$(NHV:"=) + +# The location of the ctags that we want +CTAGS_VERSION=6.1.0 +CURLCTAGSSRC=https://github.com/universal-ctags/ctags-win32/releases/download/v$(CTAGS_VERSION)/ctags-v$(CTAGS_VERSION)-x64.zip +CURLCTAGSDST=ctags-v$(CTAGS_VERSION)-x64.zip + +# +# relative directories from root of NetHack tree. +# + +ROOTDIR=..\..\..\.. # root of NetHack tree relative to project file +LIBDIR=$(ROOTDIR)\lib +CTAGSDIR=$(LIBDIR)\ctags + +default: fetchall + +fetchall: fetch-ctags + +fetch-ctags: $(CTAGSDIR) + cd $(LIBDIR) + curl --insecure -L -R -O $(CURLCTAGSSRC) +# cd ctags + tar zxf $(CURLCTAGSDST) -C ctags + cd ..\sys\windows\vs\fetchctags + @echo ctags.exe has been fetched into $(LIBDIR)\ctags + +$(CTAGSDIR): $(LIBDIR) + @if not exist $(CTAGSDIR)\*.* echo creating directory $(CTAGSDIR:\=/) + @if not exist $(CTAGSDIR)\*.* mkdir $(CTAGSDIR) + +$(LIBDIR): + @if not exist $(LIBDIR)\*.* echo creating directory $(LIBDIR:\=/) + @if not exist $(LIBDIR)\*.* mkdir $(LIBDIR) + +rebuild: + @if exist $(CTAGSDIR)\ctags.exe echo nothing to do for $(CTAGSDIR)\ctags.exe + +clean: + if exist $(CURLCTAGSDST) del $(CURLCTAGSDST) + diff --git a/sys/windows/vs/fetchctags/fetchctags.vcxproj b/sys/windows/vs/fetchctags/fetchctags.vcxproj new file mode 100644 index 000000000..8bc71cdb4 --- /dev/null +++ b/sys/windows/vs/fetchctags/fetchctags.vcxproj @@ -0,0 +1,86 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + 17.0 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD} + Win32Proj + 10.0 + + + + Makefile + true + + + Makefile + false + + + Makefile + true + + + Makefile + true + + + Makefile + false + + + Makefile + false + + + + + + + + + + + + echo ..\lib\ctags is already present + pushd $(vsDir)fetchctags %26%26 nmake -F fetchctags.nmake clean %26%26 popd + echo rebuilding $(vsDir)fetchctags + _DEBUG;$(NMakePreprocessorDefinitions) + + + pushd $(vsDir)fetchctags %26%26 nmake -F fetchctags.nmake %26%26 popd + pushd $(vsDir)fetchctags %26%26 nmake -F fetchctags.nmake clean %26%26 popd + pushd $(vsDir)fetchprereq %26%26 nmake -F fetchctags.nmake rebuild %26%26 popd + _DEBUG;$(NMakePreprocessorDefinitions) + + + + + \ No newline at end of file diff --git a/sys/windows/vs/files.props b/sys/windows/vs/files.props new file mode 100644 index 000000000..07f3c7421 --- /dev/null +++ b/sys/windows/vs/files.props @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/windows/vs/hacklib/hacklib.vcxproj b/sys/windows/vs/hacklib/hacklib.vcxproj new file mode 100644 index 000000000..c6921c542 --- /dev/null +++ b/sys/windows/vs/hacklib/hacklib.vcxproj @@ -0,0 +1,233 @@ + + + + + + + + + + Win32Proj + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3} + hacklib + 10.0 + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + StaticLibrary + true + $(DefaultPlatformToolset) + Unicode + + + StaticLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + StaticLibrary + true + Unicode + $(DefaultPlatformToolset) + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + $(DefaultPlatformToolset) + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + stdclatest + /w45262 %(AdditionalOptions) + + + + + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + stdclatest + /w45262 %(AdditionalOptions) + + + + + true + true + true + + + + + Level3 + true + _DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + stdclatest + /w45262 %(AdditionalOptions) + + + + + true + + + + + Level3 + true + _DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + stdclatest + /w45262 %(AdditionalOptions) + + + + + true + + + + + Level3 + true + true + true + NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + stdclatest + /w45262 %(AdditionalOptions) + + + + + true + true + true + + + + + Level3 + true + true + true + NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + stdclatest + /w45262 %(AdditionalOptions) + + + + + true + true + true + + + + + + diff --git a/sys/windows/vs/lualib/lualib.vcxproj b/sys/windows/vs/lualib/lualib.vcxproj new file mode 100644 index 000000000..9b8bb3667 --- /dev/null +++ b/sys/windows/vs/lualib/lualib.vcxproj @@ -0,0 +1,242 @@ + + + + + + + + + + Win32Proj + {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} + lualib + 10.0 + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + /Gs /w44774 /w45262 %(AdditionalOptions) + 4100;4244;4245;4310;4706;4820;4324 + Disabled + true + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories) + TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;SAFEPROCS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;HAS_STDINT_H;HAS_INTTYPES_H;PDC_WIDE;%(PreprocessorDefinitions) + stdclatest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + StaticLibrary + true + Unicode + + + $(DefaultPlatformToolset) + + + $(DefaultPlatformToolset) + + + $(DefaultPlatformToolset) + + + $(DefaultPlatformToolset) + + + $(DefaultPlatformToolset) + + + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + /Gs /Oi- /w44774 %(AdditionalOptions) + + + + + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + /Gs /Oi- /w44774 %(AdditionalOptions) + ProgramDatabase + + + + + true + true + true + + + + + Level3 + true + _DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + /Gs /Oi- /w44774 %(AdditionalOptions) + + + + + true + + + + + Level3 + true + _DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + /Gs /w44774 %(AdditionalOptions) + + + + + true + + + + + Level3 + true + true + true + NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + /Gs /Oi- /w44774 %(AdditionalOptions) + ProgramDatabase + + + + + true + true + true + + + + + Level3 + true + false + true + NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + true + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + /Gs /w44774 %(AdditionalOptions) + ProgramDatabase + + + + + true + true + true + + + + + + diff --git a/sys/windows/vs/makedefs/aftermakedefs.proj b/sys/windows/vs/makedefs/aftermakedefs.proj new file mode 100644 index 000000000..1a9e7d8bc --- /dev/null +++ b/sys/windows/vs/makedefs/aftermakedefs.proj @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/sys/windows/vs/makedefs/makedefs.vcxproj b/sys/windows/vs/makedefs/makedefs.vcxproj new file mode 100644 index 000000000..cced77ffd --- /dev/null +++ b/sys/windows/vs/makedefs/makedefs.vcxproj @@ -0,0 +1,106 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {BA3DD34C-04B7-40D0-B373-9329AA9E8945} + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + stdclatest + /w45262 %(AdditionalOptions) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/nhlua_h/nhlua_h.vcxproj b/sys/windows/vs/nhlua_h/nhlua_h.vcxproj new file mode 100644 index 000000000..2f8f14f28 --- /dev/null +++ b/sys/windows/vs/nhlua_h/nhlua_h.vcxproj @@ -0,0 +1,63 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {A3B1A65E-4B65-4B67-ADF1-0E38567013A5} + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/package/package.nmake b/sys/windows/vs/package/package.nmake new file mode 100644 index 000000000..9842b20c1 --- /dev/null +++ b/sys/windows/vs/package/package.nmake @@ -0,0 +1,137 @@ +# NetHack 5.0 package.nmake +#============================================================================== +# +# The version of the game this Makefile was designed for + +!IFNDEF NETHACK_VERSION +NETHACK_VERSION="5.0.0" +!MESSAGE NETHACK_VERSION set to $(NETHACK_VERSION). +!ELSE +!MESSAGE NETHACK_VERSION set to $(NETHACK_VERSION) by caller. +!ENDIF + +# A brief variation for use in macros +NHV=$(NETHACK_VERSION:.=) +NHV=$(NHV:"=) + +# +# relative directories from root of NetHack tree. +# + +#LIBSDIR=lib # libraries and external bits +#SUBMSDIR=submodules # NetHack git submodules +PACKAGESDIR=vspackage # put in vspackage to distinguish +ROOTDIR=..\..\..\.. # root of NetHack tree relative to project file +PlatformFileName=$(lowercase $(PlatformShortName)) + +# Directories we might have to collect things from +# +INCL = $(ROOTDIR)\include # NetHack include files +DAT = $(ROOTDIR)\dat # NetHack data files +DOC = $(ROOTDIR)\doc # NetHack documentation files +UTIL = $(ROOTDIR)\util # Utility source +SRC = $(ROOTDIR)\src # Main source +SSYS = $(ROOTDIR)\sys\share # Shared system files +MSWSYS = $(ROOTDIR)\sys\windows # MS windows specific files +TTY = $(ROOTDIR)\win\tty # window port files (tty) +MSWIN = $(ROOTDIR)\win\win32 # window port files (win32) +WCURSES = $(ROOTDIR)\win\curses # window port files (curses) +WSHR = $(ROOTDIR)\win\share # Tile support files +QT = $(ROOTDIR)\win\Qt # QT support files +X11 = $(ROOTDIR)\win\X11 # X11 support files +LIBDIR = $(ROOTDIR)\lib # libraries and external bits +SUBMDIR = $(ROOTDIR)\submodules # NetHack git submodules +SndWavDir = $(ROOTDIR)\sound\wav # sound files that get integrated +DocDir = $(ROOTDIR)\doc + +# Directories we might place collected things +# +VSBINDIR=$(ROOTDIR)\vsbinary +VSPACKAGEDIR = $(ROOTDIR)\vspackage + + + +default: packageall + +#=============================================================================== +# makefile rules +#=============================================================================== + +# Rules for files in dat +{$(DAT)}.dat{$(VSBINDIR)}.dat: + copy /Y $< $@ + +#=============================================================================== +# packaging +#=============================================================================== + +PKGFILES=Guidebook.txt license NetHack.exe NetHack.txt \ + NetHackW.exe opthelp nhdat370 record symbols.template sysconf.template \ + nethackrc.template +FILESTOZIP=$(VSBINDIR)\Guidebook.txt $(VSBINDIR)\license \ + $(VSBINDIR)\NetHack.exe $(VSBINDIR)\NetHack.txt $(VSBINDIR)\NetHackW.exe \ + $(VSBINDIR)\opthelp $(VSBINDIR)\nhdat370 $(VSBINDIR)\record \ + $(VSBINDIR)\symbols.template $(VSBINDIR)\sysconf.template $(VSBINDIR)\nethackrc.template +DBGSYMS = NetHack.PDB NetHackW.PDB +PDBTOZIP = ..\NetHack\symbols\$(Configuration)\$(Platform)\NetHack.PDB \ + ..\NetHackW\symbols\$(Configuration)\$(Platform)\NetHackW.PDB +MAINZIP = $(VSPACKAGEDIR)\nethack-$(NHV)-win-$(PlatformFileName).zip +DBGSYMZIP = $(VSPACKAGEDIR)\nethack-$(NHV)-win-$(PlatformFileName)-debugsymbols.zip + +packageall: packagezip + +packagezip: showvar vsbindir vspackagedir $(FILESTOZIP) $(MAINZIP) $(DBGSYMZIP) + @echo NetHack Windows package created: $(MAINZIP) + +$(MAINZIP): $(FILESTOZIP) +# if not exist $(VSPACKAGEDIR)\*.* mkdir $(VSPACKAGEDIR) + tar -a -cf $(MAINZIP) -C $(VSBINDIR) $(PKGFILES) + +$(DBGSYMZIP): $(PDBTOZIP) + tar -a -cf $(DBGSYMZIP) $(PDBTOZIP) + +$(VSBINDIR)\license: $(BinDir)\license + copy /Y $(BinDir)\license $@ +$(VSBINDIR)\Guidebook.txt: $(BinDir)\Guidebook.txt + copy /Y $(DocDir)\Guidebook.txt $@ +$(VSBINDIR)\NetHack.exe: $(BinDir)\NetHack.exe + copy /Y $(BinDir)\NetHack.exe $@ +$(VSBINDIR)\NetHack.txt: $(BinDir)\NetHack.txt + copy /Y $(DocDir)\NetHack.txt $@ +$(VSBINDIR)\NetHackW.exe: $(BinDir)\NetHackW.exe + copy /Y $(BinDir)\NetHackW.exe $@ +$(VSBINDIR)\opthelp: $(BinDir)\opthelp + copy /Y $(BinDir)\opthelp $@ +$(VSBINDIR)\nhdat$(NHV): $(BinDir)\nhdat$(NHV) + copy /Y $(BinDir)\nhdat$(NHV) $@ +$(VSBINDIR)\symbols.template: $(BinDir)\symbols.template + copy /Y $(BinDir)\symbols.template $@ +$(VSBINDIR)\nethackrc.template: $(BinDir)\nethackrc.template + copy /Y $(BinDir)\nethackrc.template $@ +$(VSBINDIR)\sysconf.template: $(BinDir)\sysconf.template + copy /Y $(BinDir)\sysconf.template $@ +$(VSBINDIR)\record: + -if not exist $(VSBINDIR)\record. goto>$(VSBINDIR)\record. + +showvar: + @echo BinDir=[$(BinDir)] + @echo Platform=[$(Platform)] + @echo PlatformShortName=[$(PlatformShortName)] + @echo Configuration=[$(Configuration)] + +vspackagedir: + @if not exist $(VSPACKAGEDIR)\*.* echo creating directory $(VSPACKAGEDIR:\=/) + @if not exist $(VSPACKAGEDIR)\*.* mkdir $(VSPACKAGEDIR) + +vsbindir: + @if not exist $(VSBINDIR)\*.* echo creating directory $(VSBINDIR:\=/) + @if not exist $(VSBINDIR)\*.* mkdir $(VSBINDIR) + +clean: +# @if exist $(LIBDIR)\$(PDCDIST) rmdir /Q $(LIBDIR)\$(PDCDIST) /s +# @if exist $(LIBDIR)\lua-$(LUA_VERSION) rmdir /Q $(LIBDIR)\lua-$(LUA_VERSION) /s +# @if exist ..\..\..\..\include\nhlua.h del /Q ..\..\..\..\include\nhlua.h + +rebuild: +# @if exist $(LIBDIR)\$(PDCDIST) echo nothing to do for lib\$(PDCDIST) +# @if exist $(LIBDIR)\lua-$(LUA_VERSION) echo nothing to do for lib\lua-$(LUA_VERSION) diff --git a/sys/windows/vs/package/package.vcxproj b/sys/windows/vs/package/package.vcxproj new file mode 100644 index 000000000..f0c0c660c --- /dev/null +++ b/sys/windows/vs/package/package.vcxproj @@ -0,0 +1,80 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + 17.0 + {0B53AF9B-E1A4-478B-9246-43A39E8B4027} + Win32Proj + 10.0 + + + + Makefile + true + + + Makefile + false + + + Makefile + true + + + Makefile + true + + + Makefile + false + + + Makefile + false + + + + + + + + + + + + pushd $(vsDir)package %26%26 nmake /NOLOGO -F package.nmake BinDir="$(BinDir)\" Platform="$(Platform)" PlatformShortName="$(PlatformShortName)" Configuration="$(Configuration)" NETHACK_VERSION="$(NETHACK_VERSION)" %26%26 popd + pushd $(vsDir)package %26%26 nmake /NOLOGO -F package.nmake clean %26%26 popd + pushd $(vsDir)package %26%26 nmake /NOLOGO -F package.nmake rebuild %26%26 popd + + + + + diff --git a/sys/windows/vs/recover/afterrecover.proj b/sys/windows/vs/recover/afterrecover.proj new file mode 100644 index 000000000..d9e52e3c4 --- /dev/null +++ b/sys/windows/vs/recover/afterrecover.proj @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/sys/windows/vs/recover/recover.vcxproj b/sys/windows/vs/recover/recover.vcxproj new file mode 100644 index 000000000..a15b4c17b --- /dev/null +++ b/sys/windows/vs/recover/recover.vcxproj @@ -0,0 +1,85 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {2F35F228-6733-4FE5-9B46-B3AA10D4BC2E} + 10.0 + + + + + + + + + + + + + $(BinDir) + + + + $(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories) + WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;MINIMAL_FOR_RECOVER;%(PreprocessorDefinitions) + stdclatest + /w45262 %(AdditionalOptions) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + + WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;MINIMAL_FOR_RECOVER;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/sfctool.sln b/sys/windows/vs/sfctool.sln new file mode 100644 index 000000000..3bf333c50 --- /dev/null +++ b/sys/windows/vs/sfctool.sln @@ -0,0 +1,86 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11205.157 d18.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sfctool", "sfctool\sfctool.vcxproj", "{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}" + ProjectSection(ProjectDependencies) = postProject + {628C594A-7565-4366-9FCA-41DB67C6B615} = {628C594A-7565-4366-9FCA-41DB67C6B615} + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD} = {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sftags", "sftags\sftags.vcxproj", "{628C594A-7565-4366-9FCA-41DB67C6B615}" + ProjectSection(ProjectDependencies) = postProject + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD} = {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fetchctags", "fetchctags\fetchctags.vcxproj", "{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hacklib", "hacklib\hacklib.vcxproj", "{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|ARM64.Build.0 = Debug|ARM64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x64.ActiveCfg = Debug|x64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x64.Build.0 = Debug|x64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x86.ActiveCfg = Debug|Win32 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x86.Build.0 = Debug|Win32 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|ARM64.ActiveCfg = Release|ARM64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|ARM64.Build.0 = Release|ARM64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x64.ActiveCfg = Release|x64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x64.Build.0 = Release|x64 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x86.ActiveCfg = Release|Win32 + {3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x86.Build.0 = Release|Win32 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|ARM64.Build.0 = Debug|ARM64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x64.ActiveCfg = Debug|x64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x64.Build.0 = Debug|x64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x86.ActiveCfg = Debug|Win32 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x86.Build.0 = Debug|Win32 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Release|ARM64.ActiveCfg = Release|ARM64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Release|ARM64.Build.0 = Release|ARM64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x64.ActiveCfg = Release|x64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x64.Build.0 = Release|x64 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x86.ActiveCfg = Release|Win32 + {628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x86.Build.0 = Release|Win32 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|ARM64.Build.0 = Debug|ARM64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x64.ActiveCfg = Debug|x64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x64.Build.0 = Debug|x64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x86.ActiveCfg = Debug|Win32 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x86.Build.0 = Debug|Win32 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|ARM64.ActiveCfg = Release|ARM64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|ARM64.Build.0 = Release|ARM64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x64.ActiveCfg = Release|x64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x64.Build.0 = Release|x64 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x86.ActiveCfg = Release|Win32 + {AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x86.Build.0 = Release|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.Build.0 = Debug|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.ActiveCfg = Debug|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.Build.0 = Debug|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x86.ActiveCfg = Debug|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x86.Build.0 = Debug|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.ActiveCfg = Release|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.Build.0 = Release|ARM64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.ActiveCfg = Release|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.Build.0 = Release|x64 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x86.ActiveCfg = Release|Win32 + {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1000CD98-D3C0-493F-9EA7-E2D81FA96432} + EndGlobalSection +EndGlobal diff --git a/sys/windows/vs/sfctool/sfctool.vcxproj b/sys/windows/vs/sfctool/sfctool.vcxproj new file mode 100644 index 000000000..c6485a0e6 --- /dev/null +++ b/sys/windows/vs/sfctool/sfctool.vcxproj @@ -0,0 +1,261 @@ + + + + + + + + + + + $(BinDir) + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17.0 + Win32Proj + {3bfa3c14-6da2-4750-b1c6-028b9bce825e} + sfctool + 10.0 + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + stdclatest + true + true + + + Console + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + stdclatest + true + true + true + true + + + Console + true + true + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + stdclatest + true + true + + + Console + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;userenv.lib;advapi32.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + stdclatest + true + true + + + Console + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;userenv.lib;advapi32.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + stdclatest + true + true + true + true + + + Console + true + true + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;userenv.lib;advapi32.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + stdclatest + true + true + true + true + + + Console + true + true + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;userenv.lib;advapi32.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) + + + + + + diff --git a/sys/windows/vs/sftags/aftersftags.proj b/sys/windows/vs/sftags/aftersftags.proj new file mode 100644 index 000000000..a79669104 --- /dev/null +++ b/sys/windows/vs/sftags/aftersftags.proj @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/windows/vs/sftags/sftags.vcxproj b/sys/windows/vs/sftags/sftags.vcxproj new file mode 100644 index 000000000..fb1aa0c66 --- /dev/null +++ b/sys/windows/vs/sftags/sftags.vcxproj @@ -0,0 +1,226 @@ + + + + + + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + 17.0 + Win32Proj + {628c594a-7565-4366-9fca-41db67c6b615} + sftags + 10.0 + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + true + true + + + Console + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + true + true + true + true + + + Console + true + true + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + true + true + + + Console + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + true + true + + + Console + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + $(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions) + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + diff --git a/sys/windows/vs/tile2bmp/aftertile2bmp.proj b/sys/windows/vs/tile2bmp/aftertile2bmp.proj new file mode 100644 index 000000000..e5576ee61 --- /dev/null +++ b/sys/windows/vs/tile2bmp/aftertile2bmp.proj @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/sys/windows/vs/tile2bmp/tile2bmp.vcxproj b/sys/windows/vs/tile2bmp/tile2bmp.vcxproj new file mode 100644 index 000000000..0c94bf9f7 --- /dev/null +++ b/sys/windows/vs/tile2bmp/tile2bmp.vcxproj @@ -0,0 +1,94 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {642BC75D-ABAF-403E-8224-7C725FD4CB42} + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IncDir);$(SysWindDir);$(SysShareDir);$(LuaDir);%(AdditionalIncludeDirectories) + WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + stdclatest + /w45262 %(AdditionalOptions) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + + + + + + TILETEXT;%(PreprocessorDefinitions) + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/tilemap/aftertilemap.proj b/sys/windows/vs/tilemap/aftertilemap.proj new file mode 100644 index 000000000..703f2c46a --- /dev/null +++ b/sys/windows/vs/tilemap/aftertilemap.proj @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/sys/windows/vs/tilemap/tilemap.vcxproj b/sys/windows/vs/tilemap/tilemap.vcxproj new file mode 100644 index 000000000..a21a17a72 --- /dev/null +++ b/sys/windows/vs/tilemap/tilemap.vcxproj @@ -0,0 +1,135 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {93F10526-209E-41D7-BBEA-775787876895} + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IncDir);$(SysWindDir);$(SysShareDir);$(LuaDir);%(AdditionalIncludeDirectories) + WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions) + stdclatest + /w45262 %(AdditionalOptions) + + + $(ToolsDir);%(AdditionalLibraryDirectories) + hacklib.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/windows/vs/tiles/tiles.vcxproj b/sys/windows/vs/tiles/tiles.vcxproj new file mode 100644 index 000000000..4481d9b81 --- /dev/null +++ b/sys/windows/vs/tiles/tiles.vcxproj @@ -0,0 +1,124 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {55946465-FC65-47B3-BB48-742C7694C0D6} + MakeFileProj + + + + Makefile + false + $(DefaultPlatformToolset) + + + Makefile + false + $(DefaultPlatformToolset) + + + Makefile + false + $(DefaultPlatformToolset) + + + Makefile + false + $(DefaultPlatformToolset) + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(RootDir)util\ + $(RootDir)util\ + .\Debug\ + .\Debug\ + nmake /f "tiles.mak" + nmake /f "tiles.mak" + nmake /f "tiles.mak" /a + nmake /f "tiles.mak" /a + + + $(RootDir)win\win32\tiles.bmp + $(RootDir)win\win32\tiles.bmp + $(NMakePreprocessorDefinitions) + $(NMakePreprocessorDefinitions) + $(NMakeIncludeSearchPath) + $(NMakeIncludeSearchPath) + $(NMakeForcedIncludes) + $(NMakeForcedIncludes) + $(NMakeAssemblySearchPath) + $(NMakeAssemblySearchPath) + $(NMakeForcedUsingAssemblies) + $(NMakeForcedUsingAssemblies) + $(RootDir)util\ + $(RootDir)util\ + .\Release\ + .\Release\ + nmake /f "tiles.mak" + nmake /f "tiles.mak" + nmake /f "tiles.mak" /a + nmake /f "tiles.mak" /a + + + $(RootDir)win\win32\tiles.bmp + $(RootDir)win\win32\tiles.bmp + $(NMakePreprocessorDefinitions) + $(NMakePreprocessorDefinitions) + $(NMakeIncludeSearchPath) + $(NMakeIncludeSearchPath) + $(NMakeForcedIncludes) + $(NMakeForcedIncludes) + $(NMakeAssemblySearchPath) + $(NMakeAssemblySearchPath) + $(NMakeForcedUsingAssemblies) + $(NMakeForcedUsingAssemblies) + + + + + + {642bc75d-abaf-403e-8224-7c725fd4cb42} + false + + + + + + diff --git a/sys/windows/vs/uudecode/afteruudecode.proj b/sys/windows/vs/uudecode/afteruudecode.proj new file mode 100644 index 000000000..32cb45898 --- /dev/null +++ b/sys/windows/vs/uudecode/afteruudecode.proj @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/windows/vs/uudecode/uudecode.vcxproj b/sys/windows/vs/uudecode/uudecode.vcxproj new file mode 100644 index 000000000..e1eba7dc8 --- /dev/null +++ b/sys/windows/vs/uudecode/uudecode.vcxproj @@ -0,0 +1,82 @@ + + + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {63F9B82B-F589-4082-ABE5-D4F0682050AB} + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(IncDir);$(SysShareDir);$(WinWin32Dir) + + + + + 4820;4702;4706;4244;4245;4100;4310 + + + + + + + + + + + + + \ No newline at end of file diff --git a/sys/winnt/win10.c b/sys/windows/win10.c similarity index 81% rename from sys/winnt/win10.c rename to sys/windows/win10.c index abf76d9eb..70b7859d8 100644 --- a/sys/winnt/win10.c +++ b/sys/windows/win10.c @@ -1,8 +1,7 @@ -/* NetHack 3.6 win10.c $NHDT-Date: 1432512810 2015/05/25 00:13:30 $ $NHDT-Branch: master $:$NHDT-Revision: 1.15 $ */ -/* Copyright (C) 2018 by Bart House */ +/* NetHack 5.0 win10.c $NHDT-Date: 1596498318 2020/08/03 23:45:18 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.10 $ */ +/* Copyright (C) 2018 by Bart House */ /* NetHack may be freely redistributed. See license for details. */ -#ifdef _MSC_VER #include "win10.h" #include #include @@ -10,6 +9,7 @@ #include "hack.h" typedef DPI_AWARENESS_CONTEXT(WINAPI *GetThreadDpiAwarenessContextProc)(VOID); +typedef DPI_AWARENESS_CONTEXT(WINAPI *SetThreadDpiAwarenessContextProc)(DPI_AWARENESS_CONTEXT); typedef BOOL(WINAPI *AreDpiAwarenessContextsEqualProc)( DPI_AWARENESS_CONTEXT dpiContextA, DPI_AWARENESS_CONTEXT dpiContextB); typedef UINT(WINAPI *GetDpiForWindowProc)(HWND hwnd); @@ -18,6 +18,7 @@ typedef LONG (WINAPI *GetCurrentPackageFullNameProc)(UINT32 *packageFullNameLeng typedef struct { BOOL Valid; + SetThreadDpiAwarenessContextProc SetThreadDpiAwarenessContext; GetThreadDpiAwarenessContextProc GetThreadDpiAwarenessContext; AreDpiAwarenessContextsEqualProc AreDpiAwarenessContextsEqual; GetDpiForWindowProc GetDpiForWindow; @@ -26,7 +27,7 @@ typedef struct { Win10 gWin10 = { 0 }; -void win10_init() +void win10_init(void) { if (IsWindows10OrGreater()) { @@ -35,6 +36,10 @@ void win10_init() if (hUser32 == NULL) panic("Unable to load user32.dll"); + gWin10.SetThreadDpiAwarenessContext = (SetThreadDpiAwarenessContextProc) GetProcAddress(hUser32, "SetThreadDpiAwarenessContext"); + if (gWin10.SetThreadDpiAwarenessContext == NULL) + panic("Unable to get address of SetThreadDpiAwarenessContext()"); + gWin10.GetThreadDpiAwarenessContext = (GetThreadDpiAwarenessContextProc) GetProcAddress(hUser32, "GetThreadDpiAwarenessContext"); if (gWin10.GetThreadDpiAwarenessContext == NULL) panic("Unable to get address of GetThreadDpiAwarenessContext()"); @@ -64,6 +69,10 @@ void win10_init() } if (gWin10.Valid) { + if (!gWin10.SetThreadDpiAwarenessContext( + DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) + panic("Unable to set DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2"); + if (!gWin10.AreDpiAwarenessContextsEqual( gWin10.GetThreadDpiAwarenessContext(), DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) @@ -108,7 +117,7 @@ void win10_monitor_info(HWND hWnd, MonitorInfo * monitorInfo) } BOOL -win10_is_desktop_bridge_application() +win10_is_desktop_bridge_application(void) { if (gWin10.Valid) { UINT32 length = 0; @@ -119,6 +128,3 @@ win10_is_desktop_bridge_application() return FALSE; } - - -#endif /* _MSC_VER */ diff --git a/sys/winnt/win10.h b/sys/windows/win10.h similarity index 75% rename from sys/winnt/win10.h rename to sys/windows/win10.h index bbb0ca9a3..64ba6b27b 100644 --- a/sys/winnt/win10.h +++ b/sys/windows/win10.h @@ -1,5 +1,5 @@ -/* NetHack 3.6 win10.h $NHDT-Date: 1432512810 2015/05/25 00:13:30 $ $NHDT-Branch: master $:$NHDT-Revision: 1.15 $ */ -/* Copyright (C) 2018 by Bart House */ +/* NetHack 5.0 win10.h $NHDT-Date: 1596498319 2020/08/03 23:45:19 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.8 $ */ +/* Copyright (C) 2018 by Bart House */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WIN10_H @@ -15,7 +15,7 @@ typedef struct { int left; // in desktop coordinate pixel space } MonitorInfo; -void win10_init(); +void win10_init(void); int win10_monitor_dpi(HWND hWnd); double win10_monitor_scale(HWND hWnd); void win10_monitor_info(HWND hWnd, MonitorInfo * monitorInfo); diff --git a/sys/winnt/win32api.h b/sys/windows/win32api.h similarity index 76% rename from sys/winnt/win32api.h rename to sys/windows/win32api.h index 28514b0ce..1aee5df18 100644 --- a/sys/winnt/win32api.h +++ b/sys/windows/win32api.h @@ -1,17 +1,15 @@ -/* NetHack 3.6 win32api.h $NHDT-Date: 1432516197 2015/05/25 01:09:57 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ +/* NetHack 5.0 win32api.h $NHDT-Date: 1596498320 2020/08/03 23:45:20 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.15 $ */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ /* - * This header file is used to clear up some discrepencies with Visual C + * This header file is used to clear up some discrepancies with Visual C * header files & NetHack before including windows.h, so all NetHack * files should include "win32api.h" rather than . */ #ifndef WIN32API #define WIN32API -#if defined(_MSC_VER) - #if defined(HACK_H) #error win32api.h must be included before hack.h #endif @@ -32,9 +30,17 @@ #error win32api.h should be included first #endif +#include "config.h" + +#if defined(_MSC_VER) #pragma warning(disable : 4142) /* Warning, Benign redefinition of type */ #pragma pack(8) -#endif // _MSC_VER +#endif + +#ifdef DEBUG +#define _CRTDBG_MAP_ALLOC +#include +#endif #define WIN32_LEAN_AND_MEAN diff --git a/sys/winnt/windmain.c b/sys/windows/windmain.c similarity index 55% rename from sys/winnt/windmain.c rename to sys/windows/windmain.c index 2a4b4f581..2ff0258f3 100644 --- a/sys/winnt/windmain.c +++ b/sys/windows/windmain.c @@ -1,64 +1,72 @@ -/* NetHack 3.6 windmain.c $NHDT-Date: 1543465755 2018/11/29 04:29:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.101 $ */ +/* NetHack 5.0 windmain.c $NHDT-Date: 1693359653 2023/08/30 01:40:53 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.189 $ */ /* Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ /* main.c - Windows */ #include "win32api.h" /* for GetModuleFileName */ + #include "hack.h" +#ifdef DLB #include "dlb.h" -#include -#include +#endif #include #include #include -#if !defined(VERSION_MAJOR) -#include "patchlevel.h" -#endif -#if !defined(SAFEPROCS) -#error You must #define SAFEPROCS to build windmain.c -#endif - -#define E extern -static void FDECL(process_options, (int argc, char **argv)); -static void NDECL(nhusage); -static char *NDECL(get_executable_path); -char *FDECL(translate_path_variables, (const char *, char *)); -char *NDECL(exename); -boolean NDECL(fakeconsole); -void NDECL(freefakeconsole); -E void FDECL(nethack_exit, (int)); -E char chosen_windowtype[WINTYPELEN]; /* flag.h */ +static void nhusage(void); +char *exename(void); +boolean fakeconsole(void); +void freefakeconsole(void); #if defined(MSWIN_GRAPHICS) -E void NDECL(mswin_destroy_reg); +extern void mswin_destroy_reg(void); #endif #ifdef TTY_GRAPHICS -extern void NDECL(backsp); +#ifdef WIN32CON +extern void backsp(void); +#endif #endif -extern void NDECL(clear_screen); -#undef E +extern void term_clear_screen(void); +#ifdef update_file +#undef update_file +#endif +#if defined(TERMLIB) || defined(CURSES_GRAPHICS) +extern void (*decgraphics_mode_callback)(void); +#endif +#ifdef CURSES_GRAPHICS +extern void (*cursesgraphics_mode_callback)(void); +#endif +#ifdef ENHANCED_SYMBOLS +extern void (*utf8graphics_mode_callback)(void); +#endif + +#ifdef WIN32CON #ifdef _MSC_VER #ifdef kbhit #undef kbhit #endif #include #endif +#endif #ifdef PC_LOCKING -static int NDECL(eraseoldlocks); -#endif -int NDECL(windows_nhgetch); -void NDECL(windows_nhbell); -int FDECL(windows_nh_poskey, (int *, int *, int *)); -void FDECL(windows_raw_print, (const char *)); -char FDECL(windows_yn_function, (const char *, const char *, CHAR_P)); -static void FDECL(windows_getlin, (const char *, char *)); -extern int NDECL(windows_console_custom_nhgetch); -void NDECL(safe_routines); -int NDECL(tty_self_recover_prompt); -int NDECL(other_self_recover_prompt); +static int eraseoldlocks(void); +#endif + +int windows_nhgetch(void); +void windows_nhbell(void); +int windows_nh_poskey(int *, int *, int *); +void windows_raw_print(const char *); +char windows_yn_function(const char *, const char *, char); +/* static void windows_getlin(const char *, char *); */ + +#ifdef WIN32CON +extern int windows_console_custom_nhgetch(void); +int tty_self_recover_prompt(void); +#endif + +int other_self_recover_prompt(void); char orgdir[PATHLEN]; boolean getreturn_enabled; @@ -68,8 +76,11 @@ int windows_startup_state = 0; /* we flag whether to continue with this */ extern int redirect_stdout; /* from sys/share/pcsys.c */ extern int GUILaunched; HANDLE hStdOut; +char default_window_sys[7] = #if defined(MSWIN_GRAPHICS) -char default_window_sys[] = "mswin"; + "mswin"; +#elif defined(TTY_GRAPHICS) + "tty"; #endif #ifdef WANT_GETHDATE static struct stat hbuf; @@ -79,358 +90,86 @@ static struct stat hbuf; extern char orgdir[]; -int -get_known_folder_path( - const KNOWNFOLDERID * folder_id, - char * path - , size_t path_size) -{ - PWSTR wide_path; - if (FAILED(SHGetKnownFolderPath(folder_id, 0, NULL, &wide_path))) { - error("Unable to get known folder path"); - return FALSE; - } - - size_t converted; - errno_t err; - - err = wcstombs_s(&converted, path, path_size, wide_path, _TRUNCATE); - - CoTaskMemFree(wide_path); - - if (err == STRUNCATE || err == EILSEQ) { - // silently handle this problem - return FALSE; - } else if (err != 0) { - error("Failed folder (%u) path string conversion, unexpected err = %d", folder_id->Data1, err); - return FALSE; - } - - return TRUE; -} - -void -create_directory(const char * path) -{ - HRESULT hr = CreateDirectoryA(path, NULL); - - if (FAILED(hr) && hr != ERROR_ALREADY_EXISTS) - error("Unable to create directory '%s'", path); -} - -int -build_known_folder_path( - const KNOWNFOLDERID * folder_id, - char * path, - size_t path_size, - boolean versioned) -{ - if(!get_known_folder_path(folder_id, path, path_size)) - return FALSE; - - strcat(path, "\\NetHack\\"); - create_directory(path); - if (versioned) { - Sprintf(eos(path), "%d.%d\\", - VERSION_MAJOR, VERSION_MINOR); - create_directory(path); - } - return TRUE; -} - -void -build_environment_path( - const char * env_str, - const char * folder, - char * path, - size_t path_size) -{ - path[0] = '\0'; - - const char * root_path = nh_getenv(env_str); - - if (root_path == NULL) return; - - strcpy_s(path, path_size, root_path); - - char * colon = index(path, ';'); - if (colon != NULL) path[0] = '\0'; - - if (strlen(path) == 0) return; - - append_slash(path); - - if (folder != NULL) { - strcat_s(path, path_size, folder); - strcat_s(path, path_size, "\\"); - } -} - -boolean -folder_file_exists(const char * folder, const char * file_name) -{ - char path[MAX_PATH]; - - if (folder[0] == '\0') return FALSE; - - strcpy(path, folder); - strcat(path, file_name); - return file_exists(path); -} - -boolean -test_portable_config( - const char *executable_path, - char *portable_device_path, - size_t portable_device_path_size) -{ - int lth = 0; - const char *sysconf = "sysconf"; - char tmppath[MAX_PATH]; - boolean retval = FALSE, - save_initoptions_noterminate = iflags.initoptions_noterminate; - - if (portable_device_path && folder_file_exists(executable_path, "sysconf")) { - /* - There is a sysconf file (not just sysconf.template) present in - the exe path, which is not the way NetHack is initially distributed, - so assume it means that the admin/installer wants to override - something, perhaps set up for a fully-portable configuration that - leaves no traces behind elsewhere on this computer's hard drive - - delve into that... - */ - - *portable_device_path = '\0'; - lth = sizeof tmppath - strlen(sysconf); - (void) strncpy(tmppath, executable_path, lth - 1); - tmppath[lth - 1] = '\0'; - (void) strcat(tmppath, sysconf); - - iflags.initoptions_noterminate = 1; - /* assure_syscf_file(); */ - config_error_init(TRUE, tmppath, FALSE); - /* ... and _must_ parse correctly. */ - if (read_config_file(tmppath, SET_IN_SYS) - && sysopt.portable_device_paths) - retval = TRUE; - (void) config_error_done(); - iflags.initoptions_noterminate = save_initoptions_noterminate; - sysopt_release(); /* the real sysconf processing comes later */ - } - if (retval) { - lth = strlen(executable_path); - if (lth <= (int) portable_device_path_size - 1) - Strcpy(portable_device_path, executable_path); - else - retval = FALSE; - } - return retval; -} - -static char portable_device_path[MAX_PATH]; - -const char *get_portable_device() -{ - return (const char *) portable_device_path; -} - -void -set_default_prefix_locations(const char *programPath) -{ - char *envp = NULL; - char *sptr = NULL; - - static char executable_path[MAX_PATH]; - static char profile_path[MAX_PATH]; - static char versioned_profile_path[MAX_PATH]; - static char versioned_user_data_path[MAX_PATH]; - static char versioned_global_data_path[MAX_PATH]; - static char versioninfo[20]; - - strcpy(executable_path, get_executable_path()); - append_slash(executable_path); - - if (test_portable_config(executable_path, - portable_device_path, sizeof portable_device_path)) { - fqn_prefix[SYSCONFPREFIX] = executable_path; - fqn_prefix[CONFIGPREFIX] = portable_device_path; - fqn_prefix[HACKPREFIX] = portable_device_path; - fqn_prefix[SAVEPREFIX] = portable_device_path; - fqn_prefix[LEVELPREFIX] = portable_device_path; - fqn_prefix[BONESPREFIX] = portable_device_path; - fqn_prefix[SCOREPREFIX] = portable_device_path; - fqn_prefix[LOCKPREFIX] = portable_device_path; - fqn_prefix[TROUBLEPREFIX] = portable_device_path; - fqn_prefix[DATAPREFIX] = executable_path; - } else { - if(!build_known_folder_path(&FOLDERID_Profile, profile_path, - sizeof(profile_path), FALSE)) - strcpy(profile_path, executable_path); - - if(!build_known_folder_path(&FOLDERID_Profile, versioned_profile_path, - sizeof(profile_path), TRUE)) - strcpy(versioned_profile_path, executable_path); - - if(!build_known_folder_path(&FOLDERID_LocalAppData, - versioned_user_data_path, sizeof(versioned_user_data_path), TRUE)) - strcpy(versioned_user_data_path, executable_path); - - if(!build_known_folder_path(&FOLDERID_ProgramData, - versioned_global_data_path, sizeof(versioned_global_data_path), TRUE)) - strcpy(versioned_global_data_path, executable_path); - - fqn_prefix[SYSCONFPREFIX] = versioned_global_data_path; - fqn_prefix[CONFIGPREFIX] = profile_path; - fqn_prefix[HACKPREFIX] = versioned_profile_path; - fqn_prefix[SAVEPREFIX] = versioned_user_data_path; - fqn_prefix[LEVELPREFIX] = versioned_user_data_path; - fqn_prefix[BONESPREFIX] = versioned_global_data_path; - fqn_prefix[SCOREPREFIX] = versioned_global_data_path; - fqn_prefix[LOCKPREFIX] = versioned_global_data_path; - fqn_prefix[TROUBLEPREFIX] = versioned_profile_path; - fqn_prefix[DATAPREFIX] = executable_path; - } -} - -/* copy file if destination does not exist */ -void -copy_file( - const char * dst_folder, - const char * dst_name, - const char * src_folder, - const char * src_name) -{ - char dst_path[MAX_PATH]; - strcpy(dst_path, dst_folder); - strcat(dst_path, dst_name); - - char src_path[MAX_PATH]; - strcpy(src_path, src_folder); - strcat(src_path, src_name); - - if(!file_exists(src_path)) - error("Unable to copy file '%s' as it does not exist", src_path); - - if(file_exists(dst_path)) - return; - - BOOL success = CopyFileA(src_path, dst_path, TRUE); - if(!success) error("Failed to copy '%s' to '%s'", src_path, dst_path); -} - -/* update file copying if it does not exist or src is newer then dst */ -void -update_file( - const char * dst_folder, - const char * dst_name, - const char * src_folder, - const char * src_name, - BOOL save_copy) -{ - char dst_path[MAX_PATH]; - strcpy(dst_path, dst_folder); - strcat(dst_path, dst_name); - - char src_path[MAX_PATH]; - strcpy(src_path, src_folder); - strcat(src_path, src_name); - - char save_path[MAX_PATH]; - strcpy(save_path, dst_folder); - strcat(save_path, dst_name); - strcat(save_path, ".save"); - - if(!file_exists(src_path)) - error("Unable to copy file '%s' as it does not exist", src_path); - - if (!file_newer(src_path, dst_path)) - return; - - if (file_exists(dst_path) && save_copy) - CopyFileA(dst_path, save_path, FALSE); - - BOOL success = CopyFileA(src_path, dst_path, FALSE); - if(!success) error("Failed to update '%s' to '%s'", src_path, dst_path); - -} - -void copy_sysconf_content() -{ - /* Using the SYSCONFPREFIX path, lock it so that it does not change */ - fqn_prefix_locked[SYSCONFPREFIX] = TRUE; - - update_file(fqn_prefix[SYSCONFPREFIX], SYSCF_TEMPLATE, - fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE, FALSE); - - update_file(fqn_prefix[SYSCONFPREFIX], SYMBOLS_TEMPLATE, - fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, FALSE); +extern void set_default_prefix_locations(const char *programPath); +void copy_sysconf_content(void); +void copy_config_content(void); +void copy_hack_content(void); +void copy_symbols_content(void); +void copy_file(const char *, const char *, + const char *, const char *, boolean); +void update_file(const char *, const char *, + const char *, const char *, BOOL); +void windows_raw_print_bold(const char *); + +void set_emergency_io(void); +staticfn void stdio_wait_synch(void); +staticfn void stdio_raw_print(const char *str); +staticfn void stdio_nonl_raw_print(const char *str); +staticfn void stdio_raw_print_bold(const char *str); +staticfn int stdio_nhgetch(void); - /* If the required early game file does not exist, copy it */ - copy_file(fqn_prefix[SYSCONFPREFIX], SYSCF_FILE, - fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE); - - update_file(fqn_prefix[SYSCONFPREFIX], SYMBOLS, - fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, TRUE); -} - -void copy_config_content() -{ - /* Using the CONFIGPREFIX path, lock it so that it does not change */ - fqn_prefix_locked[CONFIGPREFIX] = TRUE; - - /* Keep templates up to date */ - update_file(fqn_prefix[CONFIGPREFIX], CONFIG_TEMPLATE, - fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE, FALSE); +#ifdef PORT_HELP +void port_help(void); +#endif +void windows_raw_print(const char *str); - /* If the required early game file does not exist, copy it */ - /* NOTE: We never replace .nethackrc or sysconf */ - copy_file(fqn_prefix[CONFIGPREFIX], CONFIG_FILE, - fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE); -} +extern const char *known_handling[]; /* symbols.c */ +extern const char *known_restrictions[]; /* symbols.c */ -void -copy_hack_content() -{ - nhassert(fqn_prefix_locked[HACKPREFIX]); +/* --------------------------------------------------------------------------- */ - /* Keep Guidebook and opthelp up to date */ - update_file(fqn_prefix[HACKPREFIX], GUIDEBOOK_FILE, - fqn_prefix[DATAPREFIX], GUIDEBOOK_FILE, FALSE); - update_file(fqn_prefix[HACKPREFIX], OPTIONFILE, - fqn_prefix[DATAPREFIX], OPTIONFILE, FALSE); -} +DISABLE_WARNING_UNREACHABLE_CODE /* - * __MINGW32__ Note - * If the graphics version is built, we don't need a main; it is skipped - * to help MinGW decide which entry point to choose. If both main and - * WinMain exist, the resulting executable won't work correctly. + * NetHack main + * + * The following function is used in both the nongraphical nethack.exe, and + * in the graphical nethackw.exe. + * + * The function below is called main() in the non-graphical build of + * NetHack for Windows and is the primary entry point for the program. + * + * It is called nethackw_main() in the graphical build of NetHack for + * Windows, where WinMain() is the primary entry point for the program + * and this nethackw_main() is called as a sub function. + * + * The code in WinMain() (in win/win32/nethackw.c) is primarily focused + * on setting up the graphical windows environment, and leaves the + * NetHack-specific startup code to this function. + * */ -int -#ifndef __MINGW32__ -main(argc, argv) + +#if defined(MSWIN_GRAPHICS) +#define MAIN nethackw_main +int nethackw_main(int, char **); #else -mingw_main(argc, argv) +#define MAIN main #endif -int argc; -char *argv[]; + +int +MAIN(int argc, char *argv[]) { boolean resuming = FALSE; /* assume new game */ - int fd; + NHFILE *nhfp; char *windowtype = NULL; - char *envp = NULL; - char *sptr = NULL; char fnamebuf[BUFSZ], encodedfnamebuf[BUFSZ]; char failbuf[BUFSZ]; + int getlock_result = 0; + HWND hwnd; + HDC hdc; + int bpp; + char *dir = NULL; - /* - * Get a set of valid safe windowport function - * pointers during early startup initialization. - */ - safe_routines(); - sys_early_init(); #ifdef _MSC_VER -# ifdef DEBUG + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif + + /* setting iflags.colorcount has to be after early_init() + * because it zeros out all of iflags */ + hwnd = GetDesktopWindow(); + +#ifdef _MSC_VER +#ifdef DEBUG /* set these appropriately for VS debugging */ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); _CrtSetReportMode(_CRT_ERROR, @@ -449,10 +188,59 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ | _CRTDBG_LEAK_CHECK_DF); _CrtSetBreakAlloc(1423); */ -# endif +#endif +#endif + + set_emergency_io(); +#ifndef MSWIN_GRAPHICS + early_init(argc, argv); /* already in WinMain for MSWIN_GRAPHICS */ +#endif + + /* this must be done after early_init() because early_init() + sets iflags to zero */ + hdc = GetDC(hwnd); + if (hdc) { + bpp = GetDeviceCaps(hdc, BITSPIXEL); + iflags.colorcount = (bpp >= 16) ? 16777216 : (bpp >= 8) ? 256 : 16; + ReleaseDC(hwnd, hdc); + } + gh.hname = "NetHack"; /* used for syntax messages */ + set_default_prefix_locations( + argv[0]); /* must be re-done after initoptions_init() + * which clears out gp.fqn_prefix[] */ + copy_sysconf_content(); + copy_symbols_content(); + /* Now that sysconf has had a chance to set the TROUBLEPREFIX, don't + allow it to be changed from here on out. */ + fqn_prefix_locked[TROUBLEPREFIX] = TRUE; + copy_config_content(); + + // if (iflags.windowtype_deferred && gc.chosen_windowtype[0]) + // windowtype = gc.chosen_windowtype; + // windowtype = gc.chosen_windowtype; + + program_state.early_options = 1; + +#if !defined(MSWIN_GRAPHICS) + nethack_enter_consoletty(); + consoletty_open(1); #endif - hname = "NetHack"; /* used for syntax messages */ +#ifdef EARLY_CONFIGFILE_PASS + rcfile_interface_options(); + if (*gc.chosen_windowtype) + windowtype = gc.chosen_windowtype; +#endif + + if (!windowtype) { +#ifdef MSWIN_GRAPHICS + windowtype = "mswin"; +#else + windowtype = "tty"; +#endif + } + choose_windows( + windowtype); /* sets all the window port function pointers */ #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) /* Save current directory and make sure it gets restored when @@ -461,28 +249,23 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ if (getcwd(orgdir, sizeof orgdir) == (char *) 0) error("NetHack: current directory path too long"); #endif + getreturn_enabled = TRUE; + initoptions_init(); // This allows OPTIONS in syscf on Windows. + set_default_prefix_locations( + argv[0]); /* must be re-done after initoptions_init() + * which clears out gp.fqn_prefix[] */ + // iflags.windowtype_deferred = TRUE; - set_default_prefix_locations(argv[0]); + /* if (GUILaunched || IsDebuggerPresent()) */ + early_options(&argc, &argv, &dir); + program_state.early_options = 0; + initoptions(); #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) - chdir(fqn_prefix[HACKPREFIX]); + chdir(gf.fqn_prefix[HACKPREFIX]); #endif - if (GUILaunched || IsDebuggerPresent()) - getreturn_enabled = TRUE; - check_recordfile((char *) 0); - iflags.windowtype_deferred = TRUE; - copy_sysconf_content(); - initoptions(); - - /* Now that sysconf has had a chance to set the TROUBLEPREFIX, don't - allow it to be changed from here on out. */ - fqn_prefix_locked[TROUBLEPREFIX] = TRUE; - - copy_config_content(); - process_options(argc, argv); - /* did something earlier flag a need to exit without starting a game? */ if (windows_startup_state > 0) { raw_printf("Exiting."); @@ -490,7 +273,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ } /* Finished processing options, lock all directory paths */ - for(int i = 0; i < PREFIX_COUNT; i++) + for (int i = 0; i < PREFIX_COUNT; i++) fqn_prefix_locked[i] = TRUE; if (!validate_prefix_locations(failbuf)) { @@ -501,114 +284,163 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ copy_hack_content(); -/* - * It seems you really want to play. - */ - if (argc >= 1 - && !strcmpi(default_window_sys, "mswin") + /* + * It seems you really want to play. + */ +#ifndef CURSES_GRAPHICS + if (argc >= 1 && !strcmpi(default_window_sys, "mswin") && (strstri(argv[0], "nethackw.exe") || GUILaunched)) iflags.windowtype_locked = TRUE; - windowtype = default_window_sys; +#endif +#ifdef WINCHAIN + commit_windowchain(); +#endif + init_nhwindows(&argc, argv); +#ifdef TTY_GRAPHICS + if WINDOWPORT(tty) { + int i; + for (i = 0; i < 5; ++i) { + nh_delay_output(); + } + + /* wait_synch(); */ + } +#endif +#ifdef DLB if (!dlb_init()) { - pline("%s\n%s\n%s\n%s\n\n", - copyright_banner_line(1), copyright_banner_line(2), - copyright_banner_line(3), copyright_banner_line(4)); - pline("NetHack was unable to open the required file \"%s\"",DLBFILE); + pline("%s\n%s\n%s\n%s\n\n", copyright_banner_line(1), + copyright_banner_line(2), copyright_banner_line(3), + copyright_banner_line(4)); + pline("NetHack was unable to open the required file \"%s\"", DLBFILE); if (file_exists(DLBFILE)) - pline("\nAre you perhaps trying to run NetHack within a zip utility?"); + pline("\nAre you perhaps trying to run NetHack within a zip " + "utility?"); error("dlb_init failure."); } +#endif - if (!iflags.windowtype_locked) { -#if defined(TTY_GRAPHICS) - Strcpy(default_window_sys, "tty"); -#else -#if defined(CURSES_GRAPHICS) - Strcpy(default_window_sys, "curses"); -#endif /* CURSES */ -#endif /* TTY */ - if (iflags.windowtype_deferred && chosen_windowtype[0]) - windowtype = chosen_windowtype; - } - choose_windows(windowtype); +#if defined(SND_LIB_FMOD) + assign_soundlib(soundlib_fmod); +#elif defined(SND_LIB_WINDSOUND) + assign_soundlib(soundlib_windsound); +#endif u.uhp = 1; /* prevent RIP on early quits */ u.ux = 0; /* prevent flush_screen() */ - nethack_enter(argc, argv); iflags.use_background_glyph = FALSE; - if (WINDOWPORT("mswin")) + if (WINDOWPORT(mswin)) iflags.use_background_glyph = TRUE; - if (WINDOWPORT("tty")) - nttty_open(1); - init_nhwindows(&argc, argv); +// init_nhwindows(&argc, argv); - if (WINDOWPORT("tty")) +#ifdef WIN32CON + if (WINDOWPORT(tty)) toggle_mouse_support(); +#endif + + if (gs.symset[PRIMARYSET].handling + && !symset_is_compatible(gs.symset[PRIMARYSET].handling, + windowprocs.wincap2)) { + /* current symset handling and windowtype are + not compatible, feature-wise. Use IBM defaults */ + load_symset("IBMGraphics_2", PRIMARYSET); + load_symset("RogueEpyx", ROGUESET); + } + /* Has the callback for the symset been invoked? Config file processing to + load a symset runs too early to accomplish that because + the various *graphics_mode_callback pointers don't get set until + term_start_screen, unfortunately */ +#if defined(TERMLIB) || defined(CURSES_GRAPHICS) + if (SYMHANDLING(H_DEC) && decgraphics_mode_callback) + (*decgraphics_mode_callback)(); +#endif /* TERMLIB || CURSES */ +#if 0 +#ifdef CURSES_GRAPHICS + if (WINDOWPORT(curses)) + (*cursesgraphics_mode_callback)(); +#endif +#endif +#ifdef ENHANCED_SYMBOLS + if (SYMHANDLING(H_UTF8) && utf8graphics_mode_callback) + (*utf8graphics_mode_callback)(); +#endif - /* strip role,race,&c suffix; calls askname() if plname[] is empty + /* strip role,race,&c suffix; calls askname() if svp.plname[] is empty or holds a generic user name like "player" or "games" */ plnamesuffix(); - set_playmode(); /* sets plname to "wizard" for wizard mode */ + set_playmode(); /* sets svp.plname to "wizard" for wizard mode */ /* until the getlock code is resolved, override askname()'s setting of renameallowed; when False, player_selection() won't resent renaming as an option */ iflags.renameallowed = FALSE; /* Obtain the name of the logged on user and incorporate * it into the name. */ - Sprintf(fnamebuf, "%s", plname); + Sprintf(fnamebuf, "%s", svp.plname); (void) fname_encode( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-.", '%', fnamebuf, encodedfnamebuf, BUFSZ); - Sprintf(lock, "%s", encodedfnamebuf); + Snprintf(gl.lock, sizeof gl.lock, "%s", encodedfnamebuf); /* regularize(lock); */ /* we encode now, rather than substitute */ - if (getlock() == 0) + if ((getlock_result = getlock()) == 0) nethack_exit(EXIT_SUCCESS); + if (getlock_result < 0) { + if (program_state.in_self_recover) { + program_state.in_self_recover = FALSE; + } + set_savefile_name(TRUE); + } /* Set up level 0 file to keep the game state. */ - fd = create_levelfile(0, (char *) 0); - if (fd < 0) { + nhfp = create_levelfile(0, (char *) 0); + if (!nhfp) { raw_print("Cannot create lock file"); } else { - hackpid = GetCurrentProcessId(); - write(fd, (genericptr_t) &hackpid, sizeof(hackpid)); - nhclose(fd); + svh.hackpid = GetCurrentProcessId(); + (void) write(nhfp->fd, (genericptr_t) &svh.hackpid, sizeof(svh.hackpid)); + close_nhfile(nhfp); } /* * Initialize the vision system. This must be before mklev() on a * new game or before a level restore on a saved game. */ vision_init(); - display_gamewindows(); + init_sound_disp_gamewindows(); /* * First, try to find and restore a save file for specified character. * We'll return here if new game player_selection() renames the hero. */ attempt_restore: - if ((fd = restore_saved_game()) >= 0) { + if ((getlock_result != -1) && (nhfp = restore_saved_game()) != 0) { #ifdef NEWS if (iflags.news) { display_file(NEWS, FALSE); iflags.news = FALSE; } #endif - pline("Restoring save file..."); + if (ge.early_raw_messages) + raw_print("Restoring save file..."); + else + pline("Restoring save file..."); mark_synch(); /* flush output */ - if (dorecover(fd)) { + if (dorecover(nhfp)) { resuming = TRUE; /* not starting new game */ if (discover) You("are in non-scoring discovery mode."); if (discover || wizard) { - if (yn("Do you want to keep the save file?") == 'n') + if (y_n("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else { - nh_compress(fqname(SAVEF, SAVEPREFIX, 0)); + nh_compress(fqname(gs.SAVEF, SAVEPREFIX, 0)); } } } + if (program_state.in_self_recover) { + program_state.in_self_recover = FALSE; + set_savefile_name(TRUE); + } } if (!resuming) { @@ -630,7 +462,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ You("are in non-scoring discovery mode."); } - // iflags.debug_fuzzer = TRUE; + // iflags.debug_fuzzer = TRUE; moveloop(resuming); nethack_exit(EXIT_SUCCESS); @@ -638,25 +470,37 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ return 0; } -STATIC_OVL void -process_options(argc, argv) -int argc; -char *argv[]; +RESTORE_WARNING_UNREACHABLE_CODE + +#if 0 +static void +early_options(int argc, char *argv[]) { int i; - /* - * Process options. - */ if (argc > 1) { if (argcheck(argc, argv, ARG_VERSION) == 2) nethack_exit(EXIT_SUCCESS); if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { - iflags.initoptions_noterminate = TRUE; - initoptions(); - iflags.initoptions_noterminate = FALSE; - reveal_paths(); + gd.deferred_showpaths = TRUE; + /* gd.deferred_showpaths is not used by windows */ + return; + } +#ifndef NODUMPENUMS + if (argcheck(argc, argv, ARG_DUMPENUMS) == 2) { + nethack_exit(EXIT_SUCCESS); + } +#ifdef ENHANCED_SYMBOLS + if (argcheck(argc, argv, ARG_DUMPGLYPHIDS) == 2) { + nethack_exit(EXIT_SUCCESS); + } +#endif +#endif + if (argcheck(argc, argv, ARG_DUMPMONGEN) == 2) { + nethack_exit(EXIT_SUCCESS); + } + if (argcheck(argc, argv, ARG_DUMPWEIGHTS) == 2) { nethack_exit(EXIT_SUCCESS); } if (argcheck(argc, argv, ARG_DEBUG) == 1) { @@ -667,13 +511,18 @@ char *argv[]; argc--; argv++; } +#if defined(CRASHREPORT) + if (argcheck(argc, argv, ARG_BIDSHOW) == 2) { + nethack_exit(EXIT_SUCCESS); + } +#endif if (argc > 1 && !strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page * says -d directory, hope nobody's using -desomething_else */ argc--; argv++; - const char * dir = argv[0] + 2; + const char *dir = argv[0] + 2; if (*dir == '=' || *dir == ':') dir++; if (!*dir && argc > 1) { @@ -683,7 +532,7 @@ char *argv[]; } if (!*dir) error("Flag -d must be followed by a directory name."); - Strcpy(hackdir, dir); + Strcpy(gh.hackdir, dir); } if (argc > 1) { @@ -699,12 +548,14 @@ char *argv[]; nethack_exit(EXIT_SUCCESS); } +#ifdef MSWIN_GRAPHICS if (GUILaunched) { if (!strncmpi(argv[1], "-clearreg", 6)) { /* clear registry */ mswin_destroy_reg(); nethack_exit(EXIT_SUCCESS); } } +#endif /* Don't initialize the full window system just to print usage */ if (!strncmp(argv[1], "-?", 2) || !strncmp(argv[1], "/?", 2)) { nhusage(); @@ -740,11 +591,12 @@ char *argv[]; #endif case 'u': if (argv[0][2]) - (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); + (void) strncpy(svp.plname, argv[0] + 2, + sizeof(svp.plname) - 1); else if (argc > 1) { argc--; argv++; - (void) strncpy(plname, argv[0], sizeof(plname) - 1); + (void) strncpy(svp.plname, argv[0], sizeof(svp.plname) - 1); } else raw_print("Player name expected after -u"); break; @@ -784,7 +636,7 @@ char *argv[]; case 'w': /* windowtype */ config_error_init(FALSE, "command line", FALSE); if (strlen(&argv[0][2]) < (WINTYPELEN - 1)) - Strcpy(chosen_windowtype, &argv[0][2]); + Strcpy(gc.chosen_windowtype, &argv[0][2]); config_error_done(); break; case '@': @@ -796,7 +648,8 @@ char *argv[]; break; } else raw_printf("\nUnknown switch: %s", argv[0]); - /* FALL THROUGH */ + FALLTHROUGH; + /* FALLTHRU */ case '?': nhusage(); nethack_exit(EXIT_SUCCESS); @@ -804,8 +657,8 @@ char *argv[]; } } -STATIC_OVL void -nhusage() +static void +nhusage(void) { char buf1[BUFSZ], buf2[BUFSZ], *bufptr; @@ -821,18 +674,18 @@ nhusage() */ (void) Sprintf(buf2, "\nUsage:\n%s [-d dir] -s [-r race] [-p profession] " "[maxrank] [name]...\n or", - hname); + gh.hname); ADD_USAGE(buf2); (void) Sprintf( buf2, "\n%s [-d dir] [-u name] [-r race] [-p profession] [-[DX]]", - hname); + gh.hname); ADD_USAGE(buf2); #ifdef NEWS ADD_USAGE(" [-n]"); #endif (void) Sprintf(buf2, "\n or\n%s [--showpaths]", - hname); + gh.hname); ADD_USAGE(buf2); if (!iflags.window_inited) raw_printf("%s\n", buf1); @@ -840,23 +693,153 @@ nhusage() (void) printf("%s\n", buf1); #undef ADD_USAGE } +#endif /* 0 */ +/* copy file if destination does not exist */ void -safe_routines(VOID_ARGS) +copy_file(const char *dst_folder, const char *dst_name, + const char *src_folder, const char *src_name, + boolean copy_even_if_it_exists) { - /* - * Get a set of valid safe windowport function - * pointers during early startup initialization. - */ - if (!WINDOWPORT("safe-startup")) - windowprocs = *get_safe_procs(1); - if (!GUILaunched) - windowprocs.win_nhgetch = windows_console_custom_nhgetch; + char dst_path[MAX_PATH]; + strcpy(dst_path, dst_folder); + strcat(dst_path, dst_name); + + char src_path[MAX_PATH]; + strcpy(src_path, src_folder); + strcat(src_path, src_name); + + if (!file_exists(src_path)) + error("Unable to copy file '%s' as it does not exist", src_path); + + if (file_exists(dst_path) && !copy_even_if_it_exists) + return; + + BOOL success = CopyFileA(src_path, dst_path, !copy_even_if_it_exists); + if (!success) + error("Failed to copy '%s' to '%s' (%d)", src_path, dst_path, errno); } +/* update file copying if it does not exist or src is newer then dst */ +void +update_file(const char *dst_folder, const char *dst_name, + const char *src_folder, const char *src_name, BOOL save_copy) +{ + char dst_path[MAX_PATH]; + strcpy(dst_path, dst_folder); + strcat(dst_path, dst_name); + + char src_path[MAX_PATH]; + strcpy(src_path, src_folder); + strcat(src_path, src_name); + + char save_path[MAX_PATH]; + strcpy(save_path, dst_folder); + strcat(save_path, dst_name); + strcat(save_path, ".save"); + + if (!file_exists(src_path)) + error("Unable to copy file '%s' as it does not exist", src_path); + + if (!file_newer(src_path, dst_path)) + return; + + if (file_exists(dst_path) && save_copy) + CopyFileA(dst_path, save_path, FALSE); + + BOOL success = CopyFileA(src_path, dst_path, FALSE); + if (!success) + error("Failed to update '%s' to '%s'", src_path, dst_path); +} + +void +copy_symbols_content(void) +{ + char dst_path[MAX_PATH], interim_path[MAX_PATH], orig_path[MAX_PATH]; + + boolean no_template = FALSE; + + /* Using the SYSCONFPREFIX path, lock it so that it does not change */ + fqn_prefix_locked[SYSCONFPREFIX] = TRUE; + + strcpy(orig_path, gf.fqn_prefix[DATAPREFIX]); + strcat(orig_path, SYMBOLS_TEMPLATE); + strcpy(interim_path, gf.fqn_prefix[SYSCONFPREFIX]); + strcat(interim_path, SYMBOLS_TEMPLATE); + strcpy(dst_path, gf.fqn_prefix[SYSCONFPREFIX]); + strcat(dst_path, SYMBOLS); + + if (!file_exists(orig_path)) { + char alt_orig_path[MAX_PATH]; + + strcpy(alt_orig_path, gf.fqn_prefix[DATAPREFIX]); + strcat(alt_orig_path, SYMBOLS); + if (file_exists(alt_orig_path)) { + no_template = TRUE; + /* symbols -> symbols.template */ + copy_file(gf.fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, + gf.fqn_prefix[DATAPREFIX], SYMBOLS, TRUE); + } + } + if (!file_exists(interim_path) || file_newer(orig_path, interim_path)) { + /* symbols.template -> symbols.template */ + copy_file(gf.fqn_prefix[SYSCONFPREFIX], SYMBOLS_TEMPLATE, + gf.fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, TRUE); + } + if (!file_exists(dst_path) || file_newer(interim_path, dst_path)) { + /* symbols.template -> symbols */ + copy_file(gf.fqn_prefix[SYSCONFPREFIX], SYMBOLS, + gf.fqn_prefix[SYSCONFPREFIX], SYMBOLS_TEMPLATE, TRUE); + } + nhUse(no_template); +} + +void +copy_sysconf_content(void) +{ + /* Using the SYSCONFPREFIX path, lock it so that it does not change */ + fqn_prefix_locked[SYSCONFPREFIX] = TRUE; + + update_file(gf.fqn_prefix[SYSCONFPREFIX], SYSCF_TEMPLATE, + gf.fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE, FALSE); + + /* If the required early game file does not exist, copy it */ + copy_file(gf.fqn_prefix[SYSCONFPREFIX], SYSCF_FILE, + gf.fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE, FALSE); +} + +void +copy_config_content(void) +{ + /* Using the CONFIGPREFIX path, lock it so that it does not change */ + fqn_prefix_locked[CONFIGPREFIX] = TRUE; + + /* Keep templates up to date */ + update_file(gf.fqn_prefix[CONFIGPREFIX], CONFIG_TEMPLATE, + gf.fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE, FALSE); + + /* If the required early game file does not exist, copy it */ + /* NOTE: We never replace .nethackrc or sysconf */ + copy_file(gf.fqn_prefix[CONFIGPREFIX], CONFIG_FILE, + gf.fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE, FALSE); +} + +void +copy_hack_content(void) +{ + nhassert(fqn_prefix_locked[HACKPREFIX]); + + /* Keep Guidebook and opthelp up to date */ + update_file(gf.fqn_prefix[HACKPREFIX], GUIDEBOOK_FILE, + gf.fqn_prefix[DATAPREFIX], GUIDEBOOK_FILE, FALSE); + update_file(gf.fqn_prefix[HACKPREFIX], OPTIONFILE, + gf.fqn_prefix[DATAPREFIX], OPTIONFILE, FALSE); +} + + #ifdef PORT_HELP void -port_help() +port_help(void) { /* display port specific help file */ display_file(PORT_HELP, 1); @@ -865,23 +848,32 @@ port_help() /* validate wizard mode if player has requested access to it */ boolean -authorize_wizard_mode() +authorize_wizard_mode(void) { - if (!strcmp(plname, WIZARD_NAME)) + if (!strcmp(svp.plname, WIZARD_NAME)) return TRUE; return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + +#ifndef PATH_SEPARATOR #define PATH_SEPARATOR '\\' +#endif #if defined(WIN32) && !defined(WIN32CON) static char exenamebuf[PATHLEN]; -extern HANDLE hConIn; -extern HANDLE hConOut; +HANDLE hConIn; +HANDLE hConOut; boolean has_fakeconsole; char * -exename() +exename(void) { int bsize = PATHLEN; char *tmp = exenamebuf, *tmp2; @@ -906,20 +898,20 @@ boolean fakeconsole(void) { if (!hStdOut) { - HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); - HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); + HANDLE fkhStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + HANDLE fkhStdIn = GetStdHandle(STD_INPUT_HANDLE); - if (!hStdOut && !hStdIn) { + if (!fkhStdOut && !fkhStdIn) { /* Bool rval; */ AllocConsole(); AttachConsole(GetCurrentProcessId()); - /* rval = SetStdHandle(STD_OUTPUT_HANDLE, hWrite); */ - freopen("CON", "w", stdout); - freopen("CON", "r", stdin); + /* rval = SetStdHandle(STD_OUTPUT_HANDLE, hWrite); */ + (void) freopen("CON", "w", stdout); + (void) freopen("CON", "r", stdin); } has_fakeconsole = TRUE; } - + /* Obtain handles for the standard Console I/O devices */ hConIn = GetStdHandle(STD_INPUT_HANDLE); hConOut = GetStdHandle(STD_OUTPUT_HANDLE); @@ -931,7 +923,7 @@ fakeconsole(void) #endif return has_fakeconsole; } -void freefakeconsole() +void freefakeconsole(void) { if (has_fakeconsole) { FreeConsole(); @@ -939,89 +931,9 @@ void freefakeconsole() } #endif -char * -get_executable_path() -{ - static char path_buffer[MAX_PATH]; - -#ifdef UNICODE - { - TCHAR wbuf[BUFSZ]; - GetModuleFileName((HANDLE) 0, wbuf, BUFSZ); - WideCharToMultiByte(CP_ACP, 0, wbuf, -1, path_buffer, sizeof(path_buffer), NULL, NULL); - } -#else - DWORD length = GetModuleFileName((HANDLE) 0, path_buffer, MAX_PATH); - if (length == ERROR_INSUFFICIENT_BUFFER) error("Unable to get module name"); - path_buffer[length] = '\0'; -#endif - - char * seperator = strrchr(path_buffer, PATH_SEPARATOR); - if (seperator) - *seperator = '\0'; - - return path_buffer; -} - -char * -translate_path_variables(str, buf) -const char *str; -char *buf; -{ - const char *src; - char evar[BUFSZ], *dest, *envp, *eptr = (char *) 0; - boolean in_evar; - size_t ccount, ecount, destcount, slen = str ? strlen(str) : 0; - - if (!slen || !buf) { - if (buf) - *buf = '\0'; - return buf; - } - - dest = buf; - src = str; - in_evar = FALSE; - destcount = ecount = 0; - for (ccount = 0; ccount < slen && destcount < (BUFSZ - 1) && - ecount < (BUFSZ - 1); ++ccount, ++src) { - if (*src == '%') { - if (in_evar) { - *eptr = '\0'; - envp = nh_getenv(evar); - if (envp) { - size_t elen = strlen(envp); - - if ((elen + destcount) < (size_t) (BUFSZ - 1)) { - Strcpy(dest, envp); - dest += elen; - destcount += elen; - } - } - } else { - eptr = evar; - ecount = 0; - } - in_evar = !in_evar; - continue; - } - if (in_evar) { - *eptr++ = *src; - ecount++; - } else { - *dest++ = *src; - destcount++; - } - } - *dest = '\0'; - return buf; -} - - /*ARGSUSED*/ void -windows_raw_print(str) -const char *str; +windows_raw_print(const char *str) { if (str) fprintf(stdout, "%s\n", str); @@ -1031,58 +943,54 @@ const char *str; /*ARGSUSED*/ void -windows_raw_print_bold(str) -const char *str; +windows_raw_print_bold(const char *str) { windows_raw_print(str); return; } int -windows_nhgetch() +windows_nhgetch(void) { return getchar(); } void -windows_nhbell() +windows_nhbell(void) { return; } /*ARGSUSED*/ int -windows_nh_poskey(x, y, mod) -int *x, *y, *mod; +windows_nh_poskey(int *x UNUSED, int *y UNUSED, int *mod UNUSED) { return '\033'; } /*ARGSUSED*/ char -windows_yn_function(query, resp, def) -const char *query; -const char *resp; -char def; +windows_yn_function(const char *query UNUSED, const char *resp UNUSED, + char def UNUSED) { return '\033'; } /*ARGSUSED*/ +#if 0 static void -windows_getlin(prompt, outbuf) -const char *prompt UNUSED; -char *outbuf; +windows_getlin(const char *prompt UNUSED, char *outbuf) { Strcpy(outbuf, "\033"); } +#endif #ifdef PC_LOCKING static int -eraseoldlocks() +eraseoldlocks(void) { - register int i; + int i; /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization @@ -1090,28 +998,34 @@ eraseoldlocks() */ for (i = 1; i <= MAXDUNGEON * MAXLEVEL + 1; i++) { /* try to remove all */ - set_levelfile_name(lock, i); - (void) unlink(fqname(lock, LEVELPREFIX, 0)); + set_levelfile_name(gl.lock, i); + (void) unlink(fqname(gl.lock, LEVELPREFIX, 0)); } - set_levelfile_name(lock, 0); + set_levelfile_name(gl.lock, 0); #ifdef HOLD_LOCKFILE_OPEN really_close(); #endif - if (unlink(fqname(lock, LEVELPREFIX, 0))) + if (unlink(fqname(gl.lock, LEVELPREFIX, 0))) return 0; /* cannot remove it */ return (1); /* success! */ } +DISABLE_WARNING_UNREACHABLE_CODE + int -getlock() +getlock(void) { - register int fd, ern, prompt_result = 0; + int fd, ern = 0, prompt_result = 1; int fcmask = FCMASK; +#ifndef SELF_RECOVER char tbuf[BUFSZ]; +#endif const char *fq_lock; #define OOPS_BUFSZ 512 char oops[OOPS_BUFSZ]; - boolean istty = WINDOWPORT("tty"); +#ifdef WIN32CON + boolean istty = WINDOWPORT(tty); +#endif /* we ignore QUIT and INT at this point */ if (!lock_file(HLOCK, LOCKPREFIX, 10)) { @@ -1123,30 +1037,16 @@ getlock() } /* regularize(lock); */ /* already done in pcmain */ - Sprintf(tbuf, "%s", fqname(lock, LEVELPREFIX, 0)); - set_levelfile_name(lock, 0); - fq_lock = fqname(lock, LEVELPREFIX, 1); + /*Sprintf(tbuf, "%s", fqname(gl.lock, LEVELPREFIX, 0)); */ + set_levelfile_name(gl.lock, 0); + fq_lock = fqname(gl.lock, LEVELPREFIX, 1); if ((fd = open(fq_lock, 0)) == -1) { if (errno == ENOENT) goto gotlock; /* no such file */ #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) chdirx(orgdir, 0); #endif -#if defined(HOLD_LOCKFILE_OPEN) - if (errno == EACCES) { - Strcpy( - oops, - "\nThere are files from a game in progress under your name."); - Strcat(oops, "\nThe files are locked or inaccessible."); - Strcat(oops, " Is the other game still running?\n"); - if (strlen(fq_lock) < ((OOPS_BUFSZ - 16) - strlen(oops))) - Sprintf(eos(oops), "Cannot open %s", fq_lock); - Strcat(oops, "\n"); - unlock_file(HLOCK); - raw_print(oops); - } else -#endif - error("Bad directory or name: %s\n%s\n", fq_lock, + error("Bad directory or name: %s\n%s\n", fq_lock, strerror(errno)); unlock_file(HLOCK); Sprintf(oops, "Cannot open %s", fq_lock); @@ -1156,9 +1056,11 @@ getlock() (void) nhclose(fd); - if (WINDOWPORT("tty")) +#ifdef WIN32CON + if (WINDOWPORT(tty)) prompt_result = tty_self_recover_prompt(); else +#endif prompt_result = other_self_recover_prompt(); /* * prompt_result == 1 means recover old game. @@ -1171,14 +1073,16 @@ getlock() : (prompt_result == 1) ? "recover the old game" : "not start a new game"); +#ifdef WIN32CON if (istty) - clear_screen(); - pline(oops); + term_clear_screen(); +#endif + raw_printf("%s", oops); if (prompt_result == 1) { /* recover */ if (recover_savefile()) { #if 0 if (istty) - clear_screen(); /* display gets fouled up otherwise */ + term_clear_screen(); /* display gets fouled up otherwise */ #endif goto gotlock; } else { @@ -1190,8 +1094,10 @@ getlock() } } else if (prompt_result < 0) { /* destroy old game */ if (eraseoldlocks()) { +#ifdef WIN32CON if (istty) - clear_screen(); /* display gets fouled up otherwise */ + term_clear_screen(); /* display gets fouled up otherwise */ +#endif goto gotlock; } else { unlock_file(HLOCK); @@ -1220,11 +1126,11 @@ getlock() #endif Sprintf(oops, "cannot creat file (%s.)\n%s\n%s\"%s\" exists?\n", fq_lock, strerror(ern), " Are you sure that the directory", - fqn_prefix[LEVELPREFIX]); + gf.fqn_prefix[LEVELPREFIX]); raw_print(oops); } else { - if (write(fd, (char *) &hackpid, sizeof(hackpid)) - != sizeof(hackpid)) { + if (write(fd, (char *) &svh.hackpid, sizeof(svh.hackpid)) + != sizeof(svh.hackpid)) { #if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) chdirx(orgdir, 0); #endif @@ -1237,56 +1143,46 @@ getlock() error("cannot close lock (%s)", fq_lock); } } - return 1; + return prompt_result; } #endif /* PC_LOCKING */ -boolean -file_exists(path) -const char *path; -{ - struct stat sb; - - /* Just see if it's there */ - if (stat(path, &sb)) { - return FALSE; - } - return TRUE; -} +RESTORE_WARNING_UNREACHABLE_CODE -/* +/* file_newer returns TRUE if the file at a_path is newer then the file at b_path. If a_path does not exist, it returns FALSE. If b_path does not exist, it returns TRUE. */ boolean -file_newer(a_path, b_path) -const char * a_path; -const char * b_path; +file_newer(const char *a_path, const char *b_path) { - struct stat a_sb; - struct stat b_sb; + struct stat a_sb = { 0 }; + struct stat b_sb = { 0 }; + double timediff; if (stat(a_path, &a_sb)) return FALSE; if (stat(b_path, &b_sb)) return TRUE; + timediff = difftime(a_sb.st_mtime, b_sb.st_mtime); - if(difftime(a_sb.st_mtime, b_sb.st_mtime) < 0) + if(timediff > 0) return TRUE; return FALSE; } +#ifdef WIN32CON /* * returns: * 1 if game should be recovered * -1 if old game should be destroyed, allowing new game to proceed. */ int -tty_self_recover_prompt() +tty_self_recover_prompt(void) { - register int c, ci, ct, pl, retval = 0; + int c, ci, ct, pl, retval = 0; /* for saving/replacing functions, if needed */ struct window_procs saved_procs = {0}; @@ -1294,9 +1190,7 @@ tty_self_recover_prompt() c = 'n'; ct = 0; saved_procs = windowprocs; - if (!WINDOWPORT("safe-startup")) - windowprocs = *get_safe_procs(2); /* arg 2 uses no-newline variant */ - windowprocs.win_nhgetch = windows_console_custom_nhgetch; + raw_print("\n"); raw_print("\n"); raw_print("\n"); @@ -1349,19 +1243,20 @@ tty_self_recover_prompt() } return retval; } +#endif int -other_self_recover_prompt() +other_self_recover_prompt(void) { - register int c, ci, ct, pl, retval = 0; - boolean ismswin = WINDOWPORT("mswin"), - iscurses = WINDOWPORT("curses"); + int c, ci, ct, pl, retval = 0; + boolean ismswin = WINDOWPORT(mswin), + iscurses = WINDOWPORT(curses); pl = 1; c = 'n'; ct = 0; - if (iflags.window_inited || WINDOWPORT("curses")) { - c = yn("There are files from a game in progress under your name. " + if (iflags.window_inited || WINDOWPORT(curses)) { + c = y_n("There are files from a game in progress under your name. " "Recover?"); } else { c = 'n'; @@ -1388,7 +1283,7 @@ other_self_recover_prompt() } if (pl == 1 && (c == 'n' || c == 'N')) { /* no to recover */ - c = yn("Are you sure you wish to destroy the old game, rather than try to " + c = y_n("Are you sure you wish to destroy the old game, rather than try to " "recover it? [yn] "); pl = 2; if (!ismswin && !iscurses) { @@ -1409,4 +1304,79 @@ other_self_recover_prompt() } return retval; } -/*windmain.c*/ + +#ifdef CHDIR +void +chdirx(const char *dir, boolean wr) +{ + static char thisdir[] = "."; + + if (dir && chdir(dir) < 0) { + error("Cannot chdir to %s.", dir); + } + + /* warn the player if we can't write the record file */ + /* perhaps we should also test whether . is writable */ + /* unfortunately the access system-call is worthless */ + if (wr) + check_recordfile(dir ? dir : thisdir); +} +#endif /* CHDIR */ + +void +set_emergency_io(void) +{ + windowprocs.win_raw_print = stdio_raw_print; + windowprocs.win_raw_print_bold = stdio_raw_print_bold; + windowprocs.win_nhgetch = stdio_nhgetch; + windowprocs.win_wait_synch = stdio_wait_synch; +} + + +/* Add to your code: windowprocs.win_raw_print = stdio_wait_synch; */ +void +stdio_wait_synch(void) +{ + char valid[] = { ' ', '\n', '\r', '\033', '\0' }; + + fprintf(stdout, "--More--"); + (void) fflush(stdout); + while (!strchr(valid, nhgetch())) + ; +} + +/* Add to your code: windowprocs.win_raw_print = stdio_raw_print; */ +void +stdio_raw_print(const char *str) +{ + if (str) + fprintf(stdout, "%s\n", str); + return; +} + +/* no newline variation, add to your code: + windowprocs.win_raw_print = stdio_nonl_raw_print; */ +void +stdio_nonl_raw_print(const char *str) +{ + if (str) + fprintf(stdout, "%s", str); + return; +} + +/* Add to your code: windowprocs.win_raw_print_bold = stdio_raw_print_bold; */ +void +stdio_raw_print_bold(const char *str) +{ + stdio_raw_print(str); + return; +} + +/* Add to your code: windowprocs.win_nhgetch = stdio_nhgetch; */ +int +stdio_nhgetch(void) +{ + return getchar(); +} + + /*windmain.c*/ diff --git a/sys/windows/windsys.c b/sys/windows/windsys.c new file mode 100644 index 000000000..3dad0d330 --- /dev/null +++ b/sys/windows/windsys.c @@ -0,0 +1,1463 @@ +/* NetHack 5.0 windsys.c $NHDT-Date: 1710949760 2024/03/20 15:49:20 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.95 $ */ +/* Copyright (c) NetHack PC Development Team 1993, 1994 */ +/* NetHack may be freely redistributed. See license for details. */ + +/* + * WIN32 system functions. + * + * Included in both console-based and window-based clients on the windows platform. + * + * Initial Creation: Michael Allison - January 31/93 + * + */ + +#include "win10.h" +#include "winos.h" +#include + +#define NEED_VARARGS +#include "hack.h" +#include +#ifndef __BORLANDC__ +#include +#endif +#ifdef TTY_GRAPHICS +#include "wintty.h" +#endif +#include +#include + +#ifdef WIN32 +#include +#include +#include + +/* + * The following WIN32 API routines are used in this file. + * + * GetDiskFreeSpace + * GetVolumeInformation + * GetUserName + * FindFirstFile + * FindNextFile + * FindClose + * + */ + +static char portable_device_path[MAX_PATH]; + +static boolean path_buffer_set = FALSE; +static char path_buffer[MAX_PATH]; + +#ifndef SFCTOOL +/* runtime cursor display control switch */ +boolean win32_cursorblink; + +/* globals required within here */ +HANDLE ffhandle = (HANDLE) 0; +WIN32_FIND_DATA ffd; +extern int GUILaunched; +extern boolean getreturn_enabled; +int redirect_stdout; +static char *get_executable_path(void); + + + +#ifdef WIN32CON +typedef HWND(WINAPI *GETCONSOLEWINDOW)(void); +#if 0 +static HWND GetConsoleHandle(void); +static HWND GetConsoleHwnd(void); +#endif /* 0 */ +#endif /* WIN32CON */ +#if !defined(TTY_GRAPHICS) +extern void backsp(void); +#endif +int windows_console_custom_nhgetch(void); +int windows_early_options(const char *window_opt); +unsigned long sys_random_seed(void); +#if 0 +static int max_filename(void); +#endif + +int get_known_folder_path(const KNOWNFOLDERID *folder_id, char *path, + size_t path_size); +void create_directory(const char *path); +int build_known_folder_path(const KNOWNFOLDERID *folder_id, char *path, + size_t path_size, boolean versioned); +void build_environment_path(const char *env_str, const char *folder, + char *path, size_t path_size); +boolean folder_file_exists(const char *folder, const char *file_name); +boolean test_portable_config(const char *executable_path, + char *portable_device_path, + size_t portable_device_path_size); +/* The function pointer nt_kbhit contains a kbhit() equivalent + * which varies depending on which window port is active. + * For the tty port it is tty_kbhit() [from consoletty.c] + * For the win32 port it is win32_kbhit() [from winmain.c] + * It is initialized to point to def_kbhit [in here] for safety. + */ + +int def_kbhit(void); +int (*nt_kbhit)(void) = def_kbhit; + +#ifndef WIN32CON +/* this is used as a printf() replacement when the window + * system isn't initialized yet + */ +void msmsg +VA_DECL(const char *, fmt) +{ + VA_START(fmt); + VA_INIT(fmt, const char *); + VA_END(); + return; +} +#endif /* WIN32CON */ + +char +switchar(void) +{ + /* Could not locate a WIN32 API call for this- MJA */ + return '-'; +} + +long +freediskspace(char *path) +{ + char tmppath[4]; + DWORD SectorsPerCluster = 0; + DWORD BytesPerSector = 0; + DWORD FreeClusters = 0; + DWORD TotalClusters = 0; + + tmppath[0] = *path; + tmppath[1] = ':'; + tmppath[2] = '\\'; + tmppath[3] = '\0'; + GetDiskFreeSpace(tmppath, &SectorsPerCluster, &BytesPerSector, + &FreeClusters, &TotalClusters); + return (long) (SectorsPerCluster * BytesPerSector * FreeClusters); +} + +/* + * Functions to get filenames using wildcards + */ +int +findfirst(char *path) +{ + if (ffhandle) { + FindClose(ffhandle); + ffhandle = (HANDLE) 0; + } + ffhandle = FindFirstFile(path, &ffd); + return (ffhandle == INVALID_HANDLE_VALUE) ? 0 : 1; +} + +int +findnext(void) +{ + return FindNextFile(ffhandle, &ffd) ? 1 : 0; +} + +char * +foundfile_buffer(void) +{ + return &ffd.cFileName[0]; +} + +long +filesize(char *file) +{ + if (findfirst(file)) { + return ((long) ffd.nFileSizeLow); + } else + return -1L; +} + +/* + * Chdrive() changes the default drive. + */ +void +chdrive(const char *str) +{ + char *ptr; + char drive; + if ((ptr = strchr(str, ':')) != (char *) 0) { + drive = toupper((uchar) *(ptr - 1)); + (void) _chdrive((drive - 'A') + 1); + } +} + +#if 0 +static int +max_filename(void) +{ + DWORD maxflen; + int status = 0; + + status = GetVolumeInformation((LPTSTR) 0, (LPTSTR) 0, 0, (LPDWORD) 0, + &maxflen, (LPDWORD) 0, (LPTSTR) 0, 0); + if (status) + return maxflen; + else + return 0; +} +#endif + +int +def_kbhit(void) +{ + return 0; +} + +/* + * Strip out troublesome file system characters. + */ + +void nt_regularize(char* s) /* normalize file name */ +{ + unsigned char *lp; + + for (lp = (unsigned char *) s; *lp; lp++) + if (*lp == '?' || *lp == '"' || *lp == '\\' || *lp == '/' + || *lp == '>' || *lp == '<' || *lp == '*' || *lp == '|' + || *lp == ':' || (*lp > 127)) + *lp = '_'; +} + +#if 0 +char *getxxx(void) +{ +char szFullPath[MAX_PATH] = ""; +HMODULE hInst = NULL; /* NULL gets the filename of this module */ + +GetModuleFileName(hInst, szFullPath, sizeof(szFullPath)); +return &szFullPath[0]; +} +#endif + +#ifdef MSWIN_GRAPHICS +extern void mswin_raw_print_flush(void); +extern void mswin_raw_print(const char *); +#endif + +DISABLE_WARNING_FORMAT_NONLITERAL + +/* fatal error */ +/*VARARGS1*/ +void error +VA_DECL(const char *, s) +{ + char buf[BUFSZ]; + VA_START(s); + VA_INIT(s, const char *); + /* error() may get called before tty is initialized */ +#ifdef TTY_GRAPHICS + if (iflags.window_inited) + term_end_screen(); +#endif + if (WINDOWPORT(tty)) { + buf[0] = '\n'; + (void) vsnprintf(&buf[1], sizeof buf - (1 + sizeof "\n"), s, VA_ARGS); + Strcat(buf, "\n"); + msmsg("%s", buf); + } else { + (void) vsnprintf(buf, sizeof buf - sizeof "\n", s, VA_ARGS); + Strcat(buf, "\n"); + raw_printf("%s",buf); + } +#ifdef MSWIN_GRAPHICS + if (windowprocs.win_raw_print == mswin_raw_print) + mswin_raw_print_flush(); +#endif + VA_END(); + exit(EXIT_FAILURE); +} + +RESTORE_WARNING_FORMAT_NONLITERAL + +void +Delay(int ms) +{ + (void) Sleep(ms); +} + +void +win32_abort(void) +{ + int c; + + if (WINDOWPORT(mswin) || WINDOWPORT(tty)) { + if (iflags.window_inited) + exit_nhwindows((char *) 0); + iflags.window_inited = FALSE; + } + if (wizard) { + raw_print("Execute debug breakpoint wizard?"); + if ((c = nhgetch()) == 'y' || c == 'Y') + DebugBreak(); + } + abort(); +} + +static char interjection_buf[INTERJECTION_TYPES][1024]; +static int interjection[INTERJECTION_TYPES]; + +void +interject_assistance(int num, int interjection_type, genericptr_t ptr1, genericptr_t ptr2) +{ + switch (num) { + case 1: { + char *panicmsg = (char *) ptr1; + char *datadir = (char *) ptr2; + char *tempdir = nh_getenv("TEMP"); + interjection_type = INTERJECT_PANIC; + interjection[INTERJECT_PANIC] = 1; + /* + * ptr1 = the panic message about to be delivered. + * ptr2 = the directory prefix of the dungeon file + * that failed to open. + * Check to see if datadir matches tempdir or a + * common windows temp location. If it does, inform + * the user that they are probably trying to run the + * game from within their unzip utility, so the required + * files really don't exist at the location. Instruct + * them to unpack them first. + */ + if (panicmsg && datadir) { + if (!strncmpi(datadir, "C:\\WINDOWS\\TEMP", 15) + || strstri(datadir, "TEMP") + || (tempdir && strstri(datadir, tempdir))) { + (void) strncpy( + interjection_buf[INTERJECT_PANIC], + "\nOne common cause of this error is attempting to " + "execute\n" + "the game by double-clicking on it while it is " + "displayed\n" + "inside an unzip utility.\n\n" + "You have to unzip the contents of the zip file into a\n" + "folder on your system, and then run \"NetHack.exe\" or " + "\n" + "\"NetHackW.exe\" from there.\n\n" + "If that is not the situation, you are encouraged to\n" + "report the error as shown above.\n\n", + 1023); + } + } + } break; + } + nhUse(interjection_type); +} + +void +interject(int interjection_type) +{ + if (interjection_type >= 0 && interjection_type < INTERJECTION_TYPES) + msmsg("%s", interjection_buf[interjection_type]); +} + +#ifdef RUNTIME_PASTEBUF_SUPPORT + +void port_insert_pastebuf(char *buf) +{ + /* This implementation will utilize the windows clipboard + * to accomplish this. + */ + + HGLOBAL hglbCopy; + WCHAR *w, w2[2]; + /* int cc; */ + int rc, abytes; + LPWSTR lpwstrCopy; + HANDLE hresult; + + if (!buf) + return; + + /* cc = strlen(buf); */ + /* last arg=0 means "tell me the size of the buffer that I need" */ + rc = MultiByteToWideChar(GetConsoleOutputCP(), 0, buf, -1, w2, 0); + if (!rc) return; + + abytes = rc * sizeof(WCHAR); + w = (WCHAR *)alloc(abytes); + /* Housekeeping need: +free(w) */ + + rc = MultiByteToWideChar(GetConsoleOutputCP(), 0, buf, -1, w, rc); + if (!rc) { + free(w); + return; + } + if (!OpenClipboard(NULL)) { + free(w); + return; + } + /* Housekeeping need: +CloseClipboard(), free(w) */ + + EmptyClipboard(); + + /* allocate global mem obj to hold the text */ + + hglbCopy = GlobalAlloc(GMEM_MOVEABLE, abytes); + if (hglbCopy == NULL) { + CloseClipboard(); + free(w); + return; + } + /* Housekeeping need: +GlobalFree(hglbCopy), CloseClipboard(), free(w) */ + + lpwstrCopy = (LPWSTR)GlobalLock(hglbCopy); + /* Housekeeping need: +GlobalUnlock(hglbCopy), GlobalFree(hglbCopy), + CloseClipboard(), free(w) */ + + if (lpwstrCopy) { + memcpy(lpwstrCopy, w, abytes); + GlobalUnlock(hglbCopy); + /* Housekeeping need: GlobalFree(hglbCopy), CloseClipboard(), free(w) + */ + + /* put it on the clipboard */ + hresult = SetClipboardData(CF_UNICODETEXT, hglbCopy); + if (!hresult) { + raw_printf("Error copying to clipboard.\n"); + GlobalFree( + hglbCopy); /* only needed if clipboard didn't accept data */ + } + /* Housekeeping need: CloseClipboard(), free(w) */ + } + CloseClipboard(); + free(w); + return; +} + +#ifdef WIN32CON +#if 0 +static HWND +GetConsoleHandle(void) +{ + HMODULE hMod = GetModuleHandle("kernel32.dll"); + + if (hMod) { + GETCONSOLEWINDOW pfnGetConsoleWindow = + (GETCONSOLEWINDOW) GetProcAddress(hMod, "GetConsoleWindow"); + if (pfnGetConsoleWindow) + return pfnGetConsoleWindow(); + } + return GetConsoleHwnd(); +} + +static HWND +GetConsoleHwnd(void) +{ + int iterations = 0; + HWND hwndFound = 0; + char OldTitle[1024], NewTitle[1024], TestTitle[1024]; + + /* Get current window title */ + GetConsoleTitle(OldTitle, sizeof OldTitle); + + (void) sprintf(NewTitle, "NETHACK%lld/%ld", GetTickCount64(), + GetCurrentProcessId()); + SetConsoleTitle(NewTitle); + + GetConsoleTitle(TestTitle, sizeof TestTitle); + while (strcmp(TestTitle, NewTitle) != 0) { + iterations++; + /* sleep(0); */ + GetConsoleTitle(TestTitle, sizeof TestTitle); + } + hwndFound = FindWindow(NULL, NewTitle); + SetConsoleTitle(OldTitle); + /* printf("%d iterations\n", iterations); */ + return hwndFound; +} +#endif /* 0 */ +#endif /* WIN32CON */ +#endif /* RUNTIME_PASTEBUF_SUPPORT */ + +#ifdef RUNTIME_PORT_ID +/* + * _M_IX86 is Defined for x86 processors. This is not defined for x64 + * processors. + * _M_X64 is Defined for x64 processors. + * _M_IA64 is Defined for Itanium Processor Family 64-bit processors. + * _WIN64 is Defined for applications for Win64. + */ +#ifndef _M_IX86 +#ifdef _M_X64 +#define TARGET_PORT "x64" +#endif +#ifdef _M_IA64 +#define TARGET_PORT "IA64" +#endif +#endif + +#ifndef TARGET_PORT +#define TARGET_PORT "x86" +#endif + +char * +get_port_id(char *buf) +{ + Strcpy(buf, TARGET_PORT); + return buf; +} +#endif /* RUNTIME_PORT_ID */ + +#ifdef MSWIN_GRAPHICS +extern void free_winmain_stuff(void); +#endif + +void +nethack_exit(int code) +{ + /* Only if we started from the GUI, not the command prompt, + * we need to get one last return, so the score board does + * not vanish instantly after being created. + * GUILaunched is defined and set in consoletty.c. + */ + + if (getreturn_enabled) { + raw_print("\n"); + if (iflags.window_inited) + wait_synch(); + } + /* frees some status tracking data */ + genl_status_finish(); +#ifdef MSWIN_GRAPHICS + free_winmain_stuff(); +#endif + exit(code); +} + +void +get_nhuuid(void) +{ + UUID binuuid; + unsigned char *stmp; + RPC_STATUS rpcstatus; + + if (svn.nhuuid[0]) + return; + + rpcstatus = UuidCreate(&binuuid); + if (rpcstatus == RPC_S_OK) { + rpcstatus = UuidToStringA(&binuuid, &stmp); + if (rpcstatus == RPC_S_OK) { + Snprintf(svn.nhuuid, sizeof svn.nhuuid, "%s", (char *) stmp); + RpcStringFree(&stmp); + } + } +} + +void +free_nhuuid(void) +{ + int i; + + for (i = 0; i < SIZE(svn.nhuuid); i++) { + svn.nhuuid[i] = 0; + } +} + +#ifdef WIN32CON +#undef kbhit +#include + +int +windows_console_custom_nhgetch(void) +{ + return _getch(); +} + +extern int windows_console_custom_nhgetch(void); + +void +getreturn(const char *str) +{ + static boolean in_getreturn = FALSE; + char buf[BUFSZ]; + + if (in_getreturn || !getreturn_enabled) + return; + in_getreturn = TRUE; + Sprintf(buf,"Hit %s.", str); + raw_print(buf); + if (WINDOWPORT(tty)) + windows_console_custom_nhgetch(); + else + wait_synch(); + in_getreturn = FALSE; + return; +} +#endif + +/* nethack_enter_windows() is called from main immediately after + initializing the window port */ +void nethack_enter_windows(void) +{ +} + +/* CP437 to Unicode mapping according to the Unicode Consortium */ +const WCHAR cp437[256] = { + 0x0020, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, + 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, + 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302, + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 +}; + +WCHAR * +winos_ascii_to_wide_str(const unsigned char * src, WCHAR * dst, size_t dstLength) +{ + size_t i = 0; + while(i < dstLength - 1 && src[i] != 0) { + dst[i] = cp437[src[i]]; + i++; + } + dst[i] = 0; + return dst; +} + +void +winos_ascii_to_wide(WCHAR dst[3], UINT32 c) +{ +#ifdef ENHANCED_SYMBOLS + if (SYMHANDLING(H_UTF8)) { + if (c <= 0xFFFF) { + dst[0] = (WCHAR) c; + dst[1] = L'\0'; + } else { + /* UTF-16 surrogate pair */ + dst[0] = (WCHAR) ((c >> 10) + 0xD7C0); + dst[1] = (WCHAR) ((c & 0x3FF) + 0xDC00); + dst[2] = L'\0'; + } + } else +#endif + { + dst[0] = cp437[c]; + dst[1] = L'\0'; + } +} + +BOOL winos_font_support_cp437(HFONT hFont) +{ + BOOL allFound = FALSE; + HDC hdc = GetDC(NULL); + HFONT oldFont = SelectObject(hdc, hFont); + + + DWORD size = (size_t) GetFontUnicodeRanges(hdc, NULL); + if (size) { + GLYPHSET *glyphSet = (GLYPHSET *) malloc((size_t) size); + if (glyphSet != NULL) { +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 6386 ) +#endif + size = GetFontUnicodeRanges(hdc, glyphSet); +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + allFound = TRUE; + for (int i = 0; i < 256 && allFound; i++) { + WCHAR wc = cp437[i]; + BOOL found = FALSE; + for (DWORD j = 0; j < glyphSet->cRanges && !found; j++) { + WCHAR first = glyphSet->ranges[j].wcLow; + WCHAR last = first + glyphSet->ranges[j].cGlyphs - 1; + + if (wc >= first && wc <= last) + found = TRUE; + } + if (!found) + allFound = FALSE; + } + + free(glyphSet); + } + } + SelectObject(hdc, oldFont); + ReleaseDC(NULL, hdc); + + return allFound; +} + +int +windows_early_options(const char *window_opt) +{ + /* + * If you return 2, the game will exit before it begins. + * Return 1, to say the option parsed okay. + * Return 0, to say the option was bad. + */ + + if (match_optname(window_opt, "cursorblink", 5, FALSE)) { + win32_cursorblink = TRUE; + return 1; + } else { + raw_printf( + "-%s windows:cursorblink is the only supported option.\n", + window_opt); + } + return 0; +} + +#include /* Windows Crypto Next Gen (CNG) */ + +#ifndef STATUS_SUCCESS +#define STATUS_SUCCESS 0 +#endif +#ifndef STATUS_NOT_FOUND +#define STATUS_NOT_FOUND 0xC0000225 +#endif +#ifndef STATUS_UNSUCCESSFUL +#define STATUS_UNSUCCESSFUL 0xC0000001 +#endif + +unsigned long +sys_random_seed(void) +{ + unsigned long ourseed = 0UL; + BCRYPT_ALG_HANDLE hRa = (BCRYPT_ALG_HANDLE) 0; + NTSTATUS status = STATUS_UNSUCCESSFUL; + boolean Plan_B = TRUE; + + status = BCryptOpenAlgorithmProvider(&hRa, BCRYPT_RNG_ALGORITHM, + (LPCWSTR) 0, 0); + if (hRa && status == (NTSTATUS) STATUS_SUCCESS) { + status = BCryptGenRandom(hRa, (PUCHAR) &ourseed, + (ULONG) sizeof ourseed, 0); + if (status == (NTSTATUS) STATUS_SUCCESS) { + BCryptCloseAlgorithmProvider(hRa,0); + has_strong_rngseed = TRUE; + Plan_B = FALSE; + } + } + + if (Plan_B) { + time_t datetime = 0; + const char *emsg; + + if (status == (NTSTATUS) STATUS_NOT_FOUND) + emsg = "BCRYPT_RNG_ALGORITHM not avail, falling back"; + else + emsg = "Other failure than algorithm not avail"; + paniclog("sys_random_seed", emsg); /* leaves clue, doesn't exit */ + (void) time(&datetime); + ourseed = (unsigned long) datetime; + } + return ourseed; +} + +/* nt_assert_failed is called when an nhassert's condition is false */ +void +nt_assert_failed(const char *expression, const char *filepath, int line) +{ + const char * filename; + + filename = strrchr(filepath, '\\'); + filename = (filename == NULL ? filepath : filename + 1); + + if (IsDebuggerPresent()) { + char message[BUFSIZ]; + snprintf(message, sizeof(message), + "nhassert(%s) failed in file '%s' at line %d", + expression, filename, line); + OutputDebugStringA(message); + DebugBreak(); + } + + /* get file name from path */ + impossible("nhassert(%s) failed in file '%s' at line %d", + expression, filename, line); +} +#endif /* SFCTOOL */ + +/* used by util/sfctool.c as well as files.c */ +boolean +get_user_home_folder(char *homebuf, size_t sz) +{ + static char szHomeDirBuf[MAX_PATH] = { 0 }; + // We need a process with query permission set + HANDLE hToken = 0; + DWORD result = + OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken); + DWORD BufSize = MAX_PATH; + + result = GetUserProfileDirectoryA(hToken, szHomeDirBuf, &BufSize); + // Close handle opened via OpenProcessToken + CloseHandle(hToken); + if (result != 0) { + Snprintf(homebuf, sz, "%s", szHomeDirBuf); + } + + return (result != 0); +} + +char * +get_executable_path(void) +{ +#ifdef UNICODE + { + TCHAR wbuf[BUFSZ]; + GetModuleFileName((HANDLE) 0, wbuf, BUFSZ); + WideCharToMultiByte(CP_ACP, 0, wbuf, -1, path_buffer, + sizeof(path_buffer), NULL, NULL); + } +#else + DWORD length = GetModuleFileName((HANDLE) 0, path_buffer, MAX_PATH); + if (length == ERROR_INSUFFICIENT_BUFFER) + error("Unable to get module name"); + path_buffer[length] = '\0'; +#endif + + char *separator = strrchr(path_buffer, PATH_SEPARATOR); + if (separator) + *separator = '\0'; + + path_buffer_set = TRUE; + return path_buffer; +} + +char * +windows_exepath(void) +{ + char *p = (char *) 0; + + if (path_buffer_set) + p = path_buffer; + return p; +} + +char * +translate_path_variables(const char *str, char *buf) +{ + const char *src; + char evar[BUFSZ], *dest, *envp, *eptr = (char *) 0; + boolean in_evar; + size_t ccount, ecount, destcount, slen = str ? strlen(str) : 0; + + if (!slen || !buf) { + if (buf) + *buf = '\0'; + return buf; + } + + dest = buf; + src = str; + in_evar = FALSE; + destcount = ecount = 0; + for (ccount = 0; + ccount < slen && destcount < (BUFSZ - 1) && ecount < (BUFSZ - 1); + ++ccount, ++src) { + if (*src == '%') { + if (in_evar) { + *eptr = '\0'; + envp = nh_getenv(evar); + if (envp) { + size_t elen = strlen(envp); + + if ((elen + destcount) < (size_t) (BUFSZ - 1)) { + Strcpy(dest, envp); + dest += elen; + destcount += elen; + } + } + } else { + eptr = evar; + ecount = 0; + } + in_evar = !in_evar; + continue; + } + if (in_evar) { + *eptr++ = *src; + ecount++; + } else { + *dest++ = *src; + destcount++; + } + } + *dest = '\0'; + return buf; +} + +DISABLE_WARNING_UNREACHABLE_CODE + +int +get_known_folder_path(const KNOWNFOLDERID *folder_id, char *path, + size_t path_size) +{ + PWSTR wide_path; + if (FAILED(SHGetKnownFolderPath(folder_id, 0, NULL, &wide_path))) { + error("Unable to get known folder path"); + return FALSE; + } + + size_t converted; + errno_t err; + + err = wcstombs_s(&converted, path, path_size, wide_path, _TRUNCATE); + + CoTaskMemFree(wide_path); + + if (err == STRUNCATE || err == EILSEQ) { + // silently handle this problem + return FALSE; + } else if (err != 0) { + error( + "Failed folder (%lu) path string conversion, unexpected err = %d", + folder_id->Data1, err); + return FALSE; + } + + return TRUE; +} + +void +create_directory(const char *path) +{ + BOOL dres = CreateDirectoryA(path, NULL); + + if (!dres) { + DWORD dw = GetLastError(); + + if (dw != ERROR_ALREADY_EXISTS) + error("Unable to create directory '%s'", path); + } +} + +RESTORE_WARNING_UNREACHABLE_CODE + +int +build_known_folder_path(const KNOWNFOLDERID *folder_id, char *path, + size_t path_size, boolean versioned) +{ + if (!get_known_folder_path(folder_id, path, path_size)) + return FALSE; + + strcat(path, "\\NetHack\\"); + create_directory(path); + if (versioned) { + Sprintf(eos(path), "%d.%d\\", VERSION_MAJOR, VERSION_MINOR); + create_directory(path); + } + return TRUE; +} + +void +build_environment_path(const char *env_str, const char *folder, char *path, + size_t path_size) +{ + path[0] = '\0'; + + const char *root_path = nh_getenv(env_str); + + if (root_path == NULL) + return; + + strcpy_s(path, path_size, root_path); + + char *colon = strchr(path, ';'); + if (colon != NULL) + path[0] = '\0'; + + if (strlen(path) == 0) + return; + + append_slash(path); + + if (folder != NULL) { + strcat_s(path, path_size, folder); + strcat_s(path, path_size, "\\"); + } +} + +boolean +folder_file_exists(const char *folder, const char *file_name) +{ + char path[MAX_PATH]; + + if (folder[0] == '\0') + return FALSE; + + strcpy(path, folder); + strcat(path, file_name); + return file_exists(path); +} + +boolean +file_exists(const char *path) +{ + struct stat sb; + + /* Just see if it's there */ + if (stat(path, &sb)) { + return FALSE; + } + return TRUE; +} + +void +set_default_prefix_locations(const char *programPath UNUSED) +{ + static char executable_path[MAX_PATH]; + static char profile_path[MAX_PATH]; + static char versioned_profile_path[MAX_PATH]; + static char versioned_user_data_path[MAX_PATH]; + static char versioned_global_data_path[MAX_PATH]; + /* static char versioninfo[20] UNUSED; */ + + strcpy(executable_path, get_executable_path()); + append_slash(executable_path); + +#ifndef SFCTOOL + if (test_portable_config(executable_path, portable_device_path, + sizeof portable_device_path)) { + gf.fqn_prefix[SYSCONFPREFIX] = executable_path; + gf.fqn_prefix[CONFIGPREFIX] = portable_device_path; + gf.fqn_prefix[HACKPREFIX] = portable_device_path; + gf.fqn_prefix[SAVEPREFIX] = portable_device_path; + gf.fqn_prefix[LEVELPREFIX] = portable_device_path; + gf.fqn_prefix[BONESPREFIX] = portable_device_path; + gf.fqn_prefix[SCOREPREFIX] = portable_device_path; + gf.fqn_prefix[LOCKPREFIX] = portable_device_path; + gf.fqn_prefix[TROUBLEPREFIX] = portable_device_path; + gf.fqn_prefix[DATAPREFIX] = executable_path; + } else { +#endif /* SFCTOOL */ + if (!build_known_folder_path(&FOLDERID_Profile, profile_path, + sizeof(profile_path), FALSE)) + strcpy(profile_path, executable_path); + + if (!build_known_folder_path(&FOLDERID_Profile, + versioned_profile_path, + sizeof(profile_path), TRUE)) + strcpy(versioned_profile_path, executable_path); + + if (!build_known_folder_path(&FOLDERID_LocalAppData, + versioned_user_data_path, + sizeof(versioned_user_data_path), TRUE)) + strcpy(versioned_user_data_path, executable_path); + + if (!build_known_folder_path( + &FOLDERID_ProgramData, versioned_global_data_path, + sizeof(versioned_global_data_path), TRUE)) + strcpy(versioned_global_data_path, executable_path); + + gf.fqn_prefix[SYSCONFPREFIX] = versioned_global_data_path; + gf.fqn_prefix[CONFIGPREFIX] = profile_path; + gf.fqn_prefix[HACKPREFIX] = versioned_profile_path; + gf.fqn_prefix[SAVEPREFIX] = versioned_user_data_path; + gf.fqn_prefix[LEVELPREFIX] = versioned_user_data_path; + gf.fqn_prefix[BONESPREFIX] = versioned_global_data_path; + gf.fqn_prefix[SCOREPREFIX] = versioned_global_data_path; + gf.fqn_prefix[LOCKPREFIX] = versioned_global_data_path; + gf.fqn_prefix[TROUBLEPREFIX] = versioned_profile_path; + gf.fqn_prefix[DATAPREFIX] = executable_path; +#ifndef SFCTOOL + } +#endif /* SFCTOOL */ +} + +/* + * Add a backslash to any name not ending in /, \ or : There must + * be room for the \ + */ +void +append_slash(char *name) +{ + char *ptr; + + if (!*name) + return; + ptr = name + (strlen(name) - 1); + if (*ptr != '\\' && *ptr != '/' && *ptr != ':') { + *++ptr = '\\'; + *++ptr = '\0'; + } + return; +} + +void set_default_prefix_locations(const char *programPath); +boolean +test_portable_config(const char *executable_path, char *portable_device_path, + size_t portable_device_path_size) +{ + int lth = 0; + const char *sysconf = "sysconf"; + char tmppath[MAX_PATH]; + boolean retval = FALSE, + save_initoptions_noterminate = iflags.initoptions_noterminate; + + if (portable_device_path + && folder_file_exists(executable_path, "sysconf")) { + /* + There is a sysconf file (not just sysconf.template) present in + the exe path, which is not the way NetHack is initially + distributed, so assume it means that the admin/installer wants to + override something, perhaps set up for a fully-portable + configuration that leaves no traces behind elsewhere on this + computer's hard drive - delve into that... + */ + + *portable_device_path = '\0'; + lth = sizeof tmppath - strlen(sysconf); + (void) strncpy(tmppath, executable_path, lth - 1); + tmppath[lth - 1] = '\0'; + (void) strcat(tmppath, sysconf); + + iflags.initoptions_noterminate = 1; + /* assure_syscf_file(); */ + config_error_init(TRUE, tmppath, FALSE); + /* ... and _must_ parse correctly. */ + if (read_config_file(tmppath, set_in_sysconf) + && sysopt.portable_device_paths) + retval = TRUE; + (void) config_error_done(); + iflags.initoptions_noterminate = save_initoptions_noterminate; + sysopt_release(); /* the real sysconf processing comes later */ + } + if (retval) { + lth = strlen(executable_path); + if (lth <= (int) portable_device_path_size - 1) + Strcpy(portable_device_path, executable_path); + else + retval = FALSE; + } + return retval; +} + +const char * +get_portable_device(void) +{ + return (const char *) portable_device_path; +} + +#ifndef SFCTOOL +/* Windows helpers for CRASHREPORT etc */ +#ifdef CRASHREPORT +struct CRctxt { + BCRYPT_ALG_HANDLE bah; + BCRYPT_HASH_HANDLE bhh; + PBYTE pbhashobj; + DWORD cbhashobj; /* temp */ + DWORD cbhash; /* hash length */ + DWORD cbdata; /* temp */ + PBYTE pbhash; /* binary hash */ + NTSTATUS st; +} ctxp_ = { NULL, NULL, NULL, 0, 0, 0, NULL, 0 }; +struct CRctxt *ctxp = &ctxp_; // XXX should this now be in gc.* ? + +#define win32err(fn) errname = (char *) fn; goto error + +int +win32_cr_helper(char cmd, struct CRctxt *contextp, void *p, int d){ + char *errname = (char *) "unknown"; + switch (cmd) { + default: + /* Not panic - we don't want to upgrade an impossible to a + * panic due to a bug in the CRASHREPORT code. */ + impossible("win_cr_helper bad cmd %d", cmd); + return 1; + case 'D': { + char *bidstr = (char *) p; + wchar_t lbidstr[40]; // sizeof(bid), but const + swprintf_s(lbidstr, 40, L"%S", bidstr); + // XXX TODO: need something that will allow copy of just the bid + return MessageBoxW(NULL, lbidstr, L"bidshow", MB_SETFOREGROUND); + } + break; + case 'i': /* HASH_INIT(contextp) */ + if (!IsWindowsVistaOrGreater()) + return 1; // CNG not available. + contextp->bah = NULL; + contextp->bhh = NULL; + contextp->pbhashobj = NULL; + contextp->cbhashobj = 0; + contextp->cbhash = 0; + contextp->cbdata = 0; + contextp->pbhash = NULL; + contextp->st = 0; + // win32err("test"); // TESTING - FAKE AN ERROR + if (0 > (contextp->st = BCryptOpenAlgorithmProvider( + &contextp->bah, BCRYPT_MD4_ALGORITHM, NULL, 0))) { + win32err("BCryptOpenAlgorithmProvider"); + }; + if (0 > (contextp->st = + BCryptGetProperty(contextp->bah, BCRYPT_OBJECT_LENGTH, + (unsigned char *) &contextp->cbhashobj, + sizeof(DWORD), &contextp->cbdata, 0))) { + win32err("BCryptGetProperty1"); + }; + if (0 + == (contextp->pbhashobj = + HeapAlloc(GetProcessHeap(), 0, contextp->cbhashobj))) { + win32err("HeapAlloc1"); + }; + if (0 > (contextp->st = BCryptGetProperty( + contextp->bah, BCRYPT_HASH_LENGTH, (PBYTE) &contextp->cbhash, + sizeof(DWORD), &contextp->cbdata, 0))) { + win32err("BCryptGetProperty2"); + } + if (0 + == (contextp->pbhash = + HeapAlloc(GetProcessHeap(), 0, contextp->cbhash))) { + + win32err("HeapAlloc2\n"); + } + if (0 > BCryptCreateHash(contextp->bah, &contextp->bhh, contextp->pbhashobj, + contextp->cbhashobj, NULL, 0, 0)) { + win32err("BCryptCreateHash"); + } + break; + case 'u': /* HASH_UPDATE(contextp, ptr, len) */ + if (0 > (contextp->st = BCryptHashData(contextp->bhh, p, d, 0))) { + win32err("BCryptHashData"); + } + break; + case 'f': /* HASH_FINISH(contextp) */ + if (0 > BCryptFinishHash(contextp->bhh, contextp->pbhash, contextp->cbhash, 0)) { + win32err("BCryptFinishHash"); + } + break; + case 'c': /* HASH_CLEANUP(contextp) */ + if (contextp->bah) { + BCryptCloseAlgorithmProvider(contextp->bah, 0); + } + if (contextp->bhh) { + BCryptDestroyHash(contextp->bhh); + } + if (contextp->pbhashobj) { + HeapFree(GetProcessHeap(), 0, contextp->pbhashobj); + } + if (contextp->pbhash) { + HeapFree(GetProcessHeap(), 0, contextp->pbhash); + } + break; + case 's': /* HASH_RESULT_SIZE(contextp) */ + return contextp->cbhash; + case 'r': /* HASH_RESULT(contextp, resp) */ + *(unsigned char **)p = contextp->pbhash; + break; + case 'b': /* HASH_BINFILE(NULL,&binfile,0) */ + // XXX This buffer should be allocated, not static (and freed in + // HASH_CLEANUP). + // NB: assumes !longPathAware in manifest (Win10+) + { + static char binfile[MAX_PATH]; + DWORD rv = GetModuleFileNameA(NULL, binfile, sizeof(binfile)); + if (rv == 0 || rv == sizeof(binfile)) + return 1; +#if (NH_DEVEL_STATUS == NH_STATUS_BETA) + printf("FILE '%s'\n", binfile); +#endif + *(unsigned char **) p = (unsigned char *) binfile; + return 0; + } + } + return 0; /* ok */ +error: + raw_printf("WIN32 function %s failed: status=%" PRIx64 "\n", + errname, (uint64)contextp->st); + return 1; /* fail */ +} +#undef win32err + + +#include +#define MAX_SYM_SIZE 100 +#ifdef __GNUC__ + // gcc can't generate .pdb files. llvm can almost do it. + // For these platforms, use github/ianlancetaylor/libbacktrace. +// XXX this doesn't work yet - we get correct addresses but no symbol info +// XXX so still needs cleanup +// XXX no mark (overflow held to last valid segment) handling yet +// XXX libbacktrace isn't available by default, so don't try until it works +//#define USE_BACKTRACE +#ifdef USE_BACKTRACE +#include + +struct userstate { + int error_count; + int good_count; + char *out; + int outsize; + int maxframes; +} userstate; + +//backtrace_full_callback +static int +btfcb_fn(void *us0, uintptr_t pc, const char *filename, + int lineno, const char *fnname){ + struct userstate *us = us0; + //XXX generate a stack frame line +printf("C: pc=%llx f=%s line=%d fn=%s\n",pc,filename,lineno,fnname); + us->good_count++; + return 0; +} + +//backtrace_error_callback +static void +btecb_fn(void *us0, const char *msg, int errnum){ + struct userstate *us = us0; + us->error_count++; + if(errnum < 0){ +printf("E1: M=%s e=%d\n",msg,errnum); + // XXX save error message + } else { +printf("E2: M=%s e=%d\n",msg,errnum); + // errnum is an errno + //XXX save error message with strerror + } +} +#endif + +#ifdef USE_BACKTRACE +#define USED_IF_BACKTRACE +#else +#define USED_IF_BACKTRACE UNUSED +#endif + +int +win32_cr_gettrace(int maxframes USED_IF_BACKTRACE, + char *out USED_IF_BACKTRACE, + int outsize USED_IF_BACKTRACE) +{ +#ifdef USE_BACKTRACE + userstate.error_count = 0; + userstate.good_count = 0; + userstate.out = out; + userstate.outsize = outsize; + userstate.maxframes = maxframes; + static char binfile[MAX_PATH];// assumes !longPathAware in manifest (Win10+) + DWORD rv = GetModuleFileNameA(NULL, binfile, sizeof(binfile)); + struct backtrace_state *state + = backtrace_create_state(binfile, 0, btecb_fn, &userstate); + if(!state) return userstate.error_count + userstate.good_count; + rv=backtrace_full(state, 0, btfcb_fn, btecb_fn, &userstate); +printf("rv=%d\n",rv); + // XXX rv not checked + // XXX this API leaks its memory; there is no free function + return userstate.error_count + userstate.good_count; +#else + return 0; +#endif +} +#else +// Use win32 API with Visual Studio (and probably MSVC). +#include + +int +win32_cr_gettrace(int maxframes, char *out, int outsize){ + char *mark = out; + void *frames[200]; // XXX why does VS fail var array? wrong C std? + int x; + int tmp; +#define BSIZE (MAX_SYM_SIZE+50) + char buf[BSIZE]; + HANDLE me = GetCurrentProcess(); + SetLastError(0); + // XXX may need to pass the binary's dir + //XXX check for different flags + if(!SymInitialize(me, NULL, TRUE)){ + snprintf(buf, BSIZE, "no stack trace: SymInitialize: %d\n", + (int) GetLastError()); + return 1; + } + int fcount = CaptureStackBackTrace(0, maxframes,frames,NULL); + if(!fcount)goto finish; + char symbol_info_space[sizeof(SYMBOL_INFO)+MAX_SYM_SIZE]; + SYMBOL_INFO *si = (SYMBOL_INFO *)symbol_info_space; + si->MaxNameLen = MAX_SYM_SIZE; + si->SizeOfStruct = sizeof(SYMBOL_INFO); + + for(x=0;xName[0], (long long int)disp64); + if(swr_add_uricoded(buf, &out, &outsize, mark)) + goto finish; + +#if 1 +// XXX does this block do anything useful? + DWORD disp = (DWORD) disp64; + IMAGEHLP_LINE ihl; + ihl.SizeOfStruct = sizeof(IMAGEHLP_LINE); + if (SymGetLineFromAddr(me, adr, &disp, &ihl)) { + printf("L=%d\n", (int) ihl.LineNumber); + } else { +// 7e/1e7 - no info. May need to call SymLoadModule if we need those addrs +// BUT probably system code, so we don't care - experiment +// printf("SGLFA failed: $%08x\n", GetLastError()); + } +//XXXnow format the line +#endif + } else { + // Error 487 (invalid address) seems to mean + // "I can't find any info for this address". + tmp = snprintf(buf, BSIZE, "%d %p (error %d)\n", + x, frames[x], (int) GetLastError()); + if(swr_add_uricoded(buf, &out, &outsize, mark)) + goto finish; + } + if(tmp < 0 || tmp >= outsize){ // XXX is test now wrong? +//printf("FAIL tmp=%d\n",tmp); + fcount = x+1; + goto finish; + } + mark = out; + } +finish: + SymCleanup(me); + return fcount; // XXX if output truncated, fcount could be wrong +} +#endif + +int * +win32_cr_shellexecute(const char *url){ +//XXX Docs say to do this, but has so many caveats I'm going to try skipping it. +//CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); + int *rv = (int*)ShellExecuteA(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL); + return rv; +} +#endif /* CRASHREPORT */ +#endif /* SFCTOOL */ + +#endif /* WIN32 */ + +/*windsys.c*/ diff --git a/sys/winnt/winos.h b/sys/windows/winos.h similarity index 61% rename from sys/winnt/winos.h rename to sys/windows/winos.h index 39a4b408e..9847dd28b 100644 --- a/sys/winnt/winos.h +++ b/sys/windows/winos.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 winos.h $NHDT-Date: 1524321419 2018/04/21 14:36:59 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.30 $ */ +/* NetHack 5.0 winos.h $NHDT-Date: 1596498322 2020/08/03 23:45:22 $ $NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.0 $ */ /* Copyright (c) NetHack PC Development Team 2018 */ /* NetHack may be freely redistributed. See license for details. */ @@ -7,13 +7,17 @@ #include "win32api.h" +#ifndef PATH_SEPARATOR +#define PATH_SEPARATOR '\\' +#endif + extern const WCHAR cp437[256]; WCHAR * winos_ascii_to_wide_str(const unsigned char * src, WCHAR * dst, size_t dstLength); -WCHAR -winos_ascii_to_wide(const unsigned char c); +void +winos_ascii_to_wide(WCHAR dst[3], UINT32 c); BOOL winos_font_support_cp437(HFONT hFont); diff --git a/sys/winnt/Install.nt b/sys/winnt/Install.nt deleted file mode 100644 index c9ce99e7b..000000000 --- a/sys/winnt/Install.nt +++ /dev/null @@ -1,333 +0,0 @@ - Copyright (c) NetHack Development Team 1990-2023 - NetHack may be freely redistributed. See license for details. - ============================================================== - Instructions for compiling and installing - NetHack 3.6 on a Windows system - (Windows 10/11 or later) - ============================================================== - Last revision: $NHDT-Date: 1575245156 2019/12/02 00:05:56 $ - -Credit for the porting of NetHack to the Win32 Console Subsystem goes to -the NT Porting Team started by Michael Allison. - -Credit for the Win32 Graphical version of NetHack (aka "NetHack for -Windows" or NetHackW) goes to Alex Kompel who initially developed and -contributed the port. - -Alex Kompel, Dion Nicolaas, Yitzhak Sapir, Derek S. Ray, Michael Allison, -Pasi Kallinen, Bart House, and Janet Walz contributed to the maintainance -of the tty and graphical windows versions of NetHack 3.6.7. - -You can build a TTY version of NetHack and a Windows Graphical -version. You can use one of the following build environments: - - o A copy of Microsoft Visual Studio 2017 Community Edition or - a copy of Microsoft Visual Studio 2019 Community Edition - - OR - - o (Untested for 3.6) A copy of MinGW. MinGW is a collection of header - files and import libraries with which native Windows32 programs - can be built; the MinGW distribution contains the GNU Compiler - Collection. You can download MinGW at - http://www.mingw.org/ - 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 | -\--------------------------------------------------------/ - -If you are NOT using Visual Studio 2017 IDE, or you prefer to build -using a Make utility and a Makefile proceed to "Building Using Make". - -When using either Visual Studio 2017, you simply need to load the -solution file within the IDE, build the solution and run the version -of NetHack you wish to run. - -The Visual Studio 2017 NetHack solution file can be found here: - win\win32\vs2017\NetHack.sln - -You can use that same win\win32\vs2017\NetHack.sln with Visual Studio 2019, -but you likely have to retarget the projects. The same would apply if you are -trying to build using an even more recent version of Visual Studio as well. -Note: If you already built NetHack previously with an older version of -Visual Studio, manually delete the following subfolders of win\win32\vs2017: -

obj - symbols - - Windows SDK Version: 10.0.22000.0 [ There have been some reports of - difficulties if you choose - "10.0 (latest installed version)" - instead ] - Platform Toolset: Upgrade to v142 - - -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. - 3. Select the build configuration you wish to use (Release, Debug, etc.). - 4. From the build menu, select build solution. - 5. Type F5 to start debugging. - -You can also build all the projects for all platforms and configurations -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 * - -Since 3.6.2, the community patch for a window-port that uses curses has been -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 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. - -From the command prompt: - cd sys\winnt - nhsetup - -From a Windows explorer window: - double-click on nhsetup.bat - -If you wish to build from the command line, proceed to "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: - A tty port utilizing the Win32 Console I/O subsystem, Console - NetHack; - A Win32 native port built on the Windows API, Graphical NetHack or - NetHackW. - -The executable for Console NetHack will be named NetHack.exe. The -executable for Graphical NetHack will be named NetHackW.exe. The -Makefile configuration will build both; NetHackW.exe and NetHack.exe -will be able to use the same datafiles, save files and bones files. - -Since the last official release of NetHack, compilers and computer -architectures have evolved and you can now choose whether to build -a 32-bit x86 version, or a 64-bit x64 version. The default Makefile -is set up for a 32-bit x86 version, but that's only because it will -run on the most number of existing Windows environments. - -NetHack's save files and bones files in the 3.6.7 release have not yet -evolved enough to allow them to interchange between the 32-bit version -and the 64-bit version (or between different platforms). Hopefully -that will change in an upcoming release. - -I. Dispelling the Myths: - - Compiling NetHack for Windows is not as easy as it sounds, nor as hard - as it looks, however it will behoove you to read this entire section - through before beginning the task. - - We have provided a Makefile for each of the following compilers: - - o Microsoft Visual Studio 2017 or 2019 C++ Compiler - The Community Editions are fine and available at no cost - o MinGW 2.0 (with GCC 3.2) - - The Microsoft Visual Studio makefile was created for use - with MS NMAKE which is provided with the Microsoft compiler. - The supplied Makefile may work with earlier versions of the Microsoft - compiler, but that has not been tested. - - The GCC Makefile was created for use with GNU Make version 3.79.1, - which comes with the MinGW package. - - You may find it useful to obtain copies of lex (flex) and yacc - (bison, or byacc). While not strictly necessary to compile nethack, - they are required should you desire to make any changes to the level - and dungeon compilers. - -II. To compile your copy of NetHack on a Windows machine: - -Setting Up - -1. It almost goes without saying that you should make sure that your - tools are set up and running correctly. That includes ensuring that - all the necessary environment variables for the compiler environment - are set correctly. - - Change your current directory to the src subfolder of the nethack - source tree. - cd src - - GCC - - For the GCC Makefile, add \bin to your path, where - is your MinGW root directory.). - - Change your current directory to src subfolder of the nethack - source tree. - cd src - -2. Since 3.6.2, the community patch for an optional curses window-port - has been 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/. 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 - 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 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. - - 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. - - (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 - return and line feed pairs used by Windows. Some programs have - trouble with them, so you may need to convert them. The compiler - should not have any problems with them however. - -4. Edit your Makefile if you wish, but it is not required unless - you are altering the build options. - - If you are recompiling after patching your sources, or if you got - your files from somewhere other than the official distribution, - "touch makedefs.c" to ensure that certain files (onames.h and pm.h) - are remade, lest potentially troublesome timestamps fool your make - (or nmake) utility. - -Compiling - -5. Now that everything is set up... - - For the Visual Studio compiler, as mentioned above, you should now be - at the command prompt to carry out the build and your current - directory should be the src subdirectory in the NetHack source tree. - - In the src subdirectory, issue this command: - nmake install - - For GCC: - Change your current directory to the NetHack src directory. - Issue this command: - mingw32-make -f Makefile.gcc install - - If you get any errors along the way then something has not been set - up correctly. The time it takes to compile depends on your - particular machine of course, but you should be able to go for lunch - and return to find everything finished. The less memory, and slower - your machine, the longer the lunch you may take. :-) - - In any case, it is likely that the command prompt window where you - are doing the compiling will be occupied for a while. If all goes - well, you will get an NetHack executable. - -Notes: - -1. To install an update of NetHack after changing something, change - your current directory to src and issue the appropriate command for - your compiler: - - For Microsoft compiler: - nmake - - For GCC: - mingw32-make -f Makefile.gcc - - If you add, delete, or reorder monsters or objects, or you change - the format of saved level files, delete any save and bones files. - (Trying to use such files sometimes produces amusing confusions on - the game's part, but usually crashes.) - - If you made changes to any of the level compiler software, you may - have to delete dgn_flex.c, dgn_yacc.c, lev_flex.c, and lev_yacc.c - from the util directory to ensure that they are remade. - -2. Depending on the build and compiler and tools used above, the - executable produced by the TTY build is either: - - a 32-bit (x86), flat-address space, non-overlayed .exe file, - which should run on any recent Win32 environment. - or - - 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. - -PROBLEMS - - If you discover a bug and wish to report it, or if you have comments - or suggestions we recommend using our "Contact Us" web page at: - http://www.nethack.org/common/contact.html - - If you don't have access to the web, or you want to send us a patch - to the NetHack source code feel free to drop us a line c/o: - DevTeam (at) nethack.org - - Happy NetHacking! diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc deleted file mode 100644 index 5932b2a12..000000000 --- a/sys/winnt/Makefile.gcc +++ /dev/null @@ -1,1764 +0,0 @@ -# NetHack 3.6 Makefile.gcc $NHDT-Date: 1572748375 2019/11/03 02:32:55 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.80 $ -# Copyright (c) 2010 by Michael Allison -# NetHack may be freely redistributed. See license for details. -# -#============================================================================== -# -# Win32 Compilers Tested with this Makefile.gcc: -# mingw-w64 -# from: -# https://sourceforge.net/p/mingw-w64/wiki2/GeneralUsageInstructions/ -# Toolchain for Windows 32-bit target -# -# -#============================================================================== -# This is used for building two versions of NetHack: -# -# A tty port utilizing the Win32 Console I/O subsystem, Console -# NetHack. -# -# A Win32 native port built on the Windows API, Graphical NetHack or -# NetHackW. -# -# In addition to your C compiler, -# -# if you want to change you will need a -# files with suffix workalike for -# .y yacc (such as bison) -# .l lex (such as flex) -# -# If you have any questions read the sys/winnt/Install.nt file included -# with the distribution. -#============================================================================== -# BUILD DECISIONS SECTION -# -# There are currently only 4 decisions that you have to make. -# 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 any optional interfaces in the port? -# 4a) curses -# 4b) Qt -#----------------------------------------------------------------------------------------- -#========================================================================================= - -#============================================================================== -#--------------------------------------------------------------- -# 1. Where do you want the game to be built (which folder)? -# If not present prior to compilation it gets created. -# - -GAMEDIR = ../binary - -# 1. 32-bit or 64-bit? -# - -# -#--------------------------------------------------------------- -# 2. Do you want debug information in the executable? -# - -DEBUGINFO = Y - -# -#--------------------------------------------------------------- -# 3. Do you want to explicitly override auto-detection of a 32-bit -# or 64-bit executable (save files do not interchange currently)? -# -# 64 bit -#TARGET_CPU=x64 -# -# 32 bit -TARGET_CPU=x86 -# -# -#--------------------------------------------------------------- -# 4. Do you want additional GUI interfaces in the executable? -# Make these Y to enable the GUIs. Win32 is always enabled, -# and is the default. -# - -#4a Curses window port support -# -# -# 4. Uncomment these and set them appropriately if you want to -# include curses port support alongside TTY support in your -# 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 which must already be resident on -# your machine. -# -# ADD_CURSES=Y -# PDCURSES_TOP=../../pdcurses - -#4b Qt -# -#WANT_WIN_QT4 = N - -# WANT_WIN_QT4 requires Qt 4 or Qt 5, see -# https://www.qt.io/download-open-source/ -# Earlier versions of Qt are not compatible with Windows -# For Qt 5, use: -# -#QT4_DIRECTORY = c:/Qt/Qt5.9.2/5.9.2/mingw53_32 -#HAVE_QT5 = Y - -# For Qt 4, comment out the above two lines and use: -# -#QT4_DIRECTORY = c:/Qt/4.8.6 -#HAVE_QT5 = N - -# -# Note that additional GUI interfaces may require external libraries. -# Qt is placed where the official installer places it. -# Other libraries are placed in a subdirectory of your home directory, either -# x86libs or x64libs depending on whether you're building for 64 bits. -# - -# -#============================================================================== -# This marks the end of the BUILD DECISIONS section. -#============================================================================== -# -#=============================================== -#======= End of Modification Section =========== -#=============================================== -# -################################################ -# # -# Nothing below here should have to be changed.# -# # -################################################ -# -#============================================================================== - -SKIP_NETHACKW=Y - -#============================================================================== - -# The version of the game this Makefile was designed for -NETHACK_VERSION="3.6.6" - -# A brief version for use in macros -NHV1=$(subst .,,$(NETHACK_VERSION)) -NHV=$(subst ",,$(NHV1)) - -# -# Source directories. Makedefs hardcodes these, don't change them. -# - -# INCL - NetHack include files -# DAT - NetHack data files -# DOC - NetHack documentation files -# UTIL - Utility source -# SRC - Main source -# SSYS - Shared system files -# MSWSYS - mswin specific files -# TTY - window port files (tty) -# MSWIN - window port files (win32) -# WCURSES - window port files (curses) -# WSHR - Tile support files - -INCL =../include -DAT =../dat -DOC =../doc -UTIL =../util -SRC =../src -SSYS =../sys/share -MSWSYS =../sys/winnt -TTY =../win/tty -MSWIN =../win/win32 -WCURSES =../win/curses -WSHR =../win/share - -# -# Object directory. -# - -OBJ = o - -# -# Optional high-quality BSD random number generation routines -# (see pcconf.h). Set to nothing if not used. -# - -RANDOM = $(OBJ)/random.o -#RANDOM = -BCRYPT=-lbcrypt - -WINPFLAG = -DTILES -DMSWIN_GRAPHICS -DWIN32CON -D_WIN32_IE=0x0400 -D_WIN32_WINNT=0x0601 -DWINVER=0x0601 -ifeq "$(WANT_WIN_QT4)" "Y" - WINPFLAG += -DQT_GRAPHICS -DPIXMAPDIR='"."' -endif -# To store all the level files, -# help files, etc. in a single library file. -# USE_DLB = Y is left uncommented - -USE_DLB = Y - -ifeq "$(USE_DLB)" "Y" -DLBFLG = -DDLB -else -DLBFLG = -endif - -# -# If you defined ZLIB_COMP in include/config.h and you need -# to link with the zlib.lib library, uncomment the line below. -# If necessary, prefix explicit path information to the file name -# otherwise it assumes the NetHack src directory. -# - -#ZLIB = zlib.lib - -# Have windows path styles available for use in commands -W_OBJ =$(subst /,\, $(OBJ)) -W_INCL =$(subst /,\, $(INCL)) -W_DAT =$(subst /,\, $(DAT)) -W_DOC =$(subst /,\, $(DOC)) -W_UTIL =$(subst /,\, $(UTIL)) -W_SRC =$(subst /,\, $(SRC)) -W_SSYS =$(subst /,\, $(SSYS)) -W_MSWSYS =$(subst /,\, $(MSWSYS)) -W_TTY =$(subst /,\, $(TTY)) -W_MSWIN =$(subst /,\, $(MSWIN)) -W_WCURSES =$(subst /,\, $(WCURSES)) -W_WSHR =$(subst /,\, $(WSHR)) -W_GAMEDIR =$(subst /,\, $(GAMEDIR)) - -#========================================== -#================ MACROS ================== -#========================================== -# This section creates shorthand macros for many objects -# referenced later on in the Makefile. -# - -DEFFILE = $(MSWSYS)/$(GAME).def - -# -# Shorten up the location for some files -# - -O = $(OBJ)/ - -U = $(UTIL)/ - -# -# Utility Objects. -# - -MAKESRC = $(U)makedefs.c - -SPLEVSRC = $(U)lev_yacc.c $(U)lev_lex.c $(U)lev_main.c $(U)panic.c - -DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_lex.c $(U)dgn_main.c - -MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o - -LEVCOMPOBJS = $(O)lev_yacc.o $(O)lev_lex.o $(O)lev_main.o \ - $(O)alloc.o $(O)decl.o $(O)drawing.o \ - $(O)monst.o $(O)objects.o $(O)panic.o - -DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_lex.o $(O)dgn_main.o \ - $(O)alloc.o $(O)panic.o - -RECOVOBJS = $(O)recover.o - -TILEFILES = $(WSHR)/monsters.txt $(WSHR)/objects.txt $(WSHR)/other.txt - -# -# These are not invoked during a normal game build in 3.4+ -# -TEXT_IO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o - -TEXT_IO32 = $(O)tilete32.o $(O)tiletx32.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o - -GIFREADERS = $(O)gifread.o $(O)alloc.o $(O)panic.o -GIFREADERS32 = $(O)gifrd32.o $(O)alloc.o $(O)panic.o - -PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o - -# -# Object files for the game itself. -# - -VOBJ01 = $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o -VOBJ02 = $(O)attrib.o $(O)ball.o $(O)bones.o $(O)botl.o -VOBJ03 = $(O)cmd.o $(O)dbridge.o $(O)decl.o $(O)detect.o -VOBJ04 = $(O)dig.o $(O)display.o $(O)do.o $(O)do_name.o -VOBJ05 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o -VOBJ06 = $(O)dothrow.o $(O)drawing.o $(O)dungeon.o $(O)eat.o -VOBJ07 = $(O)end.o $(O)engrave.o $(O)exper.o $(O)explode.o -VOBJ08 = $(O)extralev.o $(O)files.o $(O)fountain.o $(O)hack.o -VOBJ09 = $(O)hacklib.o $(O)invent.o $(O)light.o $(O)lock.o -VOBJ10 = $(O)mail.o $(O)makemon.o $(O)mapglyph.o $(O)isaac64.o -VOBJ11 = $(O)mcastu.o $(O)mhitm.o $(O)mhitu.o $(O)minion.o -VOBJ12 = $(O)mklev.o $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o -VOBJ13 = $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o -VOBJ14 = $(O)monst.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o -VOBJ15 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o -VOBJ16 = $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o -VOBJ17 = $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o -VOBJ18 = $(O)quest.o $(O)questpgr.o $(RANDOM) $(O)read.o -VOBJ19 = $(O)rect.o $(O)region.o $(O)restore.o $(O)rip.o -VOBJ20 = $(O)rnd.o $(O)role.o $(O)rumors.o $(O)save.o -VOBJ21 = $(O)shk.o $(O)shknam.o $(O)sit.o $(O)sounds.o -VOBJ22 = $(O)sp_lev.o $(O)spell.o $(O)steal.o $(O)steed.o -VOBJ23 = $(O)sys.o $(O)teleport.o $(O)timeout.o $(O)topten.o -VOBJ24 = $(O)track.o $(O)trap.o $(O)u_init.o $(O)uhitm.o -VOBJ25 = $(O)vault.o $(O)vis_tab.o $(O)vision.o $(O)weapon.o -VOBJ26 = $(O)were.o $(O)wield.o $(O)windows.o $(O)wizard.o -VOBJ27 = $(O)worm.o $(O)worn.o $(O)write.o $(O)zap.o -#VOBJ28 = $(O)win10.o - -DLBOBJ = $(O)dlb.o - -REGEX = $(O)cppregex.o - -TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o - -ifeq "$(ADD_CURSES)" "Y" -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 -else -CURSESOBJ= -endif - -SOBJ = $(O)windmain.o $(O)winnt.o $(O)win10.o \ - $(O)safeproc.o $(O)nhlan.o $(SOUND) - -OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ - $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ - $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ - $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ - $(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \ - $(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29) $(REGEX) \ - $(CURSESOBJ) - -ifneq "$(SKIP_NETHACKW)" "Y" -GUIOBJ = $(O)mhaskyn.o $(O)mhdlg.o \ - $(O)mhfont.o $(O)mhinput.o $(O)mhmain.o $(O)mhmap.o \ - $(O)mhmenu.o $(O)mhmsgwnd.o $(O)mhrip.o $(O)mhsplash.o \ - $(O)mhstatus.o $(O)mhtext.o $(O)mswproc.o $(O)NetHackW.o - -endif - -ifeq "$(WANT_WIN_QT4)" "Y" - GUIOBJ += $(O)qt4bind.o $(O)qt4click.o $(O)qt4clust.o $(O)qt4delay.o \ - $(O)qt4glyph.o $(O)qt4icon.o $(O)qt4inv.o $(O)qt4key.o $(O)qt4line.o \ - $(O)qt4main.o $(O)qt4map.o $(O)qt4menu.o $(O)qt4msg.o $(O)qt4plsel.o \ - $(O)qt4rip.o $(O)qt4set.o $(O)qt4stat.o $(O)qt4str.o $(O)qt4streq.o \ - $(O)qt4svsel.o $(O)qt4win.o $(O)qt4xcmd.o $(O)qt4yndlg.o -endif - -ifneq "$(SKIP_NETHACKW)" "Y" -GUIHDR = $(MSWIN)/mhaskyn.h $(MSWIN)/mhdlg.h $(MSWIN)/mhfont.h \ - $(MSWIN)/mhinput.h $(MSWIN)/mhmain.h $(MSWIN)/mhmap.h \ - $(MSWIN)/mhmenu.h $(MSWIN)/mhmsg.h $(MSWIN)/mhmsgwnd.h \ - $(MSWIN)/mhrip.h $(MSWIN)/mhstatus.h \ - $(MSWIN)/mhtext.h $(MSWIN)/resource.h $(MSWIN)/winMS.h -endif - -ifeq "$(WANT_WIN_QT4)" "Y" - GUIHDR += $(QT4)/qt4bind.h $(QT4)/qt4click.h $(QT4)/qt4clust.h \ - $(QT4)/qt4delay.h $(QT4)/qt4glyph.h $(QT4)/qt4icon.h $(QT4)/qt4inv.h \ - $(QT4)/qt4kde0.h $(QT4)/qt4key.h $(QT4)/qt4line.h $(QT4)/qt4main.h \ - $(QT4)/qt4map.h $(QT4)/qt4menu.h $(QT4)/qt4msg.h $(QT4)/qt4plsel.h \ - $(QT4)/qt4rip.h $(QT4)/qt4set.h $(QT4)/qt4stat.h $(QT4)/qt4str.h \ - $(QT4)/qt4streq.h $(QT4)/qt4svsel.h $(QT4)/qt4win.h $(QT4)/qt4xcmd.h \ - $(QT4)/qt4yndlg.h -endif - -COMCTRL = comctl32.lib - -KEYDLLS = $(GAMEDIR)/nhdefkey.dll $(GAMEDIR)/nh340key.dll \ - $(GAMEDIR)/nhraykey.dll - -TILEUTIL16 = $(UTIL)/tile2bmp.exe -TILEBMP16 = $(SRC)/tiles.bmp - -TILEUTIL32 = $(UTIL)/til2bm32.exe -TILEBMP32 = $(SRC)/tiles32.bmp - -SOUND = $(OBJ)/ntsound.o -#SOUND = - -VVOBJ = $(O)version.o - -ALLOBJ = $(SOBJ) $(DLBOBJ) $(WOBJ) $(OBJS) $(VVOBJ) - -OPTIONS_FILE = $(DAT)\options - -ifeq "$(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) -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)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)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 - -PDCLIB = $(O)pdcurses.a - -PDCINCL = -I$(PDCURSES_TOP) -I$(PDCSRC) -I$(PDCWINCON) -else -PDCLIB = -endif - -#========================================== -# Header file macros -#========================================== - -CONFIG_H = $(INCL)/config.h $(INCL)/config1.h $(INCL)/tradstdc.h \ - $(INCL)/global.h $(INCL)/coord.h $(INCL)/vmsconf.h \ - $(INCL)/system.h $(INCL)/unixconf.h $(INCL)/os2conf.h \ - $(INCL)/micro.h $(INCL)/pcconf.h $(INCL)/tosconf.h \ - $(INCL)/amiconf.h $(INCL)/macconf.h $(INCL)/beconf.h \ - $(INCL)/ntconf.h - -HACK_H = $(INCL)/hack.h $(CONFIG_H) $(INCL)/align.h $(INCL)/context.h \ - $(INCL)/dungeon.h $(INCL)/monsym.h $(INCL)/mkroom.h \ - $(INCL)/objclass.h $(INCL)/youprop.h $(INCL)/prop.h \ - $(INCL)/permonst.h $(INCL)/monattk.h \ - $(INCL)/monflag.h $(INCL)/mondata.h $(INCL)/pm.h \ - $(INCL)/wintype.h $(INCL)/decl.h $(INCL)/quest.h \ - $(INCL)/spell.h $(INCL)/color.h $(INCL)/obj.h \ - $(INCL)/you.h $(INCL)/attrib.h $(INCL)/monst.h $(INCL)/lint.h \ - $(INCL)/mextra.h $(INCL)/skills.h $(INCL)/onames.h \ - $(INCL)/timeout.h $(INCL)/trap.h $(INCL)/flag.h $(INCL)/rm.h \ - $(INCL)/vision.h $(INCL)/display.h $(INCL)/engrave.h \ - $(INCL)/rect.h $(INCL)/region.h $(INCL)/winprocs.h \ - $(INCL)/wintty.h $(INCL)/sys.h $(INCL)/trampoli.h - -LEV_H = $(INCL)/lev.h -DGN_FILE_H = $(INCL)/dgn_file.h -LEV_COMP_H = $(INCL)/lev_comp.h -SP_LEV_H = $(INCL)/sp_lev.h -TILE_H = ../win/share/tile.h - -#========================================== -# Miscellaneous -#========================================== - -DATABASE = $(DAT)/data.base - -#========================================== -# More compiler setup macros -#========================================== -# -ifeq "$(ADD_CURSES)" "Y" -CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" -else -CURSDEF= -CURSESLIB= -endif - -ifneq "$(ADD_CURSES)" "Y" -INCLDIR=-I../include -I../sys/winnt -else -INCLDIR=-I../include -I../sys/winnt -endif - -#========================================== -#========================================== -# Setting up the compiler and linker -# macros. All builds include the base ones. -#========================================== -#========================================== - -ifndef TRAVIS_COMPILER -cc = i686-w64-mingw32-gcc.exe -cxx = g++ -rc = windres -link = i686-w64-mingw32-gcc.exe -else -cc = gcc -cxx = g++ -rc = windres -link = gcc -endif - -ifeq "$(WANT_WIN_QT4)" "Y" - link = g++ -endif - -cflags = -mms-bitfields $(INCLDIR) -lflags = -ifeq "$(DEBUGINFO)" "Y" -cdebug = -g -linkdebug = -g -else -cdebug = -linkdebug = -endif - -CFLAGSBASE = -c $(cflags) $(WINPINC) $(cdebug) $(CURSESDEF) -#LFLAGSBASEC = $(linkdebug) -#LFLAGSBASEG = $(linkdebug) -mwindows -baselibs = -lwinmm -lshell32 -lole32 -luuid -conlibs = -lgdi32 $(baselibs) $(BCRYPT) -guilibs = -lcomctl32 $(baselibs) -ifeq "$(WANT_WIN_QT4)" "Y" - # Might be either Qt 4 or Qt 5 - ifeq "$(HAVE_QT5)" "Y" - guilibs += $(QT4_DIRECTORY)/lib/libQt5Core.a - guilibs += $(QT4_DIRECTORY)/lib/libQt5Gui.a - guilibs += $(QT4_DIRECTORY)/lib/libQt5Widgets.a - conlibs += $(QT4_DIRECTORY)/lib/libQt5Core.a - else - guilibs += $(QT4_DIRECTORY)/lib/libQtCore4.a - guilibs += $(QT4_DIRECTORY)/lib/libQtGui4.a - conlibs += $(QT4_DIRECTORY)/lib/libQtCore4.a - endif -endif - -#========================================== -# Extra files needed for some ports -#========================================== -EXTRA_FILES = -ifeq "$(WANT_WIN_QT4)" "Y" - ifeq "$(HAVE_QT5)" "Y" - EXTRA_FILES += $(GAMEDIR)/Qt5Core.dll - EXTRA_FILES += $(GAMEDIR)/Qt5Gui.dll - EXTRA_FILES += $(GAMEDIR)/Qt5Widgets.dll - else - # TODO: define QT 4 DLLs here - EXTRA_FILES += $(GAMEDIR)/QtCore4.dll - EXTRA_FILES += $(GAMEDIR)/QtGui4.dll - endif - EXTRA_FILES += $(GAMEDIR)/rip.xpm -endif - -#========================================== -# Util builds -#========================================== - -CFLAGSU = $(CFLAGSBASE) $(WINPFLAG) $(DLBFLG) -LFLAGSU = $(LFLAGSBASEC) - -#========================================== -# - Game build -#========================================== - -CFLAGS = $(CFLAGSBASE) $(WINPFLAG) $(DLBFLG) -DSAFEPROCS -lflags = $(LFLAGSBASEC) $(linkdebuf) - -CXXFLAGS = $(CFLAGS) - -ifeq "$(USE_DLB)" "Y" -DLB = nhdat$(NHV) -else -DLB = -endif - -#========================================== -#================ RULES ================== -#========================================== - -.SUFFIXES: .exe .o .til .uu .c .y .l .moc - -#========================================== -# Rules for files in src -#========================================== - -$(OBJ)/%.o : /%.c - $(cc) $(CFLAGS) -o$@ $< - -$(OBJ)/%.o : $(SRC)/%.c - $(cc) $(CFLAGS) -o$@ $< - -#========================================== -# Rules for files in sys/share -#========================================== - -$(OBJ)/%.o : $(SSYS)/%.c - $(cc) $(CFLAGS) -o$@ $< - -$(OBJ)/%.o : $(SSYS)/%.cpp - $(cxx) $(CXXFLAGS) -std=c++11 -o$@ $< - -#========================================== -# Rules for files in sys/winnt -#========================================== - -$(OBJ)/%.o : $(MSWSYS)/%.c - $(cc) $(CFLAGS) -o$@ $< - -#========================================== -# Rules for files in util -#========================================== - -$(OBJ)/%.o : $(UTIL)/%.c - $(cc) $(CFLAGSU) -o$@ $< - -#========================================== -# Rules for files in win/share -#========================================== - -$(OBJ)/%.o : $(WSHR)/%.c - $(cc) $(CFLAGS) -o$@ $< - -#$(INCL)/%.h : $(WSHR)/%.h -# @copy $< $@ - -#{$(WSHR)}.txt{$(DAT)}.txt: -# @copy $< $@ - -#========================================== -# Rules for files in win/tty -#========================================== - -$(OBJ)/%.o : $(TTY)/%.c - $(cc) $(CFLAGS) -o$@ $< - -#========================================== -# Rules for files in win/win32 -#========================================== - -$(OBJ)/%.o : $(MSWIN)/%.c - $(cc) $(CFLAGS) -o$@ $< - -#========================================== -# Rules for files in win/curses -#========================================== - -$(OBJ)/%.o : $(WCURSES)/%.c - $(cc) -DPDC_NCMOUSE $(PDCINCL) $(CFLAGS) -o$@ $< - -#========================================== -# Rules for files in PDCurses -#========================================== - -$(OBJ)/%.o : $(PDCURSES_TOP)/%.c - $(cc) $(PDCINCL) $(CFLAGS) -o$@ $< - -$(OBJ)/%.o : $(PDCSRC)/%.c - $(cc) $(PDCINCL) $(CFLAGS) -o$@ $< - -$(OBJ)/%.o : $(PDCWINCON)/%.c - $(cc) $(PDCINCL) $(CFLAGS) -o$@ $< - -#========================================== -# Level Compiler Info -#========================================== - -# Yacc/Lex ... if you got 'em. -# -# If you have yacc and lex programs (or work-alike such as bison -# and flex), comment out the upper two macros and uncomment -# the lower two. -# - -DO_YACC = YACC_MSG -DO_LEX = LEX_MSG -#DO_YACC = YACC_ACT -#DO_LEX = LEX_ACT - -# - Specify your yacc and lex programs (or work-alikes) here. - -#YACC = bison -y -#YACC = byacc -#YACC = yacc -YACC= - -#LEX = lex -#LEX = flex -LEX= - -# -# - Specify your flex skeleton file (if needed). -# - -FLEXSKEL = -#FLEXSKEL = -S../tools/flex.ske - -YTABC = y_tab.c -YTABH = y_tab.h -LEXYYC = lexyy.c - -export YACC -export LEX -export FLEXSKEL -export YTABC -export YTABH -export LEXYYC - -#========================================== -# Rules for files in win/Qt4 -#========================================== - -ifeq "$(HAVE_QT5)" "Y" -QT4_CXXFLAGS = -std=c++11 -else -QT4_CXXFLAGS = -endif -$(OBJ)/%.o : $(QT4)/%.cpp - $(cxx) $(CXXFLAGS) $(QT4_CXXFLAGS) -I$(MSWIN) -I$(QT4_DIRECTORY)/include -o$@ $< - -$(QT4)/%.moc : $(QT4)/%.h - $(QT4_DIRECTORY)\bin\moc -o $@ $< - -ifeq "$(SKIP_NETHACKW)" "Y" -NETHACKW_EXE = -else -NETHACKW_EXE = $(GAMEDIR)/NetHack.exe -endif - -SHELL=CMD.EXE - -#========================================== -#=============== TARGETS ================== -#========================================== - -# Since DOS doesn't allow / as path separator, and GCC doesn't allow \ as -# path separator, we must change all pathnames when performing DOS commands. -# This is done by blindly applying $(subst /,\, ...) on every command. -# Where any command contain / for another reason (switch char, or echoing -# comment lines to lev/dungeon files) a little more care is taken. - -# -# The default make target (so just typing 'nmake' is useful). -# -default : install - -# -# Everything -# - -all : install - -install: initialchk $(O)utility.tag $(GAMEDIR)/NetHack.exe $(NETHACKW_EXE) \ - $(O)install.tag $(EXTRA_FILES) - @echo NetHack is up to date. - @echo Done. - -$(O)install.tag: $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ - $(DAT)/oracles $(DAT)/quest.dat $(O)sp_lev.tag $(DLB) -ifdef TRAVIS_COMPILER - ls -l $(SRC) - ls -l $(DAT) - ls -l $(UTIL) -endif -ifeq "$(USE_DLB)" "Y" - $(subst /,\,copy nhdat$(NHV) $(GAMEDIR)) - $(subst /,\,copy $(DAT)/license $(GAMEDIR)) - $(subst /,\,copy $(DAT)/opthelp $(GAMEDIR)) -else - $(subst /,\,copy $(DAT)/*. $(GAMEDIR)) - $(subst /,\,copy $(DAT)/*.dat $(GAMEDIR)) - $(subst /,\,copy $(DAT)/*.lev $(GAMEDIR)) - $(subst /,\,if exist $(GAMEDIR)/makefile del $(GAMEDIR)/makefile) -endif - $(subst /,\,if exist $(MSWSYS)/sysconf.template copy $(MSWSYS)/sysconf.template $(GAMEDIR)) - $(subst /,\,if exist $(DAT)/symbols copy $(DAT)/symbols $(GAMEDIR)/symbols.template) - $(subst /,\,if exist $(DOC)/guidebook.txt copy $(DOC)/guidebook.txt $(GAMEDIR)/Guidebook.txt) - $(subst /,\,if exist $(DOC)/nethack.txt copy $(DOC)/nethack.txt $(GAMEDIR)/NetHack.txt) - $(subst /,\,if exist $(MSWSYS)/.nethackrc.template copy $(MSWSYS)/.nethackrc.template $(GAMEDIR)) - $(subst /,\,-if not exist $(GAMEDIR)/record. echo.>$(GAMEDIR)/record.) -# -# - $(subst /,\,echo install done > $@) - -# copy $(MSWSYS)/winnt.hlp $(GAMEDIR) - -recover: $(U)recover.exe - $(subst /,\,if exist $(U)recover.exe copy $(U)recover.exe $(GAMEDIR)) - $(subst /,\,if exist $(DOC)/recover.txt copy $(DOC)/recover.txt $(GAMEDIR)/recover.txt) - -$(O)sp_lev.tag: $(O)utility.tag $(DAT)/bigroom.des $(DAT)/castle.des \ - $(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des \ - $(DAT)/medusa.des $(DAT)/oracle.des $(DAT)/tower.des \ - $(DAT)/yendor.des $(DAT)/arch.des $(DAT)/barb.des \ - $(DAT)/caveman.des $(DAT)/healer.des $(DAT)/knight.des \ - $(DAT)/monk.des $(DAT)/priest.des $(DAT)/ranger.des \ - $(DAT)/rogue.des $(DAT)/samurai.des $(DAT)/sokoban.des \ - $(DAT)/tourist.des $(DAT)/valkyrie.des $(DAT)/wizard.des - $(subst /,\,$(U)levcomp $(DAT)/bigroom.des) - $(subst /,\,$(U)levcomp $(DAT)/castle.des) - $(subst /,\,$(U)levcomp $(DAT)/endgame.des) - $(subst /,\,$(U)levcomp $(DAT)/gehennom.des) - $(subst /,\,$(U)levcomp $(DAT)/knox.des) - $(subst /,\,$(U)levcomp $(DAT)/mines.des) - $(subst /,\,$(U)levcomp $(DAT)/medusa.des) - $(subst /,\,$(U)levcomp $(DAT)/oracle.des) - $(subst /,\,$(U)levcomp $(DAT)/sokoban.des) - $(subst /,\,$(U)levcomp $(DAT)/tower.des) - $(subst /,\,$(U)levcomp $(DAT)/yendor.des) - $(subst /,\,$(U)levcomp $(DAT)/arch.des) - $(subst /,\,$(U)levcomp $(DAT)/barb.des) - $(subst /,\,$(U)levcomp $(DAT)/caveman.des) - $(subst /,\,$(U)levcomp $(DAT)/healer.des) - $(subst /,\,$(U)levcomp $(DAT)/knight.des) - $(subst /,\,$(U)levcomp $(DAT)/monk.des) - $(subst /,\,$(U)levcomp $(DAT)/priest.des) - $(subst /,\,$(U)levcomp $(DAT)/ranger.des) - $(subst /,\,$(U)levcomp $(DAT)/rogue.des) - $(subst /,\,$(U)levcomp $(DAT)/samurai.des) - $(subst /,\,$(U)levcomp $(DAT)/tourist.des) - $(subst /,\,$(U)levcomp $(DAT)/valkyrie.des) - $(subst /,\,$(U)levcomp $(DAT)/wizard.des) - $(subst /,\,copy *.lev $(DAT)) - $(subst /,\,del *.lev) - $(subst /,\,echo sp_levs done > $(O)sp_lev.tag) - -$(O)utility.tag: $(INCL)/date.h $(INCL)/onames.h $(INCL)/pm.h \ - $(SRC)/vis_tab.c $(U)levcomp.exe $(INCL)/vis_tab.h \ - $(U)dgncomp.exe $(TILEUTIL16) - $(subst /,\,@echo utilities made >$@) - @echo utilities made. - -tileutil: $(U)gif2txt.exe $(U)gif2tx32.exe $(U)txt2ppm.exe - @echo Optional tile development utilities are up to date. - -$(O)winres.o: $(TILEBMP16) $(MSWIN)/NetHackW.rc $(MSWIN)/mnsel.bmp \ - $(MSWIN)/mnselcnt.bmp $(MSWIN)/mnunsel.bmp \ - $(MSWIN)/petmark.bmp $(MSWIN)/pilemark.bmp $(MSWIN)/NetHack.ico $(MSWIN)/rip.bmp \ - $(MSWIN)/splash.bmp - $(rc) -o$@ --include-dir $(MSWIN) -i $(MSWIN)/NetHackW.rc - -$(O)conres.o: $(MSWSYS)/console.rc $(MSWSYS)/NetHack.ico - $(rc) -o$@ --include-dir $(MSWSYS) -i $(MSWSYS)/console.rc - -#========================================== -# The game targets. -#========================================== - -gamedir.tag: - test -d $(GAMEDIR) || echo creating directory $(W_GAMEDIR) - test -d $(GAMEDIR) || mkdir $(W_GAMEDIR) - test -d $(GAMEDIR) && echo directory created > $@ - -$(GAMEDIR)/NetHack.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)nttty.o $(O)guistub.o \ - $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)conres.o $(KEYDLLS) - @echo Linking $@... - $(link) $(lflags) -o$@ $(ALLOBJ) $(TTYOBJ) $(O)nttty.o $(O)tile.o \ - $(O)guistub.o $(O)conres.o $(PDCLIB) $(conlibs) -static -lstdc++ - $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) - -# NetHackW -# full tty linkage libs: -# libs: $(LIBS) $(guilibs) $(COMCTRL) -# objs: $(GAMEOBJ) $(GUIOBJ) $(TTYOBJ) $(O)tile.o $(O)nttty.o -# otherwise: -# libs: $(LIBS) $(guilibs) $(COMCTRL) -# objs: $(GAMEOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o - -ifneq "$(SKIP_NETHACKW)" "Y" -$(GAMEDIR)/NetHackW.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)ttystub.o \ - $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)winres.o $(KEYDLLS) - @echo Linking $@... - $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o \ - $(O)winres.o $(PDCLIB) $(guilibs) -static -lstdc++ - $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) -endif - -$(O)nhdefkey.o: - $(cc) $(CFLAGS) -DBUILD_DLL -o$@ $(MSWSYS)/nhdefkey.c - -$(GAMEDIR)/nhdefkey.dll : $(O)nhdefkey.o gamedir.tag - @echo Linking $@ - $(cc) -shared -Wl,--export-all-symbols \ - -Wl,--add-stdcall-alias -o $@ $< - -$(O)nh340key.o: - $(cc) $(CFLAGS) -DBUILD_DLL -o$@ $(MSWSYS)/nh340key.c - -$(GAMEDIR)/nh340key.dll : $(O)nh340key.o gamedir.tag - @echo Linking $@ - $(cc) -shared -Wl,--export-all-symbols \ - -Wl,--add-stdcall-alias -o $@ $< - -$(O)nhraykey.o: - $(cc) $(CFLAGS) -DBUILD_DLL -o$@ $(MSWSYS)/nhraykey.c - -$(GAMEDIR)/nhraykey.dll : $(O)nhraykey.o gamedir.tag - @echo Linking $@ - $(cc) -shared -Wl,--export-all-symbols \ - -Wl,--add-stdcall-alias -o $@ $< - -$(GAME)_.ico : $(MSWSYS)/$(GAME).ico - $(subst /,\,@copy $(MSWSYS)/$(GAME).ico $@) - -#========================================== -# Create directory for holding object files -#========================================== - -initialchk: objdir.tag - @echo ---- - @echo NOTE: This build will include tile support. - @echo ---- - -objdir.tag: - @test -d $(OBJ) || echo creating directory $(OBJ) - @test -d $(OBJ) || mkdir $(OBJ) - @test -d $(OBJ) && echo directory created > $@ - -#========================================== -#=========== SECONDARY TARGETS ============ -#========================================== - -#========================================== -# Makedefs Stuff -#========================================== - -$(U)makedefs.exe: $(MAKEOBJS) - $(link) $(LFLAGSU) -o$@ $(MAKEOBJS) - -$(O)makedefs.o: $(CONFIG_H) $(INCL)/monattk.h $(INCL)/monflag.h \ - $(INCL)/objclass.h $(INCL)/monsym.h $(INCL)/qtext.h \ - $(INCL)/patchlevel.h $(U)makedefs.c - $(cc) $(CFLAGSU) -o$@ $(U)makedefs.c - -# -# date.h should be remade every time any of the source or include -# files is modified. -# - -$(INCL)/date.h $(OPTIONS_FILE): $(U)makedefs.exe - $(subst /,\,$(U)makedefs -v) - -$(INCL)/onames.h : $(U)makedefs.exe - $(subst /,\,$(U)makedefs -o) - -$(INCL)/pm.h : $(U)makedefs.exe - $(subst /,\,$(U)makedefs -p) - -$(INCL)/vis_tab.h: $(U)makedefs.exe - $(subst /,\,$(U)makedefs -z) - -$(SRC)/vis_tab.c: $(U)makedefs.exe - $(subst /,\,$(U)makedefs -z) - -$(DAT)/data: $(O)utility.tag $(DATABASE) - $(subst /,\,$(U)makedefs -d) - -$(DAT)/rumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal - $(subst /,\,$(U)makedefs -r) - -$(DAT)/quest.dat: $(O)utility.tag $(DAT)/quest.txt - $(subst /,\,$(U)makedefs -q) - -$(DAT)/oracles: $(O)utility.tag $(DAT)/oracles.txt - $(subst /,\,$(U)makedefs -h) - -$(DAT)/engrave: $(DAT)/engrave.txt $(U)makedefs.exe - $(subst /,\,$(U)makedefs -s) - -$(DAT)/epitaph: $(DAT)/epitaph.txt $(U)makedefs.exe - $(subst /,\,$(U)makedefs -s) - -$(DAT)/bogusmon: $(DAT)/bogusmon.txt $(U)makedefs.exe - $(subst /,\,$(U)makedefs -s) - -$(DAT)/dungeon: $(O)utility.tag $(DAT)/dungeon.def - $(subst /,\,$(U)makedefs -e) - $(subst /,\,$(U)dgncomp $(DAT)/dungeon.pdf) - -#========================================== -# uudecode utility and uuencoded targets -#========================================== - -$(U)uudecode.exe: $(O)uudecode.o - $(link) $(LFLAGSU) -o$@ $(O)uudecode.o - -$(O)uudecode.o: $(SSYS)/uudecode.c - -$(MSWSYS)/NetHack.ico : $(U)uudecode.exe $(MSWSYS)/nhico.uu - $(subst /,\,$(U)uudecode.exe $(MSWSYS)/nhico.uu) - copy NetHack.ico $(W_MSWSYS)\NetHack.ico - del NetHack.ico - -$(MSWIN)/NetHack.ico : $(MSWSYS)/NetHack.ico - $(subst /,\,copy $< $@) - -$(MSWIN)/mnsel.bmp: $(U)uudecode.exe $(MSWIN)/mnsel.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/mnsel.uu) - $(subst /,\,copy mnsel.bmp $@) - del mnsel.bmp - -$(MSWIN)/mnselcnt.bmp: $(U)uudecode.exe $(MSWIN)/mnselcnt.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/mnselcnt.uu) - $(subst /,\,copy mnselcnt.bmp $@) - del mnselcnt.bmp - -$(MSWIN)/mnunsel.bmp: $(U)uudecode.exe $(MSWIN)/mnunsel.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/mnunsel.uu) - $(subst /,\,copy mnunsel.bmp $@) - del mnunsel.bmp - -$(MSWIN)/petmark.bmp: $(U)uudecode.exe $(MSWIN)/petmark.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/petmark.uu) - $(subst /,\,copy petmark.bmp $@) - del petmark.bmp - -$(MSWIN)/pilemark.bmp: $(U)uudecode.exe $(MSWIN)/pilemark.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/pilemark.uu) - $(subst /,\,copy pilemark.bmp $@) - del pilemark.bmp - -$(MSWIN)/rip.bmp: $(U)uudecode.exe $(MSWIN)/rip.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/rip.uu) - $(subst /,\,copy rip.bmp $@) - del rip.bmp - -$(MSWIN)/splash.bmp: $(U)uudecode.exe $(MSWIN)/splash.uu - $(subst /,\,$(U)uudecode.exe $(MSWIN)/splash.uu) - $(subst /,\,copy splash.bmp $@) - del splash.bmp - - -#========================================== -# Level Compiler Stuff -#========================================== - -LEVCFLAGS=$(cflags) -c -DWIN32 -D_WIN32 -I../include $(cdebug) -DDLB - -$(U)lev_yacc.c: $(U)lev_comp.y - mingw32-make -C ../util -f ../win/win32/levstuff-mingw32.mak $(U)lev_yacc.c - -$(U)lev_lex.c: $(HACK_H) $(U)lev_comp.l - mingw32-make -C ../util -f ../win/win32/levstuff-mingw32.mak $(U)lev_lex.c - -$(INCL)/lev_comp.h: - mingw32-make -C ../include -f ../win/win32/levstuff-mingw32.mak $(INCL)/lev_comp.h - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h $(U)lev_yacc.c - $(cc) $(LEVCFLAGS) -o$@ $(U)lev_yacc.c - -$(O)lev_lex.o: $(HACK_H) $(INCL)/lev_comp.h $(SP_LEV_H) $(U)lev_lex.c - $(cc) $(LEVCFLAGS) -o$@ $(U)lev_lex.c - -$(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) - $(cc) $(LEVCFLAGS) -o$@ $(U)lev_main.c - -$(U)levcomp.exe: $(LEVCOMPOBJS) - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(LEVCOMPOBJS) - -#========================================== -# Dungeon Compiler Stuff -#========================================== -$(U)dgn_yacc.c: $(U)dgn_comp.y - mingw32-make -C ../util -f ../win/win32/dgnstuff-mingw32.mak $(U)dgn_yacc.c - -$(INCL)/dgn_comp.h: - mingw32-make -C ../include -f ../win/win32/dgnstuff-mingw32.mak $(INCL)/dgn_comp.h - -$(U)dgn_lex.c: $(U)dgn_comp.l - mingw32-make -C ../util -f ../win/win32/dgnstuff-mingw32.mak $(U)dgn_lex.c - -$(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)/dgn_comp.h $(U)dgn_yacc.c - $(cc) $(LEVCFLAGS) -o$@ $(U)dgn_yacc.c - -$(O)dgn_lex.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_lex.c - $(cc) $(LEVCFLAGS) -o$@ $(U)dgn_lex.c - -$(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c - $(cc) $(LEVCFLAGS) -o$@ $(U)dgn_main.c - -$(U)dgncomp.exe: $(DGNCOMPOBJS) - @echo Linking $@... - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(DGNCOMPOBJS) - -#================================================= -# For a couple of devteam utilities -#================================================= - -$(U)nhsizes.exe: $(O)nhsizes.o - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(O)nhsizes.o $(O)panic.o $(O)alloc.o$(U)nhsizes.exe: $(O)nhsizes.o - -$(U)nhsize2.exe: $(O)nhsizes2.o - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(O)nhsizes2.o $(O)panic.o $(O)alloc.o - -$(O)nhsizes.o: $(CONFIG_H) nhsizes.c - $(cc) $(CFLAGSU) -o$@ nhsizes.c - -$(O)nhsizes2.o: $(CONFIG_H) nhsizes2.c - $(cc) $(CFLAGSU) -o$@ nhsizes2.c - -#========================================== -# Create directory for holding object files -#========================================== - - -#========================================== -# DLB utility and nhdat file creation -#========================================== - -$(U)dlb_main.exe: $(DLBOBJ) $(O)dlb.o - $(link) $(LFLAGSU) -o$@ $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o - - -$(O)dlb.o: $(O)dlb_main.o $(O)alloc.o $(O)panic.o $(INCL)/dlb.h - $(cc) $(CFLAGS) -o$@ $(SRC)/dlb.c - -$(O)dlb_main.o: $(UTIL)/dlb_main.c $(INCL)/config.h $(INCL)/dlb.h - $(cc) $(CFLAGS) -o$@ $(UTIL)/dlb_main.c - -$(DAT)/porthelp: $(MSWSYS)/porthelp - $(subst /,\,@copy $(MSWSYS)/porthelp $@ >nul) - -nhdat$(NHV): $(U)dlb_main.exe $(DAT)/data $(DAT)/oracles $(OPTIONS_FILE) \ - $(DAT)/quest.dat $(DAT)/rumors $(DAT)/help $(DAT)/hh $(DAT)/cmdhelp $(DAT)/keyhelp \ - $(DAT)/history $(DAT)/opthelp $(DAT)/wizhelp $(DAT)/dungeon \ - $(DAT)/porthelp $(DAT)/license $(DAT)/engrave \ - $(DAT)/epitaph $(DAT)/bogusmon $(DAT)/tribute $(O)sp_lev.tag - $(subst /,\,echo data >$(DAT)/dlb.lst) - $(subst /,\,echo oracles >>$(DAT)/dlb.lst) - $(subst /,\,if exist $(DAT)/options echo options >>$(DAT)/dlb.lst) - $(subst /,\,if exist $(DAT)/ttyoptions echo ttyoptions >>$(DAT)/dlb.lst) - $(subst /,\,if exist $(DAT)/guioptions echo guioptions >>$(DAT)/dlb.lst) - $(subst /,\,if exist $(DAT)/porthelp echo porthelp >>$(DAT)/dlb.lst) - $(subst /,\,echo quest.dat >>$(DAT)/dlb.lst) - $(subst /,\,echo rumors >>$(DAT)/dlb.lst) - $(subst /,\,echo help >>$(DAT)/dlb.lst) - $(subst /,\,echo hh >>$(DAT)/dlb.lst) - $(subst /,\,echo cmdhelp >>$(DAT)/dlb.lst) - $(subst /,\,echo keyhelp >>$(DAT)/dlb.lst) - $(subst /,\,echo history >>$(DAT)/dlb.lst) - $(subst /,\,echo opthelp >>$(DAT)/dlb.lst) - $(subst /,\,echo wizhelp >>$(DAT)/dlb.lst) - $(subst /,\,echo dungeon >>$(DAT)/dlb.lst) - $(subst /,\,echo license >>$(DAT)/dlb.lst) - $(subst /,\,echo engrave >>$(DAT)/dlb.lst) - $(subst /,\,echo epitaph >>$(DAT)/dlb.lst) - $(subst /,\,echo bogusmon >>$(DAT)/dlb.lst) - $(subst /,\,echo tribute >>$(DAT)/dlb.lst) - dir /l /b /-p $(subst /,\,$(DAT)/*.lev >>$(DAT)/dlb.lst) - $(subst /,\,$(U)dlb_main CcIf $(DAT) dlb.lst $(SRC)/nhdat) - -#========================================== -# Recover Utility -#========================================== - -$(U)recover.exe: $(RECOVOBJS) - $(link) $(LFLAGSU) -o$@ $(RECOVOBJS) - -$(O)recover.o: $(CONFIG_H) $(U)recover.c $(MSWSYS)/win32api.h - $(cc) $(CFLAGSU) -o$@ $(U)recover.c - -#========================================== -# Tile Mapping -#========================================== - -$(SRC)/tile.c: $(U)tilemap.exe - @echo A new $@ has been created - @$(U)tilemap - -$(U)tilemap.exe: $(O)tilemap.o - $(link) $(LFLAGSU) -o$@ $(O)tilemap.o - -$(O)tilemap.o: $(WSHR)/tilemap.c $(HACK_H) - $(cc) $(CFLAGSU) -o$@ $(WSHR)/tilemap.c - -$(O)tiletx32.o: $(WSHR)/tilemap.c $(HACK_H) - $(cc) $(CFLAGS) -DTILETEXT -DTILE_X=32 -DTILE_Y=32 -o$@ $(WSHR)/tilemap.c - -$(O)tiletxt.o: $(WSHR)/tilemap.c $(HACK_H) - $(cc) $(CFLAGS) -DTILETEXT -o$@ $(WSHR)/tilemap.c - -$(O)gifread.o: $(WSHR)/gifread.c $(CONFIG_H) $(TILE_H) - $(cc) $(CFLAGS) -I$(WSHR) -o$@ $(WSHR)/gifread.c - -$(O)gifrd32.o: $(WSHR)/gifread.c $(CONFIG_H) $(TILE_H) - $(cc) $(CFLAGS) -I$(WSHR) -DTILE_X=32 -DTILE_Y=32 -o$@ $(WSHR)/gifread.c - -$(O)ppmwrite.o: $(WSHR)/ppmwrite.c $(CONFIG_H) $(TILE_H) - $(cc) $(CFLAGS) -I$(WSHR) -o$@ $(WSHR)/ppmwrite.c - -$(O)tiletext.o: $(WSHR)/tiletext.c $(CONFIG_H) $(TILE_H) - $(cc) $(CFLAGS) -I$(WSHR) -o$@ $(WSHR)/tiletext.c - -$(O)tilete32.o: $(WSHR)/tiletext.c $(CONFIG_H) $(TILE_H) - $(cc) $(CFLAGS) -I$(WSHR) -DTILE_X=32 -DTILE_Y=32 -o$@ $(WSHR)/tiletext.c - -#========================================== -# Optional Tile Utilities -#========================================== - -$(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(GIFREADERS) $(TEXT_IO) - -$(U)gif2tx32.exe: $(GIFREADERS32) $(TEXT_IO32) - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(GIFREADERS32) $(TEXT_IO32) - - -$(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(PPMWRITERS) $(TEXT_IO) - - -$(TILEBMP16): $(TILEUTIL16) $(TILEFILES) - @echo Creating 16x16 binary tile files which may take some time - $(subst /,\,@$(U)tile2bmp $(TILEBMP16)) - -#$(TILEBMP32): $(TILEUTIL32) $(TILEFILES32) -# @echo Creating 32x32 binary tile files which may take some time -# $(subst /,\,@$(U)til2bm32 $(TILEBMP32)) - -$(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(O)tile2bmp.o $(TEXT_IO) - -$(U)til2bm32.exe: $(O)til2bm32.o $(TEXT_IO32) - @echo Linking $@... - $(link) $(LFLAGSU) -o$@ $(O)til2bm32.o $(TEXT_IO32) - -$(O)tile2bmp.o: $(WSHR)/tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)/win32api.h - $(cc) $(CFLAGS) -mno-ms-bitfields -I$(WSHR) -o$@ $(WSHR)/tile2bmp.c - -$(O)til2bm32.o: $(WSHR)/til2bm32.c $(HACK_H) $(TILE_H) $(MSWSYS)/win32api.h - $(cc) $(CFLAGS) -I$(WSHR) -DTILE_X=32 -DTILE_Y=32 -o$@ $(WSHR)/til2bm32.c - -#========================================== -# PDCurses Library -#========================================== - -$(O)pdcurses.a : $(PDCLIBOBJS) $(PDCOBJS) - ar rcs $@ $(PDCLIBOBJS) $(PDCOBJS) - -#========================================== -# Housekeeping -#========================================== - -spotless: clean - if exist o\* del /Q o\* - -test -d o && rd o - if exist objdir.tag del objdir.tag - if exist gamedir.tag del gamedir.tag -ifneq "$(W_GAMEDIR)" "" - if exist $(W_GAMEDIR)\NetHack.exe del $(W_GAMEDIR)\NetHack.exe - if exist $(W_GAMEDIR)\nhdefkey.dll del $(W_GAMEDIR)\nhdefkey.dll - if exist $(W_GAMEDIR)\nh340key.dll del $(W_GAMEDIR)\nh340key.dll - if exist $(W_GAMEDIR)\nhraykey.dll del $(W_GAMEDIR)\nhraykey.dll - if exist $(W_GAMEDIR)\NetHack.exe del $(W_GAMEDIR)\NetHack.exe - if exist $(W_GAMEDIR)\NetHack.pdb del $(W_GAMEDIR)\NetHack.pdb - if exist $(W_GAMEDIR)\nhdat$(NHV) del $(W_GAMEDIR)\nhdat$(NHV) -endif -ifneq "$(W_SRC)" "" - if exist $(W_SRC)\vis_tab.c del $(W_SRC)\vis_tab.c - if exist $(W_SRC)\tile.c del $(W_SRC)\tile.c - if exist $(W_SRC)\vis_tab.c del $(W_SRC)\vis_tab.c - if exist $(W_SRC)\nhdat$(NHV). del $(W_SRC)\nhdat$(NHV). -endif -ifneq "$(W_DAT)" "" - if exist $(W_DAT)\data del $(W_DAT)\data - if exist $(W_DAT)\rumors del $(W_DAT)\rumors - if exist $(W_DAT)\engrave del $(W_DAT)\engrave - if exist $(W_DAT)\epitaph del $(W_DAT)\epitaph - if exist $(W_DAT)\bogusmon del $(W_DAT)\bogusmon - if exist $(W_DAT)\???-fil?.lev del $(W_DAT)\???-fil?.lev - if exist $(W_DAT)\???-goal.lev del $(W_DAT)\???-goal.lev - if exist $(W_DAT)\???-loca.lev del $(W_DAT)\???-loca.lev - if exist $(W_DAT)\???-strt.lev del $(W_DAT)\???-strt.lev - if exist $(W_DAT)\air.lev del $(W_DAT)\air.lev - if exist $(W_DAT)\asmodeus.lev del $(W_DAT)\asmodeus.lev - if exist $(W_DAT)\astral.lev del $(W_DAT)\astral.lev - if exist $(W_DAT)\baalz.lev del $(W_DAT)\baalz.lev - if exist $(W_DAT)\bigrm-*.lev del $(W_DAT)\bigrm-*.lev - if exist $(W_DAT)\castle.lev del $(W_DAT)\castle.lev - if exist $(W_DAT)\data del $(W_DAT)\data - if exist $(W_DAT)\dungeon del $(W_DAT)\dungeon - if exist $(W_DAT)\dungeon.pdf del $(W_DAT)\dungeon.pdf - if exist $(W_DAT)\earth.lev del $(W_DAT)\earth.lev - if exist $(W_DAT)\fakewiz?.lev del $(W_DAT)\fakewiz?.lev - if exist $(W_DAT)\fire.lev del $(W_DAT)\fire.lev - if exist $(W_DAT)\juiblex.lev del $(W_DAT)\juiblex.lev - if exist $(W_DAT)\knox.lev del $(W_DAT)\knox.lev - if exist $(W_DAT)\medusa-?.lev del $(W_DAT)\medusa-?.lev - if exist $(W_DAT)\mine*.lev del $(W_DAT)\mine*.lev - if exist $(W_DAT)\options del $(W_DAT)\options - if exist $(W_DAT)\ttyoptions del $(W_DAT)\ttyoptions - if exist $(W_DAT)\guioptions del $(W_DAT)\guioptions - if exist $(W_DAT)\oracle.lev del $(W_DAT)\oracle.lev - if exist $(W_DAT)\oracles del $(W_DAT)\oracles - if exist $(W_DAT)\orcus.lev del $(W_DAT)\orcus.lev - if exist $(W_DAT)\rumors del $(W_DAT)\rumors - if exist $(W_DAT)\quest.dat del $(W_DAT)\quest.dat - if exist $(W_DAT)\sanctum.lev del $(W_DAT)\sanctum.lev - if exist $(W_DAT)\soko?-?.lev del $(W_DAT)\soko?-?.lev - if exist $(W_DAT)\tower?.lev del $(W_DAT)\tower?.lev - if exist $(W_DAT)\valley.lev del $(W_DAT)\valley.lev - if exist $(W_DAT)\water.lev del $(W_DAT)\water.lev - if exist $(W_DAT)\wizard?.lev del $(W_DAT)\wizard?.lev - if exist $(W_DAT)\dlb.lst del $(W_DAT)\dlb.lst - if exist $(W_DAT)\porthelp del $(W_DAT)\porthelp -endif -ifneq "$(W_OBJ)" "" - if exist $(W_OBJ)\sp_lev.tag del $(W_OBJ)\sp_lev.tag - if exist $(W_OBJ)\obj.tag del $(W_OBJ)\obj.tag - if exist $(W_OBJ)\gamedir.tag del $(W_OBJ)\gamedir.tag - if exist $(W_OBJ)\nh*key.lib del $(W_OBJ)\nh*key.lib - if exist $(W_OBJ)\nh*key.exp del $(W_OBJ)\nh*key.exp -endif -ifneq "$(W_MSWIN)" "" - if exist $(W_MSWIN)\mnsel.bmp del $(W_MSWIN)\mnsel.bmp - if exist $(W_MSWIN)\mnselcnt.bmp del $(W_MSWIN)\mnselcnt.bmp - if exist $(W_MSWIN)\mnunsel.bmp del $(W_MSWIN)\mnunsel.bmp - if exist $(W_MSWIN)\petmark.bmp del $(W_MSWIN)\petmark.bmp - if exist $(W_MSWIN)\pilemark.bmp del $(W_MSWIN)\pilemark.bmp - if exist $(W_MSWIN)\rip.bmp del $(W_MSWIN)\rip.bmp - if exist $(W_MSWIN)\splash.bmp del $(W_MSWIN)\splash.bmp - if exist $(W_MSWIN)\nethack.ico del $(W_MSWIN)\nethack.ico -endif -ifneq "$(W_MSWSYS)" "" - if exist $(W_MSWSYS)\nethack.ico del $(W_MSWSYS)\nethack.ico -endif -ifneq "$(W_UTIL)" "" - if exist $(W_UTIL)\*.lnk del $(W_UTIL)\*.lnk - if exist $(W_UTIL)\*.map del $(W_UTIL)\*.map - if exist $(W_UTIL)\recover.exe del $(W_UTIL)\recover.exe - if exist $(W_UTIL)\tile2bmp.exe del $(W_UTIL)\tile2bmp.exe - if exist $(W_UTIL)\tilemap.exe del $(W_UTIL)\tilemap.exe - if exist $(W_UTIL)\uudecode.exe del $(W_UTIL)\uudecode.exe - if exist $(W_UTIL)\dlb_main.exe del $(W_UTIL)\dlb_main.exe -endif -ifneq "$(W_INCL)" "" - if exist $(W_INCL)\date.h del $(W_INCL)\date.h - if exist $(W_INCL)\onames.h del $(W_INCL)\onames.h - if exist $(W_INCL)\pm.h del $(W_INCL)\pm.h - if exist $(W_INCL)\vis_tab.h del $(W_INCL)\vis_tab.h -endif -ifeq "$(ADD_CURSES)" "Y" -ifneq "$(W_OBJ)" "" - if exist $(W_OBJ)\pdcurses.lib del $(W_OBJ)\pdcurses.lib -endif -endif - if exist $(W_GAMEDIR)\license. del $(W_GAMEDIR)\license. - if exist $(W_GAMEDIR)\nh340key.dll del $(W_GAMEDIR)\nh340key.dll - if exist $(W_GAMEDIR)\nhdefkey.dll del $(W_GAMEDIR)\nhdefkey.dll - if exist $(W_GAMEDIR)\nhraykey.dll del $(W_GAMEDIR)\nhraykey.dll - -test -d ..\binary && rd ..\binary - -clean: - if exist initialchk del initialchk - if exist $(O)install.tag del $(O)install.tag - if exist $(O)utility.tag del $(O)utility.tag -ifneq "$(W_UTIL)" "" - if exist $(W_UTIL)\makedefs.exe del $(W_UTIL)\makedefs.exe - if exist $(W_UTIL)\levcomp.exe del $(W_UTIL)\levcomp.exe - if exist $(W_UTIL)\dgncomp.exe del $(W_UTIL)\dgncomp.exe -endif -ifneq "$(W_SRC)" "" - if exist $(W_SRC)\*.lnk del $(W_SRC)\*.lnk - if exist $(W_SRC)\*.map del $(W_SRC)\*.map -endif -ifneq "$(W_OBJ)" "" - if exist $(W_OBJ)\*.o del $(W_OBJ)\*.o - if exist $(W_OBJ)\utility.tag del $(W_OBJ)\utility.tag - if exist $(W_OBJ)\install.tag del $(W_OBJ)\install.tag - if exist $(W_OBJ)\console.res del $(W_OBJ)\console.res - if exist $(W_OBJ)\dgncomp.MAP del $(W_OBJ)\dgncomp.MAP - if exist $(W_OBJ)\dgncomp.PDB del $(W_OBJ)\dgncomp.PDB - if exist $(W_OBJ)\dlb_main.MAP del $(W_OBJ)\dlb_main.MAP - if exist $(W_OBJ)\dlb_main.PDB del $(W_OBJ)\dlb_main.PDB - if exist $(W_OBJ)\gamedir.tag del $(W_OBJ)\gamedir.tag - if exist $(W_OBJ)\levcomp.MAP del $(W_OBJ)\levcomp.MAP - if exist $(W_OBJ)\levcomp.PDB del $(W_OBJ)\levcomp.PDB - if exist $(W_OBJ)\makedefs.MAP del $(W_OBJ)\makedefs.MAP - if exist $(W_OBJ)\makedefs.PDB del $(W_OBJ)\makedefs.PDB - if exist $(W_OBJ)\NetHack.MAP del $(W_OBJ)\NetHack.MAP - if exist $(W_OBJ)\nh340key.def del $(W_OBJ)\nh340key.def - if exist $(W_OBJ)\nh340key.exp del $(W_OBJ)\nh340key.exp - if exist $(W_OBJ)\nh340key.lib del $(W_OBJ)\nh340key.lib - if exist $(W_OBJ)\nh340key.map del $(W_OBJ)\nh340key.map - if exist $(W_OBJ)\nh340key.PDB del $(W_OBJ)\nh340key.PDB - if exist $(W_OBJ)\nhdefkey.def del $(W_OBJ)\nhdefkey.def - if exist $(W_OBJ)\nhdefkey.exp del $(W_OBJ)\nhdefkey.exp - if exist $(W_OBJ)\nhdefkey.lib del $(W_OBJ)\nhdefkey.lib - if exist $(W_OBJ)\nhdefkey.map del $(W_OBJ)\nhdefkey.map - if exist $(W_OBJ)\nhdefkey.PDB del $(W_OBJ)\nhdefkey.PDB - if exist $(W_OBJ)\nhraykey.def del $(W_OBJ)\nhraykey.def - if exist $(W_OBJ)\nhraykey.exp del $(W_OBJ)\nhraykey.exp - if exist $(W_OBJ)\nhraykey.lib del $(W_OBJ)\nhraykey.lib - if exist $(W_OBJ)\nhraykey.map del $(W_OBJ)\nhraykey.map - if exist $(W_OBJ)\nhraykey.PDB del $(W_OBJ)\nhraykey.PDB - if exist $(W_OBJ)\envchk.tag del $(W_OBJ)\envchk.tag - if exist $(W_OBJ)\obj.tag del $(W_OBJ)\obj.tag - if exist $(W_OBJ)\sp_lev.tag del $(W_OBJ)\sp_lev.tag - if exist $(W_OBJ)\uudecode.MAP del $(W_OBJ)\uudecode.MAP - if exist $(W_OBJ)\uudecode.PDB del $(W_OBJ)\uudecode.PDB -endif - rem - rem defer to the steps in ../win/win32/levstuff-mingw32.mak - rem - mingw32-make -f ../win/win32/levstuff-mingw32.mak clean - rem - rem defer to the steps in ../win/win32/dgnstuff-mingw32.mak - mingw32-make -f ../win/win32/dgnstuff-mingw32.mak clean - $(subst /,\,if exist $(TILEBMP16) del $(TILEBMP16)) - $(subst /,\,if exist $(TILEBMP32) del $(TILEBMP32)) - -#clean: -# -test -f $(O)install.tag && del $(O)install.tag -# -test -f $(O)utility.tag && del $(O)utility.tag -# -test -f $(U)makedefs.exe && del $(U)makedefs.exe -# -test -f $(U)levcomp.exe && del $(U)levcomp.exe -# -test -f $(U)dgncomp.exe && del $(U)dgncomp.exe -# -del $(SRC)/*.lnk -# -del $(SRC)/*.map -# -test -f $(TILEBMP16) && del $(TILEBMP16) -# -test -f $(TILEBMP32) && del $(TILEBMP32) -# -#=================================================================== -# OTHER DEPENDENCIES -#=================================================================== -# -# NT dependencies -# - -$(O)nttty.o: $(HACK_H) $(TILE_H) $(MSWSYS)/win32api.h $(MSWSYS)/nttty.c - $(cc) $(CFLAGS) -I$(WSHR) -o$@ $(MSWSYS)/nttty.c -$(O)winnt.o: $(HACK_H) $(MSWSYS)/win32api.h $(MSWSYS)/winnt.c - $(cc) $(CFLAGS) -o$@ $(MSWSYS)/winnt.c -$(O)ntsound.o: $(HACK_H) $(MSWSYS)/ntsound.c - $(cc) $(CFLAGS) -o$@ $(MSWSYS)/ntsound.c - - -#if you aren't linking in the full gui then -#include the following stub for proper linkage. - -$(O)guistub.o: $(HACK_H) $(MSWSYS)/stubs.c - $(cc) $(CFLAGS) -DGUISTUB -o$@ $(MSWSYS)/stubs.c - -#if you aren't linking in the full tty then -#include the following stub for proper linkage. - -$(O)ttystub.o: $(HACK_H) $(MSWSYS)/stubs.c - $(cc) $(CFLAGS) -DTTYSTUB -o$@ $(MSWSYS)/stubs.c - -$(O)tile.o: $(SRC)/tile.c $(HACK_H) - -# -# util dependencies -# - -$(O)panic.o: $(U)panic.c $(CONFIG_H) - $(cc) $(CFLAGS) -o$@ $(U)panic.c - -# -# sys/share dependencies -# - -(O)cppregex.o: $(O)cppregex.cpp $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/share/cppregex.cpp - -# -# Other dependencies needed by some ports -# - -ifeq "$(ADD_CURSES)" "Y" -# curses window port dependencies -$(O)cursdial.o: $(WCURSES)/cursdial.c $(WCURSES)/cursdial.h $(INCL)/wincurs.h -$(O)cursinit.o: $(WCURSES)/cursinit.c $(WCURSES)/cursinit.h $(INCL)/wincurs.h -$(O)cursinvt.o: $(WCURSES)/cursinvt.c $(WCURSES)/cursinvt.h $(INCL)/wincurs.h -$(O)cursmain.o: $(WCURSES)/cursmain.c $(INCL)/wincurs.h -$(O)cursmesg.o: $(WCURSES)/cursmesg.c $(WCURSES)/cursmesg.h $(INCL)/wincurs.h -$(O)cursmisc.o: $(WCURSES)/cursmisc.c $(WCURSES)/cursmisc.h $(INCL)/wincurs.h -$(O)cursstat.o: $(WCURSES)/cursstat.c $(WCURSES)/cursstat.h $(INCL)/wincurs.h -$(O)curswins.o: $(WCURSES)/curswins.c $(WCURSES)/curswins.h $(INCL)/wincurs.h -endif - -ifeq "$(WANT_WIN_QT4)" "Y" -# Qt dependencies - -$(GAMEDIR)/Qt5Core.dll : $(QT4_DIRECTORY)/bin/Qt5Core.dll - $(subst /,\,@copy $< $@ >nul) - -$(GAMEDIR)/Qt5Gui.dll : $(QT4_DIRECTORY)/bin/Qt5Gui.dll - $(subst /,\,@copy $< $@ >nul) - -$(GAMEDIR)/Qt5Widgets.dll : $(QT4_DIRECTORY)/bin/Qt5Widgets.dll - $(subst /,\,@copy $< $@ >nul) - -$(GAMEDIR)/QtCore4.dll : $(QT4_DIRECTORY)/bin/QtCore4.dll - $(subst /,\,@copy $< $@ >nul) - -$(GAMEDIR)/QtGui4.dll : $(QT4_DIRECTORY)/bin/QtGui4.dll - $(subst /,\,@copy $< $@ >nul) - -$(GAMEDIR)/nhtiles.bmp : $(SRC)/tiles.bmp - $(subst /,\,@copy $< $@ >nul) - -$(GAMEDIR)/rip.xpm : ../win/X11/rip.xpm - $(subst /,\,@copy $< $@ >nul) -# Dependencies on .moc files (for Qt 4 or 5) -$(OBJ)/qt4main.o : $(QT4)/qt4main.cpp $(QT4)/qt4main.moc $(QT4)/qt4kde0.moc -$(OBJ)/qt4map.o : $(QT4)/qt4map.cpp $(QT4)/qt4map.moc -$(OBJ)/qt4menu.o : $(QT4)/qt4menu.cpp $(QT4)/qt4menu.moc -$(OBJ)/qt4msg.o : $(QT4)/qt4msg.cpp $(QT4)/qt4msg.moc -$(OBJ)/qt4plsel.o : $(QT4)/qt4plsel.cpp $(QT4)/qt4plsel.moc -$(OBJ)/qt4set.o : $(QT4)/qt4set.cpp $(QT4)/qt4set.moc -$(OBJ)/qt4stat.o : $(QT4)/qt4stat.cpp $(QT4)/qt4stat.moc -$(OBJ)/qt4xcmd.o : $(QT4)/qt4xcmd.cpp $(QT4)/qt4xcmd.moc -$(OBJ)/qt4yndlg.o : $(QT4)/qt4yndlg.cpp $(QT4)/qt4yndlg.moc -endif - -# -# The rest are stolen from sys/unix/Makefile.src, -# with the following changes: -# * ../include changed to $(INCL) -# * -c (which is included in CFLAGS) substituted -# with -o$@ -# * targets prefixed with $(O) -# * $(CC) changed to $(cc) -# but otherwise untouched. -# That means that there is some irrelevant stuff -# in here, but maintenance should be easier. -# -$(O)tos.o: ../sys/atari/tos.c $(HACK_H) $(INCL)/tcap.h - $(cc) $(CFLAGS) -o$@ ../sys/atari/tos.c -$(O)pcmain.o: ../sys/share/pcmain.c $(HACK_H) $(INCL)/dlb.h \ - $(MSWSYS)/win32api.h - $(cc) $(CFLAGS) -o$@ ../sys/share/pcmain.c -$(O)pcsys.o: ../sys/share/pcsys.c $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/share/pcsys.c -$(O)pctty.o: ../sys/share/pctty.c $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/share/pctty.c -$(O)pcunix.o: ../sys/share/pcunix.c $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/share/pcunix.c -$(O)random.o: ../sys/share/random.c $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/share/random.c -$(O)ioctl.o: ../sys/share/ioctl.c $(HACK_H) $(INCL)/tcap.h - $(cc) $(CFLAGS) -o$@ ../sys/share/ioctl.c -$(O)unixtty.o: ../sys/share/unixtty.c $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/share/unixtty.c -$(O)unixmain.o: ../sys/unix/unixmain.c $(HACK_H) $(INCL)/dlb.h - $(cc) $(CFLAGS) -o$@ ../sys/unix/unixmain.c -$(O)unixunix.o: ../sys/unix/unixunix.c $(HACK_H) - $(cc) $(CFLAGS) -o$@ ../sys/unix/unixunix.c -$(O)unixres.o: ../sys/unix/unixres.c $(CONFIG_H) - $(cc) $(CFLAGS) -o$@ ../sys/unix/unixres.c -$(O)bemain.o: ../sys/be/bemain.c $(HACK_H) $(INCL)/dlb.h - $(cc) $(CFLAGS) -o$@ ../sys/be/bemain.c -$(O)getline.o: ../win/tty/getline.c $(HACK_H) $(INCL)/func_tab.h - $(cc) $(CFLAGS) -o$@ ../win/tty/getline.c -$(O)termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h - $(cc) $(CFLAGS) -o$@ ../win/tty/termcap.c -$(O)topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h - $(cc) $(CFLAGS) -o$@ ../win/tty/topl.c -$(O)wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/date.h $(INCL)/patchlevel.h $(INCL)/tcap.h - $(cc) $(CFLAGS) -o$@ ../win/tty/wintty.c -#$(O)Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \ -# $(CONFIG_H) -# $(cc) $(CFLAGS) -o$@ ../win/X11/Window.c -$(O)dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) - $(cc) $(CFLAGS) -o$@ ../win/X11/dialogs.c -$(O)winX.o: ../win/X11/winX.c $(HACK_H) $(INCL)/winX.h $(INCL)/dlb.h \ - $(INCL)/patchlevel.h ../win/X11/nh72icon \ - ../win/X11/nh56icon ../win/X11/nh32icon - $(cc) $(CFLAGS) -o$@ ../win/X11/winX.c -$(O)winmap.o: ../win/X11/winmap.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/dlb.h \ - $(INCL)/winX.h $(INCL)/tile2x11.h - $(cc) $(CFLAGS) -o$@ ../win/X11/winmap.c -$(O)winmenu.o: ../win/X11/winmenu.c $(HACK_H) $(INCL)/winX.h - $(cc) $(CFLAGS) -o$@ ../win/X11/winmenu.c -$(O)winmesg.o: ../win/X11/winmesg.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/winX.h - $(cc) $(CFLAGS) -o$@ ../win/X11/winmesg.c -$(O)winmisc.o: ../win/X11/winmisc.c $(HACK_H) $(INCL)/func_tab.h \ - $(INCL)/winX.h - $(cc) $(CFLAGS) -o$@ ../win/X11/winmisc.c -$(O)winstat.o: ../win/X11/winstat.c $(HACK_H) $(INCL)/winX.h - $(cc) $(CFLAGS) -o$@ ../win/X11/winstat.c -$(O)wintext.o: ../win/X11/wintext.c $(HACK_H) $(INCL)/winX.h $(INCL)/xwindow.h - $(cc) $(CFLAGS) -o$@ ../win/X11/wintext.c -$(O)winval.o: ../win/X11/winval.c $(HACK_H) $(INCL)/winX.h - $(cc) $(CFLAGS) -o$@ ../win/X11/winval.c -$(O)tile.o: $(SRC)/tile.c $(HACK_H) -$(O)gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ - ../win/gnome/gnmain.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnaskstr.c -$(O)gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ - ../win/gnome/gnaskstr.h ../win/gnome/gnyesno.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnbind.c -$(O)gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h $(INCL)/tile2x11.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnglyph.c -$(O)gnmain.o: ../win/gnome/gnmain.c ../win/gnome/gnmain.h ../win/gnome/gnsignal.h \ - ../win/gnome/gnbind.h ../win/gnome/gnopts.h $(HACK_H) \ - $(INCL)/date.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmain.c -$(O)gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h $(HACK_H) - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmap.c -$(O)gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ - ../win/gnome/gnbind.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmenu.c -$(O)gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmesg.c -$(O)gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnopts.c -$(O)gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ - ../win/gnome/gnmain.h $(HACK_H) - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnplayer.c -$(O)gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ - ../win/gnome/gnmain.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnsignal.c -$(O)gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ - ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ - ../win/gnome/gnomeprv.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnstatus.c -$(O)gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ - ../win/gnome/gn_rip.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gntext.c -$(O)gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ - ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnworn.c -$(O)gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h - $(cc) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnyesno.c -$(O)wingem.o: ../win/gem/wingem.c $(HACK_H) $(INCL)/func_tab.h $(INCL)/dlb.h \ - $(INCL)/patchlevel.h $(INCL)/wingem.h - $(cc) $(CFLAGS) -o$@ ../win/gem/wingem.c -$(O)wingem1.o: ../win/gem/wingem1.c $(INCL)/gem_rsc.h $(INCL)/load_img.h \ - $(INCL)/gr_rect.h $(INCL)/wintype.h $(INCL)/wingem.h - $(cc) $(CFLAGS) -o$@ ../win/gem/wingem1.c -$(O)load_img.o: ../win/gem/load_img.c $(INCL)/load_img.h - $(cc) $(CFLAGS) -o$@ ../win/gem/load_img.c -$(O)gr_rect.o: ../win/gem/gr_rect.c $(INCL)/gr_rect.h - $(cc) $(CFLAGS) -o$@ ../win/gem/gr_rect.c -$(O)qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) $(INCL)/func_tab.h \ - $(INCL)/dlb.h $(INCL)/patchlevel.h $(INCL)/tile2x11.h \ - $(INCL)/qt_win.h $(INCL)/qt_clust.h $(INCL)/qt_kde0.h \ - $(INCL)/qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_win.cpp -$(O)qt_clust.o: ../win/Qt/qt_clust.cpp $(INCL)/qt_clust.h - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_clust.cpp -$(O)qttableview.o: ../win/Qt/qttableview.cpp $(INCL)/qttableview.h - $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qttableview.cpp -$(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h -$(O)allmain.o: allmain.c $(HACK_H) -$(O)alloc.o: alloc.c $(CONFIG_H) -$(O)apply.o: apply.c $(HACK_H) -$(O)artifact.o: artifact.c $(HACK_H) $(INCL)/artifact.h $(INCL)/artilist.h -$(O)attrib.o: attrib.c $(HACK_H) -$(O)ball.o: ball.c $(HACK_H) -$(O)bones.o: bones.c $(HACK_H) $(INCL)/lev.h -$(O)botl.o: botl.c $(HACK_H) -$(O)cmd.o: cmd.c $(HACK_H) $(INCL)/func_tab.h -$(O)dbridge.o: dbridge.c $(HACK_H) -$(O)decl.o: decl.c $(HACK_H) -$(O)detect.o: detect.c $(HACK_H) $(INCL)/artifact.h -$(O)dig.o: dig.c $(HACK_H) -$(O)display.o: display.c $(HACK_H) -$(O)dlb.o: dlb.c $(CONFIG_H) $(INCL)/dlb.h -$(O)do.o: do.c $(HACK_H) $(INCL)/lev.h -$(O)do_name.o: do_name.c $(HACK_H) -$(O)do_wear.o: do_wear.c $(HACK_H) -$(O)dog.o: dog.c $(HACK_H) -$(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)/mfndpos.h -$(O)dokick.o: dokick.c $(HACK_H) -$(O)dothrow.o: dothrow.c $(HACK_H) -$(O)drawing.o: drawing.c $(HACK_H) $(INCL)/tcap.h -$(O)dungeon.o: dungeon.c $(HACK_H) $(INCL)/dgn_file.h $(INCL)/dlb.h -$(O)eat.o: eat.c $(HACK_H) -$(O)end.o: end.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h -$(O)engrave.o: engrave.c $(HACK_H) $(INCL)/lev.h -$(O)exper.o: exper.c $(HACK_H) -$(O)explode.o: explode.c $(HACK_H) -$(O)extralev.o: extralev.c $(HACK_H) -$(O)files.o: files.c $(HACK_H) $(INCL)/dlb.h -$(O)fountain.o: fountain.c $(HACK_H) -$(O)hack.o: hack.c $(HACK_H) -$(O)hacklib.o: hacklib.c $(HACK_H) -$(O)invent.o: invent.c $(HACK_H) -$(O)light.o: light.c $(HACK_H) $(INCL)/lev.h -$(O)lock.o: lock.c $(HACK_H) -$(O)mail.o: mail.c $(HACK_H) $(INCL)/mail.h -$(O)makemon.o: makemon.c $(HACK_H) -$(O)mapglyph.o: mapglyph.c $(HACK_H) -$(O)mcastu.o: mcastu.c $(HACK_H) -$(O)mhitm.o: mhitm.c $(HACK_H) $(INCL)/artifact.h -$(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)/artifact.h -$(O)minion.o: minion.c $(HACK_H) -$(O)mklev.o: mklev.c $(HACK_H) -$(O)mkmap.o: mkmap.c $(HACK_H) $(INCL)/sp_lev.h -$(O)mkmaze.o: mkmaze.c $(HACK_H) $(INCL)/sp_lev.h $(INCL)/lev.h -$(O)mkobj.o: mkobj.c $(HACK_H) -$(O)mkroom.o: mkroom.c $(HACK_H) -$(O)mon.o: mon.c $(HACK_H) $(INCL)/mfndpos.h -$(O)mondata.o: mondata.c $(HACK_H) -$(O)monmove.o: monmove.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/artifact.h -$(O)monst.o: monst.c $(CONFIG_H) $(INCL)/permonst.h $(INCL)/align.h \ - $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/monsym.h \ - $(INCL)/color.h -$(O)mplayer.o: mplayer.c $(HACK_H) -$(O)mthrowu.o: mthrowu.c $(HACK_H) -$(O)muse.o: muse.c $(HACK_H) -$(O)music.o: music.c $(HACK_H) #interp.c -$(O)o_init.o: o_init.c $(HACK_H) $(INCL)/lev.h -$(O)objects.o: objects.c $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ - $(INCL)/prop.h $(INCL)/skills.h $(INCL)/color.h -$(O)objnam.o: objnam.c $(HACK_H) -$(O)options.o: options.c $(CONFIG_H) $(INCL)/objclass.h $(INCL)/flag.h \ - $(HACK_H) $(INCL)/tcap.h -$(O)pager.o: pager.c $(HACK_H) $(INCL)/dlb.h -$(O)pickup.o: pickup.c $(HACK_H) -$(O)pline.o: pline.c $(HACK_H) -$(O)polyself.o: polyself.c $(HACK_H) -$(O)potion.o: potion.c $(HACK_H) -$(O)pray.o: pray.c $(HACK_H) -$(O)priest.o: priest.c $(HACK_H) $(INCL)/mfndpos.h -$(O)quest.o: quest.c $(HACK_H) $(INCL)/qtext.h -$(O)questpgr.o: questpgr.c $(HACK_H) $(INCL)/dlb.h $(INCL)/qtext.h -$(O)read.o: read.c $(HACK_H) -$(O)rect.o: rect.c $(HACK_H) -$(O)region.o: region.c $(HACK_H) $(INCL)/lev.h -$(O)restore.o: restore.c $(HACK_H) $(INCL)/lev.h $(INCL)/tcap.h -$(O)rip.o: rip.c $(HACK_H) -$(O)rnd.o: rnd.c $(HACK_H) -$(O)role.o: role.c $(HACK_H) -$(O)rumors.o: rumors.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h -$(O)save.o: save.c $(HACK_H) $(INCL)/lev.h -$(O)shk.o: shk.c $(HACK_H) -$(O)shknam.o: shknam.c $(HACK_H) -$(O)sit.o: sit.c $(HACK_H) $(INCL)/artifact.h -$(O)sounds.o: sounds.c $(HACK_H) -$(O)sp_lev.o: sp_lev.c $(HACK_H) $(INCL)/dlb.h $(INCL)/sp_lev.h -$(O)spell.o: spell.c $(HACK_H) -$(O)steal.o: steal.c $(HACK_H) -$(O)steed.o: steed.c $(HACK_H) -$(O)sys.o: sys.c $(HACK_H) -$(O)teleport.o: teleport.c $(HACK_H) -$(O)timeout.o: timeout.c $(HACK_H) $(INCL)/lev.h -$(O)topten.o: topten.c $(HACK_H) $(INCL)/dlb.h $(INCL)/patchlevel.h -$(O)track.o: track.c $(HACK_H) -$(O)trap.o: trap.c $(HACK_H) -$(O)u_init.o: u_init.c $(HACK_H) -$(O)uhitm.o: uhitm.c $(HACK_H) -$(O)vault.o: vault.c $(HACK_H) -$(O)version.o: version.c $(HACK_H) $(INCL)/date.h $(INCL)/patchlevel.h -$(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)windmain.o: $(MSWSYS)/windmain.c $(HACK_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) -$(O)write.o: write.c $(HACK_H) -$(O)zap.o: zap.c $(HACK_H) - -# end of file diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc deleted file mode 100644 index c094182e4..000000000 --- a/sys/winnt/Makefile.msc +++ /dev/null @@ -1,1710 +0,0 @@ -# NetHack 3.6 Makefile.msc $NHDT-Date: 1572748386 2019/11/03 02:33:06 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.167 $ */ -# Copyright (c) NetHack PC Development Team 1993-2023 -# -#============================================================================== -# Build Tools Environment -# -# NetHack 3.6.x Makefile for MS Visual Studio Visual C++ compiler -# -# Visual Studio Compilers Tested: -# - Microsoft Visual Studio 2017 Community Edition -# - Microsoft Visual Studio 2019 Community Edition -# -#============================================================================== -# This is used for building two versions of NetHack: -# -# A tty port utilizing the Win32 Console I/O subsystem, Console -# NetHack.exe -# -# A Win32 native port built on the Windows API, Graphical NetHack or -# NetHackW.exe -# -# In addition to your C compiler, -# -# if you want to change you will need a -# files with suffix workalike for -# .y yacc (such as bison) -# .l lex (such as flex) -# -# If you have any questions read the sys/winnt/Install.nt file included -# with the distribution. -#======================================================================================== -# BUILD DECISIONS SECTION -# -# 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? -# -#----------------------------------------------------------------------------------------- -#========================================================================================= - -#--------------------------------------------------------------- -# 1. Where do you want the game to be built (which folder)? - -GAMEDIR = ..\binary # Default game build directory - -#--------------------------------------------------------------- -# 2. Do you want debug information available to the executable? - -DEBUGINFO = Y - -#--------------------------------------------------------------- -# 3. This Makefile will attempt to auto-detect your selected target architecture -# based on Visual Studio command prompt configuration settins etc. -# However, if you want to manually override generation of a -# 32-bit or 64-bit build target, you can uncomment the apppropriate -# TARGET_CPU line below. -# -#TARGET_CPU=x64 -#TARGET_CPU=x86 - -#--------------------------------------------------------------- -# OPTIONAL - Curses window port support -# -# 4. Uncomment these and set them appropriately if you want to -# include curses port support alongside TTY support in your -# 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 -#PDCURSES_TOP=..\lib\pdcurses -# -#============================================================================== -# This marks the end of the BUILD DECISIONS section. -#============================================================================== -# -#=============================================== -#======= End of Modification Section =========== -#=============================================== -# -################################################ -# # -# Nothing below here should have to be changed.# -# # -################################################ - -# -#============================================================================== -# -# The version of the game this Makefile was designed for -NETHACK_VERSION="3.6.7" - -# A brief version for use in macros -NHV=$(NETHACK_VERSION:.=) -NHV=$(NHV:"=) - -# -# 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) -WCURSES = ..\win\curses # window port files (curses) -WSHR = ..\win\share # Tile support files - -# -# Object directory. -# - -OBJ = o - -# -#========================================== -# Exe File Info. -#========================================== - -# -# -# Optional high-quality BSD random number generation routines -# (see pcconf.h). Set to nothing if not used. -# - -RANDOM = $(OBJ)\random.o -#RANDOM = -BCRYPT=bcrypt.lib -WINPFLAG= -DTILES -DMSWIN_GRAPHICS -DWIN32CON - -# To store all the level files, -# help files, etc. in a single library file. -# USE_DLB = Y is left uncommented - -USE_DLB = Y - -! IF ("$(USE_DLB)"=="Y") -DLBFLG = -DDLB -! ELSE -DLBFLG = -! ENDIF - -# -# If you defined ZLIB_COMP in include/config.h and you need -# to link with the zlib.lib library, uncomment the line below. -# If necessary, prefix explicit path information to the file name -# otherwise it assumes the NetHack src directory. -# - -#ZLIB = zlib.lib - - -#========================================== -#================ MACROS ================== -#========================================== -# This section creates shorthand macros for many objects -# referenced later on in the Makefile. -# -# -# Shorten up the location for some files -# - -O = $(OBJ)^\ - -U = $(UTIL)^\ - -# -# Utility Objects. -# - -MAKESRC = $(U)makedefs.c - -MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o - -LEVCOMPOBJS = $(O)lev_yacc.o $(O)lev_lex.o $(O)lev_main.o \ - $(O)alloc.o $(O)decl.o $(O)drawing.o $(O)monst.o $(O)objects.o $(O)panic.o - -DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_lex.o $(O)dgn_main.o \ - $(O)alloc.o $(O)panic.o - -RECOVOBJS = $(O)recover.o - -TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt - -# -# These are not invoked during a normal game build in 3.4 -# -TEXT_IO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o - -TEXT_IO32 = $(O)tilete32.o $(O)tiletx32.o $(O)drawing.o \ - $(O)decl.o $(O)monst.o $(O)objects.o - -GIFREADERS = $(O)gifread.o $(O)alloc.o $(O)panic.o -GIFREADERS32 = $(O)gifrd32.o $(O)alloc.o $(O)panic.o - -PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o - -# -# Object files for the game itself. -# - -VOBJ01 = $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o -VOBJ02 = $(O)attrib.o $(O)ball.o $(O)bones.o $(O)botl.o -VOBJ03 = $(O)cmd.o $(O)dbridge.o $(O)decl.o $(O)detect.o -VOBJ04 = $(O)dig.o $(O)display.o $(O)do.o $(O)do_name.o -VOBJ05 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o -VOBJ06 = $(O)dothrow.o $(O)drawing.o $(O)dungeon.o $(O)eat.o -VOBJ07 = $(O)end.o $(O)engrave.o $(O)exper.o $(O)explode.o -VOBJ08 = $(O)extralev.o $(O)files.o $(O)fountain.o $(O)hack.o -VOBJ09 = $(O)hacklib.o $(O)invent.o $(O)light.o $(O)lock.o -VOBJ10 = $(O)mail.o $(O)makemon.o $(O)mapglyph.o $(O)mcastu.o -VOBJ11 = $(O)mhitm.o $(O)mhitu.o $(O)minion.o $(O)mklev.o -VOBJ12 = $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o $(O)mkroom.o -VOBJ13 = $(O)mon.o $(O)mondata.o $(O)monmove.o $(O)monst.o -VOBJ14 = $(O)mplayer.o $(O)mthrowu.o $(O)muse.o $(O)isaac64.o -VOBJ15 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o -VOBJ16 = $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o -VOBJ17 = $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o -VOBJ18 = $(O)quest.o $(O)questpgr.o $(RANDOM) $(O)read.o -VOBJ19 = $(O)rect.o $(O)region.o $(O)restore.o $(O)rip.o -VOBJ20 = $(O)rnd.o $(O)role.o $(O)rumors.o $(O)save.o -VOBJ21 = $(O)shk.o $(O)shknam.o $(O)sit.o $(O)sounds.o -VOBJ22 = $(O)sp_lev.o $(O)spell.o $(O)steal.o $(O)steed.o -VOBJ23 = $(O)sys.o $(O)teleport.o $(O)timeout.o $(O)topten.o -VOBJ24 = $(O)track.o $(O)trap.o $(O)u_init.o $(O)uhitm.o -VOBJ25 = $(O)vault.o $(O)vis_tab.o $(O)vision.o $(O)weapon.o -VOBJ26 = $(O)were.o $(O)wield.o $(O)windows.o $(O)wizard.o -VOBJ27 = $(O)worm.o $(O)worn.o $(O)write.o $(O)zap.o -VOBJ28 = - -DLBOBJ = $(O)dlb.o - -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)windmain.o $(O)winnt.o $(O)win10.o \ - $(O)safeproc.o $(O)nhlan.o $(SOUND) - -OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ - $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ - $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ - $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ - $(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \ - $(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 \ - $(O)mhmenu.o $(O)mhmsgwnd.o $(O)mhrip.o $(O)mhsplash.o \ - $(O)mhstatus.o $(O)mhtext.o $(O)mswproc.o $(O)NetHackW.o - -GUIHDR = $(MSWIN)\mhaskyn.h $(MSWIN)\mhdlg.h $(MSWIN)\mhfont.h \ - $(MSWIN)\mhinput.h $(MSWIN)\mhmain.h $(MSWIN)\mhmap.h $(MSWIN)\mhmenu.h \ - $(MSWIN)\mhmsg.h $(MSWIN)\mhmsgwnd.h $(MSWIN)\mhrip.h $(MSWIN)\mhstatus.h \ - $(MSWIN)\mhtext.h $(MSWIN)\resource.h $(MSWIN)\winMS.h - -COMCTRL = comctl32.lib - -TILEUTIL16 = $(UTIL)\tile2bmp.exe -TILEBMP16 = $(SRC)\tiles.bmp - -TILEUTIL32 = $(UTIL)\til2bm32.exe -TILEBMP32 = $(SRC)\tiles32.bmp - -SOUND = $(OBJ)\ntsound.o - -VVOBJ = $(O)version.o - -ALLOBJ = $(SOBJ) $(DLBOBJ) $(WOBJ) $(OBJS) $(VVOBJ) - -OPTIONS_FILE = $(DAT)\options - -!IF "$(ADD_CURSES)" == "Y" -#===============-================================================= -# PDCurses build macros -# Latest PDCurses from https://github.com/wmcbrine/PDCurses.git -#================================================================= - -PDCURSES_CURSES_H = $(PDCURSES_TOP)\curses.h -PDCURSES_CURSPRIV_H = $(PDCURSES_TOP)\curspriv.h -PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) -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)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)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 - -PDCLIB = $(O)pdcurses.lib - -PDCINCL = /I$(PDCURSES_TOP) /I$(PDCSRC) /I$(PDCWINCON) - -!ELSE -PDCLIB = -!ENDIF - -#========================================== -# Header file macros -#========================================== - -CONFIG_H = $(INCL)\config.h $(INCL)\config1.h $(INCL)\tradstdc.h \ - $(INCL)\global.h $(INCL)\coord.h $(INCL)\vmsconf.h \ - $(INCL)\system.h $(INCL)\unixconf.h $(INCL)\os2conf.h \ - $(INCL)\micro.h $(INCL)\pcconf.h $(INCL)\tosconf.h \ - $(INCL)\amiconf.h $(INCL)\macconf.h $(INCL)\beconf.h \ - $(INCL)\ntconf.h - -HACK_H = $(INCL)\hack.h $(CONFIG_H) $(INCL)\align.h $(INCL)\context.h \ - $(INCL)\dungeon.h $(INCL)\monsym.h $(INCL)\mkroom.h \ - $(INCL)\objclass.h $(INCL)\youprop.h $(INCL)\prop.h \ - $(INCL)\permonst.h $(INCL)\monattk.h \ - $(INCL)\monflag.h $(INCL)\mondata.h $(INCL)\pm.h \ - $(INCL)\wintype.h $(INCL)\decl.h $(INCL)\quest.h \ - $(INCL)\spell.h $(INCL)\color.h $(INCL)\obj.h \ - $(INCL)\you.h $(INCL)\attrib.h $(INCL)\monst.h $(INCL)\lint.h \ - $(INCL)\mextra.h $(INCL)\skills.h $(INCL)\onames.h \ - $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ - $(INCL)\vision.h $(INCL)\display.h $(INCL)\engrave.h \ - $(INCL)\rect.h $(INCL)\region.h $(INCL)\winprocs.h $(INCL)\botl.h \ - $(INCL)\wintty.h $(INCL)\sys.h $(INCL)\trampoli.h - -LEV_H = $(INCL)\lev.h -DGN_FILE_H = $(INCL)\dgn_file.h -LEV_COMP_H = $(INCL)\lev_comp.h -SP_LEV_H = $(INCL)\sp_lev.h -TILE_H = ..\win\share\tile.h - -#========================================== -# Miscellaneous -#========================================== - -DATABASE = $(DAT)\data.base - -#========================================== -#========================================== -# Setting up the compiler and linker -#========================================== -#========================================== - -cc=cl -cpp=cpp -link=link -rc=Rc - -# Before we get started, this section is used to determine the version of -# Visual Studio we are using. We set VSVER to 0000 to flag any version that -# is too old or untested. -# -#NMAKE version 1421277022 is distributed with latest VS 2019 at time of 3.6.6 -#NMAKE version 1434319370 is distributed with latest VS 2019 at time of 3.6.7 - -# Before we get started, this section is used to determine the version of -# Visual Studio we are using. We set VSVER to 0000 to flag any version that -# is too old or untested. -# -# Recently tested versions: -TESTEDVS2017 = 14.16.27048.0 -TESTEDVS2019 = 14.29.30147.0 -TESTEDVS2022 = 14.34.31937.0 - -VS2017CUR = $(TESTEDVS2017:.=) -VS2019CUR = $(TESTEDVS2019:.=) -VS2022CUR = $(TESTEDVS2022:.=) -VS2017UP1 = $(VS2017CUR) + 1 -VS2019UP1 = $(VS2019CUR) + 1 -VS2022UP1 = $(VS2022CUR) + 1 -VS20171ST = 1411000000 -VS20191ST = $(VS2017UP1) -VS20221ST = $(VS2019UP1) - -#!MESSAGE $(MAKEFLAGS) -#!MESSAGE $(MAKEDIR) -#!MESSAGE $(MAKE) - -MAKEVERSION=$(_NMAKE_VER:.= ) -MAKEVERSION=$(MAKEVERSION: =) -#!MESSAGE $(_NMAKE_VER) -#!MESSAGE $(MAKEVERSION) - -VSSPECIAL= -VSNEWEST=2022 -!IF ($(MAKEVERSION) < 1000000000) -VSVER=0000 #untested ancient version -!ELSEIF ($(MAKEVERSION) > 1000000000) && ($(MAKEVERSION) < 1100000000) -VSVER=2010 -!ELSEIF ($(MAKEVERSION) > 1100000000) && ($(MAKEVERSION) < 1200000000) -VSVER=2012 -!ELSEIF ($(MAKEVERSION) > 1200000000) && ($(MAKEVERSION) < 1400000000) -VSVER=2013 -!ELSEIF ($(MAKEVERSION) > 1400000000) && ($(MAKEVERSION) < 1411000000) -VSVER=2015 -!ELSEIF ($(MAKEVERSION) > $(VS20171ST)) && ($(MAKEVERSION) < $(VS2017UP1)) -VSVER=2017 -!ELSEIF ($(MAKEVERSION) > $(VS20191ST)) && ($(MAKEVERSION) < $(VS2019UP1)) -VSVER=2019 -!ELSEIF ($(MAKEVERSION) > $(VS20221ST)) && ($(MAKEVERSION) < $(VS2022UP1)) -VSVER=2022 -!ELSEIF ($(MAKEVERSION) > $(VS2022CUR)) -VSVER=2999 #untested future version -!ENDIF - -!IF ($(VSVER) >= 2012) -!IF ($(VSVER) <= $(VSNEWEST)) -!MESSAGE Autodetected Visual Studio $(VSVER) $(VSSPECIAL) -!ENDIF -!ENDIF -!IF ($(VSVER) == 2999) -!MESSAGE The NMAKE version of this Visual Studio $(_NMAKE_VER) is newer than the -!MESSAGE most recent at the time this Makefile was crafted (Visual Studio $(VSNEWEST)). -!MESSAGE Because it is newer we'll proceed expecting that the VS$(VSNEWEST) processing -!MESSAGE will still work. -!ELSEIF ($(VSVER) == 0000) -!MESSAGE The version of Visual Studio appears to be quite old, older -!MESSAGE than VS2010 which is the oldest supported version by this -!MESSAGE Makefile, so we'll stop now. -!ERROR Untested old Visual Studio version with NMAKE $(_NMAKE_VER). -!ENDIF - -!IF ($(VSVER) == 2010) -# For VS2010 use "setenv /x86" or "setenv /x64" before invoking make process -# DO NOT DELETE THE FOLLOWING LINE -!include -! ENDIF - -#These will be in the environment variables with one of the VS2017 -#developer command prompts. -#VSCMD_ARG_HOST_ARCH=x64 -#VSCMD_ARG_TGT_ARCH=x86 - -!IFDEF VSCMD_ARG_HOST_ARCH -!MESSAGE Host architecture is $(VSCMD_ARG_HOST_ARCH) -!MESSAGE Target architecture is $(VSCMD_ARG_TGT_ARCH) -! IFNDEF TARGET_CPU -! IF "$(VSCMD_ARG_TGT_ARCH)"=="x64" -TARGET_CPU=x64 -! ELSE -TARGET_CPU=x86 -! ENDIF -! ENDIF -!ENDIF - -!IF "$(TARGET_CPU)" == "" -TARGET_CPU=x86 -!ENDIF - -!IF ($(VSVER) == 2010) -CL_RECENT= -!ELSE -! IF ($(VSVER) > 2010) -CL_RECENT=-sdl -! ENDIF -!ENDIF - -#========================================== -# More compiler setup post-macros -#========================================== -#---------------------------------------------------------------- - -!IF "$(ADD_CURSES)" == "Y" -CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" -DCHTYPE_32 -!ELSE -CURSDEF= -CURSESLIB= -!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" \ - -DHAS_STDINT_H -DHAS_INLINE $(CURSESDEF) \ - -EHsc -fp:precise -Gd -GF -GS -Gy \ - $(CL_RECENT) -WX- -Zc:forScope -Zc:wchar_t -Zi -cdebug= -analyze- -D"_DEBUG" -MTd -RTC1 -Od -crelease= -analyze- -D"_MBCS" -errorReport:prompt -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 \ - ole32.lib Shell32.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 -!ENDIF - -#========================================== -# Util builds -#========================================== - -cflagsBuild = $(cflags) $(INCLDIR) $(WINPFLAG) $(DLBFLG) -DSAFEPROCS -lflagsBuild = $(lflags) $(conlibs) $(MACHINE) - -#========================================== -# - Game build -#========================================== - -LIBS= user32.lib winmm.lib $(ZLIB) $(CURSESLIB) - -! IF ("$(USE_DLB)"=="Y") -DLB = nhdat$(NHV) -! ELSE -DLB = -! ENDIF - -#========================================== -#================ RULES ================== -#========================================== - -.SUFFIXES: .exe .o .til .uu .c .y .l - -#========================================== -# Rules for files in src -#========================================== - -.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -{$(SRC)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -#========================================== -# Rules for files in sys\share -#========================================== - -{$(SSYS)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -{$(SSYS)}.cpp{$(OBJ)}.o: - @$(cc) $(cflagsBuild) /EHsc -Fo$@ $< - -#========================================== -# Rules for files in sys\winnt -#========================================== - -{$(MSWSYS)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -{$(MSWSYS)}.h{$(INCL)}.h: - @copy $< $@ - -#========================================== -# Rules for files in util -#========================================== - -{$(UTIL)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -#========================================== -# Rules for files in win\share -#========================================== - -{$(WSHR)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -{$(WSHR)}.h{$(INCL)}.h: - @copy $< $@ - -#{$(WSHR)}.txt{$(DAT)}.txt: -# @copy $< $@ - -#========================================== -# Rules for files in win\tty -#========================================== - -{$(TTY)}.c{$(OBJ)}.o: - $(cc) $(cflagsBuild) -Fo$@ $< - - -#========================================== -# Rules for files in win\win32 -#========================================== - -{$(MSWIN)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -#========================================== -# Rules for files in win\curses -#========================================== - -{$(WCURSES)}.c{$(OBJ)}.o: - @$(cc) -DPDC_NCMOUSE $(PDCINCL) $(cflagsBuild) -Fo$@ $< - -#{$(WCURSES)}.txt{$(DAT)}.txt: -# @copy $< $@ - -#========================================== -# Rules for files in PDCurses -#========================================== - -{$(PDCURSES_TOP)}.c{$(OBJ)}.o: - @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< - -{$(PDCSRC)}.c{$(OBJ)}.o: - @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< - -{$(PDCWINCON)}.c{$(OBJ)}.o: - @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< - -#========================================== -#=============== TARGETS ================== -#========================================== - -# -# The default make target (so just typing 'nmake' is useful). -# -default : install - -# -# The game target. -# - -# -# Everything -# - -all : install - -install: $(O)envchk.tag $(O)obj.tag $(O)utility.tag $(GAMEDIR)\NetHack.exe $(GAMEDIR)\NetHackW.exe $(O)install.tag - @echo Done. - -$(O)install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ - $(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB) -! IF ("$(USE_DLB)"=="Y") - copy nhdat$(NHV) $(GAMEDIR) - copy $(DAT)\license $(GAMEDIR) - copy $(DAT)\opthelp $(GAMEDIR) -! ELSE - copy $(DAT)\*. $(GAMEDIR) - copy $(DAT)\*.dat $(GAMEDIR) - copy $(DAT)\*.lev $(GAMEDIR) - if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile -! ENDIF - if exist $(MSWSYS)\sysconf.template copy $(MSWSYS)\sysconf.template $(GAMEDIR) - if exist $(DAT)\symbols copy $(DAT)\symbols $(GAMEDIR)\symbols.template - if exist $(DOC)\guidebook.txt copy $(DOC)\guidebook.txt $(GAMEDIR)\Guidebook.txt - 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 - if exist $(MSWSYS)\.nethackrc.template copy $(MSWSYS)\.nethackrc.template $(GAMEDIR) - -if not exist $(GAMEDIR)\record. goto>$(GAMEDIR)\record. - echo install done > $@ - -# copy $(MSWSYS)\winnt.hlp $(GAMEDIR) - -recover: $(U)recover.exe - if exist $(U)recover.exe copy $(U)recover.exe $(GAMEDIR) - if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR)\recover.txt - -$(O)sp_lev.tag: $(O)utility.tag $(DAT)\bigroom.des $(DAT)\castle.des \ - $(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des \ - $(DAT)\medusa.des $(DAT)\oracle.des $(DAT)\tower.des \ - $(DAT)\yendor.des $(DAT)\arch.des $(DAT)\barb.des \ - $(DAT)\caveman.des $(DAT)\healer.des $(DAT)\knight.des \ - $(DAT)\monk.des $(DAT)\priest.des $(DAT)\ranger.des \ - $(DAT)\rogue.des $(DAT)\samurai.des $(DAT)\sokoban.des \ - $(DAT)\tourist.des $(DAT)\valkyrie.des $(DAT)\wizard.des - cd $(DAT) - $(U)levcomp bigroom.des - $(U)levcomp castle.des - $(U)levcomp endgame.des - $(U)levcomp gehennom.des - $(U)levcomp knox.des - $(U)levcomp mines.des - $(U)levcomp medusa.des - $(U)levcomp oracle.des - $(U)levcomp sokoban.des - $(U)levcomp tower.des - $(U)levcomp yendor.des - $(U)levcomp arch.des - $(U)levcomp barb.des - $(U)levcomp caveman.des - $(U)levcomp healer.des - $(U)levcomp knight.des - $(U)levcomp monk.des - $(U)levcomp priest.des - $(U)levcomp ranger.des - $(U)levcomp rogue.des - $(U)levcomp samurai.des - $(U)levcomp tourist.des - $(U)levcomp valkyrie.des - $(U)levcomp wizard.des - cd $(SRC) - echo sp_levs done > $(O)sp_lev.tag - -$(O)utility.tag: $(INCL)\date.h $(INCL)\onames.h $(INCL)\pm.h \ - $(SRC)\vis_tab.c \ - $(U)levcomp.exe $(INCL)\vis_tab.h \ - $(U)dgncomp.exe $(TILEUTIL16) - @echo utilities made >$@ - @echo utilities made. - -tileutil: $(U)gif2txt.exe $(U)gif2tx32.exe $(U)txt2ppm.exe - @echo Optional tile development utilities are up to date. - -$(O)NetHackW.res: $(TILEBMP16) $(MSWIN)\NetHackW.rc $(MSWIN)\mnsel.bmp \ - $(MSWIN)\mnselcnt.bmp $(MSWIN)\mnunsel.bmp \ - $(MSWIN)\petmark.bmp $(MSWIN)\pilemark.bmp $(MSWIN)\NetHack.ico $(MSWIN)\rip.bmp \ - $(MSWIN)\splash.bmp - @$(rc) -r -fo$@ -i$(MSWIN) -dNDEBUG $(MSWIN)\NetHackW.rc - -$(O)console.res: $(MSWSYS)\console.rc $(MSWSYS)\NetHack.ico - @$(rc) -r -fo$@ -i$(MSWSYS) -dNDEBUG $(MSWSYS)\console.rc - - -#========================================== -# The game targets. -#========================================== - -# The section for linking the NetHack image looks a little strange at -# first, especially if you are used to UNIX makes, or NDMAKE. It is -# Microsoft nmake specific, and it gets around the problem of the -# link command line being too long for the linker. An "in-line" linker -# response file is generated temporarily. -# -# It takes advantage of the following features of nmake: -# -# Inline files : -# Specifying the "<<" means to start an inline file. -# Another "<<" at the start of a line closes the -# inline file. -# -# Substitution within Macros: -# $(mymacro:string1=string2) replaces every -# occurrence of string1 with string2 in the -# macro mymacro. Special ascii key codes may be -# used in the substitution text by preceding it -# with ^ as we have done below. Every occurence -# of a in $(ALLOBJ) is replaced by -# <+>. - -GAMEOBJ=$(ALLOBJ:^ =^ -) -GAMEOBJ=$(GAMEOBJ:^ =^ -) - -# -# DO NOT INDENT THE << below! -# - -# NetHack -# full gui linkage libs: -# libs: $(LIBS) $(conlibs) $(guilibs) $(COMCTRL) -# objs: $(GAMEOBJ) $(TTYOBJ) $(O)nttty.o $(O)tile.o $(GUIOBJ) -# otherwise: -# libs: $(LIBS) $(conlibs) -# objs: $(GAMEOBJ) $(TTYOBJ) $(O)tile.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 \ - $(LIBS) $(PDCLIB) $(conlibs) $(BCRYPT) -out:$@ @<<$(@B).lnk - $(GAMEOBJ) - $(TTYOBJ) - $(O)nttty.o - $(O)tile.o - $(O)guistub.o - $(O)console.res -<< - @if exist $(O)install.tag del $(O)install.tag - -# NetHackW -# full tty linkage libs: -# libs: $(LIBS) $(guilibs) $(COMCTRL) -# objs: $(GAMEOBJ) $(GUIOBJ) $(TTYOBJ) $(O)tile.o $(O)nttty.o -# otherwise: -# libs: $(LIBS) $(guilibs) $(COMCTRL) -# objs: $(GAMEOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o - -$(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \ - $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)NetHackW.res $(O)gamedir.tag $(KEYDLLS) - @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) - @echo Linking $(@:\=/) - $(link) $(lflagsBuild) $(guilflags) /STACK:2048 /PDB:$(GAMEDIR)\$(@B).PDB \ - /MAP:$(O)$(@B).MAP $(LIBS) $(PDCLIB) $(guilibs) $(COMCTRL) $(BCRYPT) -out:$@ @<<$(@B).lnk - $(GAMEOBJ) - $(GUIOBJ) - $(O)tile.o - $(O)ttystub.o - $(O)NetHackW.res -<< - -$(O)gamedir.tag: - @if not exist $(GAMEDIR)\*.* echo creating directory $(GAMEDIR:\=/) - @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) - @echo directory created > $@ - -# -# Secondary Targets. -# - -#========================================== -# Makedefs Stuff -#========================================== -$(U)nhsizes.exe: $(O)nhsizes.o - @echo Linking $(@:\=/) - $(link) $(lflagsBuild) -out:$@ $(O)nhsizes.o $(O)panic.o $(O)alloc.o - -$(O)nhsizes.o: $(CONFIG_H) nhsizes.c - @$(cc) $(cflagsBuild) -Fo$@ nhsizes.c - -$(U)makedefs.exe: $(MAKEOBJS) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ $(MAKEOBJS) - -$(O)makedefs.o: $(CONFIG_H) $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\objclass.h \ - $(INCL)\monsym.h $(INCL)\qtext.h $(INCL)\patchlevel.h \ - $(U)makedefs.c - @if not exist $(OBJ)\*.* echo creating directory $(OBJ:\=/) - @if not exist $(OBJ)\*.* mkdir $(OBJ) - @$(cc) -DENUM_PM $(cflagsBuild) -Fo$@ $(U)makedefs.c - -# -# date.h should be remade every time any of the source or include -# files is modified. -# - -$(INCL)\date.h $(OPTIONS_FILE) : $(U)makedefs.exe - $(U)makedefs -v - -$(INCL)\onames.h : $(U)makedefs.exe - $(U)makedefs -o - -$(INCL)\pm.h : $(U)makedefs.exe - $(U)makedefs -p - -$(INCL)\vis_tab.h: $(U)makedefs.exe - $(U)makedefs -z - -$(SRC)\vis_tab.c: $(U)makedefs.exe - $(U)makedefs -z - -#========================================== -# uudecode utility and uuencoded targets -#========================================== - -$(U)uudecode.exe: $(O)uudecode.o - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ $(O)uudecode.o - -$(O)uudecode.o: $(SSYS)\uudecode.c - @$(cc) $(cflagsBuild) /D_CRT_SECURE_NO_DEPRECATE -Fo$@ $(SSYS)\uudecode.c - -$(MSWSYS)\NetHack.ico : $(U)uudecode.exe $(MSWSYS)\nhico.uu - chdir $(MSWSYS) - ..\..\util\uudecode.exe nhico.uu - chdir ..\..\src - -$(MSWIN)\NetHack.ico : $(U)uudecode.exe $(MSWSYS)\nhico.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe ../../sys/winnt/nhico.uu - chdir ..\..\src - -$(MSWIN)\mnsel.bmp: $(U)uudecode.exe $(MSWIN)\mnsel.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe mnsel.uu - chdir ..\..\src - -$(MSWIN)\mnselcnt.bmp: $(U)uudecode.exe $(MSWIN)\mnselcnt.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe mnselcnt.uu - chdir ..\..\src - -$(MSWIN)\mnunsel.bmp: $(U)uudecode.exe $(MSWIN)\mnunsel.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe mnunsel.uu - chdir ..\..\src - -$(MSWIN)\petmark.bmp: $(U)uudecode.exe $(MSWIN)\petmark.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe petmark.uu - chdir ..\..\src - -$(MSWIN)\pilemark.bmp: $(U)uudecode.exe $(MSWIN)\pilemark.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe pilemark.uu - chdir ..\..\src - -$(MSWIN)\rip.bmp: $(U)uudecode.exe $(MSWIN)\rip.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe rip.uu - chdir ..\..\src - -$(MSWIN)\splash.bmp: $(U)uudecode.exe $(MSWIN)\splash.uu - chdir $(MSWIN) - ..\..\util\uudecode.exe splash.uu - chdir ..\..\src - -#================================================= -# Level Compiler Stuff -#================================================= -# -# defer to the steps in ..\win\win32\levstuff.mak -# - -$(U)lev_yacc.c: $(U)lev_comp.y - nmake -nologo -f ..\win\win32\levstuff.mak $(U)lev_yacc.c - -$(U)lev_lex.c: $(U)lev_comp.l - nmake -nologo -f ..\win\win32\levstuff.mak $(U)lev_lex.c - -$(INCL)\lev_comp.h: - nmake -nologo -f ..\win\win32\levstuff.mak $(INCL)\lev_comp.h - -$(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c - @$(cc) $(cflagsBuild) -Fo$@ $(U)lev_yacc.c - -$(O)lev_lex.o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) $(U)lev_lex.c - @$(cc) $(cflagsBuild) -Fo$@ $(U)lev_lex.c - -$(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) - @$(cc) $(cflagsBuild) -Fo$@ $(U)lev_main.c - -$(U)levcomp.exe: $(LEVCOMPOBJS) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(LEVCOMPOBJS:^ =^ - ) -<< - -#================================================= -# Dungeon Compiler Stuff -#================================================= -# -# defer to the steps in ..\win\win32\dgnstuff.mak -# -$(U)dgn_yacc.c: $(U)dgn_comp.y - nmake -nologo -f ..\win\win32\dgnstuff.mak $(U)dgn_yacc.c - -$(INCL)\dgn_comp.h: - nmake -nologo -f ..\win\win32\dgnstuff.mak $(INCL)\dgn_comp.h - -$(U)dgn_lex.c: $(U)dgn_comp.l - nmake -nologo -f ..\win\win32\dgnstuff.mak $(U)dgn_lex.c - -$(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h $(U)dgn_yacc.c - @$(cc) $(cflagsBuild) -Fo$@ $(U)dgn_yacc.c - -$(O)dgn_lex.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ - $(U)dgn_lex.c - @$(cc) $(cflagsBuild) -Fo$@ $(U)dgn_lex.c - -$(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c - @$(cc) $(cflagsBuild) -Fo$@ $(U)dgn_main.c - -$(U)dgncomp.exe: $(DGNCOMPOBJS) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(DGNCOMPOBJS:^ =^ - ) -<< - -#================================================= -# Create directory for holding object files -#================================================= - -$(O)obj.tag: - @if not exist $(OBJ)\*.* echo creating directory $(OBJ:\=/) - @if not exist $(OBJ)\*.* mkdir $(OBJ) - @echo directory created >$@ - -#========================================== -# Notify of any CL environment variables -# in effect since they change the compiler -# options. -#========================================== - -$(O)envchk.tag: $(O)obj.tag -! IF "$(TARGET_CPU)"=="x64" - @echo Windows x64 64-bit target build -! 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) -! ENDIF - echo envchk >$@ - -#========================================== -#=========== SECONDARY TARGETS ============ -#========================================== - -#========================================== -# DLB utility and nhdatNNN file creation -#========================================== - -$(U)dlb_main.exe: $(DLBOBJ) $(O)dlb.o - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(O)dlb_main.o - $(O)dlb.o - $(O)alloc.o - $(O)panic.o -<< - -$(O)dlb.o: $(O)dlb_main.o $(O)alloc.o $(O)panic.o $(INCL)\dlb.h - @$(cc) $(cflagsBuild) /Fo$@ $(SRC)\dlb.c - -$(O)dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(INCL)\dlb.h - @$(cc) $(cflagsBuild) /Fo$@ $(UTIL)\dlb_main.c - -$(DAT)\porthelp: $(MSWSYS)\porthelp - @copy $(MSWSYS)\porthelp $@ >nul - -nhdat$(NHV): $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \ - $(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp $(DAT)\keyhelp \ - $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon $(DAT)\porthelp \ - $(DAT)\license $(DAT)\engrave $(DAT)\epitaph $(DAT)\bogusmon $(DAT)\tribute $(O)sp_lev.tag - cd $(DAT) - echo data >dlb.lst - echo oracles >>dlb.lst - if exist options echo options >>dlb.lst - if exist ttyoptions echo ttyoptions >>dlb.lst - if exist guioptions echo guioptions >>dlb.lst - if exist porthelp echo porthelp >>dlb.lst - echo quest.dat >>dlb.lst - echo rumors >>dlb.lst - echo engrave >>dlb.lst - echo epitaph >>dlb.lst - echo bogusmon >>dlb.lst - echo tribute >>dlb.lst - echo help >>dlb.lst - echo hh >>dlb.lst - echo cmdhelp >>dlb.lst - echo keyhelp >>dlb.lst - echo history >>dlb.lst - echo opthelp >>dlb.lst - echo wizhelp >>dlb.lst - echo dungeon >>dlb.lst - echo license >>dlb.lst - for %%N in (*.lev) do echo %%N >>dlb.lst - $(U)dlb_main cIf dlb.lst $(SRC)\nhdat - cd $(SRC) - -#========================================== -# Recover Utility -#========================================== - -$(U)recover.exe: $(RECOVOBJS) - @echo Linking $(@:\=/) - $(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ $(RECOVOBJS) - -$(O)recover.o: $(CONFIG_H) $(U)recover.c $(MSWSYS)\win32api.h - @$(cc) $(cflagsBuild) -Fo$@ $(U)recover.c - -#========================================== -# Tile Mapping -#========================================== - -$(SRC)\tile.c: $(U)tilemap.exe - @echo A new $(@:\=/) has been created - @$(U)tilemap - -$(U)tilemap.exe: $(O)tilemap.o - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ $(O)tilemap.o - -$(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) - @$(cc) $(cflagsBuild) -Fo$@ $(WSHR)\tilemap.c - -$(O)tiletx32.o: $(WSHR)\tilemap.c $(HACK_H) - @$(cc) $(cflagsBuild) /DTILETEXT /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tilemap.c - -$(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) - @$(cc) $(cflagsBuild) /DTILETEXT -Fo$@ $(WSHR)\tilemap.c - -$(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) - @$(cc) $(cflagsBuild) -I$(WSHR) -Fo$@ $(WSHR)\gifread.c - -$(O)gifrd32.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) - @$(cc) $(cflagsBuild) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\gifread.c - -$(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(TILE_H) - @$(cc) $(cflagsBuild) -I$(WSHR) -Fo$@ $(WSHR)\ppmwrite.c - -$(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) - @$(cc) $(cflagsBuild) -I$(WSHR) -Fo$@ $(WSHR)\tiletext.c - -$(O)tilete32.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) - @$(cc) $(cflagsBuild) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tiletext.c - -#========================================== -# Optional Tile Utilities -#========================================== - -$(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(GIFREADERS:^ =^ - ) - $(TEXT_IO:^ =^ - ) -<< - -$(U)gif2tx32.exe: $(GIFREADERS32) $(TEXT_IO32) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(GIFREADERS32:^ =^ - ) - $(TEXT_IO32:^ =^ - ) -<< - -$(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(PPMWRITERS:^ =^ - ) - $(TEXT_IO:^ =^ - ) -<< - -$(TILEBMP16): $(TILEUTIL16) $(TILEFILES) - @echo Creating 16x16 binary tile files (this may take some time) - @$(U)tile2bmp $(TILEBMP16) -#$(TILEBMP32): $(TILEUTIL32) $(TILEFILES32) -# @echo Creating 32x32 binary tile files (this may take some time) -# @$(U)til2bm32 $(TILEBMP32) - - -$(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(O)tile2bmp.o - $(TEXT_IO:^ =^ - ) -<< - -$(U)til2bm32.exe: $(O)til2bm32.o $(TEXT_IO32) - @echo Linking $(@:\=/) - @$(link) $(lflagsBuild) /PDB:"$(O)$(@B).PDB" /MAP:"$(O)$(@B).MAP" -out:$@ @<<$(@B).lnk - $(O)til2bm32.o - $(TEXT_IO32:^ =^ - ) -<< - -$(O)tile2bmp.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)\win32api.h - @$(cc) $(cflagsBuild) -I$(WSHR) /DPACKED_FILE /Fo$@ $(WSHR)\tile2bmp.c - -$(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 -#=============================================================================== - -$(O)pdcurses.lib : $(PDCLIBOBJS) $(PDCOBJS) - lib -nologo /out:$@ $(PDCLIBOBJS) $(PDCOBJS) - -$(O)pdcscrn.o : $(PDCURSES_HEADERS) $(PDCWINCON)\pdcscrn.c $(MSWSYS)\stub-pdcscrn.c - $(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $(MSWSYS)\stub-pdcscrn.c - -#=============================================================================== -# Housekeeping -#=============================================================================== - -spotless: clean -! IF ("$(OBJ)"!="") - if exist $(OBJ)\* rmdir $(OBJ) /s /Q - if exist $(GAMEDIR)\NetHack.exe del $(GAMEDIR)\NetHack.exe - if exist $(GAMEDIR)\NetHack.pdb del $(GAMEDIR)\NetHack.pdb - if exist $(GAMEDIR)\nhdat$(NHV) del $(GAMEDIR)\nhdat$(NHV) -! ENDIF - if exist $(INCL)\date.h del $(INCL)\date.h - if exist $(INCL)\onames.h del $(INCL)\onames.h - if exist $(INCL)\pm.h del $(INCL)\pm.h - if exist $(INCL)\vis_tab.h del $(INCL)\vis_tab.h - if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c - if exist $(SRC)\tile.c del $(SRC)\tile.c - if exist $(U)*.lnk del $(U)*.lnk - if exist $(U)*.map del $(U)*.map - if exist $(DAT)\data del $(DAT)\data - if exist $(DAT)\rumors del $(DAT)\rumors - if exist $(DAT)\engrave del $(DAT)\engrave - if exist $(DAT)\epitaph del $(DAT)\epitaph - if exist $(DAT)\bogusmon del $(DAT)\bogusmon - if exist $(DAT)\???-fil?.lev del $(DAT)\???-fil?.lev - if exist $(DAT)\???-goal.lev del $(DAT)\???-goal.lev - if exist $(DAT)\???-loca.lev del $(DAT)\???-loca.lev - if exist $(DAT)\???-strt.lev del $(DAT)\???-strt.lev - if exist $(DAT)\air.lev del $(DAT)\air.lev - if exist $(DAT)\asmodeus.lev del $(DAT)\asmodeus.lev - if exist $(DAT)\astral.lev del $(DAT)\astral.lev - if exist $(DAT)\baalz.lev del $(DAT)\baalz.lev - if exist $(DAT)\bigrm-*.lev del $(DAT)\bigrm-*.lev - if exist $(DAT)\castle.lev del $(DAT)\castle.lev - if exist $(DAT)\data del $(DAT)\data - if exist $(DAT)\dungeon del $(DAT)\dungeon - if exist $(DAT)\dungeon.pdf del $(DAT)\dungeon.pdf - if exist $(DAT)\earth.lev del $(DAT)\earth.lev - if exist $(DAT)\fakewiz?.lev del $(DAT)\fakewiz?.lev - if exist $(DAT)\fire.lev del $(DAT)\fire.lev - if exist $(DAT)\juiblex.lev del $(DAT)\juiblex.lev - if exist $(DAT)\knox.lev del $(DAT)\knox.lev - if exist $(DAT)\medusa-?.lev del $(DAT)\medusa-?.lev - if exist $(DAT)\mine*.lev del $(DAT)\mine*.lev - if exist $(DAT)\options del $(DAT)\options - if exist $(DAT)\ttyoptions del $(DAT)\ttyoptions - if exist $(DAT)\guioptions del $(DAT)\guioptions - if exist $(DAT)\oracle.lev del $(DAT)\oracle.lev - if exist $(DAT)\oracles del $(DAT)\oracles - if exist $(DAT)\orcus.lev del $(DAT)\orcus.lev - if exist $(DAT)\rumors del $(DAT)\rumors - if exist $(DAT)\quest.dat del $(DAT)\quest.dat - if exist $(DAT)\sanctum.lev del $(DAT)\sanctum.lev - if exist $(DAT)\soko?-?.lev del $(DAT)\soko?-?.lev - if exist $(DAT)\tower?.lev del $(DAT)\tower?.lev - if exist $(DAT)\valley.lev del $(DAT)\valley.lev - if exist $(DAT)\water.lev del $(DAT)\water.lev - if exist $(DAT)\wizard?.lev del $(DAT)\wizard?.lev - if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst - if exist $(DAT)\porthelp del $(DAT)\porthelp - if exist $(O)sp_lev.tag del $(O)sp_lev.tag - if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c - if exist nhdat$(NHV). del nhdat$(NHV). - if exist $(O)obj.tag del $(O)obj.tag - if exist $(O)gamedir.tag del $(O)gamedir.tag - if exist $(O)nh*key.lib del $(O)nh*key.lib - if exist $(O)nh*key.exp del $(O)nh*key.exp - if exist $(MSWIN)\mnsel.bmp del $(MSWIN)\mnsel.bmp - if exist $(MSWIN)\mnselcnt.bmp del $(MSWIN)\mnselcnt.bmp - if exist $(MSWIN)\mnunsel.bmp del $(MSWIN)\mnunsel.bmp - if exist $(MSWIN)\petmark.bmp del $(MSWIN)\petmark.bmp - if exist $(MSWIN)\pilemark.bmp del $(MSWIN)\pilemark.bmp - if exist $(MSWIN)\rip.bmp del $(MSWIN)\rip.bmp - if exist $(MSWIN)\splash.bmp del $(MSWIN)\splash.bmp - if exist $(MSWIN)\nethack.ico del $(MSWIN)\nethack.ico - if exist $(MSWSYS)\nethack.ico del $(MSWSYS)\nethack.ico - if exist $(U)recover.exe del $(U)recover.exe - if exist $(U)tile2bmp.exe del $(U)tile2bmp.exe - 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 $(O)pdcurses.lib del $(O)pdcurses.lib -!ENDIF -clean: - if exist $(O)*.o del $(O)*.o - if exist $(O)utility.tag del $(O)utility.tag - if exist $(U)makedefs.exe del $(U)makedefs.exe - if exist $(U)levcomp.exe del $(U)levcomp.exe - if exist $(U)dgncomp.exe del $(U)dgncomp.exe - if exist $(SRC)\*.lnk del $(SRC)\*.lnk - if exist $(SRC)\*.map del $(SRC)\*.map - if exist $(O)install.tag del $(O)install.tag - if exist $(O)console.res del $(O)console.res - if exist $(O)dgncomp.MAP del $(O)dgncomp.MAP - if exist $(O)dgncomp.PDB del $(O)dgncomp.PDB - if exist $(O)dlb_main.MAP del $(O)dlb_main.MAP - if exist $(O)dlb_main.PDB del $(O)dlb_main.PDB - if exist $(O)gamedir.tag del $(O)gamedir.tag - if exist $(O)levcomp.MAP del $(O)levcomp.MAP - if exist $(O)levcomp.PDB del $(O)levcomp.PDB - if exist $(O)makedefs.MAP del $(O)makedefs.MAP - if exist $(O)makedefs.PDB del $(O)makedefs.PDB - if exist $(O)NetHack.MAP del $(O)NetHack.MAP - if exist $(O)envchk.tag del $(O)envchk.tag - if exist $(O)obj.tag del $(O)obj.tag - if exist $(O)sp_lev.tag del $(O)sp_lev.tag - if exist $(O)uudecode.MAP del $(O)uudecode.MAP - if exist $(O)uudecode.PDB del $(O)uudecode.PDB - if exist $(SRC)\tiles.bmp del $(SRC)\tiles.bmp - if exist $(O)console.res del $(O)console.res - if exist $(O)NetHack.res del $(O)NetHack.res - if exist $(O)NetHackW.res del $(O)NetHackW.res - rem - rem defer to the steps in ..\win\win32\levstuff.mak - rem - nmake -nologo -f ..\win\win32\levstuff.mak clean - rem - rem defer to the steps in ..\win\win32\dgnstuff.mak - rem - nmake -nologo -f ..\win\win32\dgnstuff.mak clean - if exist $(TILEBMP16) del $(TILEBMP16) - if exist $(TILEBMP32) del $(TILEBMP32) - -#=================================================================== -# OTHER DEPENDENCIES -#=================================================================== - -# -# dat dependencies -# - -$(DAT)\data: $(O)utility.tag $(DATABASE) - $(U)makedefs -d - -$(DAT)\rumors: $(O)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal - $(U)makedefs -r - -$(DAT)\quest.dat: $(O)utility.tag $(DAT)\quest.txt - $(U)makedefs -q - -$(DAT)\oracles: $(O)utility.tag $(DAT)\oracles.txt - $(U)makedefs -h - -$(DAT)\engrave: $(DAT)\engrave.txt $(U)makedefs.exe - $(U)makedefs -s - -$(DAT)\epitaph: $(DAT)\epitaph.txt $(U)makedefs.exe - $(U)makedefs -s - -$(DAT)\bogusmon: $(DAT)\bogusmon.txt $(U)makedefs.exe - $(U)makedefs -s - -$(DAT)\dungeon: $(O)utility.tag $(DAT)\dungeon.def - $(U)makedefs -e - cd $(DAT) - $(U)dgncomp dungeon.pdf - cd $(SRC) - -# -# NT dependencies -# - -$(O)nttty.o: $(HACK_H) $(TILE_H) $(MSWSYS)\win32api.h $(MSWSYS)\nttty.c - @$(cc) $(cflagsBuild) -I$(WSHR) -Fo$@ $(MSWSYS)\nttty.c -$(O)winnt.o: $(HACK_H) $(MSWSYS)\win32api.h $(MSWSYS)\winnt.c - @$(cc) $(cflagsBuild) -I$(MSWSYS) -I$(MSWIN) -Fo$@ $(MSWSYS)\win10.c - @$(cc) $(cflagsBuild) -Fo$@ $(MSWSYS)\winnt.c -$(O)ntsound.o: $(HACK_H) $(MSWSYS)\ntsound.c - @$(cc) $(cflagsBuild) -Fo$@ $(MSWSYS)\ntsound.c - -#if you aren't linking in the full gui then -#include the following stub for proper linkage. - -$(O)guistub.o: $(HACK_H) $(MSWSYS)\stubs.c - @$(cc) $(cflagsBuild) -DGUISTUB -Fo$@ $(MSWSYS)\stubs.c - -# -# WIN32 dependencies -# - -$(O)NetHackW.o: $(HACK_H) $(MSWIN)\NetHackW.c - @$(cc) $(cflagsBuild) -I$(MSWSYS) -I$(MSWIN) -Fo$@ $(MSWIN)\NetHackW.c - -#if you aren't linking in the full tty then -#include the following stub for proper linkage. - -$(O)ttystub.o: $(HACK_H) $(MSWSYS)\stubs.c - @$(cc) $(cflagsBuild) -DTTYSTUB -Fo$@ $(MSWSYS)\stubs.c - -# -# util dependencies -# - -$(O)panic.o: $(U)panic.c $(CONFIG_H) - @$(cc) $(cflagsBuild) -Fo$@ $(U)panic.c - -# -# sys/share dependencies -# - -(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.o: $(WCURSES)\cursinit.c $(WCURSES)\cursinit.h $(INCL)\wincurs.h -$(O)cursinvt.o: $(WCURSES)\cursinvt.c $(WCURSES)\cursinvt.h $(INCL)\wincurs.h -$(O)cursmain.o: $(WCURSES)\cursmain.c $(INCL)\wincurs.h -$(O)cursmesg.o: $(WCURSES)\cursmesg.c $(WCURSES)\cursmesg.h $(INCL)\wincurs.h -$(O)cursmisc.o: $(WCURSES)\cursmisc.c $(WCURSES)\cursmisc.h $(INCL)\wincurs.h -$(O)cursstat.o: $(WCURSES)\cursstat.c $(WCURSES)\cursstat.h $(INCL)\wincurs.h -$(O)curswins.o: $(WCURSES)\curswins.c $(WCURSES)\curswins.h $(INCL)\wincurs.h -# -# The rest are stolen from sys/unix/Makefile.src, -# with the following changes: -# * ../include changed to $(INCL) -# * slashes changed to back-slashes -# * -c (which is included in CFLAGS) substituted with -Fo$@ -# * $(CFLAGS) replaced with $(cflagsBuild) -# * $(CC) replaced with @$(CC) -# * targets prefixed with $(O) -# but otherwise untouched. -# That means that there is some irrelevant stuff -# in here, but maintenance should be easier. -# - -$(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\atari\tos.c -$(O)pctty.o: ..\sys\share\pctty.c $(HACK_H) - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pctty.c -$(O)isaac64.o: ..\src\isaac64.c $(HACK_H) $(INCL)\isaac64.h $(INCL)\integer.h - @$(CC) $(cflagsBuild) -Fo$@ ..\src\isaac64.c -$(O)random.o: ..\sys\share\random.c $(HACK_H) - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\random.c -$(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\ioctl.c -$(O)unixtty.o: ..\sys\share\unixtty.c $(HACK_H) - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\unixtty.c -$(O)unixmain.o: ..\sys\unix\unixmain.c $(HACK_H) $(INCL)\dlb.h - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\unix\unixmain.c -$(O)unixunix.o: ..\sys\unix\unixunix.c $(HACK_H) - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\unix\unixunix.c -$(O)unixres.o: ..\sys\unix\unixres.c $(CONFIG_H) - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\unix\unixres.c -$(O)bemain.o: ..\sys\be\bemain.c $(HACK_H) $(INCL)\dlb.h - @$(CC) $(cflagsBuild) -Fo$@ ..\sys\be\bemain.c -$(O)getline.o: ..\win\tty\getline.c $(HACK_H) $(INCL)\func_tab.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\tty\getline.c -$(O)termcap.o: ..\win\tty\termcap.c $(HACK_H) $(INCL)\tcap.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\tty\termcap.c -$(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)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 \ - ..\win\X11\nh72icon ..\win\X11\nh56icon ..\win\X11\nh32icon - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winX.c -$(O)winmap.o: ..\win\X11\winmap.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\dlb.h \ - $(INCL)\winX.h $(INCL)\tile2x11.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winmap.c -$(O)winmenu.o: ..\win\X11\winmenu.c $(HACK_H) $(INCL)\winX.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winmenu.c -$(O)winmesg.o: ..\win\X11\winmesg.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\winX.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winmesg.c -$(O)winmisc.o: ..\win\X11\winmisc.c $(HACK_H) $(INCL)\func_tab.h \ - $(INCL)\winX.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winmisc.c -$(O)winstat.o: ..\win\X11\winstat.c $(HACK_H) $(INCL)\winX.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winstat.c -$(O)wintext.o: ..\win\X11\wintext.c $(HACK_H) $(INCL)\winX.h $(INCL)\xwindow.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\wintext.c -$(O)winval.o: ..\win\X11\winval.c $(HACK_H) $(INCL)\winX.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\winval.c -$(O)tile.o: $(SRC)\tile.c $(HACK_H) -$(O)gnaskstr.o: ..\win\gnome\gnaskstr.c ..\win\gnome\gnaskstr.h \ - ..\win\gnome\gnmain.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnaskstr.c -$(O)gnbind.o: ..\win\gnome\gnbind.c ..\win\gnome\gnbind.h ..\win\gnome\gnmain.h \ - ..\win\gnome\gnmenu.h ..\win\gnome\gnaskstr.h \ - ..\win\gnome\gnyesno.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnbind.c -$(O)gnglyph.o: ..\win\gnome\gnglyph.c ..\win\gnome\gnglyph.h $(INCL)\tile2x11.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnglyph.c -$(O)gnmain.o: ..\win\gnome\gnmain.c ..\win\gnome\gnmain.h ..\win\gnome\gnsignal.h \ - ..\win\gnome\gnbind.h ..\win\gnome\gnopts.h $(HACK_H) \ - $(INCL)\date.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmain.c -$(O)gnmap.o: ..\win\gnome\gnmap.c ..\win\gnome\gnmap.h ..\win\gnome\gnglyph.h \ - ..\win\gnome\gnsignal.h $(HACK_H) - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmap.c -$(O)gnmenu.o: ..\win\gnome\gnmenu.c ..\win\gnome\gnmenu.h ..\win\gnome\gnmain.h \ - ..\win\gnome\gnbind.h $(INCL)\func_tab.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmenu.c -$(O)gnmesg.o: ..\win\gnome\gnmesg.c ..\win\gnome\gnmesg.h ..\win\gnome\gnsignal.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmesg.c -$(O)gnopts.o: ..\win\gnome\gnopts.c ..\win\gnome\gnopts.h ..\win\gnome\gnglyph.h \ - ..\win\gnome\gnmain.h ..\win\gnome\gnmap.h $(HACK_H) - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnopts.c -$(O)gnplayer.o: ..\win\gnome\gnplayer.c ..\win\gnome\gnplayer.h \ - ..\win\gnome\gnmain.h $(HACK_H) - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnplayer.c -$(O)gnsignal.o: ..\win\gnome\gnsignal.c ..\win\gnome\gnsignal.h \ - ..\win\gnome\gnmain.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnsignal.c -$(O)gnstatus.o: ..\win\gnome\gnstatus.c ..\win\gnome\gnstatus.h \ - ..\win\gnome\gnsignal.h ..\win\gnome\gn_xpms.h \ - ..\win\gnome\gnomeprv.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnstatus.c -$(O)gntext.o: ..\win\gnome\gntext.c ..\win\gnome\gntext.h ..\win\gnome\gnmain.h \ - ..\win\gnome\gn_rip.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gntext.c -$(O)gnyesno.o: ..\win\gnome\gnyesno.c ..\win\gnome\gnbind.h ..\win\gnome\gnyesno.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnyesno.c -$(O)gnworn.o: ..\win\gnome\gnworn.c ..\win\gnome\gnworn.h ..\win\gnome\gnglyph.h \ - ..\win\gnome\gnsignal.h ..\win\gnome\gnomeprv.h - @$(CC) $(cflagsBuild) $(GNOMEINC) -Fo$@ ..\win\gnome\gnworn.c -$(O)wingem.o: ..\win\gem\wingem.c $(HACK_H) $(INCL)\func_tab.h $(INCL)\dlb.h \ - $(INCL)\patchlevel.h $(INCL)\wingem.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\gem\wingem.c -$(O)wingem1.o: ..\win\gem\wingem1.c $(INCL)\gem_rsc.h $(INCL)\load_img.h \ - $(INCL)\gr_rect.h $(INCL)\wintype.h $(INCL)\wingem.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\gem\wingem1.c -$(O)load_img.o: ..\win\gem\load_img.c $(INCL)\load_img.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\gem\load_img.c -$(O)gr_rect.o: ..\win\gem\gr_rect.c $(INCL)\gr_rect.h - @$(CC) $(cflagsBuild) -Fo$@ ..\win\gem\gr_rect.c -$(O)tile.o: $(SRC)\tile.c $(HACK_H) -$(O)qt_win.o: ..\win\Qt\qt_win.cpp $(HACK_H) $(INCL)\func_tab.h \ - $(INCL)\dlb.h $(INCL)\patchlevel.h $(INCL)\tile2x11.h \ - $(INCL)\qt_win.h $(INCL)\qt_clust.h $(INCL)\qt_kde0.h \ - $(INCL)\qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc - $(CXX) $(CXXFLAGS) -Fo$@ ..\win\Qt\qt_win.cpp -$(O)qt_clust.o: ..\win\Qt\qt_clust.cpp $(INCL)\qt_clust.h - $(CXX) $(CXXFLAGS) -Fo$@ ..\win\Qt\qt_clust.cpp -$(O)qttableview.o: ..\win\Qt\qttableview.cpp $(INCL)\qttableview.h - $(CXX) $(CXXFLAGS) -Fo$@ ..\win\Qt\qttableview.cpp -$(O)wc_chainin.o: ..\win\chain\wc_chainin.c $(HACK_H) - @$(cc) $(cflagsBuild) -Fo$@ ..\win\chain\wc_chainin.c -$(O)wc_chainout.o: ..\win\chain\wc_chainout.c $(HACK_H) - @$(cc) $(cflagsBuild) -Fo$@ ..\win\chain\wc_chainout.c -$(O)wc_trace.o: ..\win\chain\wc_trace.c $(HACK_H) $(INCL)\func_tab.h - @$(cc) $(cflagsBuild) -Fo$@ ..\win\chain\wc_trace.c -$(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)\vis_tab.h -$(O)allmain.o: allmain.c $(HACK_H) -$(O)alloc.o: alloc.c $(CONFIG_H) -$(O)apply.o: apply.c $(HACK_H) -$(O)artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h -$(O)attrib.o: attrib.c $(HACK_H) -$(O)ball.o: ball.c $(HACK_H) -$(O)bones.o: bones.c $(HACK_H) $(INCL)\lev.h -$(O)botl.o: botl.c $(HACK_H) -$(O)cmd.o: cmd.c $(HACK_H) $(INCL)\func_tab.h -$(O)dbridge.o: dbridge.c $(HACK_H) -$(O)decl.o: decl.c $(HACK_H) -$(O)detect.o: detect.c $(HACK_H) $(INCL)\artifact.h -$(O)dig.o: dig.c $(HACK_H) -$(O)display.o: display.c $(HACK_H) -$(O)dlb.o: dlb.c $(CONFIG_H) $(INCL)\dlb.h -$(O)do.o: do.c $(HACK_H) $(INCL)\lev.h -$(O)do_name.o: do_name.c $(HACK_H) -$(O)do_wear.o: do_wear.c $(HACK_H) -$(O)dog.o: dog.c $(HACK_H) -$(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)\mfndpos.h -$(O)dokick.o: dokick.c $(HACK_H) -$(O)dothrow.o: dothrow.c $(HACK_H) -$(O)drawing.o: drawing.c $(HACK_H) $(INCL)\tcap.h -$(O)dungeon.o: dungeon.c $(HACK_H) $(INCL)\dgn_file.h $(INCL)\dlb.h -$(O)eat.o: eat.c $(HACK_H) -$(O)end.o: end.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h -$(O)engrave.o: engrave.c $(HACK_H) $(INCL)\lev.h -$(O)exper.o: exper.c $(HACK_H) -$(O)explode.o: explode.c $(HACK_H) -$(O)extralev.o: extralev.c $(HACK_H) -$(O)files.o: files.c $(HACK_H) $(INCL)\dlb.h #zlib.h -$(O)fountain.o: fountain.c $(HACK_H) -$(O)hack.o: hack.c $(HACK_H) -$(O)hacklib.o: hacklib.c $(HACK_H) -$(O)invent.o: invent.c $(HACK_H) -$(O)light.o: light.c $(HACK_H) $(INCL)\lev.h -$(O)lock.o: lock.c $(HACK_H) -$(O)mail.o: mail.c $(HACK_H) $(INCL)\mail.h -$(O)makemon.o: makemon.c $(HACK_H) -$(O)mapglyph.o: mapglyph.c $(HACK_H) -$(O)mcastu.o: mcastu.c $(HACK_H) -$(O)mhitm.o: mhitm.c $(HACK_H) $(INCL)\artifact.h -$(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)\artifact.h -$(O)minion.o: minion.c $(HACK_H) -$(O)mklev.o: mklev.c $(HACK_H) -$(O)mkmap.o: mkmap.c $(HACK_H) $(INCL)\sp_lev.h -$(O)mkmaze.o: mkmaze.c $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev.h -$(O)mkobj.o: mkobj.c $(HACK_H) -$(O)mkroom.o: mkroom.c $(HACK_H) -$(O)mon.o: mon.c $(HACK_H) $(INCL)\mfndpos.h -$(O)mondata.o: mondata.c $(HACK_H) -$(O)monmove.o: monmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h -$(O)monst.o: monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \ - $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\monsym.h \ - $(INCL)\color.h -$(O)mplayer.o: mplayer.c $(HACK_H) -$(O)mthrowu.o: mthrowu.c $(HACK_H) -$(O)muse.o: muse.c $(HACK_H) -$(O)music.o: music.c $(HACK_H) #interp.c -$(O)o_init.o: o_init.c $(HACK_H) $(INCL)\lev.h -$(O)objects.o: objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ - $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h -$(O)objnam.o: objnam.c $(HACK_H) -$(O)options.o: options.c $(CONFIG_H) $(INCL)\objclass.h $(INCL)\flag.h \ - $(HACK_H) $(INCL)\tcap.h -$(O)pager.o: pager.c $(HACK_H) $(INCL)\dlb.h -$(O)pickup.o: pickup.c $(HACK_H) -$(O)pline.o: pline.c $(HACK_H) -$(O)polyself.o: polyself.c $(HACK_H) -$(O)potion.o: potion.c $(HACK_H) -$(O)pray.o: pray.c $(HACK_H) -$(O)priest.o: priest.c $(HACK_H) $(INCL)\mfndpos.h -$(O)quest.o: quest.c $(HACK_H) $(INCL)\qtext.h -$(O)questpgr.o: questpgr.c $(HACK_H) $(INCL)\dlb.h $(INCL)\qtext.h -$(O)read.o: read.c $(HACK_H) -$(O)rect.o: rect.c $(HACK_H) -$(O)region.o: region.c $(HACK_H) $(INCL)\lev.h -$(O)restore.o: restore.c $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h -$(O)rip.o: rip.c $(HACK_H) -$(O)rnd.o: rnd.c $(HACK_H) -$(O)role.o: role.c $(HACK_H) -$(O)rumors.o: rumors.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h -$(O)save.o: save.c $(HACK_H) $(INCL)\lev.h -$(O)shk.o: shk.c $(HACK_H) -$(O)shknam.o: shknam.c $(HACK_H) -$(O)sit.o: sit.c $(HACK_H) $(INCL)\artifact.h -$(O)sounds.o: sounds.c $(HACK_H) -$(O)sp_lev.o: sp_lev.c $(HACK_H) $(INCL)\dlb.h $(INCL)\sp_lev.h -$(O)spell.o: spell.c $(HACK_H) -$(O)steal.o: steal.c $(HACK_H) -$(O)steed.o: steed.c $(HACK_H) -$(O)sys.o: sys.c $(HACK_H) -$(O)teleport.o: teleport.c $(HACK_H) -$(O)timeout.o: timeout.c $(HACK_H) $(INCL)\lev.h -$(O)topten.o: topten.c $(HACK_H) $(INCL)\dlb.h $(INCL)\patchlevel.h -$(O)track.o: track.c $(HACK_H) -$(O)trap.o: trap.c $(HACK_H) -$(O)u_init.o: u_init.c $(HACK_H) -$(O)uhitm.o: uhitm.c $(HACK_H) -$(O)vault.o: vault.c $(HACK_H) -$(O)version.o: version.c $(HACK_H) $(INCL)\dlb.h $(INCL)\date.h \ - $(INCL)\patchlevel.h -$(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)windmain.o: $(MSWSYS)\windmain.c $(HACK_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) -$(O)write.o: write.c $(HACK_H) -$(O)zap.o: zap.c $(HACK_H) - -# end of file - diff --git a/sys/winnt/console.rc b/sys/winnt/console.rc deleted file mode 100644 index 5884c782b..000000000 --- a/sys/winnt/console.rc +++ /dev/null @@ -1,49 +0,0 @@ -/* NetHack 3.6 console.rc $NHDT-Date: 1601668518 2020/10/02 19:55:18 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.14 $ */ -/* Copyright (c) Yitzhak Sapir, 2002. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "windows.h" - -1 ICON DISCARDABLE "NetHack.ICO" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,6,7,0 - PRODUCTVERSION 3,6,7,0 - FILEFLAGSMASK 0x1fL -#ifdef _DEBUG - FILEFLAGS 0x9L -#else - FILEFLAGS 0x8L -#endif - FILEOS 0x4L - FILETYPE 0x0L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "FileDescription", "NetHack for Windows - TTY Interface\0" - VALUE "FileVersion", "3.6.7\0" - VALUE "InternalName", "NetHack\0" - VALUE "LegalCopyright", "Copyright (C) 1985 - 2023. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0" - VALUE "OriginalFilename", "NetHack.exe\0" - VALUE "PrivateBuild", "050102\0" - VALUE "ProductName", "NetHack\0" - VALUE "ProductVersion", "3.6.7\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -/*console.rc*/ - diff --git a/sys/winnt/nhsetup.bat b/sys/winnt/nhsetup.bat deleted file mode 100755 index a5c9ce75b..000000000 --- a/sys/winnt/nhsetup.bat +++ /dev/null @@ -1,128 +0,0 @@ -@REM NetHack 3.6 nhsetup.bat $NHDT-Date: 1554784485 2019/04/09 04:34:45 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.37 $ */ -@REM Copyright (c) NetHack PC Development Team 1993-2019 -@REM NetHack may be freely redistributed. See license for details. -@REM Win32 setup batch file, see Install.nt for details -@REM -@echo off -pushd %~dp0 -set WIN32PATH=..\..\win\win32 -set BINPATH=..\..\binary -set VCDir= - -goto :main - -:dirname -rem Get the dirname of the second argument and set the variable who's -rem name was specified in the first argument. -call set %~1=%%~dp2 -call set %~1=%%%~1:~0,-1%% -goto :EOF - -:main - -echo Checking to see if source tree directories are set up properly... -if not exist ..\..\include\hack.h goto :err_dir -if not exist ..\..\src\hack.c goto :err_dir -if not exist ..\..\dat\wizard.des goto :err_dir -if not exist ..\..\util\makedefs.c goto :err_dir -if not exist ..\..\sys\winnt\winnt.c goto :err_dir -echo Directories look ok. - -:movemakes -echo Moving Makefiles into ..\..\src for those not using Visual Studio -REM Some file movemet for those that still want to use MAKE or NMAKE and a Makefile -:do_tty -if NOT exist %BINPATH%\*.* mkdir %BINPATH% -if NOT exist %BINPATH%\license copy ..\..\dat\license %BINPATH%\license >nul -echo Copying Microsoft Makefile - Makefile.msc to ..\..\src\Makefile... -if NOT exist ..\..\src\Makefile goto :domsc -copy ..\..\src\Makefile ..\..\src\Makefile-orig >nul -echo Your existing -echo ..\..\src\Makefile -echo has been renamed to -echo ..\..\src\Makefile-orig -:domsc -copy Makefile.msc ..\..\src\Makefile >nul -echo Microsoft Makefile copied ok. - -echo Copying MinGW Makefile - Makefile.gcc to ..\..\src\Makefile.gcc... -if NOT exist ..\..\src\Makefile.gcc goto :dogcc -copy ..\..\src\Makefile.gcc ..\..\src\Makefile.gcc-orig >nul -echo Your existing -echo ..\..\src\Makefile.gcc -echo has been renamed to -echo ..\..\src\Makefile.gcc-orig -:dogcc -copy Makefile.gcc ..\..\src\Makefile.gcc >nul -echo MinGW Makefile copied ok. - -echo Done copying files. - -echo Checking version of VC++ installed... -:vscheck2019 -SET REGTREE=HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio -@REM i can see your house from here... or at least your VC++ folder -set VCDir="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\" -if not defined VCDir goto :vscheck2017 -if not exist %VCDir% goto :vscheck2017 -if not "%VSCMD_VER%"=="16.0.0" goto :vscheck2017 -set MSVCVERSION=2019 -set MSVCPROJ=2017 -goto :fallback - -:vscheck2017 -SET REGTREE=HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7 -@REM i can see your house from here... or at least your VC++ folder -for /f "usebackq skip=2 tokens=1-2*" %%a IN (`reg query %REGTREE% /v 15.0`) do @set VCDir="%%c" -if not defined VCDir goto :vscheck2015 -if not exist %VCDir% goto :vscheck2015 -set MSVCVERSION=2017 -set MSVCPROJ=2017 -goto :fallback - -:vscheck2015 -rem cannot use the registry trick used for vc2017 -rem 14 = 2015 -SET VCVERS=14 -rem Finally, let's determine the root folder for this VC installation. -set VCROOT=%%VS%VCVERS%0COMNTOOLS%% -if "%VCROOT:~-1%"=="\" set VCROOT=%VCROOT:~0,-1% -rem VCROOT=VSDir\Common7\Tools -call :dirname VCROOT "%VCROOT%" -rem VCROOT=VSDir\Common7 -call :dirname VCROOT "%VCROOT%" -rem VCROOT=VSDir -set VCDir=%VCROOT%\VC -SET MSVCVERSION=2015 - -:fallback -echo Using VS%MSVCVERSION%. -set SRCPATH=%WIN32PATH%\vs%MSVCPROJ% -echo NetHack VS%MSVCVERSION% project files are in %SRCPATH% -goto :done - -:err_win -echo Some of the files needed to build graphical NetHack -echo for Windows are not in the expected places. -echo Check "Install.nt" for a list of the steps required -echo to build NetHack. -goto :fini - -:err_dir -echo Your directories are not set up properly, please re-read the -echo documentation and sys/winnt/Install.nt. -goto :fini - -:done -echo done! -echo. -echo Proceed with the next step documented in Install.nt -echo. - -:fini -:end -set _pause=N -for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set _pause=Y -if "%_pause%"=="Y" pause -set _pause= -popd diff --git a/sys/winnt/ntsound.c b/sys/winnt/ntsound.c deleted file mode 100644 index c8ec07450..000000000 --- a/sys/winnt/ntsound.c +++ /dev/null @@ -1,29 +0,0 @@ -/* NetHack 3.6 ntsound.c $NHDT-Date: 1432512794 2015/05/25 00:13:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */ -/* Copyright (c) NetHack PC Development Team 1993 */ -/* NetHack may be freely redistributed. See license for details. */ -/* */ -/* - * ntsound.c - Windows NT NetHack sound support - * - *Edit History: - * Initial Creation 93/12/11 - * - */ - -#include "win32api.h" -#include "hack.h" -#include - -#ifdef USER_SOUNDS - -void -play_usersound(filename, volume) -const char *filename; -int volume; -{ - /* pline("play_usersound: %s (%d).", filename, volume); */ - (void) sndPlaySound(filename, SND_ASYNC | SND_NODEFAULT); -} - -#endif /*USER_SOUNDS*/ -/* ntsound.c */ diff --git a/sys/winnt/stub-pdcscrn.c b/sys/winnt/stub-pdcscrn.c deleted file mode 100644 index 7588a782b..000000000 --- a/sys/winnt/stub-pdcscrn.c +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Use this stub to insert a needed pragma prior - * to compiling $(PDCWINCON)\pdcscrn.c in the - * PDCurses distribution. - * - * We don't want to ask NetHack builders to - * modify the PDCurses distribution in any way, - * we only ask that they have the original intact - * PDCurses source tree available during the build. - * - */ - -#pragma warning(disable : 4996) -#include "pdcscrn.c" - diff --git a/sys/winnt/stubs.c b/sys/winnt/stubs.c deleted file mode 100644 index 246676cab..000000000 --- a/sys/winnt/stubs.c +++ /dev/null @@ -1,202 +0,0 @@ -/* NetHack 3.6 stubs.c $NHDT-Date: 1524689357 2018/04/25 20:49:17 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.3 $ */ -/* Copyright (c) 2015 by Michael Allison */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "win32api.h" -#include "hack.h" - -#ifdef GUISTUB -#ifdef TTYSTUB -#error You cannot compile this with both GUISTUB and TTYSTUB defined. -#endif - -int GUILaunched; -struct window_procs mswin_procs = { "-guistubs" }; - -#ifdef QT_GRAPHICS -struct window_procs Qt_procs = { "-guistubs" }; -int qt_tilewidth, qt_tileheight, qt_fontsize, qt_compact_mode; -#endif -void -mswin_destroy_reg() -{ - return; -} -void -mswin_raw_print_flush() -{ -} - -void -mswin_raw_print(const char *str) -{ -} - -/* MINGW32 has trouble with both a main() and WinMain() - * so we move main for the MINGW tty version into this stub - * so that it is out of sight for the gui linkage. - */ -#ifdef __MINGW32__ -extern char default_window_sys[]; -extern int mingw_main(int argc, char **argv); - -int -main(argc, argv) -int argc; -char *argv[]; -{ - boolean resuming; - - resuming = mingw_main(argc, argv); - nethack_exit(EXIT_SUCCESS); - /*NOTREACHED*/ - return 0; -} -#endif - -#endif /* GUISTUB */ - -/* =============================================== */ - -#ifdef TTYSTUB - -HANDLE hConIn; -HANDLE hConOut; -int GUILaunched; -struct window_procs tty_procs = { "-ttystubs" }; -#ifdef CURSES_GRAPHICS -char erase_char, kill_char; -#endif - -void -win_tty_init(dir) -int dir; -{ - return; -} - -void -nttty_open(mode) -int mode; -{ - return; -} - -int -xputc(ch) -int ch; -{ - return 0; -} - -void -xputs(s) -const char *s; -{ - return; -} - -void -raw_clear_screen() -{ - return; -} - -void -clear_screen() -{ - return; -} - -void -backsp() -{ - return; -} - -#ifndef NO_MOUSE_ALLOWED -void -toggle_mouse_support() -{ - return; -} -#endif - -#ifdef PORT_DEBUG -void -win32con_debug_keystrokes() -{ - return; -} -void -win32con_handler_info() -{ - return; -} -#endif - -void -map_subkeyvalue(op) -register char *op; -{ - return; -} - -/* this is used as a printf() replacement when the window - * system isn't initialized yet - */ -void msmsg -VA_DECL(const char *, fmt) -{ - VA_START(fmt); - VA_INIT(fmt, const char *); - VA_END(); - return; -} - -/*VARARGS1*/ -void nttty_error -VA_DECL(const char *, s) -{ - VA_START(s); - VA_INIT(s, const char *); - VA_END(); - return; -} - -#ifdef TTY_GRAPHICS -void -synch_cursor() -{ - return; -} -#endif - -void -more() -{ - return; -} - -void -nethack_enter_nttty() -{ - return; -} - -void -set_altkeyhandler(const char *inName) -{ - return; -} -void -set_altkeyhandling(const char *inName) -{ -} - -int -set_keyhandling_via_option(void) -{ - return 1; -} -#endif /* TTYSTUBS */ diff --git a/sys/winnt/winnt.c b/sys/winnt/winnt.c deleted file mode 100644 index e7a2040a6..000000000 --- a/sys/winnt/winnt.c +++ /dev/null @@ -1,737 +0,0 @@ -/* NetHack 3.6 winnt.c $NHDT-Date: 1524321419 2018/04/21 14:36:59 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.30 $ */ -/* Copyright (c) NetHack PC Development Team 1993, 1994 */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * WIN32 system functions. - * - * Included in both console and window based clients on the windows platform. - * - * Initial Creation: Michael Allison - January 31/93 - * - */ - -#include "win10.h" -#include "winos.h" - -#define NEED_VARARGS -#include "hack.h" -#include -#ifndef __BORLANDC__ -#include -#endif -#include -#ifdef TTY_GRAPHICS -#include "wintty.h" -#endif -#ifdef WIN32 - -/* - * The following WIN32 API routines are used in this file. - * - * GetDiskFreeSpace - * GetVolumeInformation - * GetUserName - * FindFirstFile - * FindNextFile - * FindClose - * - */ - -/* runtime cursor display control switch */ -boolean win32_cursorblink; - -/* globals required within here */ -HANDLE ffhandle = (HANDLE) 0; -WIN32_FIND_DATA ffd; -extern int GUILaunched; -boolean getreturn_enabled; -int redirect_stdout; - -typedef HWND(WINAPI *GETCONSOLEWINDOW)(); -static HWND GetConsoleHandle(void); -static HWND GetConsoleHwnd(void); -#if !defined(TTY_GRAPHICS) -extern void NDECL(backsp); -#endif -int NDECL(windows_console_custom_nhgetch); -extern void NDECL(safe_routines); - -/* The function pointer nt_kbhit contains a kbhit() equivalent - * which varies depending on which window port is active. - * For the tty port it is tty_kbhit() [from nttty.c] - * For the win32 port it is win32_kbhit() [from winmain.c] - * It is initialized to point to def_kbhit [in here] for safety. - */ - -int def_kbhit(void); -int (*nt_kbhit)() = def_kbhit; - -char -switchar() -{ - /* Could not locate a WIN32 API call for this- MJA */ - return '-'; -} - -long -freediskspace(path) -char *path; -{ - char tmppath[4]; - DWORD SectorsPerCluster = 0; - DWORD BytesPerSector = 0; - DWORD FreeClusters = 0; - DWORD TotalClusters = 0; - - tmppath[0] = *path; - tmppath[1] = ':'; - tmppath[2] = '\\'; - tmppath[3] = '\0'; - GetDiskFreeSpace(tmppath, &SectorsPerCluster, &BytesPerSector, - &FreeClusters, &TotalClusters); - return (long) (SectorsPerCluster * BytesPerSector * FreeClusters); -} - -/* - * Functions to get filenames using wildcards - */ -int -findfirst(path) -char *path; -{ - if (ffhandle) { - FindClose(ffhandle); - ffhandle = (HANDLE) 0; - } - ffhandle = FindFirstFile(path, &ffd); - return (ffhandle == INVALID_HANDLE_VALUE) ? 0 : 1; -} - -int -findnext() -{ - return FindNextFile(ffhandle, &ffd) ? 1 : 0; -} - -char * -foundfile_buffer() -{ - return &ffd.cFileName[0]; -} - -long -filesize(file) -char *file; -{ - if (findfirst(file)) { - return ((long) ffd.nFileSizeLow); - } else - return -1L; -} - -/* - * Chdrive() changes the default drive. - */ -void -chdrive(str) -char *str; -{ - char *ptr; - char drive; - if ((ptr = index(str, ':')) != (char *) 0) { - drive = toupper((uchar) *(ptr - 1)); - _chdrive((drive - 'A') + 1); - } -} - -static int -max_filename() -{ - DWORD maxflen; - int status = 0; - - status = GetVolumeInformation((LPTSTR) 0, (LPTSTR) 0, 0, (LPDWORD) 0, - &maxflen, (LPDWORD) 0, (LPTSTR) 0, 0); - if (status) - return maxflen; - else - return 0; -} - -int -def_kbhit() -{ - return 0; -} - -/* - * Strip out troublesome file system characters. - */ - -void nt_regularize(s) /* normalize file name */ -register char *s; -{ - register unsigned char *lp; - - for (lp = s; *lp; lp++) - if (*lp == '?' || *lp == '"' || *lp == '\\' || *lp == '/' - || *lp == '>' || *lp == '<' || *lp == '*' || *lp == '|' - || *lp == ':' || (*lp > 127)) - *lp = '_'; -} - -/* - * This is used in nhlan.c to implement some of the LAN_FEATURES. - */ -char * -get_username(lan_username_size) -int *lan_username_size; -{ - static TCHAR username_buffer[BUFSZ]; - DWORD i = BUFSZ - 1; - BOOL allowUserName = TRUE; - - Strcpy(username_buffer, "NetHack"); - -#ifndef WIN32CON - /* Our privacy policy for the windows store version of nethack makes - * a promise about not collecting any personally identifiable information. - * Do not allow getting user name if we being run from windows store - * version of nethack. In 3.7, we should remove use of username. - */ - allowUserName = !win10_is_desktop_bridge_application(); -#endif - - if (allowUserName) { - /* i gets updated with actual size */ - if (GetUserName(username_buffer, &i)) - username_buffer[i] = '\0'; - } - - if (lan_username_size) - *lan_username_size = strlen(username_buffer); - return username_buffer; -} - -#if 0 -char *getxxx() -{ -char szFullPath[MAX_PATH] = ""; -HMODULE hInst = NULL; /* NULL gets the filename of this module */ - -GetModuleFileName(hInst, szFullPath, sizeof(szFullPath)); -return &szFullPath[0]; -} -#endif - -extern void NDECL(mswin_raw_print_flush); -extern void FDECL(mswin_raw_print, (const char *)); - -/* fatal error */ -/*VARARGS1*/ -void error -VA_DECL(const char *, s) -{ - char buf[BUFSZ]; - VA_START(s); - VA_INIT(s, const char *); - /* error() may get called before tty is initialized */ - if (iflags.window_inited) - end_screen(); - if (WINDOWPORT("tty")) { - buf[0] = '\n'; - (void) vsnprintf(&buf[1], sizeof buf - (1 + sizeof "\n"), s, VA_ARGS); - Strcat(buf, "\n"); - msmsg(buf); - } else { - (void) vsnprintf(buf, sizeof buf - sizeof "\n", s, VA_ARGS); - Strcat(buf, "\n"); - raw_printf(buf); - } - if (windowprocs.win_raw_print == mswin_raw_print) - mswin_raw_print_flush(); - VA_END(); - exit(EXIT_FAILURE); -} - -void -Delay(int ms) -{ - (void) Sleep(ms); -} - -void -win32_abort() -{ - int c; - - if (WINDOWPORT("mswin") || WINDOWPORT("tty")) { - if (iflags.window_inited) - exit_nhwindows((char *) 0); - iflags.window_inited = FALSE; - } - if (!WINDOWPORT("mswin") && !WINDOWPORT("safe-startup")) - safe_routines(); - if (wizard) { - raw_print("Execute debug breakpoint wizard?"); - if ((c = nhgetch()) == 'y' || c == 'Y') - DebugBreak(); - } - abort(); -} - -static char interjection_buf[INTERJECTION_TYPES][1024]; -static int interjection[INTERJECTION_TYPES]; - -void -interject_assistance(num, interjection_type, ptr1, ptr2) -int num; -int interjection_type; -genericptr_t ptr1; -genericptr_t ptr2; -{ - switch (num) { - case 1: { - char *panicmsg = (char *) ptr1; - char *datadir = (char *) ptr2; - char *tempdir = nh_getenv("TEMP"); - interjection_type = INTERJECT_PANIC; - interjection[INTERJECT_PANIC] = 1; - /* - * ptr1 = the panic message about to be delivered. - * ptr2 = the directory prefix of the dungeon file - * that failed to open. - * Check to see if datadir matches tempdir or a - * common windows temp location. If it does, inform - * the user that they are probably trying to run the - * game from within their unzip utility, so the required - * files really don't exist at the location. Instruct - * them to unpack them first. - */ - if (panicmsg && datadir) { - if (!strncmpi(datadir, "C:\\WINDOWS\\TEMP", 15) - || strstri(datadir, "TEMP") - || (tempdir && strstri(datadir, tempdir))) { - (void) strncpy( - interjection_buf[INTERJECT_PANIC], - "\nOne common cause of this error is attempting to " - "execute\n" - "the game by double-clicking on it while it is " - "displayed\n" - "inside an unzip utility.\n\n" - "You have to unzip the contents of the zip file into a\n" - "folder on your system, and then run \"NetHack.exe\" or " - "\n" - "\"NetHackW.exe\" from there.\n\n" - "If that is not the situation, you are encouraged to\n" - "report the error as shown above.\n\n", - 1023); - } - } - } break; - } -} - -void -interject(interjection_type) -int interjection_type; -{ - if (interjection_type >= 0 && interjection_type < INTERJECTION_TYPES) - msmsg(interjection_buf[interjection_type]); -} - -#ifdef RUNTIME_PASTEBUF_SUPPORT - -void port_insert_pastebuf(buf) -char *buf; -{ - /* This implementation will utilize the windows clipboard - * to accomplish this. - */ - - char *tmp = buf; - HGLOBAL hglbCopy; - WCHAR *w, w2[2]; - int cc, rc, abytes; - LPWSTR lpwstrCopy; - HANDLE hresult; - - if (!buf) - return; - - cc = strlen(buf); - /* last arg=0 means "tell me the size of the buffer that I need" */ - rc = MultiByteToWideChar(GetConsoleOutputCP(), 0, buf, -1, w2, 0); - if (!rc) return; - - abytes = rc * sizeof(WCHAR); - w = (WCHAR *)alloc(abytes); - /* Housekeeping need: +free(w) */ - - rc = MultiByteToWideChar(GetConsoleOutputCP(), 0, buf, -1, w, rc); - if (!rc) { - free(w); - return; - } - if (!OpenClipboard(NULL)) { - free(w); - return; - } - /* Housekeeping need: +CloseClipboard(), free(w) */ - - EmptyClipboard(); - - /* allocate global mem obj to hold the text */ - - hglbCopy = GlobalAlloc(GMEM_MOVEABLE, abytes); - if (hglbCopy == NULL) { - CloseClipboard(); - free(w); - return; - } - /* Housekeeping need: +GlobalFree(hglbCopy), CloseClipboard(), free(w) */ - - lpwstrCopy = (LPWSTR)GlobalLock(hglbCopy); - /* Housekeeping need: +GlobalUnlock(hglbCopy), GlobalFree(hglbCopy), - CloseClipboard(), free(w) */ - - memcpy(lpwstrCopy, w, abytes); - GlobalUnlock(hglbCopy); - /* Housekeeping need: GlobalFree(hglbCopy), CloseClipboard(), free(w) */ - - /* put it on the clipboard */ - hresult = SetClipboardData(CF_UNICODETEXT, hglbCopy); - if (!hresult) { - raw_printf("Error copying to clipboard.\n"); - GlobalFree(hglbCopy); /* only needed if clipboard didn't accept data */ - } - /* Housekeeping need: CloseClipboard(), free(w) */ - - CloseClipboard(); - free(w); - return; -} - -static HWND -GetConsoleHandle(void) -{ - HMODULE hMod = GetModuleHandle("kernel32.dll"); - GETCONSOLEWINDOW pfnGetConsoleWindow = - (GETCONSOLEWINDOW) GetProcAddress(hMod, "GetConsoleWindow"); - if (pfnGetConsoleWindow) - return pfnGetConsoleWindow(); - else - return GetConsoleHwnd(); -} - -static HWND -GetConsoleHwnd(void) -{ - int iterations = 0; - HWND hwndFound = 0; - char OldTitle[1024], NewTitle[1024], TestTitle[1024]; - - /* Get current window title */ - GetConsoleTitle(OldTitle, sizeof OldTitle); - - (void) sprintf(NewTitle, "NETHACK%d/%d", GetTickCount(), - GetCurrentProcessId()); - SetConsoleTitle(NewTitle); - - GetConsoleTitle(TestTitle, sizeof TestTitle); - while (strcmp(TestTitle, NewTitle) != 0) { - iterations++; - /* sleep(0); */ - GetConsoleTitle(TestTitle, sizeof TestTitle); - } - hwndFound = FindWindow(NULL, NewTitle); - SetConsoleTitle(OldTitle); - /* printf("%d iterations\n", iterations); */ - return hwndFound; -} - -#endif - -#ifdef RUNTIME_PORT_ID -/* - * _M_IX86 is Defined for x86 processors. This is not defined for x64 - * processors. - * _M_X64 is Defined for x64 processors. - * _M_IA64 is Defined for Itanium Processor Family 64-bit processors. - * _WIN64 is Defined for applications for Win64. - */ -#ifndef _M_IX86 -#ifdef _M_X64 -#define TARGET_PORT "x64" -#endif -#ifdef _M_IA64 -#define TARGET_PORT "IA64" -#endif -#endif - -#ifndef TARGET_PORT -#define TARGET_PORT "x86" -#endif - -char * -get_port_id(buf) -char *buf; -{ - Strcpy(buf, TARGET_PORT); - return buf; -} -#endif /* RUNTIME_PORT_ID */ - -/* nhassert_failed is called when an nhassert's condition is false */ -void nhassert_failed(const char * exp, const char * file, int line) -{ - char message[128]; - _snprintf(message, sizeof(message), - "NHASSERT(%s) in '%s' at line %d\n", exp, file, line); - - if (IsDebuggerPresent()) { - OutputDebugStringA(message); - DebugBreak(); - } - - // strip off the newline - message[strlen(message) - 1] = '\0'; - error(message); -} - -void -nethack_exit(code) -int code; -{ - /* Only if we started from the GUI, not the command prompt, - * we need to get one last return, so the score board does - * not vanish instantly after being created. - * GUILaunched is defined and set in nttty.c. - */ - - - if (!GUILaunched) { - windowprocs = *get_safe_procs(1); - /* use our custom version which works - a little cleaner than the stdio one */ - windowprocs.win_nhgetch = windows_console_custom_nhgetch; - } - if (getreturn_enabled) - wait_synch(); - exit(code); -} - -#undef kbhit -#include - -int -windows_console_custom_nhgetch(VOID_ARGS) -{ - return _getch(); -} - - -void -getreturn(str) -const char *str; -{ - static boolean in_getreturn = FALSE; - char buf[BUFSZ]; - - if (in_getreturn || !getreturn_enabled) - return; - in_getreturn = TRUE; - Sprintf(buf,"Hit %s.", str); - raw_print(buf); - wait_synch(); - in_getreturn = FALSE; - return; -} - -/* nethack_enter_winnt() is called from main immediately after - initializing the window port */ -void nethack_enter_winnt() -{ - if (WINDOWPORT("tty")) - nethack_enter_nttty(); -} - -/* CP437 to Unicode mapping according to the Unicode Consortium */ -const WCHAR cp437[256] = { - 0x0020, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, - 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, - 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, - 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302, - 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, - 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, - 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, - 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, - 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, - 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, - 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, - 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 -}; - -WCHAR * -winos_ascii_to_wide_str(const unsigned char * src, WCHAR * dst, size_t dstLength) -{ - size_t i = 0; - while(i < dstLength - 1 && src[i] != 0) - dst[i++] = cp437[src[i]]; - dst[i] = 0; - return dst; -} - -WCHAR -winos_ascii_to_wide(const unsigned char c) -{ - return cp437[c]; -} - -BOOL winos_font_support_cp437(HFONT hFont) -{ - BOOL allFound = FALSE; - HDC hdc = GetDC(NULL); - HFONT oldFont = SelectObject(hdc, hFont); - - DWORD size = GetFontUnicodeRanges(hdc, NULL); - GLYPHSET *glyphSet = (GLYPHSET *) malloc(size); - - if (glyphSet != NULL) { - GetFontUnicodeRanges(hdc, glyphSet); - - allFound = TRUE; - for (int i = 0; i < 256 && allFound; i++) { - WCHAR wc = cp437[i]; - BOOL found = FALSE; - for (DWORD j = 0; j < glyphSet->cRanges && !found; j++) { - WCHAR first = glyphSet->ranges[j].wcLow; - WCHAR last = first + glyphSet->ranges[j].cGlyphs - 1; - - if (wc >= first && wc <= last) - found = TRUE; - } - if (!found) - allFound = FALSE; - } - - free(glyphSet); - } - - SelectObject(hdc, oldFont); - ReleaseDC(NULL, hdc); - - return allFound; -} - -int -windows_early_options(window_opt) -const char *window_opt; -{ - /* - * If you return 2, the game will exit before it begins. - * Return 1, to say the option parsed okay. - * Return 0, to say the option was bad. - */ - - if (match_optname(window_opt, "cursorblink", 5, FALSE)) { - win32_cursorblink = TRUE; - return 1; - } else { - raw_printf( - "-%swindows:cursorblink is the only supported option.\n"); - } - return 0; -} - -/* - * Add a backslash to any name not ending in /, \ or : There must - * be room for the \ - */ -void -append_slash(name) -char *name; -{ - char *ptr; - - if (!*name) - return; - ptr = name + (strlen(name) - 1); - if (*ptr != '\\' && *ptr != '/' && *ptr != ':') { - *++ptr = '\\'; - *++ptr = '\0'; - } - return; -} - -#include /* Windows Crypto Next Gen (CNG) */ - -#ifndef STATUS_SUCCESS -#define STATUS_SUCCESS 0 -#endif -#ifndef STATUS_NOT_FOUND -#define STATUS_NOT_FOUND 0xC0000225 -#endif -#ifndef STATUS_UNSUCCESSFUL -#define STATUS_UNSUCCESSFUL 0xC0000001 -#endif - -unsigned long -sys_random_seed(VOID_ARGS) -{ - unsigned long ourseed = 0UL; - BCRYPT_ALG_HANDLE hRa = (BCRYPT_ALG_HANDLE) 0; - NTSTATUS status = STATUS_UNSUCCESSFUL; - boolean Plan_B = TRUE; - - status = BCryptOpenAlgorithmProvider(&hRa, BCRYPT_RNG_ALGORITHM, - (LPCWSTR) 0, 0); - if (hRa && status == STATUS_SUCCESS) { - status = BCryptGenRandom(hRa, (PUCHAR) &ourseed, - (ULONG) sizeof ourseed, 0); - if (status == STATUS_SUCCESS) { - BCryptCloseAlgorithmProvider(hRa,0); - has_strong_rngseed = TRUE; - Plan_B = FALSE; - } - } - - if (Plan_B) { - time_t datetime = 0; - const char *emsg; - - if (status == STATUS_NOT_FOUND) - emsg = "BCRYPT_RNG_ALGORITHM not avail, falling back"; - else - emsg = "Other failure than algorithm not avail"; - paniclog("sys_random_seed", emsg); /* leaves clue, doesn't exit */ - (void) time(&datetime); - ourseed = (unsigned long) datetime; - } - return ourseed; -} - -#endif /* WIN32 */ - -/*winnt.c*/